@threaded/ai 1.0.29 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +240 -0
- package/dist/approval.d.ts +18 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +35 -0
- package/dist/approval.js.map +1 -0
- package/dist/composition/compose.d.ts +3 -0
- package/dist/composition/compose.d.ts.map +1 -0
- package/dist/composition/compose.js +38 -0
- package/dist/composition/compose.js.map +1 -0
- package/dist/composition/model.d.ts +9 -0
- package/dist/composition/model.d.ts.map +1 -0
- package/dist/composition/model.js +192 -0
- package/dist/composition/model.js.map +1 -0
- package/dist/composition/retry.d.ts +6 -0
- package/dist/composition/retry.d.ts.map +1 -0
- package/dist/composition/retry.js +18 -0
- package/dist/composition/retry.js.map +1 -0
- package/dist/composition/scope.d.ts +3 -0
- package/dist/composition/scope.d.ts.map +1 -0
- package/dist/composition/scope.js +83 -0
- package/dist/composition/scope.js.map +1 -0
- package/dist/composition/tap.d.ts +3 -0
- package/dist/composition/tap.d.ts.map +1 -0
- package/dist/composition/tap.js +7 -0
- package/dist/composition/tap.js.map +1 -0
- package/dist/composition/when.d.ts +3 -0
- package/dist/composition/when.d.ts.map +1 -0
- package/dist/composition/when.js +9 -0
- package/dist/composition/when.js.map +1 -0
- package/dist/embed.d.ts +16 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +72 -0
- package/dist/embed.js.map +1 -0
- package/dist/examples.d.ts +2 -0
- package/dist/examples.d.ts.map +1 -0
- package/dist/examples.js +6 -0
- package/dist/examples.js.map +1 -0
- package/dist/helpers.d.ts +17 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +104 -0
- package/dist/helpers.js.map +1 -0
- package/dist/image-model-schema.d.ts +19 -0
- package/dist/image-model-schema.d.ts.map +1 -0
- package/dist/image-model-schema.js +103 -0
- package/dist/image-model-schema.js.map +1 -0
- package/dist/image.d.ts +3 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +120 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +18 -350
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -2061
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +29 -0
- package/dist/mcp.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +226 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/google.d.ts +3 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +244 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/huggingface.d.ts +3 -0
- package/dist/providers/huggingface.d.ts.map +1 -0
- package/dist/providers/huggingface.js +59 -0
- package/dist/providers/huggingface.js.map +1 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +29 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/local.d.ts +3 -0
- package/dist/providers/local.d.ts.map +1 -0
- package/dist/providers/local.js +152 -0
- package/dist/providers/local.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +165 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/xai.d.ts +3 -0
- package/dist/providers/xai.d.ts.map +1 -0
- package/dist/providers/xai.js +161 -0
- package/dist/providers/xai.js.map +1 -0
- package/dist/schema.d.ts +7 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +44 -0
- package/dist/schema.js.map +1 -0
- package/dist/thread.d.ts +25 -0
- package/dist/thread.d.ts.map +1 -0
- package/dist/thread.js +87 -0
- package/dist/thread.js.map +1 -0
- package/dist/types.d.ts +193 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/rateLimited.d.ts +27 -0
- package/dist/utils/rateLimited.d.ts.map +1 -0
- package/dist/utils/rateLimited.js +74 -0
- package/dist/utils/rateLimited.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +78 -0
- package/dist/utils.js.map +1 -0
- package/package.json +34 -12
- package/.claude/settings.local.json +0 -15
- package/.lore +0 -65
- package/dist/index.cjs +0 -2137
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -350
- package/tsconfig.json +0 -29
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
export interface Message {
|
|
2
|
+
role: "system" | "user" | "assistant" | "tool";
|
|
3
|
+
content: string;
|
|
4
|
+
tool_call_id?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ToolCall {
|
|
7
|
+
id: string;
|
|
8
|
+
function: {
|
|
9
|
+
name: string;
|
|
10
|
+
arguments: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface ToolCallResult {
|
|
14
|
+
name: string;
|
|
15
|
+
inputs: any;
|
|
16
|
+
results: any;
|
|
17
|
+
}
|
|
18
|
+
export interface ToolDefinition {
|
|
19
|
+
type: "function";
|
|
20
|
+
function: {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
parameters: {
|
|
24
|
+
type: string;
|
|
25
|
+
properties: Record<string, any>;
|
|
26
|
+
required?: string[];
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface ToolConfig {
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
schema: Record<string, SchemaProperty> | StandardSchema;
|
|
34
|
+
execute: (args: any) => Promise<any> | any;
|
|
35
|
+
_maxCalls?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface SchemaProperty {
|
|
38
|
+
type: "string" | "number" | "boolean" | "array" | "object";
|
|
39
|
+
description?: string;
|
|
40
|
+
enum?: string[];
|
|
41
|
+
optional?: boolean;
|
|
42
|
+
items?: SchemaProperty;
|
|
43
|
+
properties?: Record<string, SchemaProperty>;
|
|
44
|
+
}
|
|
45
|
+
export interface ToolExecutionConfig {
|
|
46
|
+
/** require user approval before executing tools */
|
|
47
|
+
requireApproval?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* custom callback to handle tool approval, return true to approve
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* // simple callback
|
|
53
|
+
* approvalCallback: (call) => call.function.name !== 'dangerousTool'
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* // event-driven (SSE): server sends approval request, waits for client POST
|
|
57
|
+
* approvalCallback: (call) => new Promise((resolve) => {
|
|
58
|
+
* pendingApprovals.set(call.id, resolve);
|
|
59
|
+
* res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\n\n`);
|
|
60
|
+
* })
|
|
61
|
+
* // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))
|
|
62
|
+
*/
|
|
63
|
+
approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;
|
|
64
|
+
/** execute tools in parallel instead of sequentially */
|
|
65
|
+
parallel?: boolean;
|
|
66
|
+
/** number of times to retry failed tool executions */
|
|
67
|
+
retryCount?: number;
|
|
68
|
+
/** identifier for approval requests, useful for managing multiple approval flows */
|
|
69
|
+
approvalId?: string;
|
|
70
|
+
/** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */
|
|
71
|
+
executeOnApproval?: boolean;
|
|
72
|
+
}
|
|
73
|
+
export type StreamEvent = {
|
|
74
|
+
type: 'content';
|
|
75
|
+
content: string;
|
|
76
|
+
} | {
|
|
77
|
+
type: 'tool_calls_ready';
|
|
78
|
+
calls: ToolCall[];
|
|
79
|
+
} | {
|
|
80
|
+
type: 'tool_executing';
|
|
81
|
+
call: ToolCall;
|
|
82
|
+
} | {
|
|
83
|
+
type: 'tool_complete';
|
|
84
|
+
call: ToolCall;
|
|
85
|
+
result: any;
|
|
86
|
+
} | {
|
|
87
|
+
type: 'tool_error';
|
|
88
|
+
call: ToolCall;
|
|
89
|
+
error: string;
|
|
90
|
+
} | {
|
|
91
|
+
type: 'approval_requested';
|
|
92
|
+
call: ToolCall;
|
|
93
|
+
requestId: string;
|
|
94
|
+
} | {
|
|
95
|
+
type: 'usage';
|
|
96
|
+
usage: TokenUsage;
|
|
97
|
+
};
|
|
98
|
+
export interface ConversationContext {
|
|
99
|
+
history: Message[];
|
|
100
|
+
lastRequest?: Message;
|
|
101
|
+
lastResponse?: Message & {
|
|
102
|
+
tool_calls?: ToolCall[];
|
|
103
|
+
};
|
|
104
|
+
tools?: ToolDefinition[];
|
|
105
|
+
toolExecutors?: Record<string, Function>;
|
|
106
|
+
stream?: (event: StreamEvent) => void;
|
|
107
|
+
stopReason?: string;
|
|
108
|
+
toolCallCounts?: Record<string, number>;
|
|
109
|
+
toolLimits?: Record<string, number>;
|
|
110
|
+
toolConfig?: ToolExecutionConfig;
|
|
111
|
+
abortSignal?: AbortSignal;
|
|
112
|
+
usage?: TokenUsage;
|
|
113
|
+
}
|
|
114
|
+
export declare enum Inherit {
|
|
115
|
+
Nothing = 0,
|
|
116
|
+
Conversation = 1,
|
|
117
|
+
Tools = 2,
|
|
118
|
+
All = 3
|
|
119
|
+
}
|
|
120
|
+
export interface ScopeConfig {
|
|
121
|
+
inherit?: number;
|
|
122
|
+
tools?: ToolConfig[];
|
|
123
|
+
toolConfig?: ToolExecutionConfig;
|
|
124
|
+
system?: string;
|
|
125
|
+
silent?: boolean;
|
|
126
|
+
until?: (ctx: ConversationContext) => boolean;
|
|
127
|
+
stream?: (event: StreamEvent) => void;
|
|
128
|
+
}
|
|
129
|
+
export type StepFunction = (ctx: ConversationContext) => Promise<ConversationContext>;
|
|
130
|
+
export type ComposedFunction = (ctxOrMessage: ConversationContext | string) => Promise<ConversationContext>;
|
|
131
|
+
export interface JsonSchema {
|
|
132
|
+
name: string;
|
|
133
|
+
schema: Record<string, any>;
|
|
134
|
+
}
|
|
135
|
+
export interface StandardSchema {
|
|
136
|
+
"~standard": any;
|
|
137
|
+
[key: string]: any;
|
|
138
|
+
}
|
|
139
|
+
export interface ProviderConfig {
|
|
140
|
+
model: string;
|
|
141
|
+
instructions?: string;
|
|
142
|
+
schema?: JsonSchema;
|
|
143
|
+
apiKey?: string;
|
|
144
|
+
baseUrl?: string;
|
|
145
|
+
}
|
|
146
|
+
export interface ParsedModel {
|
|
147
|
+
provider: string;
|
|
148
|
+
model: string;
|
|
149
|
+
}
|
|
150
|
+
export interface ApiKeys {
|
|
151
|
+
openai?: string;
|
|
152
|
+
anthropic?: string;
|
|
153
|
+
google?: string;
|
|
154
|
+
[provider: string]: string | undefined;
|
|
155
|
+
}
|
|
156
|
+
export interface ThreadStore {
|
|
157
|
+
get(threadId: string): Promise<Message[]>;
|
|
158
|
+
set(threadId: string, messages: Message[]): Promise<void>;
|
|
159
|
+
}
|
|
160
|
+
export interface Thread {
|
|
161
|
+
id: string;
|
|
162
|
+
store: ThreadStore;
|
|
163
|
+
generate(step: StepFunction): Promise<ConversationContext>;
|
|
164
|
+
message(content: string, workflow?: StepFunction, options?: {
|
|
165
|
+
abortSignal?: AbortSignal;
|
|
166
|
+
}): Promise<ConversationContext>;
|
|
167
|
+
}
|
|
168
|
+
export interface RetryOptions {
|
|
169
|
+
times?: number;
|
|
170
|
+
}
|
|
171
|
+
export interface ImageConfig {
|
|
172
|
+
n?: number;
|
|
173
|
+
size?: string;
|
|
174
|
+
quality?: "standard" | "hd" | "low" | "medium" | "high" | "auto";
|
|
175
|
+
style?: "vivid" | "natural";
|
|
176
|
+
responseFormat?: "url" | "b64_json";
|
|
177
|
+
aspectRatio?: string;
|
|
178
|
+
outputFormat?: "png" | "jpeg" | "webp";
|
|
179
|
+
outputCompression?: number;
|
|
180
|
+
background?: "transparent" | "opaque" | "auto";
|
|
181
|
+
moderation?: "auto" | "low";
|
|
182
|
+
imageSize?: "1K" | "2K";
|
|
183
|
+
}
|
|
184
|
+
export interface ImageResult {
|
|
185
|
+
data: string;
|
|
186
|
+
revisedPrompt?: string;
|
|
187
|
+
}
|
|
188
|
+
export interface TokenUsage {
|
|
189
|
+
promptTokens: number;
|
|
190
|
+
completionTokens: number;
|
|
191
|
+
totalTokens: number;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;SACrB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,cAAc,CAAC;IACxD,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+IAA+I;IAC/I,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC;IACrD,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,oBAAY,OAAO;IACjB,OAAO,IAAI;IACX,YAAY,IAAS;IACrB,KAAK,IAAS;IACd,GAAG,IAAuB;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC;IAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,mBAAmB,KACrB,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,MAAM,gBAAgB,GAAG,CAC7B,YAAY,EAAE,mBAAmB,GAAG,MAAM,KACvC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,GAAG,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC1H;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IACjE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,cAAc,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export var Inherit;
|
|
2
|
+
(function (Inherit) {
|
|
3
|
+
Inherit[Inherit["Nothing"] = 0] = "Nothing";
|
|
4
|
+
Inherit[Inherit["Conversation"] = 1] = "Conversation";
|
|
5
|
+
Inherit[Inherit["Tools"] = 2] = "Tools";
|
|
6
|
+
Inherit[Inherit["All"] = 3] = "All";
|
|
7
|
+
})(Inherit || (Inherit = {}));
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwGA,MAAM,CAAN,IAAY,OAKX;AALD,WAAY,OAAO;IACjB,2CAAW,CAAA;IACX,qDAAqB,CAAA;IACrB,uCAAc,CAAA;IACd,mCAA0B,CAAA;AAC5B,CAAC,EALW,OAAO,KAAP,OAAO,QAKlB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type RateLimitConfig = {
|
|
2
|
+
rps: number;
|
|
3
|
+
burst: number;
|
|
4
|
+
concurrency: number;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* creates a rate limiter that wraps async functions with burst, rate, and concurrency controls
|
|
8
|
+
*
|
|
9
|
+
* @param config - rate limit configuration
|
|
10
|
+
* @param config.rps - maximum requests per second
|
|
11
|
+
* @param config.burst - maximum burst size (initial token bucket capacity)
|
|
12
|
+
* @param config.concurrency - maximum concurrent in-flight requests
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });
|
|
16
|
+
*
|
|
17
|
+
* const workflow = limiter(
|
|
18
|
+
* compose(
|
|
19
|
+
* scope({ tools: [searchTool] }, model())
|
|
20
|
+
* )
|
|
21
|
+
* );
|
|
22
|
+
*
|
|
23
|
+
* await workflow("hello");
|
|
24
|
+
*/
|
|
25
|
+
export declare const rateLimited: (config: RateLimitConfig) => <T extends (...args: any[]) => Promise<any>>(fn: T) => T;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=rateLimited.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimited.d.ts","sourceRoot":"","sources":["../../src/utils/rateLimited.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW,GACrB,QAAQ,eAAe,MACvB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAG,CA6DpD,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* creates a rate limiter that wraps async functions with burst, rate, and concurrency controls
|
|
3
|
+
*
|
|
4
|
+
* @param config - rate limit configuration
|
|
5
|
+
* @param config.rps - maximum requests per second
|
|
6
|
+
* @param config.burst - maximum burst size (initial token bucket capacity)
|
|
7
|
+
* @param config.concurrency - maximum concurrent in-flight requests
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });
|
|
11
|
+
*
|
|
12
|
+
* const workflow = limiter(
|
|
13
|
+
* compose(
|
|
14
|
+
* scope({ tools: [searchTool] }, model())
|
|
15
|
+
* )
|
|
16
|
+
* );
|
|
17
|
+
*
|
|
18
|
+
* await workflow("hello");
|
|
19
|
+
*/
|
|
20
|
+
export const rateLimited = (config) => (fn) => {
|
|
21
|
+
const { rps, burst, concurrency } = config;
|
|
22
|
+
let tokens = burst;
|
|
23
|
+
let inFlight = 0;
|
|
24
|
+
const queue = [];
|
|
25
|
+
let intervalId = null;
|
|
26
|
+
const refillTokens = () => {
|
|
27
|
+
tokens = Math.min(tokens + 1, burst);
|
|
28
|
+
processQueue();
|
|
29
|
+
};
|
|
30
|
+
const startInterval = () => {
|
|
31
|
+
if (!intervalId) {
|
|
32
|
+
intervalId = setInterval(refillTokens, 1000 / rps);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const stopInterval = () => {
|
|
36
|
+
if (intervalId && queue.length === 0 && inFlight === 0) {
|
|
37
|
+
clearInterval(intervalId);
|
|
38
|
+
intervalId = null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const processQueue = () => {
|
|
42
|
+
while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {
|
|
43
|
+
tokens--;
|
|
44
|
+
inFlight++;
|
|
45
|
+
const item = queue.shift();
|
|
46
|
+
item
|
|
47
|
+
.fn()
|
|
48
|
+
.then((result) => {
|
|
49
|
+
inFlight--;
|
|
50
|
+
item.resolve(result);
|
|
51
|
+
processQueue();
|
|
52
|
+
stopInterval();
|
|
53
|
+
})
|
|
54
|
+
.catch((error) => {
|
|
55
|
+
inFlight--;
|
|
56
|
+
item.reject(error);
|
|
57
|
+
processQueue();
|
|
58
|
+
stopInterval();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
return (async (...args) => {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
queue.push({
|
|
65
|
+
fn: () => fn(...args),
|
|
66
|
+
resolve,
|
|
67
|
+
reject,
|
|
68
|
+
});
|
|
69
|
+
startInterval();
|
|
70
|
+
processQueue();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=rateLimited.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimited.js","sourceRoot":"","sources":["../../src/utils/rateLimited.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,WAAW,GACtB,CAAC,MAAuB,EAAE,EAAE,CAC5B,CAA6C,EAAK,EAAK,EAAE;IACvD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAE3C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,UAAU,GAA0B,IAAI,CAAC;IAE7C,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,WAAW,CAAC,YAAY,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACvD,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;YAChE,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,CAAC;YAEX,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAE5B,IAAI;iBACD,EAAE,EAAE;iBACJ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,QAAQ,EAAE,CAAC;gBACX,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrB,YAAY,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;YACjB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,QAAQ,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnB,YAAY,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;gBACrB,OAAO;gBACP,MAAM;aACP,CAAC,CAAC;YACH,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAM,CAAC;AACV,CAAC,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ApiKeys, ParsedModel, TokenUsage, ToolConfig, ToolDefinition } from "./types";
|
|
2
|
+
export declare const toolConfigToToolDefinition: (tool: ToolConfig) => ToolDefinition;
|
|
3
|
+
export declare const parseModelName: (model: string) => ParsedModel;
|
|
4
|
+
export declare const setKeys: (keys: ApiKeys) => void;
|
|
5
|
+
export declare const getKey: (provider: string) => string;
|
|
6
|
+
export declare const maxCalls: (toolConfig: ToolConfig, maxCalls: number) => ToolConfig;
|
|
7
|
+
export declare const addUsage: (existing: TokenUsage | undefined, promptTokens: number, completionTokens: number, totalTokens: number) => TokenUsage;
|
|
8
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,WAAW,EAEX,UAAU,EACV,UAAU,EACV,cAAc,EACf,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,0BAA0B,GACrC,MAAM,UAAU,KACf,cA2BF,CAAC;AA6BF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,WAW9C,CAAC;AAIF,eAAO,MAAM,OAAO,GAAI,MAAM,OAAO,KAAG,IAEvC,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,UAAU,MAAM,KAAG,MAMzC,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,YAAY,UAAU,EAAE,UAAU,MAAM,KAAG,UAGlE,CAAC;AAEH,eAAO,MAAM,QAAQ,GACnB,UAAU,UAAU,GAAG,SAAS,EAChC,cAAc,MAAM,EACpB,kBAAkB,MAAM,EACxB,aAAa,MAAM,KAClB,UAID,CAAC"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { isStandardSchema, convertStandardSchemaToSchemaProperties } from "./schema";
|
|
2
|
+
export const toolConfigToToolDefinition = (tool) => {
|
|
3
|
+
const schema = isStandardSchema(tool.schema)
|
|
4
|
+
? convertStandardSchemaToSchemaProperties(tool.schema)
|
|
5
|
+
: tool.schema;
|
|
6
|
+
const properties = {};
|
|
7
|
+
const required = [];
|
|
8
|
+
for (const [key, prop] of Object.entries(schema)) {
|
|
9
|
+
properties[key] = convertSchemaProperty(prop);
|
|
10
|
+
if (!prop.optional) {
|
|
11
|
+
required.push(key);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
type: "function",
|
|
16
|
+
function: {
|
|
17
|
+
name: tool.name,
|
|
18
|
+
description: tool.description,
|
|
19
|
+
parameters: {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties,
|
|
22
|
+
...(required.length > 0 && { required }),
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
const convertSchemaProperty = (prop) => {
|
|
28
|
+
const result = {
|
|
29
|
+
type: prop.type,
|
|
30
|
+
};
|
|
31
|
+
if (prop.description) {
|
|
32
|
+
result.description = prop.description;
|
|
33
|
+
}
|
|
34
|
+
if (prop.enum) {
|
|
35
|
+
result.enum = prop.enum;
|
|
36
|
+
}
|
|
37
|
+
if (prop.items) {
|
|
38
|
+
result.items = convertSchemaProperty(prop.items);
|
|
39
|
+
}
|
|
40
|
+
if (prop.properties) {
|
|
41
|
+
result.properties = {};
|
|
42
|
+
for (const [key, childProp] of Object.entries(prop.properties)) {
|
|
43
|
+
result.properties[key] = convertSchemaProperty(childProp);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
export const parseModelName = (model) => {
|
|
49
|
+
const parts = model.split("/");
|
|
50
|
+
if (parts.length === 1) {
|
|
51
|
+
return { provider: "huggingface", model: parts[0] };
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
provider: parts[0],
|
|
55
|
+
model: parts.slice(1).join("/"),
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
let globalKeys = {};
|
|
59
|
+
export const setKeys = (keys) => {
|
|
60
|
+
globalKeys = { ...globalKeys, ...keys };
|
|
61
|
+
};
|
|
62
|
+
export const getKey = (provider) => {
|
|
63
|
+
const key = globalKeys[provider.toLowerCase()];
|
|
64
|
+
if (!key) {
|
|
65
|
+
throw new Error(`No API key configured for provider: ${provider}`);
|
|
66
|
+
}
|
|
67
|
+
return key;
|
|
68
|
+
};
|
|
69
|
+
export const maxCalls = (toolConfig, maxCalls) => ({
|
|
70
|
+
...toolConfig,
|
|
71
|
+
_maxCalls: maxCalls,
|
|
72
|
+
});
|
|
73
|
+
export const addUsage = (existing, promptTokens, completionTokens, totalTokens) => ({
|
|
74
|
+
promptTokens: (existing?.promptTokens || 0) + promptTokens,
|
|
75
|
+
completionTokens: (existing?.completionTokens || 0) + completionTokens,
|
|
76
|
+
totalTokens: (existing?.totalTokens || 0) + totalTokens,
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,27 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@threaded/ai",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Composable LLM inference with multi-provider support, tool execution, streaming, and approval workflows",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
6
17
|
"scripts": {
|
|
7
|
-
"build": "
|
|
8
|
-
"test": "vitest",
|
|
9
|
-
"test:
|
|
18
|
+
"build": "tsc -p tsconfig.json",
|
|
19
|
+
"test": "vitest --reporter=verbose --run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
10
22
|
},
|
|
11
|
-
"
|
|
12
|
-
"author": "",
|
|
23
|
+
"author": "nvms",
|
|
13
24
|
"license": "ISC",
|
|
14
|
-
"
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=18"
|
|
27
|
+
},
|
|
15
28
|
"dependencies": {
|
|
16
|
-
"@huggingface/transformers": "^3.7.5",
|
|
17
29
|
"zod": "^4.1.11"
|
|
18
30
|
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@huggingface/transformers": "^3.0.0",
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependenciesMeta": {
|
|
36
|
+
"@huggingface/transformers": {
|
|
37
|
+
"optional": true
|
|
38
|
+
},
|
|
39
|
+
"@modelcontextprotocol/sdk": {
|
|
40
|
+
"optional": true
|
|
41
|
+
}
|
|
42
|
+
},
|
|
19
43
|
"devDependencies": {
|
|
44
|
+
"@huggingface/transformers": "^3.7.5",
|
|
20
45
|
"@modelcontextprotocol/sdk": "^1.18.2",
|
|
21
46
|
"@types/node": "^24.5.2",
|
|
22
|
-
"@vitest/ui": "^3.2.4",
|
|
23
|
-
"tsup": "^8.5.0",
|
|
24
|
-
"tsx": "^4.20.6",
|
|
25
47
|
"typescript": "^5.9.2",
|
|
26
48
|
"vitest": "^3.2.4"
|
|
27
49
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"WebSearch",
|
|
5
|
-
"WebFetch(domain:platform.openai.com)",
|
|
6
|
-
"WebFetch(domain:docs.anthropic.com)",
|
|
7
|
-
"WebFetch(domain:ai.google.dev)",
|
|
8
|
-
"WebFetch(domain:docs.x.ai)",
|
|
9
|
-
"WebFetch(domain:docs.cloud.google.com)",
|
|
10
|
-
"WebFetch(domain:latenode.com)",
|
|
11
|
-
"WebFetch(domain:github.com)",
|
|
12
|
-
"WebFetch(domain:docs.aimlapi.com)"
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
}
|
package/.lore
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
-- core pattern --
|
|
2
|
-
|
|
3
|
-
everything is built on compose/scope/model. compose chains steps, scope isolates context, model calls an LLM.
|
|
4
|
-
|
|
5
|
-
```js
|
|
6
|
-
const workflow = compose(
|
|
7
|
-
scope({ system: "...", tools: [...] }, model({ model: "openai/gpt-4o" }))
|
|
8
|
-
)
|
|
9
|
-
const ctx = await workflow("user message")
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
-- key setup --
|
|
13
|
-
|
|
14
|
-
must call setKeys() before any model() call, or set env vars (OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, XAI_API_KEY)
|
|
15
|
-
|
|
16
|
-
```js
|
|
17
|
-
import { setKeys } from "@threaded/ai"
|
|
18
|
-
setKeys({ openai: process.env.OPENAI_API_KEY })
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
-- model naming --
|
|
22
|
-
|
|
23
|
-
always "provider/model-name": openai/gpt-4o, anthropic/claude-sonnet-4-5-20250929, google/gemini-2.5-flash, xai/grok-4-1-fast-non-reasoning. no prefix defaults to huggingface.
|
|
24
|
-
|
|
25
|
-
-- structured output --
|
|
26
|
-
|
|
27
|
-
pass schema (zod or json schema) to model(). response comes back as JSON in lastResponse.content. claude wraps it in markdown code fences - strip them before JSON.parse.
|
|
28
|
-
|
|
29
|
-
```js
|
|
30
|
-
function extractResult(ctx) {
|
|
31
|
-
const last = ctx.history?.findLast(m => m.role === 'assistant')
|
|
32
|
-
if (!last?.content) return null
|
|
33
|
-
let text = typeof last.content === 'string' ? last.content : last.content[0]?.text || ''
|
|
34
|
-
const fenced = text.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/)
|
|
35
|
-
if (fenced) text = fenced[1]
|
|
36
|
-
return JSON.parse(text.trim())
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
-- pitfalls --
|
|
41
|
-
|
|
42
|
-
do NOT use Inherit.Nothing - it drops the user prompt entirely. use Inherit.Conversation (default) instead.
|
|
43
|
-
|
|
44
|
-
until: noToolsCalled() loops can cause runaway API calls (5-6+ per invocation). use maxCalls() on tools to limit.
|
|
45
|
-
|
|
46
|
-
silent scopes run analysis without polluting chat history but still accumulate token usage on ctx.usage.
|
|
47
|
-
|
|
48
|
-
events are local only in the scope where stream callback is set. nested silent scopes with their own stream get their own events.
|
|
49
|
-
|
|
50
|
-
-- rate limiting --
|
|
51
|
-
|
|
52
|
-
anthropic tier 1 has very low limits (30K input tokens/min). when using anthropic, add delays between calls and use maxCalls() aggressively. 90s backoff on rate limit errors.
|
|
53
|
-
|
|
54
|
-
-- token usage --
|
|
55
|
-
|
|
56
|
-
ctx.usage accumulates across all model() calls, tool loops, and nested scopes. always available after workflow completes:
|
|
57
|
-
{ promptTokens, completionTokens, totalTokens }
|
|
58
|
-
|
|
59
|
-
-- integration patterns --
|
|
60
|
-
|
|
61
|
-
SSE streaming: pass stream callback in scope config, write events to res as `data: ${JSON.stringify(event)}\n\n`
|
|
62
|
-
|
|
63
|
-
tool approval: use toolConfig.requireApproval + approvalCallback for gating dangerous tool execution in web UIs
|
|
64
|
-
|
|
65
|
-
MCP tools: createMCPTools(client) converts MCP server tools to native format. tools are prefixed with server name.
|