assistant-stream 0.2.5 → 0.2.7
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/dist/core/AssistantStreamChunk.d.ts +5 -1
- package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.js +1 -0
- package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +19 -1
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +9 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +1 -1
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/object/ObjectStream.test.d.ts +2 -0
- package/dist/core/object/ObjectStream.test.d.ts.map +1 -0
- package/dist/core/object/ObjectStreamAccumulator.d.ts +11 -0
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -0
- package/dist/core/object/ObjectStreamAccumulator.js +64 -0
- package/dist/core/object/ObjectStreamAccumulator.js.map +1 -0
- package/dist/core/object/ObjectStreamResponse.d.ts +13 -0
- package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -0
- package/dist/core/object/ObjectStreamResponse.js +66 -0
- package/dist/core/object/ObjectStreamResponse.js.map +1 -0
- package/dist/core/object/createObjectStream.d.ts +13 -0
- package/dist/core/object/createObjectStream.d.ts.map +1 -0
- package/dist/core/object/createObjectStream.js +63 -0
- package/dist/core/object/createObjectStream.js.map +1 -0
- package/dist/core/object/types.d.ts +15 -0
- package/dist/core/object/types.d.ts.map +1 -0
- package/dist/core/object/types.js +1 -0
- package/dist/core/object/types.js.map +1 -0
- package/dist/core/serialization/PlainText.d.ts.map +1 -1
- package/dist/core/serialization/PlainText.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.js +14 -0
- package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts +4 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js +1 -0
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/tool/ToolCallReader.d.ts +8 -7
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js +11 -4
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts +3 -3
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts +2 -2
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/ToolResponse.js +3 -1
- package/dist/core/tool/ToolResponse.js.map +1 -1
- package/dist/core/tool/tool-types.d.ts +4 -5
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.d.ts +2 -2
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +3 -2
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/utils/stream/SSE.d.ts +10 -0
- package/dist/core/utils/stream/SSE.d.ts.map +1 -0
- package/dist/core/utils/stream/SSE.js +102 -0
- package/dist/core/utils/stream/SSE.js.map +1 -0
- package/dist/core/utils/types.d.ts +14 -3
- package/dist/core/utils/types.d.ts.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json/index.d.ts +2 -0
- package/dist/utils/json/index.d.ts.map +1 -0
- package/dist/utils/json/index.js +1 -0
- package/dist/utils/json/index.js.map +1 -0
- package/package.json +7 -7
- package/src/core/AssistantStreamChunk.ts +6 -1
- package/src/core/accumulators/AssistantMessageStream.ts +1 -0
- package/src/core/accumulators/assistant-message-accumulator.ts +25 -1
- package/src/core/index.ts +7 -0
- package/src/core/modules/tool-call.ts +3 -1
- package/src/core/object/ObjectStream.test.ts +376 -0
- package/src/core/object/ObjectStreamAccumulator.ts +80 -0
- package/src/core/object/ObjectStreamResponse.ts +81 -0
- package/src/core/object/createObjectStream.ts +87 -0
- package/src/core/object/types.ts +18 -0
- package/src/core/serialization/PlainText.ts +2 -1
- package/src/core/serialization/data-stream/DataStream.ts +16 -0
- package/src/core/serialization/data-stream/chunk-types.ts +6 -0
- package/src/core/tool/ToolCallReader.ts +57 -36
- package/src/core/tool/ToolExecutionStream.ts +14 -5
- package/src/core/tool/ToolResponse.ts +7 -3
- package/src/core/tool/tool-types.ts +10 -5
- package/src/core/tool/toolResultStream.ts +19 -13
- package/src/core/utils/stream/SSE.ts +116 -0
- package/src/core/utils/types.ts +18 -3
- package/src/utils/index.ts +5 -0
- package/src/utils/json/index.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolResultStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/toolResultStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuC,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"toolResultStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/toolResultStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuC,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA2ElD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,EACvC,WAAW,EAAE,WAAW,6BA+BzB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,EACvC,WAAW,EAAE,WAAW,uBAOzB"}
|
|
@@ -24,7 +24,8 @@ function getToolResponse(tools, abortSignal, toolCall) {
|
|
|
24
24
|
toolCallId: toolCall.toolCallId,
|
|
25
25
|
abortSignal
|
|
26
26
|
});
|
|
27
|
-
if (result instanceof ToolResponse)
|
|
27
|
+
if (result instanceof ToolResponse)
|
|
28
|
+
return result;
|
|
28
29
|
return new ToolResponse({
|
|
29
30
|
result: result === void 0 ? "<no result>" : result
|
|
30
31
|
});
|
|
@@ -48,7 +49,7 @@ async function unstable_runPendingTools(message, tools, abortSignal) {
|
|
|
48
49
|
return {
|
|
49
50
|
...p,
|
|
50
51
|
state: "result",
|
|
51
|
-
artifact: result.artifact,
|
|
52
|
+
...result.artifact !== void 0 ? { artifact: result.artifact } : {},
|
|
52
53
|
result: result.result,
|
|
53
54
|
isError: result.isError
|
|
54
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport { AssistantMessage } from \"../utils/types\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool
|
|
1
|
+
{"version":3,"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport { AssistantMessage } from \"../utils/types\";\nimport { ReadonlyJSONObject, ReadonlyJSONValue } from \"../../utils\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n toolCall: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n },\n) {\n const tool = tools?.[toolCall.toolName];\n if (!tool || !tool.execute) return undefined;\n\n const getResult = async (\n toolExecute: ToolExecuteFunction<ReadonlyJSONObject, unknown>,\n ): Promise<ToolResponse<ReadonlyJSONValue>> => {\n let executeFn = toolExecute;\n\n if (isStandardSchemaV1(tool.parameters)) {\n let result = tool.parameters[\"~standard\"].validate(toolCall.args);\n if (result instanceof Promise) result = await result;\n\n if (result.issues) {\n executeFn =\n tool.experimental_onSchemaValidationError ??\n (() => {\n throw new Error(\n `Function parameter validation failed. ${JSON.stringify(result.issues)}`,\n );\n });\n }\n }\n\n const result = (await executeFn(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n abortSignal,\n })) as unknown as ReadonlyJSONValue;\n if (result instanceof ToolResponse)\n return result as ToolResponse<ReadonlyJSONValue>;\n return new ToolResponse({\n result: result === undefined ? \"<no result>\" : result,\n });\n };\n\n return getResult(tool.execute);\n}\n\nfunction getToolStreamResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n reader: ToolCallReader<any, ReadonlyJSONValue>,\n context: {\n toolCallId: string;\n toolName: string;\n },\n) {\n tools?.[context.toolName]?.streamCall?.(reader, {\n toolCallId: context.toolCallId,\n abortSignal,\n });\n}\n\nexport async function unstable_runPendingTools(\n message: AssistantMessage,\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n) {\n // TODO parallel tool calling\n for (const part of message.parts) {\n if (part.type === \"tool-call\") {\n const promiseOrUndefined = getToolResponse(tools, abortSignal, part);\n if (promiseOrUndefined) {\n const result = await promiseOrUndefined;\n const updatedParts = message.parts.map((p) => {\n if (p.type === \"tool-call\" && p.toolCallId === part.toolCallId) {\n return {\n ...p,\n state: \"result\" as const,\n ...(result.artifact !== undefined\n ? { artifact: result.artifact }\n : {}),\n result: result.result as ReadonlyJSONValue,\n isError: result.isError,\n };\n }\n return p;\n });\n message = {\n ...message,\n parts: updatedParts,\n content: updatedParts,\n };\n }\n }\n }\n return message;\n}\n\nexport function toolResultStream(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n) {\n return new ToolExecutionStream({\n execute: (toolCall) => getToolResponse(tools, abortSignal, toolCall),\n streamCall: ({ reader, ...context }) =>\n getToolStreamResponse(tools, abortSignal, reader, context),\n });\n}\n"],"mappings":";AAEA,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAIpC,IAAM,qBAAqB,CACzB,WACwC;AACxC,SACE,OAAO,WAAW,YAClB,WAAW,QACX,eAAe,UACd,OAAqC,WAAW,EAAE,YAAY;AAEnE;AAEA,SAAS,gBACP,OACA,aACA,UAKA;AACA,QAAM,OAAO,QAAQ,SAAS,QAAQ;AACtC,MAAI,CAAC,QAAQ,CAAC,KAAK,QAAS,QAAO;AAEnC,QAAM,YAAY,OAChB,gBAC6C;AAC7C,QAAI,YAAY;AAEhB,QAAI,mBAAmB,KAAK,UAAU,GAAG;AACvC,UAAIA,UAAS,KAAK,WAAW,WAAW,EAAE,SAAS,SAAS,IAAI;AAChE,UAAIA,mBAAkB,QAAS,CAAAA,UAAS,MAAMA;AAE9C,UAAIA,QAAO,QAAQ;AACjB,oBACE,KAAK,yCACJ,MAAM;AACL,gBAAM,IAAI;AAAA,YACR,yCAAyC,KAAK,UAAUA,QAAO,MAAM,CAAC;AAAA,UACxE;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,UAAU,SAAS,MAAM;AAAA,MAC7C,YAAY,SAAS;AAAA,MACrB;AAAA,IACF,CAAC;AACD,QAAI,kBAAkB;AACpB,aAAO;AACT,WAAO,IAAI,aAAa;AAAA,MACtB,QAAQ,WAAW,SAAY,gBAAgB;AAAA,IACjD,CAAC;AAAA,EACH;AAEA,SAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,sBACP,OACA,aACA,QACA,SAIA;AACA,UAAQ,QAAQ,QAAQ,GAAG,aAAa,QAAQ;AAAA,IAC9C,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,yBACpB,SACA,OACA,aACA;AAEA,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,qBAAqB,gBAAgB,OAAO,aAAa,IAAI;AACnE,UAAI,oBAAoB;AACtB,cAAM,SAAS,MAAM;AACrB,cAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,MAAM;AAC5C,cAAI,EAAE,SAAS,eAAe,EAAE,eAAe,KAAK,YAAY;AAC9D,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,OAAO;AAAA,cACP,GAAI,OAAO,aAAa,SACpB,EAAE,UAAU,OAAO,SAAS,IAC5B,CAAC;AAAA,cACL,QAAQ,OAAO;AAAA,cACf,SAAS,OAAO;AAAA,YAClB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AACD,kBAAU;AAAA,UACR,GAAG;AAAA,UACH,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBACd,OACA,aACA;AACA,SAAO,IAAI,oBAAoB;AAAA,IAC7B,SAAS,CAAC,aAAa,gBAAgB,OAAO,aAAa,QAAQ;AAAA,IACnE,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,MAChC,sBAAsB,OAAO,aAAa,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;","names":["result"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PipeableTransformStream } from "./PipeableTransformStream";
|
|
2
|
+
export declare class SSEEncoder<T> extends PipeableTransformStream<T, Uint8Array> {
|
|
3
|
+
static readonly headers: Headers;
|
|
4
|
+
headers: Headers;
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
export declare class SSEDecoder<T> extends PipeableTransformStream<Uint8Array, T> {
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=SSE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SSE.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/stream/SSE.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAC;IACvE,MAAM,CAAC,QAAQ,CAAC,OAAO,UAIpB;IAEH,OAAO,UAAsB;;CAe9B;AAoED,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,uBAAuB,CAAC,UAAU,EAAE,CAAC,CAAC;;CAsBxE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// src/core/utils/stream/SSE.ts
|
|
2
|
+
import { PipeableTransformStream } from "./PipeableTransformStream.js";
|
|
3
|
+
import { LineDecoderStream } from "./LineDecoderStream.js";
|
|
4
|
+
var SSEEncoder = class _SSEEncoder extends PipeableTransformStream {
|
|
5
|
+
static headers = new Headers({
|
|
6
|
+
"Content-Type": "text/event-stream",
|
|
7
|
+
"Cache-Control": "no-cache",
|
|
8
|
+
Connection: "keep-alive"
|
|
9
|
+
});
|
|
10
|
+
headers = _SSEEncoder.headers;
|
|
11
|
+
constructor() {
|
|
12
|
+
super(
|
|
13
|
+
(readable) => readable.pipeThrough(
|
|
14
|
+
new TransformStream({
|
|
15
|
+
transform(chunk, controller) {
|
|
16
|
+
controller.enqueue(`data: ${JSON.stringify(chunk)}
|
|
17
|
+
|
|
18
|
+
`);
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
).pipeThrough(new TextEncoderStream())
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
var SSEEventStream = class extends TransformStream {
|
|
26
|
+
constructor() {
|
|
27
|
+
let eventBuffer = {};
|
|
28
|
+
let dataLines = [];
|
|
29
|
+
super({
|
|
30
|
+
start() {
|
|
31
|
+
eventBuffer = {};
|
|
32
|
+
dataLines = [];
|
|
33
|
+
},
|
|
34
|
+
transform(line, controller) {
|
|
35
|
+
if (line.startsWith(":")) return;
|
|
36
|
+
if (line === "") {
|
|
37
|
+
if (dataLines.length > 0) {
|
|
38
|
+
controller.enqueue({
|
|
39
|
+
event: eventBuffer.event || "message",
|
|
40
|
+
data: dataLines.join("\n"),
|
|
41
|
+
id: eventBuffer.id,
|
|
42
|
+
retry: eventBuffer.retry
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
eventBuffer = {};
|
|
46
|
+
dataLines = [];
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const [field, ...rest] = line.split(":");
|
|
50
|
+
const value = rest.join(":").trimStart();
|
|
51
|
+
switch (field) {
|
|
52
|
+
case "event":
|
|
53
|
+
eventBuffer.event = value;
|
|
54
|
+
break;
|
|
55
|
+
case "data":
|
|
56
|
+
dataLines.push(value);
|
|
57
|
+
break;
|
|
58
|
+
case "id":
|
|
59
|
+
eventBuffer.id = value;
|
|
60
|
+
break;
|
|
61
|
+
case "retry":
|
|
62
|
+
eventBuffer.retry = Number(value);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
flush(controller) {
|
|
67
|
+
if (dataLines.length > 0) {
|
|
68
|
+
controller.enqueue({
|
|
69
|
+
event: eventBuffer.event || "message",
|
|
70
|
+
data: dataLines.join("\n"),
|
|
71
|
+
id: eventBuffer.id,
|
|
72
|
+
retry: eventBuffer.retry
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var SSEDecoder = class extends PipeableTransformStream {
|
|
80
|
+
constructor() {
|
|
81
|
+
super(
|
|
82
|
+
(readable) => readable.pipeThrough(new TextDecoderStream()).pipeThrough(new LineDecoderStream()).pipeThrough(new SSEEventStream()).pipeThrough(
|
|
83
|
+
new TransformStream({
|
|
84
|
+
transform(event, controller) {
|
|
85
|
+
switch (event.event) {
|
|
86
|
+
case "message":
|
|
87
|
+
controller.enqueue(JSON.parse(event.data));
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
throw new Error(`Unknown SSE event type: ${event.event}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
)
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
export {
|
|
99
|
+
SSEDecoder,
|
|
100
|
+
SSEEncoder
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=SSE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/utils/stream/SSE.ts"],"sourcesContent":["import { PipeableTransformStream } from \"./PipeableTransformStream\";\nimport { LineDecoderStream } from \"./LineDecoderStream\";\n\nexport class SSEEncoder<T> extends PipeableTransformStream<T, Uint8Array> {\n static readonly headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n headers = SSEEncoder.headers;\n\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(\n new TransformStream<T, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n }),\n )\n .pipeThrough(new TextEncoderStream()),\n );\n }\n}\n\ntype SSEEvent = {\n event: string;\n data: string;\n id?: string | undefined;\n retry?: number | undefined;\n};\n\nclass SSEEventStream extends TransformStream<string, SSEEvent> {\n constructor() {\n let eventBuffer: Partial<SSEEvent> = {};\n let dataLines: string[] = [];\n\n super({\n start() {\n eventBuffer = {};\n dataLines = [];\n },\n transform(line, controller) {\n if (line.startsWith(\":\")) return; // Ignore comments\n\n if (line === \"\") {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n eventBuffer = {};\n dataLines = [];\n return;\n }\n\n const [field, ...rest] = line.split(\":\");\n const value = rest.join(\":\").trimStart();\n\n switch (field) {\n case \"event\":\n eventBuffer.event = value;\n break;\n case \"data\":\n dataLines.push(value);\n break;\n case \"id\":\n eventBuffer.id = value;\n break;\n case \"retry\":\n eventBuffer.retry = Number(value);\n break;\n }\n },\n flush(controller) {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n },\n });\n }\n}\n\nexport class SSEDecoder<T> extends PipeableTransformStream<Uint8Array, T> {\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new SSEEventStream())\n .pipeThrough(\n new TransformStream<SSEEvent, T>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n controller.enqueue(JSON.parse(event.data));\n break;\n default:\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n },\n }),\n ),\n );\n }\n}\n"],"mappings":";AAAA,SAAS,+BAA+B;AACxC,SAAS,yBAAyB;AAE3B,IAAM,aAAN,MAAM,oBAAsB,wBAAuC;AAAA,EACxE,OAAgB,UAAU,IAAI,QAAQ;AAAA,IACpC,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd,CAAC;AAAA,EAED,UAAU,YAAW;AAAA,EAErB,cAAc;AACZ;AAAA,MAAM,CAAC,aACL,SACG;AAAA,QACC,IAAI,gBAA2B;AAAA,UAC7B,UAAU,OAAO,YAAY;AAC3B,uBAAW,QAAQ,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM;AAAA,UACzD;AAAA,QACF,CAAC;AAAA,MACH,EACC,YAAY,IAAI,kBAAkB,CAAC;AAAA,IACxC;AAAA,EACF;AACF;AASA,IAAM,iBAAN,cAA6B,gBAAkC;AAAA,EAC7D,cAAc;AACZ,QAAI,cAAiC,CAAC;AACtC,QAAI,YAAsB,CAAC;AAE3B,UAAM;AAAA,MACJ,QAAQ;AACN,sBAAc,CAAC;AACf,oBAAY,CAAC;AAAA,MACf;AAAA,MACA,UAAU,MAAM,YAAY;AAC1B,YAAI,KAAK,WAAW,GAAG,EAAG;AAE1B,YAAI,SAAS,IAAI;AACf,cAAI,UAAU,SAAS,GAAG;AACxB,uBAAW,QAAQ;AAAA,cACjB,OAAO,YAAY,SAAS;AAAA,cAC5B,MAAM,UAAU,KAAK,IAAI;AAAA,cACzB,IAAI,YAAY;AAAA,cAChB,OAAO,YAAY;AAAA,YACrB,CAAC;AAAA,UACH;AACA,wBAAc,CAAC;AACf,sBAAY,CAAC;AACb;AAAA,QACF;AAEA,cAAM,CAAC,OAAO,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AACvC,cAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,UAAU;AAEvC,gBAAQ,OAAO;AAAA,UACb,KAAK;AACH,wBAAY,QAAQ;AACpB;AAAA,UACF,KAAK;AACH,sBAAU,KAAK,KAAK;AACpB;AAAA,UACF,KAAK;AACH,wBAAY,KAAK;AACjB;AAAA,UACF,KAAK;AACH,wBAAY,QAAQ,OAAO,KAAK;AAChC;AAAA,QACJ;AAAA,MACF;AAAA,MACA,MAAM,YAAY;AAChB,YAAI,UAAU,SAAS,GAAG;AACxB,qBAAW,QAAQ;AAAA,YACjB,OAAO,YAAY,SAAS;AAAA,YAC5B,MAAM,UAAU,KAAK,IAAI;AAAA,YACzB,IAAI,YAAY;AAAA,YAChB,OAAO,YAAY;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,IAAM,aAAN,cAA4B,wBAAuC;AAAA,EACxE,cAAc;AACZ;AAAA,MAAM,CAAC,aACL,SACG,YAAY,IAAI,kBAAkB,CAAC,EACnC,YAAY,IAAI,kBAAkB,CAAC,EACnC,YAAY,IAAI,eAAe,CAAC,EAChC;AAAA,QACC,IAAI,gBAA6B;AAAA,UAC/B,UAAU,OAAO,YAAY;AAC3B,oBAAQ,MAAM,OAAO;AAAA,cACnB,KAAK;AACH,2BAAW,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AACzC;AAAA,cACF;AACE,sBAAM,IAAI,MAAM,2BAA2B,MAAM,KAAK,EAAE;AAAA,YAC5D;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
|
|
@@ -31,18 +31,28 @@ type ToolCallStatus = {
|
|
|
31
31
|
type: "incomplete";
|
|
32
32
|
reason: "cancelled" | "length" | "content-filter" | "other";
|
|
33
33
|
};
|
|
34
|
-
|
|
34
|
+
type ToolCallPartBase = {
|
|
35
35
|
type: "tool-call";
|
|
36
|
-
state: "partial-call" | "call" | "result";
|
|
37
36
|
status: ToolCallStatus;
|
|
38
37
|
toolCallId: string;
|
|
39
38
|
toolName: string;
|
|
40
39
|
argsText: string;
|
|
41
40
|
args: ReadonlyJSONObject;
|
|
42
|
-
artifact?:
|
|
41
|
+
artifact?: ReadonlyJSONValue;
|
|
43
42
|
result?: ReadonlyJSONValue;
|
|
44
43
|
isError?: boolean;
|
|
45
44
|
};
|
|
45
|
+
type ToolCallPartWithoutResult = ToolCallPartBase & {
|
|
46
|
+
state: "partial-call" | "call";
|
|
47
|
+
result?: undefined;
|
|
48
|
+
};
|
|
49
|
+
type ToolCallPartWithResult = ToolCallPartBase & {
|
|
50
|
+
state: "result";
|
|
51
|
+
result: ReadonlyJSONValue;
|
|
52
|
+
artifact?: ReadonlyJSONValue;
|
|
53
|
+
isError?: boolean;
|
|
54
|
+
};
|
|
55
|
+
export type ToolCallPart = ToolCallPartWithoutResult | ToolCallPartWithResult;
|
|
46
56
|
export type SourcePart = {
|
|
47
57
|
type: "source";
|
|
48
58
|
sourceType: "url";
|
|
@@ -92,6 +102,7 @@ export type AssistantMessage = {
|
|
|
92
102
|
*/
|
|
93
103
|
content: AssistantMessagePart[];
|
|
94
104
|
metadata: {
|
|
105
|
+
unstable_state: ReadonlyJSONValue;
|
|
95
106
|
unstable_data: ReadonlyJSONValue[];
|
|
96
107
|
unstable_annotations: ReadonlyJSONValue[];
|
|
97
108
|
steps: AssistantMessageStepMetadata[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,KAAK,UAAU,GACX;IACE,IAAI,EAAE,SAAS,CAAC;CACjB,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC;CAC7D,CAAC;AAMN,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,KAAK,cAAc,GACf;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACzB,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC;CAC7D,CAAC;AAEN,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/utils/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export {\n asAsyncIterableStream,\n type AsyncIterableStream,\n} from \"./AsyncIterableStream\";\nexport { type ReadonlyJSONObject, type ReadonlyJSONValue } from \"./json\";\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAEK;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/json/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "assistant-stream",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"sideEffects": false,
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@standard-schema/spec": "^1.0.0",
|
|
33
|
-
"ai": "^4.3.
|
|
34
|
-
"@types/node": "^22.
|
|
33
|
+
"ai": "^4.3.15",
|
|
34
|
+
"@types/node": "^22.15.18",
|
|
35
35
|
"eslint": "^9",
|
|
36
|
-
"eslint-config-next": "15.3.
|
|
37
|
-
"tsup": "8.
|
|
38
|
-
"tsx": "^4.19.
|
|
39
|
-
"vitest": "^3.1.
|
|
36
|
+
"eslint-config-next": "15.3.2",
|
|
37
|
+
"tsup": "8.5.0",
|
|
38
|
+
"tsx": "^4.19.4",
|
|
39
|
+
"vitest": "^3.1.3",
|
|
40
40
|
"@assistant-ui/x-buildutils": "0.0.1"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ReadonlyJSONValue } from "../utils/json/json-value";
|
|
2
|
+
import { ObjectStreamOperation } from "./object/types";
|
|
2
3
|
|
|
3
4
|
export type PartInit =
|
|
4
5
|
| {
|
|
@@ -82,7 +83,7 @@ export type AssistantStreamChunk = { readonly path: readonly number[] } & (
|
|
|
82
83
|
}
|
|
83
84
|
| {
|
|
84
85
|
readonly type: "result";
|
|
85
|
-
readonly artifact?: ReadonlyJSONValue
|
|
86
|
+
readonly artifact?: ReadonlyJSONValue;
|
|
86
87
|
readonly result: ReadonlyJSONValue;
|
|
87
88
|
readonly isError: boolean;
|
|
88
89
|
}
|
|
@@ -90,4 +91,8 @@ export type AssistantStreamChunk = { readonly path: readonly number[] } & (
|
|
|
90
91
|
readonly type: "error";
|
|
91
92
|
readonly error: string;
|
|
92
93
|
}
|
|
94
|
+
| {
|
|
95
|
+
readonly type: "update-state";
|
|
96
|
+
readonly operations: ObjectStreamOperation[];
|
|
97
|
+
}
|
|
93
98
|
);
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
ReasoningPart,
|
|
12
12
|
FilePart,
|
|
13
13
|
} from "../utils/types";
|
|
14
|
+
import { ObjectStreamAccumulator } from "../object/ObjectStreamAccumulator";
|
|
14
15
|
|
|
15
16
|
const createInitialMessage = (): AssistantMessage => ({
|
|
16
17
|
role: "assistant",
|
|
@@ -20,6 +21,7 @@ const createInitialMessage = (): AssistantMessage => ({
|
|
|
20
21
|
return this.parts;
|
|
21
22
|
},
|
|
22
23
|
metadata: {
|
|
24
|
+
unstable_state: null,
|
|
23
25
|
unstable_data: [],
|
|
24
26
|
unstable_annotations: [],
|
|
25
27
|
steps: [],
|
|
@@ -132,6 +134,9 @@ const handleToolCallArgsTextFinish = (
|
|
|
132
134
|
if (part.type !== "tool-call") {
|
|
133
135
|
throw new Error("Last is not a tool call");
|
|
134
136
|
}
|
|
137
|
+
if (part.state !== "partial-call")
|
|
138
|
+
throw new Error("Last is not a partial call");
|
|
139
|
+
|
|
135
140
|
return {
|
|
136
141
|
...part,
|
|
137
142
|
state: "call",
|
|
@@ -180,7 +185,7 @@ const handleResult = (
|
|
|
180
185
|
return {
|
|
181
186
|
...part,
|
|
182
187
|
state: "result",
|
|
183
|
-
artifact: chunk.artifact,
|
|
188
|
+
...(chunk.artifact !== undefined ? { artifact: chunk.artifact } : {}),
|
|
184
189
|
result: chunk.result,
|
|
185
190
|
isError: chunk.isError ?? false,
|
|
186
191
|
status: { type: "complete", reason: "stop" },
|
|
@@ -316,6 +321,22 @@ const handleErrorChunk = (
|
|
|
316
321
|
};
|
|
317
322
|
};
|
|
318
323
|
|
|
324
|
+
const handleUpdateState = (
|
|
325
|
+
message: AssistantMessage,
|
|
326
|
+
chunk: AssistantStreamChunk & { type: "update-state" },
|
|
327
|
+
): AssistantMessage => {
|
|
328
|
+
const acc = new ObjectStreamAccumulator(message.metadata.unstable_state);
|
|
329
|
+
acc.append(chunk.operations);
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
...message,
|
|
333
|
+
metadata: {
|
|
334
|
+
...message.metadata,
|
|
335
|
+
unstable_state: acc.state,
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
};
|
|
339
|
+
|
|
319
340
|
export class AssistantMessageAccumulator extends TransformStream<
|
|
320
341
|
AssistantStreamChunk,
|
|
321
342
|
AssistantMessage
|
|
@@ -366,6 +387,9 @@ export class AssistantMessageAccumulator extends TransformStream<
|
|
|
366
387
|
case "error":
|
|
367
388
|
message = handleErrorChunk(message, chunk);
|
|
368
389
|
break;
|
|
390
|
+
case "update-state":
|
|
391
|
+
message = handleUpdateState(message, chunk);
|
|
392
|
+
break;
|
|
369
393
|
default: {
|
|
370
394
|
const unhandledType: never = type;
|
|
371
395
|
throw new Error(`Unsupported chunk type: ${unhandledType}`);
|
package/src/core/index.ts
CHANGED
|
@@ -15,3 +15,10 @@ export { AssistantMessageStream } from "./accumulators/AssistantMessageStream";
|
|
|
15
15
|
export type { AssistantMessage } from "./utils/types";
|
|
16
16
|
|
|
17
17
|
export * from "./tool";
|
|
18
|
+
|
|
19
|
+
export { createObjectStream } from "./object/createObjectStream";
|
|
20
|
+
export {
|
|
21
|
+
ObjectStreamResponse,
|
|
22
|
+
fromObjectStreamResponse,
|
|
23
|
+
} from "./object/ObjectStreamResponse";
|
|
24
|
+
export type { ObjectStreamChunk } from "./object/types";
|
|
@@ -57,7 +57,9 @@ class ToolCallStreamControllerImpl implements ToolCallStreamController {
|
|
|
57
57
|
this._controller.enqueue({
|
|
58
58
|
type: "result",
|
|
59
59
|
path: [],
|
|
60
|
-
|
|
60
|
+
...(response.artifact !== undefined
|
|
61
|
+
? { artifact: response.artifact }
|
|
62
|
+
: {}),
|
|
61
63
|
result: response.result,
|
|
62
64
|
isError: response.isError ?? false,
|
|
63
65
|
});
|