@tanstack/ai 0.47.2 → 0.48.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 +2 -1
- package/dist/esm/activities/chat/adapter.d.ts +5 -4
- package/dist/esm/activities/chat/adapter.js.map +1 -1
- package/dist/esm/activities/chat/index.d.ts +4 -7
- package/dist/esm/activities/chat/index.js +201 -243
- package/dist/esm/activities/chat/index.js.map +1 -1
- package/dist/esm/activities/chat/messages.js +126 -31
- package/dist/esm/activities/chat/messages.js.map +1 -1
- package/dist/esm/activities/chat/stream/processor.d.ts +38 -17
- package/dist/esm/activities/chat/stream/processor.js +197 -110
- package/dist/esm/activities/chat/stream/processor.js.map +1 -1
- package/dist/esm/activities/chat/tools/tool-calls.d.ts +3 -2
- package/dist/esm/activities/chat/tools/tool-calls.js +15 -10
- package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
- package/dist/esm/activities/generateVideo/index.js +6 -6
- package/dist/esm/activities/generateVideo/index.js.map +1 -1
- package/dist/esm/activities/stream-generation-result.js +7 -8
- package/dist/esm/activities/stream-generation-result.js.map +1 -1
- package/dist/esm/activities/summarize/chat-stream-summarize.d.ts +2 -1
- package/dist/esm/activities/summarize/chat-stream-summarize.js +59 -54
- package/dist/esm/activities/summarize/chat-stream-summarize.js.map +1 -1
- package/dist/esm/adapter-internals.d.ts +2 -0
- package/dist/esm/adapter-internals.js +3 -1
- package/dist/esm/client.d.ts +8 -1
- package/dist/esm/client.js +7 -2
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.js +6 -2
- package/dist/esm/middlewares/otel.js +12 -5
- package/dist/esm/middlewares/otel.js.map +1 -1
- package/dist/esm/stream-to-response.js +13 -6
- package/dist/esm/stream-to-response.js.map +1 -1
- package/dist/esm/stream-to-websocket.js +4 -2
- package/dist/esm/stream-to-websocket.js.map +1 -1
- package/dist/esm/strip-to-spec-middleware.d.ts +10 -13
- package/dist/esm/strip-to-spec-middleware.js +24 -22
- package/dist/esm/strip-to-spec-middleware.js.map +1 -1
- package/dist/esm/types.d.ts +82 -305
- package/dist/esm/utilities/adapter-yield-chunk.d.ts +31 -0
- package/dist/esm/utilities/ag-ui-usage.d.ts +24 -0
- package/dist/esm/utilities/ag-ui-usage.js +66 -0
- package/dist/esm/utilities/ag-ui-usage.js.map +1 -0
- package/dist/esm/utilities/ag-ui-wire.d.ts +14 -7
- package/dist/esm/utilities/ag-ui-wire.js +71 -30
- package/dist/esm/utilities/ag-ui-wire.js.map +1 -1
- package/dist/esm/utilities/chat-params.d.ts +3 -3
- package/dist/esm/utilities/chat-params.js +10 -30
- package/dist/esm/utilities/chat-params.js.map +1 -1
- package/dist/esm/utilities/chunk-ids.d.ts +5 -0
- package/dist/esm/utilities/chunk-ids.js +25 -0
- package/dist/esm/utilities/chunk-ids.js.map +1 -0
- package/dist/esm/utilities/errors.d.ts +9 -0
- package/dist/esm/utilities/errors.js +13 -1
- package/dist/esm/utilities/errors.js.map +1 -1
- package/dist/esm/utilities/merge-metadata.d.ts +14 -0
- package/dist/esm/utilities/merge-metadata.js +43 -0
- package/dist/esm/utilities/merge-metadata.js.map +1 -0
- package/dist/esm/utilities/normalize-stream-chunk.d.ts +3 -0
- package/dist/esm/utilities/normalize-stream-chunk.js +100 -0
- package/dist/esm/utilities/normalize-stream-chunk.js.map +1 -0
- package/dist/esm/utilities/reasoning-encrypted-value.d.ts +8 -0
- package/dist/esm/utilities/reasoning-encrypted-value.js +16 -0
- package/dist/esm/utilities/reasoning-encrypted-value.js.map +1 -0
- package/dist/esm/utilities/restore-inbound-chunk.d.ts +15 -0
- package/dist/esm/utilities/restore-inbound-chunk.js +43 -0
- package/dist/esm/utilities/restore-inbound-chunk.js.map +1 -0
- package/dist/esm/utilities/spec-event-keys.d.ts +2 -0
- package/dist/esm/utilities/spec-event-keys.js +56 -0
- package/dist/esm/utilities/spec-event-keys.js.map +1 -0
- package/dist/esm/utilities/structured-output-events.d.ts +3 -3
- package/dist/esm/utilities/structured-output-events.js.map +1 -1
- package/package.json +3 -3
- package/src/activities/chat/adapter.ts +4 -4
- package/src/activities/chat/index.ts +398 -400
- package/src/activities/chat/messages.ts +183 -36
- package/src/activities/chat/stream/processor.ts +313 -239
- package/src/activities/chat/tools/tool-calls.ts +23 -22
- package/src/activities/generateVideo/index.ts +7 -6
- package/src/activities/stream-generation-result.ts +8 -12
- package/src/activities/summarize/chat-stream-summarize.ts +98 -70
- package/src/adapter-internals.ts +2 -0
- package/src/client.ts +13 -0
- package/src/index.ts +6 -0
- package/src/middlewares/otel.ts +16 -8
- package/src/stream-to-response.ts +16 -4
- package/src/stream-to-websocket.ts +3 -1
- package/src/strip-to-spec-middleware.ts +48 -24
- package/src/types.ts +109 -393
- package/src/utilities/adapter-yield-chunk.ts +30 -0
- package/src/utilities/ag-ui-usage.test.ts +194 -0
- package/src/utilities/ag-ui-usage.ts +148 -0
- package/src/utilities/ag-ui-wire.ts +149 -31
- package/src/utilities/chat-params.ts +22 -39
- package/src/utilities/chunk-ids.ts +24 -0
- package/src/utilities/errors.ts +23 -0
- package/src/utilities/merge-metadata.test.ts +117 -0
- package/src/utilities/merge-metadata.ts +59 -0
- package/src/utilities/normalize-stream-chunk.test.ts +423 -0
- package/src/utilities/normalize-stream-chunk.ts +186 -0
- package/src/utilities/reasoning-encrypted-value.ts +18 -0
- package/src/utilities/restore-inbound-chunk.test.ts +133 -0
- package/src/utilities/restore-inbound-chunk.ts +72 -0
- package/src/utilities/spec-event-keys.test.ts +34 -0
- package/src/utilities/spec-event-keys.ts +74 -0
- package/src/utilities/structured-output-events.ts +3 -3
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/utilities/merge-metadata.ts
|
|
2
|
+
function isPlainRecord(value) {
|
|
3
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
function mergeMetadata(current, incoming) {
|
|
6
|
+
if (incoming == null) return current;
|
|
7
|
+
if (current == null) return { ...incoming };
|
|
8
|
+
const merged = {
|
|
9
|
+
...current,
|
|
10
|
+
...incoming
|
|
11
|
+
};
|
|
12
|
+
if (isPlainRecord(current.tanstack) && isPlainRecord(incoming.tanstack)) merged.tanstack = {
|
|
13
|
+
...current.tanstack,
|
|
14
|
+
...incoming.tanstack
|
|
15
|
+
};
|
|
16
|
+
return merged;
|
|
17
|
+
}
|
|
18
|
+
/** Read `metadata.tanstack`. Not part of the public SDK surface. */
|
|
19
|
+
function tanstackMetadata(value) {
|
|
20
|
+
if (value == null) return void 0;
|
|
21
|
+
const nested = "metadata" in value ? value.metadata : void 0;
|
|
22
|
+
const tanstack = (nested != null && typeof nested === "object" && !Array.isArray(nested) ? nested : value).tanstack;
|
|
23
|
+
if (tanstack == null || typeof tanstack !== "object" || Array.isArray(tanstack)) return;
|
|
24
|
+
return tanstack;
|
|
25
|
+
}
|
|
26
|
+
function withTanstackMetadata(value, tanstack) {
|
|
27
|
+
const current = value.metadata;
|
|
28
|
+
const currentTanstack = tanstackMetadata(value) ?? {};
|
|
29
|
+
return {
|
|
30
|
+
...value,
|
|
31
|
+
metadata: {
|
|
32
|
+
...current ?? {},
|
|
33
|
+
tanstack: {
|
|
34
|
+
...currentTanstack,
|
|
35
|
+
...tanstack
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { mergeMetadata, tanstackMetadata, withTanstackMetadata };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=merge-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-metadata.js","names":[],"sources":["../../../src/utilities/merge-metadata.ts"],"sourcesContent":["import type { TanStackMessageMetadata, TanStackRunMetadata } from '../types'\n\nexport type MetadataRecord = Record<string, any>\n\n/** `metadata.tanstack` on a message or run event. Internal getter return type. */\nexport type TanStackMetadata = TanStackMessageMetadata & TanStackRunMetadata\n\nfunction isPlainRecord(value: unknown): value is MetadataRecord {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function mergeMetadata(\n current: MetadataRecord | undefined,\n incoming: MetadataRecord | null | undefined,\n): MetadataRecord | undefined {\n if (incoming == null) return current\n if (current == null) return { ...incoming }\n const merged: MetadataRecord = { ...current, ...incoming }\n if (isPlainRecord(current.tanstack) && isPlainRecord(incoming.tanstack)) {\n merged.tanstack = { ...current.tanstack, ...incoming.tanstack }\n }\n return merged\n}\n\n/** Read `metadata.tanstack`. Not part of the public SDK surface. */\nexport function tanstackMetadata(\n value: { metadata?: MetadataRecord | null } | MetadataRecord | undefined,\n): TanStackMetadata | undefined {\n if (value == null) return undefined\n const nested = 'metadata' in value ? value.metadata : undefined\n const metadata =\n nested != null && typeof nested === 'object' && !Array.isArray(nested)\n ? nested\n : (value as MetadataRecord)\n const tanstack = metadata.tanstack\n if (\n tanstack == null ||\n typeof tanstack !== 'object' ||\n Array.isArray(tanstack)\n ) {\n return undefined\n }\n return tanstack as TanStackMetadata\n}\n\nexport function withTanstackMetadata<T>(\n value: T & { metadata?: MetadataRecord | null },\n tanstack: MetadataRecord,\n): Omit<T, 'metadata'> & { metadata: MetadataRecord } {\n const current = value.metadata\n const currentTanstack = tanstackMetadata(value) ?? {}\n return {\n ...value,\n metadata: {\n ...(current ?? {}),\n tanstack: { ...currentTanstack, ...tanstack },\n },\n }\n}\n"],"mappings":";AAOA,SAAS,cAAc,OAAyC;CAC9D,OAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC3E;AAEA,SAAgB,cACd,SACA,UAC4B;CAC5B,IAAI,YAAY,MAAM,OAAO;CAC7B,IAAI,WAAW,MAAM,OAAO,EAAE,GAAG,SAAS;CAC1C,MAAM,SAAyB;EAAE,GAAG;EAAS,GAAG;CAAS;CACzD,IAAI,cAAc,QAAQ,QAAQ,KAAK,cAAc,SAAS,QAAQ,GACpE,OAAO,WAAW;EAAE,GAAG,QAAQ;EAAU,GAAG,SAAS;CAAS;CAEhE,OAAO;AACT;;AAGA,SAAgB,iBACd,OAC8B;CAC9B,IAAI,SAAS,MAAM,OAAO,KAAA;CAC1B,MAAM,SAAS,cAAc,QAAQ,MAAM,WAAW,KAAA;CAKtD,MAAM,YAHJ,UAAU,QAAQ,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IACjE,SACC,MAAA,CACmB;CAC1B,IACE,YAAY,QACZ,OAAO,aAAa,YACpB,MAAM,QAAQ,QAAQ,GAEtB;CAEF,OAAO;AACT;AAEA,SAAgB,qBACd,OACA,UACoD;CACpD,MAAM,UAAU,MAAM;CACtB,MAAM,kBAAkB,iBAAiB,KAAK,KAAK,CAAC;CACpD,OAAO;EACL,GAAG;EACH,UAAU;GACR,GAAI,WAAW,CAAC;GAChB,UAAU;IAAE,GAAG;IAAiB,GAAG;GAAS;EAC9C;CACF;AACF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { EventType } from "../types.js";
|
|
2
|
+
import { isTanstackUsage, toSpecTokenUsage } from "./ag-ui-usage.js";
|
|
3
|
+
import { withTanstackMetadata } from "./merge-metadata.js";
|
|
4
|
+
import { reasoningEncryptedValue } from "./reasoning-encrypted-value.js";
|
|
5
|
+
import { specKeysFor } from "./spec-event-keys.js";
|
|
6
|
+
//#region src/utilities/normalize-stream-chunk.ts
|
|
7
|
+
function stringField(value) {
|
|
8
|
+
return typeof value === "string" && value !== "" ? value : void 0;
|
|
9
|
+
}
|
|
10
|
+
function encryptedValueExtras(chunk) {
|
|
11
|
+
const extras = [];
|
|
12
|
+
const timestamp = "timestamp" in chunk && typeof chunk.timestamp === "number" ? chunk.timestamp : void 0;
|
|
13
|
+
if (typeof chunk.signature === "string" && chunk.signature !== "") {
|
|
14
|
+
const source = chunk;
|
|
15
|
+
const toolCallId = stringField(source.toolCallId);
|
|
16
|
+
const entityId = stringField(chunk.stepId) ?? stringField(source.stepName) ?? stringField(source.messageId) ?? toolCallId;
|
|
17
|
+
if (entityId !== void 0) extras.push(reasoningEncryptedValue({
|
|
18
|
+
subtype: toolCallId && !chunk.stepId ? "tool-call" : "message",
|
|
19
|
+
entityId,
|
|
20
|
+
encryptedValue: chunk.signature,
|
|
21
|
+
timestamp
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
if (chunk.type === EventType.TOOL_CALL_START) {
|
|
25
|
+
const thoughtSignature = stringField(chunk.metadata?.thoughtSignature);
|
|
26
|
+
if (thoughtSignature !== void 0 && chunk.toolCallId) extras.push(reasoningEncryptedValue({
|
|
27
|
+
subtype: "tool-call",
|
|
28
|
+
entityId: chunk.toolCallId,
|
|
29
|
+
encryptedValue: thoughtSignature,
|
|
30
|
+
timestamp
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
return extras;
|
|
34
|
+
}
|
|
35
|
+
function normalizeStreamChunk(chunk) {
|
|
36
|
+
const specKeys = specKeysFor(chunk.type);
|
|
37
|
+
const source = chunk;
|
|
38
|
+
const specChunk = {};
|
|
39
|
+
for (const key of Object.keys(chunk)) if (specKeys.has(key)) specChunk[key] = source[key];
|
|
40
|
+
if (chunk.type === EventType.TOOL_CALL_START) {
|
|
41
|
+
if (specChunk.toolCallName === void 0 && chunk.toolName) specChunk.toolCallName = chunk.toolName;
|
|
42
|
+
}
|
|
43
|
+
if (chunk.type === EventType.RUN_ERROR && chunk.error != null) {
|
|
44
|
+
if (specChunk.message === void 0 && chunk.error.message) specChunk.message = chunk.error.message;
|
|
45
|
+
if (specChunk.code === void 0 && chunk.error.code !== void 0) specChunk.code = chunk.error.code;
|
|
46
|
+
}
|
|
47
|
+
const tanstack = {};
|
|
48
|
+
if (chunk.model !== void 0 && chunk.type !== EventType.TEXT_MESSAGE_CONTENT && chunk.type !== EventType.TOOL_CALL_ARGS) tanstack.model = chunk.model;
|
|
49
|
+
if (chunk.finishReason !== void 0) tanstack.finishReason = chunk.finishReason;
|
|
50
|
+
const interruptErrors = chunk["tanstack:interruptErrors"];
|
|
51
|
+
if (interruptErrors !== void 0) tanstack.interruptErrors = interruptErrors;
|
|
52
|
+
if (chunk.type === EventType.CUSTOM || chunk.type === EventType.RUN_ERROR) {
|
|
53
|
+
if (chunk.threadId !== void 0) tanstack.threadId = chunk.threadId;
|
|
54
|
+
if (chunk.runId !== void 0) tanstack.runId = chunk.runId;
|
|
55
|
+
}
|
|
56
|
+
const skipLeftover = /* @__PURE__ */ new Set([
|
|
57
|
+
"result",
|
|
58
|
+
"error",
|
|
59
|
+
"tanstack:interruptErrors"
|
|
60
|
+
]);
|
|
61
|
+
if (chunk.type === EventType.TEXT_MESSAGE_CONTENT || chunk.type === EventType.TOOL_CALL_ARGS) {
|
|
62
|
+
skipLeftover.add("model");
|
|
63
|
+
skipLeftover.add("content");
|
|
64
|
+
skipLeftover.add("args");
|
|
65
|
+
}
|
|
66
|
+
if (chunk.type === EventType.TOOL_CALL_START) skipLeftover.add("toolName");
|
|
67
|
+
for (const key of Object.keys(chunk)) {
|
|
68
|
+
if (specKeys.has(key) || skipLeftover.has(key)) continue;
|
|
69
|
+
if (tanstack[key] !== void 0) continue;
|
|
70
|
+
const value = source[key];
|
|
71
|
+
if (value !== void 0) tanstack[key] = value;
|
|
72
|
+
}
|
|
73
|
+
if ((chunk.type === EventType.RUN_FINISHED || chunk.type === EventType.RUN_ERROR) && isTanstackUsage(specChunk.usage)) {
|
|
74
|
+
const { usage, leftover } = toSpecTokenUsage(specChunk.usage, { model: typeof chunk.model === "string" ? chunk.model : void 0 });
|
|
75
|
+
specChunk.usage = usage;
|
|
76
|
+
if (leftover !== void 0) tanstack.usage = leftover;
|
|
77
|
+
}
|
|
78
|
+
const normalized = Object.keys(tanstack).length === 0 ? specChunk : withTanstackMetadata(specChunk, tanstack);
|
|
79
|
+
const extras = encryptedValueExtras(chunk);
|
|
80
|
+
const main = [normalized];
|
|
81
|
+
if (chunk.type === EventType.TOOL_CALL_END && chunk.result !== void 0) {
|
|
82
|
+
const parentMessageId = source.parentMessageId;
|
|
83
|
+
const resultChunk = {
|
|
84
|
+
type: EventType.TOOL_CALL_RESULT,
|
|
85
|
+
toolCallId: chunk.toolCallId,
|
|
86
|
+
content: Array.isArray(chunk.result) ? JSON.stringify(chunk.result) : chunk.result,
|
|
87
|
+
messageId: typeof parentMessageId === "string" && parentMessageId !== "" ? parentMessageId : chunk.toolCallId
|
|
88
|
+
};
|
|
89
|
+
if (chunk.state === "output-error") main.push({
|
|
90
|
+
...resultChunk,
|
|
91
|
+
metadata: { tanstack: { state: chunk.state } }
|
|
92
|
+
});
|
|
93
|
+
else main.push(resultChunk);
|
|
94
|
+
}
|
|
95
|
+
return [...main, ...extras];
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { normalizeStreamChunk };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=normalize-stream-chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-stream-chunk.js","names":[],"sources":["../../../src/utilities/normalize-stream-chunk.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { StreamChunk, ToolCallResultEvent } from '../types'\nimport type { AdapterYieldChunk } from './adapter-yield-chunk'\nimport { isTanstackUsage, toSpecTokenUsage } from './ag-ui-usage'\nimport type { MetadataRecord } from './merge-metadata'\nimport { withTanstackMetadata } from './merge-metadata'\nimport { reasoningEncryptedValue } from './reasoning-encrypted-value'\nimport { specKeysFor } from './spec-event-keys'\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined\n}\n\nfunction encryptedValueExtras(chunk: AdapterYieldChunk): Array<StreamChunk> {\n const extras: Array<StreamChunk> = []\n const timestamp =\n 'timestamp' in chunk && typeof chunk.timestamp === 'number'\n ? chunk.timestamp\n : undefined\n\n if (typeof chunk.signature === 'string' && chunk.signature !== '') {\n const source = chunk as Record<string, unknown>\n const toolCallId = stringField(source.toolCallId)\n const entityId =\n stringField(chunk.stepId) ??\n stringField(source.stepName) ??\n stringField(source.messageId) ??\n toolCallId\n if (entityId !== undefined) {\n extras.push(\n reasoningEncryptedValue({\n subtype: toolCallId && !chunk.stepId ? 'tool-call' : 'message',\n entityId,\n encryptedValue: chunk.signature,\n timestamp,\n }),\n )\n }\n }\n\n if (chunk.type === EventType.TOOL_CALL_START) {\n const thoughtSignature = stringField(\n (chunk.metadata as { thoughtSignature?: unknown } | undefined)\n ?.thoughtSignature,\n )\n if (thoughtSignature !== undefined && chunk.toolCallId) {\n extras.push(\n reasoningEncryptedValue({\n subtype: 'tool-call',\n entityId: chunk.toolCallId,\n encryptedValue: thoughtSignature,\n timestamp,\n }),\n )\n }\n }\n\n return extras\n}\n\nexport function normalizeStreamChunk(\n chunk: AdapterYieldChunk,\n): Array<StreamChunk> {\n const specKeys = specKeysFor(chunk.type)\n const source = chunk as Record<string, unknown>\n const specChunk: Record<string, unknown> & {\n metadata?: MetadataRecord | null\n } = {}\n\n for (const key of Object.keys(chunk)) {\n if (specKeys.has(key)) {\n specChunk[key] = source[key]\n }\n }\n\n if (chunk.type === EventType.TOOL_CALL_START) {\n if (specChunk.toolCallName === undefined && chunk.toolName) {\n specChunk.toolCallName = chunk.toolName\n }\n }\n\n if (chunk.type === EventType.RUN_ERROR && chunk.error != null) {\n if (specChunk.message === undefined && chunk.error.message) {\n specChunk.message = chunk.error.message\n }\n if (specChunk.code === undefined && chunk.error.code !== undefined) {\n specChunk.code = chunk.error.code\n }\n }\n\n const tanstack: MetadataRecord = {}\n\n if (\n chunk.model !== undefined &&\n chunk.type !== EventType.TEXT_MESSAGE_CONTENT &&\n chunk.type !== EventType.TOOL_CALL_ARGS\n ) {\n tanstack.model = chunk.model\n }\n\n if (chunk.finishReason !== undefined) {\n tanstack.finishReason = chunk.finishReason\n }\n\n const interruptErrors = chunk['tanstack:interruptErrors']\n if (interruptErrors !== undefined) {\n tanstack.interruptErrors = interruptErrors\n }\n\n if (chunk.type === EventType.CUSTOM || chunk.type === EventType.RUN_ERROR) {\n if (chunk.threadId !== undefined) {\n tanstack.threadId = chunk.threadId\n }\n if (chunk.runId !== undefined) {\n tanstack.runId = chunk.runId\n }\n }\n\n const skipLeftover = new Set(['result', 'error', 'tanstack:interruptErrors'])\n if (\n chunk.type === EventType.TEXT_MESSAGE_CONTENT ||\n chunk.type === EventType.TOOL_CALL_ARGS\n ) {\n skipLeftover.add('model')\n skipLeftover.add('content')\n skipLeftover.add('args')\n }\n if (chunk.type === EventType.TOOL_CALL_START) {\n skipLeftover.add('toolName')\n }\n for (const key of Object.keys(chunk)) {\n if (specKeys.has(key) || skipLeftover.has(key)) continue\n if (tanstack[key] !== undefined) continue\n const value = source[key]\n if (value !== undefined) {\n tanstack[key] = value\n }\n }\n\n if (\n (chunk.type === EventType.RUN_FINISHED ||\n chunk.type === EventType.RUN_ERROR) &&\n isTanstackUsage(specChunk.usage)\n ) {\n const { usage, leftover } = toSpecTokenUsage(specChunk.usage, {\n model: typeof chunk.model === 'string' ? chunk.model : undefined,\n })\n specChunk.usage = usage\n if (leftover !== undefined) {\n tanstack.usage = leftover\n }\n }\n\n const normalized =\n Object.keys(tanstack).length === 0\n ? specChunk\n : withTanstackMetadata(specChunk, tanstack)\n\n const extras = encryptedValueExtras(chunk)\n const main: Array<StreamChunk> = [normalized as StreamChunk]\n\n if (chunk.type === EventType.TOOL_CALL_END && chunk.result !== undefined) {\n const parentMessageId = source.parentMessageId\n const resultChunk: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: chunk.toolCallId,\n content: Array.isArray(chunk.result)\n ? JSON.stringify(chunk.result)\n : chunk.result,\n messageId:\n typeof parentMessageId === 'string' && parentMessageId !== ''\n ? parentMessageId\n : chunk.toolCallId,\n }\n if (chunk.state === 'output-error') {\n main.push({\n ...resultChunk,\n metadata: { tanstack: { state: chunk.state } },\n })\n } else {\n main.push(resultChunk)\n }\n }\n\n return [...main, ...extras]\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReasoningEncryptedValueEvent } from '../types.js';
|
|
2
|
+
/** Spec event that carries a provider thinking / tool-call signature blob. */
|
|
3
|
+
export declare function reasoningEncryptedValue(opts: {
|
|
4
|
+
subtype: 'message' | 'tool-call';
|
|
5
|
+
entityId: string;
|
|
6
|
+
encryptedValue: string;
|
|
7
|
+
timestamp?: number;
|
|
8
|
+
}): ReasoningEncryptedValueEvent;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EventType } from "../types.js";
|
|
2
|
+
//#region src/utilities/reasoning-encrypted-value.ts
|
|
3
|
+
/** Spec event that carries a provider thinking / tool-call signature blob. */
|
|
4
|
+
function reasoningEncryptedValue(opts) {
|
|
5
|
+
return {
|
|
6
|
+
type: EventType.REASONING_ENCRYPTED_VALUE,
|
|
7
|
+
subtype: opts.subtype,
|
|
8
|
+
entityId: opts.entityId,
|
|
9
|
+
encryptedValue: opts.encryptedValue,
|
|
10
|
+
...opts.timestamp !== void 0 ? { timestamp: opts.timestamp } : {}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { reasoningEncryptedValue };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=reasoning-encrypted-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-encrypted-value.js","names":[],"sources":["../../../src/utilities/reasoning-encrypted-value.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { ReasoningEncryptedValueEvent } from '../types'\n\n/** Spec event that carries a provider thinking / tool-call signature blob. */\nexport function reasoningEncryptedValue(opts: {\n subtype: 'message' | 'tool-call'\n entityId: string\n encryptedValue: string\n timestamp?: number\n}): ReasoningEncryptedValueEvent {\n return {\n type: EventType.REASONING_ENCRYPTED_VALUE,\n subtype: opts.subtype,\n entityId: opts.entityId,\n encryptedValue: opts.encryptedValue,\n ...(opts.timestamp !== undefined ? { timestamp: opts.timestamp } : {}),\n }\n}\n"],"mappings":";;;AAIA,SAAgB,wBAAwB,MAKP;CAC/B,OAAO;EACL,MAAM,UAAU;EAChB,SAAS,KAAK;EACd,UAAU,KAAK;EACf,gBAAgB,KAAK;EACrB,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;CACtE;AACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { StreamChunk } from '../types.js';
|
|
2
|
+
import { AdapterYieldChunk } from './adapter-yield-chunk.js';
|
|
3
|
+
/**
|
|
4
|
+
* Rebuild TanStack `TokenUsage` (`promptTokens`) from spec `usage[]` plus
|
|
5
|
+
* leftover fields in `metadata.tanstack.usage`. Restore in-process aliases
|
|
6
|
+
* that the wire does not keep (`toolName`, `TOOL_CALL_END.input`). Mutates
|
|
7
|
+
* in place so WeakMap run-id stamps stay attached.
|
|
8
|
+
*/
|
|
9
|
+
export declare function restorePublicUsage(chunk: StreamChunk): StreamChunk;
|
|
10
|
+
/**
|
|
11
|
+
* Rebuild the pre-wire chunk shape after SSE/HTTP/WS ingest.
|
|
12
|
+
* Copies `metadata.tanstack` extras back to top-level fields and rebuilds
|
|
13
|
+
* TanStack `TokenUsage` from spec `usage[]` when present.
|
|
14
|
+
*/
|
|
15
|
+
export declare function restoreInboundChunk(chunk: StreamChunk): AdapterYieldChunk;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { EventType } from "../types.js";
|
|
2
|
+
import { isTanstackUsage, rebuildTokenUsage } from "./ag-ui-usage.js";
|
|
3
|
+
import { tanstackMetadata } from "./merge-metadata.js";
|
|
4
|
+
//#region src/utilities/restore-inbound-chunk.ts
|
|
5
|
+
/**
|
|
6
|
+
* Rebuild TanStack `TokenUsage` (`promptTokens`) from spec `usage[]` plus
|
|
7
|
+
* leftover fields in `metadata.tanstack.usage`. Restore in-process aliases
|
|
8
|
+
* that the wire does not keep (`toolName`, `TOOL_CALL_END.input`). Mutates
|
|
9
|
+
* in place so WeakMap run-id stamps stay attached.
|
|
10
|
+
*/
|
|
11
|
+
function restorePublicUsage(chunk) {
|
|
12
|
+
if ((chunk.type === EventType.RUN_FINISHED || chunk.type === EventType.RUN_ERROR) && (Array.isArray(chunk.usage) || isTanstackUsage(chunk.usage))) {
|
|
13
|
+
const rebuilt = rebuildTokenUsage(chunk.usage, tanstackMetadata(chunk)?.usage);
|
|
14
|
+
if (rebuilt !== void 0) chunk.usage = rebuilt;
|
|
15
|
+
}
|
|
16
|
+
if (chunk.type === EventType.TOOL_CALL_START && chunk.toolName === void 0 && chunk.toolCallName) chunk.toolName = chunk.toolCallName;
|
|
17
|
+
if (chunk.type === EventType.TOOL_CALL_END && chunk.input === void 0) {
|
|
18
|
+
const input = tanstackMetadata(chunk)?.input;
|
|
19
|
+
if (input !== void 0) chunk.input = input;
|
|
20
|
+
}
|
|
21
|
+
return chunk;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Rebuild the pre-wire chunk shape after SSE/HTTP/WS ingest.
|
|
25
|
+
* Copies `metadata.tanstack` extras back to top-level fields and rebuilds
|
|
26
|
+
* TanStack `TokenUsage` from spec `usage[]` when present.
|
|
27
|
+
*/
|
|
28
|
+
function restoreInboundChunk(chunk) {
|
|
29
|
+
restorePublicUsage(chunk);
|
|
30
|
+
const tanstack = tanstackMetadata(chunk);
|
|
31
|
+
const next = chunk;
|
|
32
|
+
if (tanstack == null) return next;
|
|
33
|
+
for (const [key, value] of Object.entries(tanstack)) {
|
|
34
|
+
if (key === "usage" || key === "interruptErrors") continue;
|
|
35
|
+
if (next[key] === void 0 && value !== void 0) next[key] = value;
|
|
36
|
+
}
|
|
37
|
+
if (tanstack.interruptErrors !== void 0) next["tanstack:interruptErrors"] = tanstack.interruptErrors;
|
|
38
|
+
return next;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { restoreInboundChunk, restorePublicUsage };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=restore-inbound-chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-inbound-chunk.js","names":[],"sources":["../../../src/utilities/restore-inbound-chunk.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { StreamChunk } from '../types'\nimport type { AdapterYieldChunk } from './adapter-yield-chunk'\nimport { isTanstackUsage, rebuildTokenUsage } from './ag-ui-usage'\nimport { tanstackMetadata } from './merge-metadata'\n\n/**\n * Rebuild TanStack `TokenUsage` (`promptTokens`) from spec `usage[]` plus\n * leftover fields in `metadata.tanstack.usage`. Restore in-process aliases\n * that the wire does not keep (`toolName`, `TOOL_CALL_END.input`). Mutates\n * in place so WeakMap run-id stamps stay attached.\n */\nexport function restorePublicUsage(chunk: StreamChunk): StreamChunk {\n if (\n (chunk.type === EventType.RUN_FINISHED ||\n chunk.type === EventType.RUN_ERROR) &&\n (Array.isArray(chunk.usage) || isTanstackUsage(chunk.usage))\n ) {\n const rebuilt = rebuildTokenUsage(\n chunk.usage,\n tanstackMetadata(chunk)?.usage,\n )\n if (rebuilt !== undefined) {\n chunk.usage = rebuilt\n }\n }\n\n if (\n chunk.type === EventType.TOOL_CALL_START &&\n chunk.toolName === undefined &&\n chunk.toolCallName\n ) {\n chunk.toolName = chunk.toolCallName\n }\n\n if (chunk.type === EventType.TOOL_CALL_END && chunk.input === undefined) {\n const input = tanstackMetadata(chunk)?.input\n if (input !== undefined) {\n chunk.input = input\n }\n }\n\n return chunk\n}\n\n/**\n * Rebuild the pre-wire chunk shape after SSE/HTTP/WS ingest.\n * Copies `metadata.tanstack` extras back to top-level fields and rebuilds\n * TanStack `TokenUsage` from spec `usage[]` when present.\n */\nexport function restoreInboundChunk(chunk: StreamChunk): AdapterYieldChunk {\n restorePublicUsage(chunk)\n const tanstack = tanstackMetadata(chunk)\n const next = chunk as AdapterYieldChunk & Record<string, unknown>\n\n if (tanstack == null) {\n return next\n }\n\n for (const [key, value] of Object.entries(tanstack)) {\n if (key === 'usage' || key === 'interruptErrors') continue\n if (next[key] === undefined && value !== undefined) {\n next[key] = value\n }\n }\n\n if (tanstack.interruptErrors !== undefined) {\n next['tanstack:interruptErrors'] = tanstack.interruptErrors\n }\n\n return next\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAgB,mBAAmB,OAAiC;CAClE,KACG,MAAM,SAAS,UAAU,gBACxB,MAAM,SAAS,UAAU,eAC1B,MAAM,QAAQ,MAAM,KAAK,KAAK,gBAAgB,MAAM,KAAK,IAC1D;EACA,MAAM,UAAU,kBACd,MAAM,OACN,iBAAiB,KAAK,CAAC,EAAE,KAC3B;EACA,IAAI,YAAY,KAAA,GACd,MAAM,QAAQ;CAElB;CAEA,IACE,MAAM,SAAS,UAAU,mBACzB,MAAM,aAAa,KAAA,KACnB,MAAM,cAEN,MAAM,WAAW,MAAM;CAGzB,IAAI,MAAM,SAAS,UAAU,iBAAiB,MAAM,UAAU,KAAA,GAAW;EACvE,MAAM,QAAQ,iBAAiB,KAAK,CAAC,EAAE;EACvC,IAAI,UAAU,KAAA,GACZ,MAAM,QAAQ;CAElB;CAEA,OAAO;AACT;;;;;;AAOA,SAAgB,oBAAoB,OAAuC;CACzE,mBAAmB,KAAK;CACxB,MAAM,WAAW,iBAAiB,KAAK;CACvC,MAAM,OAAO;CAEb,IAAI,YAAY,MACd,OAAO;CAGT,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAAG;EACnD,IAAI,QAAQ,WAAW,QAAQ,mBAAmB;EAClD,IAAI,KAAK,SAAS,KAAA,KAAa,UAAU,KAAA,GACvC,KAAK,OAAO;CAEhB;CAEA,IAAI,SAAS,oBAAoB,KAAA,GAC/B,KAAK,8BAA8B,SAAS;CAG9C,OAAO;AACT"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { EventType } from "../types.js";
|
|
2
|
+
//#region src/utilities/spec-event-keys.ts
|
|
3
|
+
var SHARED = /* @__PURE__ */ new Set([
|
|
4
|
+
"type",
|
|
5
|
+
"timestamp",
|
|
6
|
+
"rawEvent",
|
|
7
|
+
"metadata"
|
|
8
|
+
]);
|
|
9
|
+
function keys(...fields) {
|
|
10
|
+
return /* @__PURE__ */ new Set([...SHARED, ...fields]);
|
|
11
|
+
}
|
|
12
|
+
var SPEC_KEYS = /* @__PURE__ */ new Map([
|
|
13
|
+
[EventType.TEXT_MESSAGE_START, keys("messageId", "role", "name")],
|
|
14
|
+
[EventType.TEXT_MESSAGE_CONTENT, keys("messageId", "delta")],
|
|
15
|
+
[EventType.TEXT_MESSAGE_END, keys("messageId")],
|
|
16
|
+
[EventType.TEXT_MESSAGE_CHUNK, keys("messageId", "role", "delta", "name")],
|
|
17
|
+
[EventType.TOOL_CALL_START, keys("toolCallId", "toolCallName", "parentMessageId")],
|
|
18
|
+
[EventType.TOOL_CALL_ARGS, keys("toolCallId", "delta")],
|
|
19
|
+
[EventType.TOOL_CALL_END, keys("toolCallId")],
|
|
20
|
+
[EventType.TOOL_CALL_CHUNK, keys("toolCallId", "toolCallName", "parentMessageId", "delta")],
|
|
21
|
+
[EventType.TOOL_CALL_RESULT, keys("messageId", "toolCallId", "content", "role")],
|
|
22
|
+
[EventType.THINKING_START, keys("title")],
|
|
23
|
+
[EventType.THINKING_END, SHARED],
|
|
24
|
+
[EventType.THINKING_TEXT_MESSAGE_START, SHARED],
|
|
25
|
+
[EventType.THINKING_TEXT_MESSAGE_CONTENT, keys("delta")],
|
|
26
|
+
[EventType.THINKING_TEXT_MESSAGE_END, SHARED],
|
|
27
|
+
[EventType.STATE_SNAPSHOT, keys("snapshot")],
|
|
28
|
+
[EventType.STATE_DELTA, keys("delta")],
|
|
29
|
+
[EventType.MESSAGES_SNAPSHOT, keys("messages")],
|
|
30
|
+
[EventType.ACTIVITY_SNAPSHOT, keys("messageId", "activityType", "content", "replace")],
|
|
31
|
+
[EventType.ACTIVITY_DELTA, keys("messageId", "activityType", "patch")],
|
|
32
|
+
[EventType.RAW, keys("event", "source")],
|
|
33
|
+
[EventType.CUSTOM, keys("name", "value")],
|
|
34
|
+
[EventType.RUN_STARTED, keys("threadId", "runId", "parentRunId", "input")],
|
|
35
|
+
[EventType.RUN_FINISHED, keys("threadId", "runId", "result", "outcome", "usage")],
|
|
36
|
+
[EventType.RUN_ERROR, keys("message", "code", "usage")],
|
|
37
|
+
[EventType.STEP_STARTED, keys("stepName")],
|
|
38
|
+
[EventType.STEP_FINISHED, keys("stepName")],
|
|
39
|
+
[EventType.REASONING_START, keys("messageId")],
|
|
40
|
+
[EventType.REASONING_MESSAGE_START, keys("messageId", "role")],
|
|
41
|
+
[EventType.REASONING_MESSAGE_CONTENT, keys("messageId", "delta")],
|
|
42
|
+
[EventType.REASONING_MESSAGE_END, keys("messageId")],
|
|
43
|
+
[EventType.REASONING_MESSAGE_CHUNK, keys("messageId", "delta")],
|
|
44
|
+
[EventType.REASONING_END, keys("messageId")],
|
|
45
|
+
[EventType.REASONING_ENCRYPTED_VALUE, keys("subtype", "entityId", "encryptedValue")]
|
|
46
|
+
]);
|
|
47
|
+
function specKeysFor(type) {
|
|
48
|
+
return SPEC_KEYS.get(type) ?? SHARED;
|
|
49
|
+
}
|
|
50
|
+
function isSpecTopLevelKey(type, key) {
|
|
51
|
+
return specKeysFor(type).has(key);
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { isSpecTopLevelKey, specKeysFor };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=spec-event-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-event-keys.js","names":[],"sources":["../../../src/utilities/spec-event-keys.ts"],"sourcesContent":["import { EventType } from '../types'\n\nconst SHARED: ReadonlySet<string> = new Set([\n 'type',\n 'timestamp',\n 'rawEvent',\n 'metadata',\n])\n\nfunction keys(...fields: Array<string>): ReadonlySet<string> {\n return new Set([...SHARED, ...fields])\n}\n\nconst SPEC_KEYS: ReadonlyMap<string, ReadonlySet<string>> = new Map([\n [EventType.TEXT_MESSAGE_START, keys('messageId', 'role', 'name')],\n [EventType.TEXT_MESSAGE_CONTENT, keys('messageId', 'delta')],\n [EventType.TEXT_MESSAGE_END, keys('messageId')],\n [EventType.TEXT_MESSAGE_CHUNK, keys('messageId', 'role', 'delta', 'name')],\n [\n EventType.TOOL_CALL_START,\n keys('toolCallId', 'toolCallName', 'parentMessageId'),\n ],\n [EventType.TOOL_CALL_ARGS, keys('toolCallId', 'delta')],\n [EventType.TOOL_CALL_END, keys('toolCallId')],\n [\n EventType.TOOL_CALL_CHUNK,\n keys('toolCallId', 'toolCallName', 'parentMessageId', 'delta'),\n ],\n [\n EventType.TOOL_CALL_RESULT,\n keys('messageId', 'toolCallId', 'content', 'role'),\n ],\n [EventType.THINKING_START, keys('title')],\n [EventType.THINKING_END, SHARED],\n [EventType.THINKING_TEXT_MESSAGE_START, SHARED],\n [EventType.THINKING_TEXT_MESSAGE_CONTENT, keys('delta')],\n [EventType.THINKING_TEXT_MESSAGE_END, SHARED],\n [EventType.STATE_SNAPSHOT, keys('snapshot')],\n [EventType.STATE_DELTA, keys('delta')],\n [EventType.MESSAGES_SNAPSHOT, keys('messages')],\n [\n EventType.ACTIVITY_SNAPSHOT,\n keys('messageId', 'activityType', 'content', 'replace'),\n ],\n [EventType.ACTIVITY_DELTA, keys('messageId', 'activityType', 'patch')],\n [EventType.RAW, keys('event', 'source')],\n [EventType.CUSTOM, keys('name', 'value')],\n [EventType.RUN_STARTED, keys('threadId', 'runId', 'parentRunId', 'input')],\n [\n EventType.RUN_FINISHED,\n keys('threadId', 'runId', 'result', 'outcome', 'usage'),\n ],\n [EventType.RUN_ERROR, keys('message', 'code', 'usage')],\n [EventType.STEP_STARTED, keys('stepName')],\n [EventType.STEP_FINISHED, keys('stepName')],\n [EventType.REASONING_START, keys('messageId')],\n [EventType.REASONING_MESSAGE_START, keys('messageId', 'role')],\n [EventType.REASONING_MESSAGE_CONTENT, keys('messageId', 'delta')],\n [EventType.REASONING_MESSAGE_END, keys('messageId')],\n [EventType.REASONING_MESSAGE_CHUNK, keys('messageId', 'delta')],\n [EventType.REASONING_END, keys('messageId')],\n [\n EventType.REASONING_ENCRYPTED_VALUE,\n keys('subtype', 'entityId', 'encryptedValue'),\n ],\n])\n\nexport function specKeysFor(type: string): ReadonlySet<string> {\n return SPEC_KEYS.get(type) ?? SHARED\n}\n\nexport function isSpecTopLevelKey(type: string, key: string): boolean {\n return specKeysFor(type).has(key)\n}\n"],"mappings":";;AAEA,IAAM,yBAA8B,IAAI,IAAI;CAC1C;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,KAAK,GAAG,QAA4C;CAC3D,uBAAO,IAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC;AACvC;AAEA,IAAM,4BAAsD,IAAI,IAAI;CAClE,CAAC,UAAU,oBAAoB,KAAK,aAAa,QAAQ,MAAM,CAAC;CAChE,CAAC,UAAU,sBAAsB,KAAK,aAAa,OAAO,CAAC;CAC3D,CAAC,UAAU,kBAAkB,KAAK,WAAW,CAAC;CAC9C,CAAC,UAAU,oBAAoB,KAAK,aAAa,QAAQ,SAAS,MAAM,CAAC;CACzE,CACE,UAAU,iBACV,KAAK,cAAc,gBAAgB,iBAAiB,CACtD;CACA,CAAC,UAAU,gBAAgB,KAAK,cAAc,OAAO,CAAC;CACtD,CAAC,UAAU,eAAe,KAAK,YAAY,CAAC;CAC5C,CACE,UAAU,iBACV,KAAK,cAAc,gBAAgB,mBAAmB,OAAO,CAC/D;CACA,CACE,UAAU,kBACV,KAAK,aAAa,cAAc,WAAW,MAAM,CACnD;CACA,CAAC,UAAU,gBAAgB,KAAK,OAAO,CAAC;CACxC,CAAC,UAAU,cAAc,MAAM;CAC/B,CAAC,UAAU,6BAA6B,MAAM;CAC9C,CAAC,UAAU,+BAA+B,KAAK,OAAO,CAAC;CACvD,CAAC,UAAU,2BAA2B,MAAM;CAC5C,CAAC,UAAU,gBAAgB,KAAK,UAAU,CAAC;CAC3C,CAAC,UAAU,aAAa,KAAK,OAAO,CAAC;CACrC,CAAC,UAAU,mBAAmB,KAAK,UAAU,CAAC;CAC9C,CACE,UAAU,mBACV,KAAK,aAAa,gBAAgB,WAAW,SAAS,CACxD;CACA,CAAC,UAAU,gBAAgB,KAAK,aAAa,gBAAgB,OAAO,CAAC;CACrE,CAAC,UAAU,KAAK,KAAK,SAAS,QAAQ,CAAC;CACvC,CAAC,UAAU,QAAQ,KAAK,QAAQ,OAAO,CAAC;CACxC,CAAC,UAAU,aAAa,KAAK,YAAY,SAAS,eAAe,OAAO,CAAC;CACzE,CACE,UAAU,cACV,KAAK,YAAY,SAAS,UAAU,WAAW,OAAO,CACxD;CACA,CAAC,UAAU,WAAW,KAAK,WAAW,QAAQ,OAAO,CAAC;CACtD,CAAC,UAAU,cAAc,KAAK,UAAU,CAAC;CACzC,CAAC,UAAU,eAAe,KAAK,UAAU,CAAC;CAC1C,CAAC,UAAU,iBAAiB,KAAK,WAAW,CAAC;CAC7C,CAAC,UAAU,yBAAyB,KAAK,aAAa,MAAM,CAAC;CAC7D,CAAC,UAAU,2BAA2B,KAAK,aAAa,OAAO,CAAC;CAChE,CAAC,UAAU,uBAAuB,KAAK,WAAW,CAAC;CACnD,CAAC,UAAU,yBAAyB,KAAK,aAAa,OAAO,CAAC;CAC9D,CAAC,UAAU,eAAe,KAAK,WAAW,CAAC;CAC3C,CACE,UAAU,2BACV,KAAK,WAAW,YAAY,gBAAgB,CAC9C;AACF,CAAC;AAED,SAAgB,YAAY,MAAmC;CAC7D,OAAO,UAAU,IAAI,IAAI,KAAK;AAChC;AAEA,SAAgB,kBAAkB,MAAc,KAAsB;CACpE,OAAO,YAAY,IAAI,CAAC,CAAC,IAAI,GAAG;AAClC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AdapterYieldChunk } from './adapter-yield-chunk.js';
|
|
2
2
|
export declare function structuredOutputStartChunk(args: {
|
|
3
3
|
messageId: string;
|
|
4
4
|
model: string;
|
|
5
5
|
threadId: string;
|
|
6
6
|
runId: string;
|
|
7
7
|
timestamp?: number;
|
|
8
|
-
}):
|
|
8
|
+
}): AdapterYieldChunk;
|
|
9
9
|
export declare function structuredOutputCompleteChunk(args: {
|
|
10
10
|
messageId: string;
|
|
11
11
|
model: string;
|
|
@@ -14,4 +14,4 @@ export declare function structuredOutputCompleteChunk(args: {
|
|
|
14
14
|
object: unknown;
|
|
15
15
|
raw: string;
|
|
16
16
|
timestamp?: number;
|
|
17
|
-
}):
|
|
17
|
+
}): AdapterYieldChunk;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-output-events.js","names":[],"sources":["../../../src/utilities/structured-output-events.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type {
|
|
1
|
+
{"version":3,"file":"structured-output-events.js","names":[],"sources":["../../../src/utilities/structured-output-events.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { AdapterYieldChunk } from './adapter-yield-chunk'\n\nexport function structuredOutputStartChunk(args: {\n messageId: string\n model: string\n threadId: string\n runId: string\n timestamp?: number\n}): AdapterYieldChunk {\n return {\n type: EventType.CUSTOM,\n name: 'structured-output.start',\n value: { messageId: args.messageId },\n model: args.model,\n timestamp: args.timestamp ?? Date.now(),\n threadId: args.threadId,\n runId: args.runId,\n }\n}\n\nexport function structuredOutputCompleteChunk(args: {\n messageId: string\n model: string\n threadId: string\n runId: string\n object: unknown\n raw: string\n timestamp?: number\n}): AdapterYieldChunk {\n return {\n type: EventType.CUSTOM,\n name: 'structured-output.complete',\n value: {\n object: args.object,\n raw: args.raw,\n messageId: args.messageId,\n },\n model: args.model,\n timestamp: args.timestamp ?? Date.now(),\n threadId: args.threadId,\n runId: args.runId,\n }\n}\n"],"mappings":";;AAGA,SAAgB,2BAA2B,MAMrB;CACpB,OAAO;EACL,MAAM,UAAU;EAChB,MAAM;EACN,OAAO,EAAE,WAAW,KAAK,UAAU;EACnC,OAAO,KAAK;EACZ,WAAW,KAAK,aAAa,KAAK,IAAI;EACtC,UAAU,KAAK;EACf,OAAO,KAAK;CACd;AACF;AAEA,SAAgB,8BAA8B,MAQxB;CACpB,OAAO;EACL,MAAM,UAAU;EAChB,MAAM;EACN,OAAO;GACL,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,WAAW,KAAK;EAClB;EACA,OAAO,KAAK;EACZ,WAAW,KAAK,aAAa,KAAK,IAAI;EACtC,UAAU,KAAK;EACf,OAAO,KAAK;CACd;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/ai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.48.0",
|
|
4
4
|
"description": "Type-safe TypeScript AI SDK for streaming chat, tool calling, agents, structured outputs, and multimodal generation.",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"@ag-ui/core": "0.1.1-canary.beta.0",
|
|
81
81
|
"@standard-schema/spec": "^1.1.0",
|
|
82
82
|
"partial-json": "^0.1.7",
|
|
83
|
-
"@tanstack/ai-
|
|
84
|
-
"@tanstack/ai-
|
|
83
|
+
"@tanstack/ai-event-client": "^0.10.0",
|
|
84
|
+
"@tanstack/ai-utils": "^0.4.0"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
87
|
"@opentelemetry/api": ">=1.9.0"
|
|
@@ -2,10 +2,10 @@ import type {
|
|
|
2
2
|
DefaultMessageMetadataByModality,
|
|
3
3
|
JSONSchema,
|
|
4
4
|
Modality,
|
|
5
|
-
StreamChunk,
|
|
6
5
|
TextOptions,
|
|
7
6
|
TokenUsage,
|
|
8
7
|
} from '../../types'
|
|
8
|
+
import type { AdapterYieldChunk } from '../../utilities/adapter-yield-chunk'
|
|
9
9
|
import type { CapabilityHandle } from './middleware/capabilities'
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -106,7 +106,7 @@ export interface TextAdapter<
|
|
|
106
106
|
*/
|
|
107
107
|
chatStream: (
|
|
108
108
|
options: TextOptions<TProviderOptions>,
|
|
109
|
-
) => AsyncIterable<
|
|
109
|
+
) => AsyncIterable<AdapterYieldChunk>
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
112
|
* Generate structured output using the provider's native structured output API.
|
|
@@ -136,7 +136,7 @@ export interface TextAdapter<
|
|
|
136
136
|
*/
|
|
137
137
|
structuredOutputStream?: (
|
|
138
138
|
options: StructuredOutputOptions<TProviderOptions>,
|
|
139
|
-
) => AsyncIterable<
|
|
139
|
+
) => AsyncIterable<AdapterYieldChunk>
|
|
140
140
|
|
|
141
141
|
/**
|
|
142
142
|
* Declares whether the adapter supports combining `tools` and a
|
|
@@ -229,7 +229,7 @@ export abstract class BaseTextAdapter<
|
|
|
229
229
|
|
|
230
230
|
abstract chatStream(
|
|
231
231
|
options: TextOptions<TProviderOptions>,
|
|
232
|
-
): AsyncIterable<
|
|
232
|
+
): AsyncIterable<AdapterYieldChunk>
|
|
233
233
|
|
|
234
234
|
/**
|
|
235
235
|
* Generate structured output using the provider's native structured output API.
|