@tanstack/ai 0.0.1
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/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/esm/base-adapter.d.ts +35 -0
- package/dist/esm/base-adapter.js +12 -0
- package/dist/esm/base-adapter.js.map +1 -0
- package/dist/esm/core/chat-common-options.d.ts +52 -0
- package/dist/esm/core/chat.d.ts +30 -0
- package/dist/esm/core/chat.js +533 -0
- package/dist/esm/core/chat.js.map +1 -0
- package/dist/esm/core/embedding.d.ts +8 -0
- package/dist/esm/core/embedding.js +33 -0
- package/dist/esm/core/embedding.js.map +1 -0
- package/dist/esm/core/summarize.d.ts +9 -0
- package/dist/esm/core/summarize.js +36 -0
- package/dist/esm/core/summarize.js.map +1 -0
- package/dist/esm/event-client.d.ts +311 -0
- package/dist/esm/event-client.js +62 -0
- package/dist/esm/event-client.js.map +1 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.js +50 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/message-converters.d.ts +52 -0
- package/dist/esm/message-converters.js +162 -0
- package/dist/esm/message-converters.js.map +1 -0
- package/dist/esm/stream/index.d.ts +11 -0
- package/dist/esm/stream/json-parser.d.ts +38 -0
- package/dist/esm/stream/json-parser.js +28 -0
- package/dist/esm/stream/json-parser.js.map +1 -0
- package/dist/esm/stream/message-updaters.d.ts +44 -0
- package/dist/esm/stream/message-updaters.js +141 -0
- package/dist/esm/stream/message-updaters.js.map +1 -0
- package/dist/esm/stream/processor.d.ts +242 -0
- package/dist/esm/stream/processor.js +693 -0
- package/dist/esm/stream/processor.js.map +1 -0
- package/dist/esm/stream/strategies.d.ts +43 -0
- package/dist/esm/stream/strategies.js +54 -0
- package/dist/esm/stream/strategies.js.map +1 -0
- package/dist/esm/stream/types.d.ts +71 -0
- package/dist/esm/tools/tool-calls.d.ts +112 -0
- package/dist/esm/tools/tool-calls.js +302 -0
- package/dist/esm/tools/tool-calls.js.map +1 -0
- package/dist/esm/tools/tool-definition.d.ts +125 -0
- package/dist/esm/tools/tool-definition.js +25 -0
- package/dist/esm/tools/tool-definition.js.map +1 -0
- package/dist/esm/tools/zod-converter.d.ts +30 -0
- package/dist/esm/tools/zod-converter.js +36 -0
- package/dist/esm/tools/zod-converter.js.map +1 -0
- package/dist/esm/types.d.ts +619 -0
- package/dist/esm/utilities/agent-loop-strategies.d.ts +59 -0
- package/dist/esm/utilities/agent-loop-strategies.js +23 -0
- package/dist/esm/utilities/agent-loop-strategies.js.map +1 -0
- package/dist/esm/utilities/chat-options.d.ts +6 -0
- package/dist/esm/utilities/chat-options.js +7 -0
- package/dist/esm/utilities/chat-options.js.map +1 -0
- package/dist/esm/utilities/messages.d.ts +30 -0
- package/dist/esm/utilities/messages.js +7 -0
- package/dist/esm/utilities/messages.js.map +1 -0
- package/dist/esm/utilities/stream-to-response.d.ts +48 -0
- package/dist/esm/utilities/stream-to-response.js +62 -0
- package/dist/esm/utilities/stream-to-response.js.map +1 -0
- package/package.json +65 -0
- package/src/base-adapter.ts +85 -0
- package/src/core/chat-common-options.ts +55 -0
- package/src/core/chat.ts +771 -0
- package/src/core/embedding.ts +54 -0
- package/src/core/summarize.ts +56 -0
- package/src/event-client.ts +389 -0
- package/src/index.ts +68 -0
- package/src/message-converters.ts +285 -0
- package/src/stream/index.ts +41 -0
- package/src/stream/json-parser.ts +58 -0
- package/src/stream/message-updaters.ts +275 -0
- package/src/stream/processor.ts +1092 -0
- package/src/stream/strategies.ts +78 -0
- package/src/stream/types.ts +94 -0
- package/src/tools/tool-calls.ts +471 -0
- package/src/tools/tool-definition.ts +206 -0
- package/src/tools/zod-converter.ts +85 -0
- package/src/types.ts +872 -0
- package/src/utilities/agent-loop-strategies.ts +85 -0
- package/src/utilities/chat-options.ts +35 -0
- package/src/utilities/messages.ts +63 -0
- package/src/utilities/stream-to-response.ts +116 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { aiEventClient } from "../event-client.js";
|
|
2
|
+
function createId(prefix) {
|
|
3
|
+
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
4
|
+
}
|
|
5
|
+
async function summarize(options) {
|
|
6
|
+
const { adapter, model, text, ...restOptions } = options;
|
|
7
|
+
const requestId = createId("summarize");
|
|
8
|
+
const inputLength = text.length;
|
|
9
|
+
const startTime = Date.now();
|
|
10
|
+
aiEventClient.emit("summarize:started", {
|
|
11
|
+
requestId,
|
|
12
|
+
model,
|
|
13
|
+
inputLength,
|
|
14
|
+
timestamp: startTime
|
|
15
|
+
});
|
|
16
|
+
const result = await adapter.summarize({
|
|
17
|
+
...restOptions,
|
|
18
|
+
text,
|
|
19
|
+
model
|
|
20
|
+
});
|
|
21
|
+
const duration = Date.now() - startTime;
|
|
22
|
+
const outputLength = result.summary.length;
|
|
23
|
+
aiEventClient.emit("summarize:completed", {
|
|
24
|
+
requestId,
|
|
25
|
+
model,
|
|
26
|
+
inputLength,
|
|
27
|
+
outputLength,
|
|
28
|
+
duration,
|
|
29
|
+
timestamp: Date.now()
|
|
30
|
+
});
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
summarize
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.js","sources":["../../../src/core/summarize.ts"],"sourcesContent":["import { aiEventClient } from '../event-client.js'\nimport type {\n AIAdapter,\n ExtractModelsFromAdapter,\n SummarizationOptions,\n SummarizationResult,\n} from '../types'\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Standalone summarize function with type inference from adapter\n */\nexport async function summarize<\n TAdapter extends AIAdapter<any, any, any, any, any>,\n>(\n options: Omit<SummarizationOptions, 'model'> & {\n adapter: TAdapter\n model: ExtractModelsFromAdapter<TAdapter>\n text: string\n },\n): Promise<SummarizationResult> {\n const { adapter, model, text, ...restOptions } = options\n const requestId = createId('summarize')\n const inputLength = text.length\n const startTime = Date.now()\n\n aiEventClient.emit('summarize:started', {\n requestId,\n model: model as string,\n inputLength,\n timestamp: startTime,\n })\n\n const result = await adapter.summarize({\n ...restOptions,\n text,\n model: model as string,\n })\n\n const duration = Date.now() - startTime\n const outputLength = result.summary.length\n\n aiEventClient.emit('summarize:completed', {\n requestId,\n model: model as string,\n inputLength,\n outputLength,\n duration,\n timestamp: Date.now(),\n })\n\n return result\n}\n"],"names":[],"mappings":";AAQA,SAAS,SAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1E;AAKA,eAAsB,UAGpB,SAK8B;AAC9B,QAAM,EAAE,SAAS,OAAO,MAAM,GAAG,gBAAgB;AACjD,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,cAAc,KAAK;AACzB,QAAM,YAAY,KAAK,IAAA;AAEvB,gBAAc,KAAK,qBAAqB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EAAA,CACZ;AAED,QAAM,SAAS,MAAM,QAAQ,UAAU;AAAA,IACrC,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,QAAM,eAAe,OAAO,QAAQ;AAEpC,gBAAc,KAAK,uBAAuB;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAA;AAAA,EAAI,CACrB;AAED,SAAO;AACT;"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { EventClient } from '@tanstack/devtools-event-client';
|
|
2
|
+
/**
|
|
3
|
+
* Tool call states - track the lifecycle of a tool call
|
|
4
|
+
* Must match @tanstack/ai-client ToolCallState
|
|
5
|
+
*/
|
|
6
|
+
type ToolCallState = 'awaiting-input' | 'input-streaming' | 'input-complete' | 'approval-requested' | 'approval-responded';
|
|
7
|
+
/**
|
|
8
|
+
* Tool result states - track the lifecycle of a tool result
|
|
9
|
+
* Must match @tanstack/ai-client ToolResultState
|
|
10
|
+
*/
|
|
11
|
+
type ToolResultState = 'streaming' | 'complete' | 'error';
|
|
12
|
+
export interface AIDevtoolsEventMap {
|
|
13
|
+
'tanstack-ai-devtools:stream:started': {
|
|
14
|
+
streamId: string;
|
|
15
|
+
model: string;
|
|
16
|
+
provider: string;
|
|
17
|
+
timestamp: number;
|
|
18
|
+
clientId?: string;
|
|
19
|
+
};
|
|
20
|
+
'tanstack-ai-devtools:stream:chunk:content': {
|
|
21
|
+
streamId: string;
|
|
22
|
+
messageId?: string;
|
|
23
|
+
content: string;
|
|
24
|
+
delta?: string;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
};
|
|
27
|
+
'tanstack-ai-devtools:stream:chunk:tool-call': {
|
|
28
|
+
streamId: string;
|
|
29
|
+
messageId?: string;
|
|
30
|
+
toolCallId: string;
|
|
31
|
+
toolName: string;
|
|
32
|
+
index: number;
|
|
33
|
+
arguments: string;
|
|
34
|
+
timestamp: number;
|
|
35
|
+
};
|
|
36
|
+
'tanstack-ai-devtools:stream:chunk:tool-result': {
|
|
37
|
+
streamId: string;
|
|
38
|
+
messageId?: string;
|
|
39
|
+
toolCallId: string;
|
|
40
|
+
result: string;
|
|
41
|
+
timestamp: number;
|
|
42
|
+
};
|
|
43
|
+
'tanstack-ai-devtools:stream:chunk:done': {
|
|
44
|
+
streamId: string;
|
|
45
|
+
messageId?: string;
|
|
46
|
+
finishReason: string | null;
|
|
47
|
+
usage?: {
|
|
48
|
+
promptTokens: number;
|
|
49
|
+
completionTokens: number;
|
|
50
|
+
totalTokens: number;
|
|
51
|
+
};
|
|
52
|
+
timestamp: number;
|
|
53
|
+
};
|
|
54
|
+
'tanstack-ai-devtools:stream:chunk:error': {
|
|
55
|
+
streamId: string;
|
|
56
|
+
messageId?: string;
|
|
57
|
+
error: string;
|
|
58
|
+
timestamp: number;
|
|
59
|
+
};
|
|
60
|
+
'tanstack-ai-devtools:stream:chunk:thinking': {
|
|
61
|
+
streamId: string;
|
|
62
|
+
messageId?: string;
|
|
63
|
+
content: string;
|
|
64
|
+
delta?: string;
|
|
65
|
+
timestamp: number;
|
|
66
|
+
};
|
|
67
|
+
'tanstack-ai-devtools:stream:approval-requested': {
|
|
68
|
+
streamId: string;
|
|
69
|
+
messageId?: string;
|
|
70
|
+
toolCallId: string;
|
|
71
|
+
toolName: string;
|
|
72
|
+
input: any;
|
|
73
|
+
approvalId: string;
|
|
74
|
+
timestamp: number;
|
|
75
|
+
};
|
|
76
|
+
'tanstack-ai-devtools:stream:tool-input-available': {
|
|
77
|
+
streamId: string;
|
|
78
|
+
messageId?: string;
|
|
79
|
+
toolCallId: string;
|
|
80
|
+
toolName: string;
|
|
81
|
+
input: any;
|
|
82
|
+
timestamp: number;
|
|
83
|
+
};
|
|
84
|
+
'tanstack-ai-devtools:tool:call-completed': {
|
|
85
|
+
requestId: string;
|
|
86
|
+
streamId: string;
|
|
87
|
+
messageId?: string;
|
|
88
|
+
toolCallId: string;
|
|
89
|
+
toolName: string;
|
|
90
|
+
result: any;
|
|
91
|
+
duration: number;
|
|
92
|
+
timestamp: number;
|
|
93
|
+
};
|
|
94
|
+
'tanstack-ai-devtools:stream:ended': {
|
|
95
|
+
requestId: string;
|
|
96
|
+
streamId: string;
|
|
97
|
+
totalChunks: number;
|
|
98
|
+
duration: number;
|
|
99
|
+
timestamp: number;
|
|
100
|
+
};
|
|
101
|
+
'tanstack-ai-devtools:chat:started': {
|
|
102
|
+
requestId: string;
|
|
103
|
+
streamId: string;
|
|
104
|
+
provider: string;
|
|
105
|
+
model: string;
|
|
106
|
+
messageCount: number;
|
|
107
|
+
hasTools: boolean;
|
|
108
|
+
streaming: boolean;
|
|
109
|
+
timestamp: number;
|
|
110
|
+
clientId?: string;
|
|
111
|
+
toolNames?: Array<string>;
|
|
112
|
+
options?: Record<string, unknown>;
|
|
113
|
+
providerOptions?: Record<string, unknown>;
|
|
114
|
+
};
|
|
115
|
+
'tanstack-ai-devtools:chat:completed': {
|
|
116
|
+
requestId: string;
|
|
117
|
+
streamId: string;
|
|
118
|
+
model: string;
|
|
119
|
+
content: string;
|
|
120
|
+
messageId?: string;
|
|
121
|
+
finishReason?: string;
|
|
122
|
+
usage?: {
|
|
123
|
+
promptTokens: number;
|
|
124
|
+
completionTokens: number;
|
|
125
|
+
totalTokens: number;
|
|
126
|
+
};
|
|
127
|
+
timestamp: number;
|
|
128
|
+
};
|
|
129
|
+
'tanstack-ai-devtools:chat:iteration': {
|
|
130
|
+
requestId: string;
|
|
131
|
+
streamId: string;
|
|
132
|
+
iterationNumber: number;
|
|
133
|
+
messageCount: number;
|
|
134
|
+
toolCallCount: number;
|
|
135
|
+
timestamp: number;
|
|
136
|
+
};
|
|
137
|
+
'tanstack-ai-devtools:usage:tokens': {
|
|
138
|
+
requestId: string;
|
|
139
|
+
streamId: string;
|
|
140
|
+
model: string;
|
|
141
|
+
messageId?: string;
|
|
142
|
+
usage: {
|
|
143
|
+
promptTokens: number;
|
|
144
|
+
completionTokens: number;
|
|
145
|
+
totalTokens: number;
|
|
146
|
+
};
|
|
147
|
+
timestamp: number;
|
|
148
|
+
};
|
|
149
|
+
'tanstack-ai-devtools:embedding:started': {
|
|
150
|
+
requestId: string;
|
|
151
|
+
model: string;
|
|
152
|
+
inputCount: number;
|
|
153
|
+
timestamp: number;
|
|
154
|
+
clientId?: string;
|
|
155
|
+
};
|
|
156
|
+
'tanstack-ai-devtools:embedding:completed': {
|
|
157
|
+
requestId: string;
|
|
158
|
+
model: string;
|
|
159
|
+
inputCount: number;
|
|
160
|
+
duration: number;
|
|
161
|
+
timestamp: number;
|
|
162
|
+
};
|
|
163
|
+
'tanstack-ai-devtools:summarize:started': {
|
|
164
|
+
requestId: string;
|
|
165
|
+
model: string;
|
|
166
|
+
inputLength: number;
|
|
167
|
+
timestamp: number;
|
|
168
|
+
clientId?: string;
|
|
169
|
+
};
|
|
170
|
+
'tanstack-ai-devtools:summarize:completed': {
|
|
171
|
+
requestId: string;
|
|
172
|
+
model: string;
|
|
173
|
+
inputLength: number;
|
|
174
|
+
outputLength: number;
|
|
175
|
+
duration: number;
|
|
176
|
+
timestamp: number;
|
|
177
|
+
};
|
|
178
|
+
'tanstack-ai-devtools:client:created': {
|
|
179
|
+
clientId: string;
|
|
180
|
+
initialMessageCount: number;
|
|
181
|
+
timestamp: number;
|
|
182
|
+
};
|
|
183
|
+
'tanstack-ai-devtools:client:message-appended': {
|
|
184
|
+
clientId: string;
|
|
185
|
+
messageId: string;
|
|
186
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
187
|
+
contentPreview: string;
|
|
188
|
+
timestamp: number;
|
|
189
|
+
};
|
|
190
|
+
'tanstack-ai-devtools:client:message-sent': {
|
|
191
|
+
clientId: string;
|
|
192
|
+
messageId: string;
|
|
193
|
+
content: string;
|
|
194
|
+
timestamp: number;
|
|
195
|
+
};
|
|
196
|
+
'tanstack-ai-devtools:client:loading-changed': {
|
|
197
|
+
clientId: string;
|
|
198
|
+
isLoading: boolean;
|
|
199
|
+
timestamp: number;
|
|
200
|
+
};
|
|
201
|
+
'tanstack-ai-devtools:client:error-changed': {
|
|
202
|
+
clientId: string;
|
|
203
|
+
error: string | null;
|
|
204
|
+
timestamp: number;
|
|
205
|
+
};
|
|
206
|
+
'tanstack-ai-devtools:client:messages-cleared': {
|
|
207
|
+
clientId: string;
|
|
208
|
+
timestamp: number;
|
|
209
|
+
};
|
|
210
|
+
'tanstack-ai-devtools:client:reloaded': {
|
|
211
|
+
clientId: string;
|
|
212
|
+
fromMessageIndex: number;
|
|
213
|
+
timestamp: number;
|
|
214
|
+
};
|
|
215
|
+
'tanstack-ai-devtools:client:stopped': {
|
|
216
|
+
clientId: string;
|
|
217
|
+
timestamp: number;
|
|
218
|
+
};
|
|
219
|
+
'tanstack-ai-devtools:tool:result-added': {
|
|
220
|
+
clientId: string;
|
|
221
|
+
toolCallId: string;
|
|
222
|
+
toolName: string;
|
|
223
|
+
output: any;
|
|
224
|
+
state: 'output-available' | 'output-error';
|
|
225
|
+
timestamp: number;
|
|
226
|
+
};
|
|
227
|
+
'tanstack-ai-devtools:tool:approval-responded': {
|
|
228
|
+
clientId: string;
|
|
229
|
+
approvalId: string;
|
|
230
|
+
toolCallId: string;
|
|
231
|
+
approved: boolean;
|
|
232
|
+
timestamp: number;
|
|
233
|
+
};
|
|
234
|
+
'tanstack-ai-devtools:processor:text-updated': {
|
|
235
|
+
streamId: string;
|
|
236
|
+
content: string;
|
|
237
|
+
timestamp: number;
|
|
238
|
+
};
|
|
239
|
+
'tanstack-ai-devtools:processor:tool-call-state-changed': {
|
|
240
|
+
streamId: string;
|
|
241
|
+
toolCallId: string;
|
|
242
|
+
toolName: string;
|
|
243
|
+
state: ToolCallState;
|
|
244
|
+
arguments: any;
|
|
245
|
+
timestamp: number;
|
|
246
|
+
};
|
|
247
|
+
'tanstack-ai-devtools:processor:tool-result-state-changed': {
|
|
248
|
+
streamId: string;
|
|
249
|
+
toolCallId: string;
|
|
250
|
+
content: any;
|
|
251
|
+
state: ToolResultState;
|
|
252
|
+
error?: string;
|
|
253
|
+
timestamp: number;
|
|
254
|
+
};
|
|
255
|
+
'tanstack-ai-devtools:client:assistant-message-updated': {
|
|
256
|
+
clientId: string;
|
|
257
|
+
messageId: string;
|
|
258
|
+
content: string;
|
|
259
|
+
timestamp: number;
|
|
260
|
+
};
|
|
261
|
+
'tanstack-ai-devtools:client:tool-call-updated': {
|
|
262
|
+
clientId: string;
|
|
263
|
+
messageId: string;
|
|
264
|
+
toolCallId: string;
|
|
265
|
+
toolName: string;
|
|
266
|
+
state: ToolCallState;
|
|
267
|
+
arguments: any;
|
|
268
|
+
timestamp: number;
|
|
269
|
+
};
|
|
270
|
+
'tanstack-ai-devtools:client:approval-requested': {
|
|
271
|
+
clientId: string;
|
|
272
|
+
messageId: string;
|
|
273
|
+
toolCallId: string;
|
|
274
|
+
toolName: string;
|
|
275
|
+
input: any;
|
|
276
|
+
approvalId: string;
|
|
277
|
+
timestamp: number;
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
type StripPrefix<T extends string> = T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never;
|
|
281
|
+
type EventSuffix = StripPrefix<keyof AIDevtoolsEventMap & string>;
|
|
282
|
+
declare class AiEventClient extends EventClient<AIDevtoolsEventMap> {
|
|
283
|
+
private eventTarget;
|
|
284
|
+
constructor();
|
|
285
|
+
/**
|
|
286
|
+
* Subscribe to events using both the parent EventClient and EventTarget API
|
|
287
|
+
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
288
|
+
* @param handler - The event handler function
|
|
289
|
+
* @param options - Optional configuration for event subscription
|
|
290
|
+
* @returns A function to unsubscribe from the event
|
|
291
|
+
*/
|
|
292
|
+
on<TSuffix extends EventSuffix>(eventSuffix: TSuffix, handler: (event: {
|
|
293
|
+
type: `tanstack-ai-devtools:${TSuffix}`;
|
|
294
|
+
payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`];
|
|
295
|
+
}) => void, options?: {
|
|
296
|
+
withEventTarget?: boolean;
|
|
297
|
+
}): () => void;
|
|
298
|
+
/**
|
|
299
|
+
* Emit an event to both the parent EventClient and the EventTarget
|
|
300
|
+
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
301
|
+
* @param data - The event data
|
|
302
|
+
*/
|
|
303
|
+
emit<TSuffix extends EventSuffix>(eventSuffix: TSuffix, data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`]): void;
|
|
304
|
+
/**
|
|
305
|
+
* Get the underlying EventTarget for advanced use cases
|
|
306
|
+
* @returns The EventTarget instance
|
|
307
|
+
*/
|
|
308
|
+
getEventTarget(): EventTarget;
|
|
309
|
+
}
|
|
310
|
+
declare const aiEventClient: AiEventClient;
|
|
311
|
+
export { aiEventClient };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { EventClient } from "@tanstack/devtools-event-client";
|
|
2
|
+
class AiEventClient extends EventClient {
|
|
3
|
+
constructor() {
|
|
4
|
+
super({
|
|
5
|
+
pluginId: "tanstack-ai-devtools"
|
|
6
|
+
});
|
|
7
|
+
this.eventTarget = new EventTarget();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Subscribe to events using both the parent EventClient and EventTarget API
|
|
11
|
+
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
12
|
+
* @param handler - The event handler function
|
|
13
|
+
* @param options - Optional configuration for event subscription
|
|
14
|
+
* @returns A function to unsubscribe from the event
|
|
15
|
+
*/
|
|
16
|
+
on(eventSuffix, handler, options) {
|
|
17
|
+
const parentUnsubscribe = super.on(eventSuffix, handler);
|
|
18
|
+
const withEventTarget = options?.withEventTarget ?? true;
|
|
19
|
+
let eventListener;
|
|
20
|
+
if (withEventTarget) {
|
|
21
|
+
eventListener = (event) => {
|
|
22
|
+
if (event instanceof CustomEvent) {
|
|
23
|
+
handler({
|
|
24
|
+
type: `${eventSuffix}`,
|
|
25
|
+
payload: event.detail
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
this.eventTarget.addEventListener(eventSuffix, eventListener);
|
|
30
|
+
}
|
|
31
|
+
return () => {
|
|
32
|
+
parentUnsubscribe();
|
|
33
|
+
if (withEventTarget && eventListener) {
|
|
34
|
+
this.eventTarget.removeEventListener(eventSuffix, eventListener);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Emit an event to both the parent EventClient and the EventTarget
|
|
40
|
+
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
41
|
+
* @param data - The event data
|
|
42
|
+
*/
|
|
43
|
+
emit(eventSuffix, data) {
|
|
44
|
+
super.emit(eventSuffix, data);
|
|
45
|
+
const customEvent = new CustomEvent(eventSuffix, {
|
|
46
|
+
detail: data
|
|
47
|
+
});
|
|
48
|
+
this.eventTarget.dispatchEvent(customEvent);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the underlying EventTarget for advanced use cases
|
|
52
|
+
* @returns The EventTarget instance
|
|
53
|
+
*/
|
|
54
|
+
getEventTarget() {
|
|
55
|
+
return this.eventTarget;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const aiEventClient = new AiEventClient();
|
|
59
|
+
export {
|
|
60
|
+
aiEventClient
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=event-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-client.js","sources":["../../src/event-client.ts"],"sourcesContent":["import { EventClient } from '@tanstack/devtools-event-client'\n\n/**\n * Tool call states - track the lifecycle of a tool call\n * Must match @tanstack/ai-client ToolCallState\n */\ntype ToolCallState =\n | 'awaiting-input' // Received start but no arguments yet\n | 'input-streaming' // Partial arguments received\n | 'input-complete' // All arguments received\n | 'approval-requested' // Waiting for user approval\n | 'approval-responded' // User has approved/denied\n\n/**\n * Tool result states - track the lifecycle of a tool result\n * Must match @tanstack/ai-client ToolResultState\n */\ntype ToolResultState =\n | 'streaming' // Placeholder for future streamed output\n | 'complete' // Result is complete\n | 'error' // Error occurred\n\nexport interface AIDevtoolsEventMap {\n // AI Stream events - from @tanstack/ai package\n 'tanstack-ai-devtools:stream:started': {\n streamId: string\n model: string\n provider: string\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:stream:chunk:content': {\n streamId: string\n messageId?: string\n content: string\n delta?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:tool-call': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n index: number\n arguments: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:tool-result': {\n streamId: string\n messageId?: string\n toolCallId: string\n result: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:done': {\n streamId: string\n messageId?: string\n finishReason: string | null\n usage?: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:error': {\n streamId: string\n messageId?: string\n error: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:thinking': {\n streamId: string\n messageId?: string\n content: string\n delta?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:approval-requested': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: any\n approvalId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:tool-input-available': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: any\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:call-completed': {\n requestId: string\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n result: any\n duration: number\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:ended': {\n requestId: string\n streamId: string\n totalChunks: number\n duration: number\n timestamp: number\n }\n 'tanstack-ai-devtools:chat:started': {\n requestId: string\n streamId: string\n provider: string\n model: string\n messageCount: number\n hasTools: boolean\n streaming: boolean\n timestamp: number\n clientId?: string\n toolNames?: Array<string>\n options?: Record<string, unknown>\n providerOptions?: Record<string, unknown>\n }\n 'tanstack-ai-devtools:chat:completed': {\n requestId: string\n streamId: string\n model: string\n content: string\n messageId?: string\n finishReason?: string\n usage?: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n 'tanstack-ai-devtools:chat:iteration': {\n requestId: string\n streamId: string\n iterationNumber: number\n messageCount: number\n toolCallCount: number\n timestamp: number\n }\n 'tanstack-ai-devtools:usage:tokens': {\n requestId: string\n streamId: string\n model: string\n messageId?: string\n usage: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n\n // Embedding events\n 'tanstack-ai-devtools:embedding:started': {\n requestId: string\n model: string\n inputCount: number\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:embedding:completed': {\n requestId: string\n model: string\n inputCount: number\n duration: number\n timestamp: number\n }\n\n // Summarize events\n 'tanstack-ai-devtools:summarize:started': {\n requestId: string\n model: string\n inputLength: number\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:summarize:completed': {\n requestId: string\n model: string\n inputLength: number\n outputLength: number\n duration: number\n timestamp: number\n }\n\n // Chat Client events - from @tanstack/ai-client package\n 'tanstack-ai-devtools:client:created': {\n clientId: string\n initialMessageCount: number\n timestamp: number\n }\n 'tanstack-ai-devtools:client:message-appended': {\n clientId: string\n messageId: string\n role: 'user' | 'assistant' | 'system' | 'tool'\n contentPreview: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:message-sent': {\n clientId: string\n messageId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:loading-changed': {\n clientId: string\n isLoading: boolean\n timestamp: number\n }\n 'tanstack-ai-devtools:client:error-changed': {\n clientId: string\n error: string | null\n timestamp: number\n }\n 'tanstack-ai-devtools:client:messages-cleared': {\n clientId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:reloaded': {\n clientId: string\n fromMessageIndex: number\n timestamp: number\n }\n 'tanstack-ai-devtools:client:stopped': {\n clientId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:result-added': {\n clientId: string\n toolCallId: string\n toolName: string\n output: any\n state: 'output-available' | 'output-error'\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:approval-responded': {\n clientId: string\n approvalId: string\n toolCallId: string\n approved: boolean\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:text-updated': {\n streamId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:tool-call-state-changed': {\n streamId: string\n toolCallId: string\n toolName: string\n state: ToolCallState\n arguments: any\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:tool-result-state-changed': {\n streamId: string\n toolCallId: string\n content: any\n state: ToolResultState\n error?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:assistant-message-updated': {\n clientId: string\n messageId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:tool-call-updated': {\n clientId: string\n messageId: string\n toolCallId: string\n toolName: string\n state: ToolCallState\n arguments: any\n timestamp: number\n }\n 'tanstack-ai-devtools:client:approval-requested': {\n clientId: string\n messageId: string\n toolCallId: string\n toolName: string\n input: any\n approvalId: string\n timestamp: number\n }\n}\n\n// Helper type to strip the prefix at the type level\ntype StripPrefix<T extends string> =\n T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never\n\n// Get all event names without the prefix\ntype EventSuffix = StripPrefix<keyof AIDevtoolsEventMap & string>\n\nclass AiEventClient extends EventClient<AIDevtoolsEventMap> {\n private eventTarget: EventTarget\n\n constructor() {\n super({\n pluginId: 'tanstack-ai-devtools',\n })\n this.eventTarget = new EventTarget()\n }\n\n /**\n * Subscribe to events using both the parent EventClient and EventTarget API\n * @param eventSuffix - The event name without the prefix (e.g., \"stream:started\")\n * @param handler - The event handler function\n * @param options - Optional configuration for event subscription\n * @returns A function to unsubscribe from the event\n */\n override on<TSuffix extends EventSuffix>(\n eventSuffix: TSuffix,\n handler: (event: {\n type: `tanstack-ai-devtools:${TSuffix}`\n payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`]\n }) => void,\n options?: { withEventTarget?: boolean },\n ): () => void {\n const parentUnsubscribe = super.on(eventSuffix, handler)\n\n const withEventTarget = options?.withEventTarget ?? true\n let eventListener: ((event: Event) => void) | undefined\n\n if (withEventTarget) {\n // Create a wrapper to handle CustomEvent for EventTarget\n eventListener = (event: Event) => {\n if (event instanceof CustomEvent) {\n handler({\n type: `${eventSuffix}` as `tanstack-ai-devtools:${TSuffix}`,\n payload: event.detail,\n })\n }\n }\n\n // Add listener to EventTarget\n this.eventTarget.addEventListener(eventSuffix, eventListener)\n }\n\n // Return unsubscribe function that cleans up both subscriptions\n return () => {\n parentUnsubscribe()\n if (withEventTarget && eventListener) {\n this.eventTarget.removeEventListener(eventSuffix, eventListener)\n }\n }\n }\n\n /**\n * Emit an event to both the parent EventClient and the EventTarget\n * @param eventSuffix - The event name without the prefix (e.g., \"stream:started\")\n * @param data - The event data\n */\n override emit<TSuffix extends EventSuffix>(\n eventSuffix: TSuffix,\n data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`],\n ): void {\n super.emit(eventSuffix, data)\n\n // Always dispatch to EventTarget (for local listeners)\n const customEvent = new CustomEvent(eventSuffix, {\n detail: data,\n })\n this.eventTarget.dispatchEvent(customEvent)\n }\n\n /**\n * Get the underlying EventTarget for advanced use cases\n * @returns The EventTarget instance\n */\n getEventTarget(): EventTarget {\n return this.eventTarget\n }\n}\n\nconst aiEventClient = new AiEventClient()\n\nexport { aiEventClient }\n"],"names":[],"mappings":";AAiTA,MAAM,sBAAsB,YAAgC;AAAA,EAG1D,cAAc;AACZ,UAAM;AAAA,MACJ,UAAU;AAAA,IAAA,CACX;AACD,SAAK,cAAc,IAAI,YAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASS,GACP,aACA,SAIA,SACY;AACZ,UAAM,oBAAoB,MAAM,GAAG,aAAa,OAAO;AAEvD,UAAM,kBAAkB,SAAS,mBAAmB;AACpD,QAAI;AAEJ,QAAI,iBAAiB;AAEnB,sBAAgB,CAAC,UAAiB;AAChC,YAAI,iBAAiB,aAAa;AAChC,kBAAQ;AAAA,YACN,MAAM,GAAG,WAAW;AAAA,YACpB,SAAS,MAAM;AAAA,UAAA,CAChB;AAAA,QACH;AAAA,MACF;AAGA,WAAK,YAAY,iBAAiB,aAAa,aAAa;AAAA,IAC9D;AAGA,WAAO,MAAM;AACX,wBAAA;AACA,UAAI,mBAAmB,eAAe;AACpC,aAAK,YAAY,oBAAoB,aAAa,aAAa;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,KACP,aACA,MACM;AACN,UAAM,KAAK,aAAa,IAAI;AAG5B,UAAM,cAAc,IAAI,YAAY,aAAa;AAAA,MAC/C,QAAQ;AAAA,IAAA,CACT;AACD,SAAK,YAAY,cAAc,WAAW;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AACF;AAEA,MAAM,gBAAgB,IAAI,cAAA;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { chat } from './core/chat.js';
|
|
2
|
+
export { summarize } from './core/summarize.js';
|
|
3
|
+
export { embedding } from './core/embedding.js';
|
|
4
|
+
export { toolDefinition, type ToolDefinition, type ToolDefinitionInstance, type ToolDefinitionConfig, type ServerTool, type ClientTool, type AnyClientTool, type InferToolName, type InferToolInput, type InferToolOutput, } from './tools/tool-definition.js';
|
|
5
|
+
export { convertZodToJsonSchema } from './tools/zod-converter.js';
|
|
6
|
+
export { toServerSentEventsStream, toStreamResponse, } from './utilities/stream-to-response.js';
|
|
7
|
+
export { BaseAdapter } from './base-adapter.js';
|
|
8
|
+
export { ToolCallManager } from './tools/tool-calls.js';
|
|
9
|
+
export { maxIterations, untilFinishReason, combineStrategies, } from './utilities/agent-loop-strategies.js';
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
export { chatOptions } from './utilities/chat-options.js';
|
|
12
|
+
export { messages } from './utilities/messages.js';
|
|
13
|
+
export { aiEventClient } from './event-client.js';
|
|
14
|
+
export { convertMessagesToModelMessages, uiMessageToModelMessages, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, generateMessageId, } from './message-converters.js';
|
|
15
|
+
export { StreamProcessor, createReplayStream, ImmediateStrategy, PunctuationStrategy, BatchStrategy, WordBoundaryStrategy, CompositeStrategy, PartialJSONParser, defaultJSONParser, parsePartialJSON, } from './stream.js';
|
|
16
|
+
export type { ChunkStrategy, ChunkRecording, InternalToolCallState, ProcessorResult, ProcessorState, StreamProcessorEvents, StreamProcessorHandlers, StreamProcessorOptions, ToolCallState, ToolResultState, JSONParser, } from './stream.js';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { chat } from "./core/chat.js";
|
|
2
|
+
import { summarize } from "./core/summarize.js";
|
|
3
|
+
import { embedding } from "./core/embedding.js";
|
|
4
|
+
import { toolDefinition } from "./tools/tool-definition.js";
|
|
5
|
+
import { convertZodToJsonSchema } from "./tools/zod-converter.js";
|
|
6
|
+
import { toServerSentEventsStream, toStreamResponse } from "./utilities/stream-to-response.js";
|
|
7
|
+
import { BaseAdapter } from "./base-adapter.js";
|
|
8
|
+
import { ToolCallManager } from "./tools/tool-calls.js";
|
|
9
|
+
import { combineStrategies, maxIterations, untilFinishReason } from "./utilities/agent-loop-strategies.js";
|
|
10
|
+
import { chatOptions } from "./utilities/chat-options.js";
|
|
11
|
+
import { messages } from "./utilities/messages.js";
|
|
12
|
+
import { aiEventClient } from "./event-client.js";
|
|
13
|
+
import { convertMessagesToModelMessages, generateMessageId, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, uiMessageToModelMessages } from "./message-converters.js";
|
|
14
|
+
import { StreamProcessor, createReplayStream } from "./stream/processor.js";
|
|
15
|
+
import { BatchStrategy, CompositeStrategy, ImmediateStrategy, PunctuationStrategy, WordBoundaryStrategy } from "./stream/strategies.js";
|
|
16
|
+
import { PartialJSONParser, defaultJSONParser, parsePartialJSON } from "./stream/json-parser.js";
|
|
17
|
+
export {
|
|
18
|
+
BaseAdapter,
|
|
19
|
+
BatchStrategy,
|
|
20
|
+
CompositeStrategy,
|
|
21
|
+
ImmediateStrategy,
|
|
22
|
+
PartialJSONParser,
|
|
23
|
+
PunctuationStrategy,
|
|
24
|
+
StreamProcessor,
|
|
25
|
+
ToolCallManager,
|
|
26
|
+
WordBoundaryStrategy,
|
|
27
|
+
aiEventClient,
|
|
28
|
+
chat,
|
|
29
|
+
chatOptions,
|
|
30
|
+
combineStrategies,
|
|
31
|
+
convertMessagesToModelMessages,
|
|
32
|
+
convertZodToJsonSchema,
|
|
33
|
+
createReplayStream,
|
|
34
|
+
defaultJSONParser,
|
|
35
|
+
embedding,
|
|
36
|
+
generateMessageId,
|
|
37
|
+
maxIterations,
|
|
38
|
+
messages,
|
|
39
|
+
modelMessageToUIMessage,
|
|
40
|
+
modelMessagesToUIMessages,
|
|
41
|
+
normalizeToUIMessage,
|
|
42
|
+
parsePartialJSON,
|
|
43
|
+
summarize,
|
|
44
|
+
toServerSentEventsStream,
|
|
45
|
+
toStreamResponse,
|
|
46
|
+
toolDefinition,
|
|
47
|
+
uiMessageToModelMessages,
|
|
48
|
+
untilFinishReason
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ModelMessage, UIMessage } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Convert UIMessages or ModelMessages to ModelMessages
|
|
4
|
+
*/
|
|
5
|
+
export declare function convertMessagesToModelMessages(messages: Array<UIMessage | ModelMessage>): Array<ModelMessage>;
|
|
6
|
+
/**
|
|
7
|
+
* Convert a UIMessage to ModelMessage(s)
|
|
8
|
+
*
|
|
9
|
+
* This conversion handles the parts-based structure:
|
|
10
|
+
* - Text parts → content field
|
|
11
|
+
* - ToolCall parts → toolCalls array
|
|
12
|
+
* - ToolResult parts → separate role="tool" messages
|
|
13
|
+
*
|
|
14
|
+
* @param uiMessage - The UIMessage to convert
|
|
15
|
+
* @returns An array of ModelMessages (may be multiple if tool results are present)
|
|
16
|
+
*/
|
|
17
|
+
export declare function uiMessageToModelMessages(uiMessage: UIMessage): Array<ModelMessage>;
|
|
18
|
+
/**
|
|
19
|
+
* Convert a ModelMessage to UIMessage
|
|
20
|
+
*
|
|
21
|
+
* This conversion creates a parts-based structure:
|
|
22
|
+
* - content field → TextPart
|
|
23
|
+
* - toolCalls array → ToolCallPart[]
|
|
24
|
+
* - role="tool" messages should be converted separately and merged
|
|
25
|
+
*
|
|
26
|
+
* @param modelMessage - The ModelMessage to convert
|
|
27
|
+
* @param id - Optional ID for the UIMessage (generated if not provided)
|
|
28
|
+
* @returns A UIMessage with parts
|
|
29
|
+
*/
|
|
30
|
+
export declare function modelMessageToUIMessage(modelMessage: ModelMessage, id?: string): UIMessage;
|
|
31
|
+
/**
|
|
32
|
+
* Convert an array of ModelMessages to UIMessages
|
|
33
|
+
*
|
|
34
|
+
* This handles merging tool result messages with their corresponding assistant messages
|
|
35
|
+
*
|
|
36
|
+
* @param modelMessages - Array of ModelMessages to convert
|
|
37
|
+
* @returns Array of UIMessages
|
|
38
|
+
*/
|
|
39
|
+
export declare function modelMessagesToUIMessages(modelMessages: Array<ModelMessage>): Array<UIMessage>;
|
|
40
|
+
/**
|
|
41
|
+
* Normalize a message (UIMessage or ModelMessage) to a UIMessage
|
|
42
|
+
* Ensures the message has an ID and createdAt timestamp
|
|
43
|
+
*
|
|
44
|
+
* @param message - Either a UIMessage or ModelMessage
|
|
45
|
+
* @param generateId - Function to generate a message ID if needed
|
|
46
|
+
* @returns A UIMessage with guaranteed id and createdAt
|
|
47
|
+
*/
|
|
48
|
+
export declare function normalizeToUIMessage(message: UIMessage | ModelMessage, generateId: () => string): UIMessage;
|
|
49
|
+
/**
|
|
50
|
+
* Generate a unique message ID
|
|
51
|
+
*/
|
|
52
|
+
export declare function generateMessageId(): string;
|