assistant-stream 0.0.29 → 0.0.31
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/ai-sdk.d.mts +1 -1
- package/dist/ai-sdk.d.ts +1 -1
- package/dist/ai-sdk.js +23 -19
- package/dist/ai-sdk.js.map +1 -1
- package/dist/ai-sdk.mjs +14 -8
- package/dist/ai-sdk.mjs.map +1 -1
- package/dist/{assistant-stream-tsvbKdH1.d.mts → assistant-stream-DolPLJ-R.d.mts} +24 -14
- package/dist/{assistant-stream-tsvbKdH1.d.ts → assistant-stream-DolPLJ-R.d.ts} +24 -14
- package/dist/{chunk-UKEHPKV7.mjs → chunk-NU5PP6C2.mjs} +23 -46
- package/dist/chunk-NU5PP6C2.mjs.map +1 -0
- package/dist/index.d.mts +2 -14
- package/dist/index.d.ts +2 -14
- package/dist/index.js +24 -67
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
- package/dist/chunk-UKEHPKV7.mjs.map +0 -1
|
@@ -59,11 +59,9 @@ type AssistantStreamChunk = {
|
|
|
59
59
|
};
|
|
60
60
|
} | {
|
|
61
61
|
readonly type: "result";
|
|
62
|
+
readonly artifact?: ReadonlyJSONValue | undefined;
|
|
62
63
|
readonly result: ReadonlyJSONValue;
|
|
63
64
|
readonly isError: boolean;
|
|
64
|
-
} | {
|
|
65
|
-
readonly type: "artifact";
|
|
66
|
-
readonly artifact: ReadonlyJSONValue;
|
|
67
65
|
} | {
|
|
68
66
|
readonly type: "error";
|
|
69
67
|
readonly error: string;
|
|
@@ -85,10 +83,21 @@ type TextStreamController = {
|
|
|
85
83
|
close(): void;
|
|
86
84
|
};
|
|
87
85
|
|
|
86
|
+
type ToolResponseInit<TResult> = {
|
|
87
|
+
result: TResult;
|
|
88
|
+
artifact?: ReadonlyJSONValue | undefined;
|
|
89
|
+
isError?: boolean | undefined;
|
|
90
|
+
};
|
|
91
|
+
declare class ToolResponse<TResult> {
|
|
92
|
+
readonly artifact?: ReadonlyJSONValue | undefined;
|
|
93
|
+
readonly result: TResult;
|
|
94
|
+
readonly isError: boolean;
|
|
95
|
+
constructor(options: ToolResponseInit<TResult>);
|
|
96
|
+
}
|
|
97
|
+
|
|
88
98
|
type ToolCallStreamController = {
|
|
89
99
|
argsText: TextStreamController;
|
|
90
|
-
|
|
91
|
-
unstable_setArtifact(artifact: ReadonlyJSONValue): void;
|
|
100
|
+
setResponse(response: ToolResponseInit<ReadonlyJSONValue>): void;
|
|
92
101
|
close(): void;
|
|
93
102
|
};
|
|
94
103
|
|
|
@@ -192,20 +201,21 @@ type AssistantMessage = {
|
|
|
192
201
|
};
|
|
193
202
|
};
|
|
194
203
|
|
|
204
|
+
type ToolCallPartInit = {
|
|
205
|
+
toolCallId?: string;
|
|
206
|
+
toolName: string;
|
|
207
|
+
argsText?: string;
|
|
208
|
+
args?: ReadonlyJSONObject;
|
|
209
|
+
response?: ToolResponseInit<ReadonlyJSONValue>;
|
|
210
|
+
};
|
|
195
211
|
type AssistantStreamController = {
|
|
196
212
|
appendText(textDelta: string): void;
|
|
197
213
|
appendReasoning(reasoningDelta: string): void;
|
|
198
214
|
appendSource(options: SourcePart): void;
|
|
199
215
|
appendFile(options: FilePart): void;
|
|
200
216
|
addTextPart(): TextStreamController;
|
|
201
|
-
addToolCallPart(
|
|
202
|
-
addToolCallPart(options:
|
|
203
|
-
toolCallId?: string;
|
|
204
|
-
toolName: string;
|
|
205
|
-
args?: ReadonlyJSONObject;
|
|
206
|
-
result?: ReadonlyJSONValue;
|
|
207
|
-
isError?: boolean;
|
|
208
|
-
}): ToolCallStreamController;
|
|
217
|
+
addToolCallPart(options: string): ToolCallStreamController;
|
|
218
|
+
addToolCallPart(options: ToolCallPartInit): ToolCallStreamController;
|
|
209
219
|
enqueue(chunk: AssistantStreamChunk): void;
|
|
210
220
|
merge(stream: AssistantStream): void;
|
|
211
221
|
close(): void;
|
|
@@ -213,4 +223,4 @@ type AssistantStreamController = {
|
|
|
213
223
|
declare function createAssistantStream(callback: (controller: AssistantStreamController) => PromiseLike<void> | void): AssistantStream;
|
|
214
224
|
declare function createAssistantStreamResponse(callback: (controller: AssistantStreamController) => PromiseLike<void> | void): Response;
|
|
215
225
|
|
|
216
|
-
export { AssistantStream as A, type ReadonlyJSONValue as R, type AssistantStreamChunk as a, type AssistantStreamController as b, type AssistantMessage as c, type AssistantStreamEncoder as d, createAssistantStream as e, createAssistantStreamResponse as f };
|
|
226
|
+
export { AssistantStream as A, type ReadonlyJSONValue as R, ToolResponse as T, type AssistantStreamChunk as a, type AssistantStreamController as b, type AssistantMessage as c, type AssistantStreamEncoder as d, createAssistantStream as e, createAssistantStreamResponse as f };
|
|
@@ -189,19 +189,13 @@ var ToolCallStreamControllerImpl = class {
|
|
|
189
189
|
return this._argsTextController;
|
|
190
190
|
}
|
|
191
191
|
_argsTextController;
|
|
192
|
-
|
|
193
|
-
this._controller.enqueue({
|
|
194
|
-
type: "artifact",
|
|
195
|
-
path: [],
|
|
196
|
-
artifact
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
setResult(result, isError) {
|
|
192
|
+
setResponse(response) {
|
|
200
193
|
this._controller.enqueue({
|
|
201
194
|
type: "result",
|
|
202
195
|
path: [],
|
|
203
|
-
|
|
204
|
-
|
|
196
|
+
artifact: response.artifact,
|
|
197
|
+
result: response.result,
|
|
198
|
+
isError: response.isError ?? false
|
|
205
199
|
});
|
|
206
200
|
}
|
|
207
201
|
async close() {
|
|
@@ -377,12 +371,16 @@ var AssistantStreamControllerImpl = class {
|
|
|
377
371
|
const toolCallId = opt.toolCallId ?? generateId();
|
|
378
372
|
const [stream, controller] = createToolCallStreamController();
|
|
379
373
|
this._addPart({ type: "tool-call", toolName, toolCallId }, stream);
|
|
374
|
+
if (opt.argsText !== void 0) {
|
|
375
|
+
controller.argsText.append(opt.argsText);
|
|
376
|
+
controller.argsText.close();
|
|
377
|
+
}
|
|
380
378
|
if (opt.args !== void 0) {
|
|
381
379
|
controller.argsText.append(JSON.stringify(opt.args));
|
|
382
380
|
controller.argsText.close();
|
|
383
381
|
}
|
|
384
|
-
if (opt.
|
|
385
|
-
controller.
|
|
382
|
+
if (opt.response !== void 0) {
|
|
383
|
+
controller.setResponse(opt.response);
|
|
386
384
|
}
|
|
387
385
|
return controller;
|
|
388
386
|
}
|
|
@@ -613,7 +611,7 @@ var AssistantMetaTransformStream = class extends TransformStream {
|
|
|
613
611
|
controller.enqueue(chunk);
|
|
614
612
|
return;
|
|
615
613
|
}
|
|
616
|
-
if (chunk.type === "text-delta" || chunk.type === "result" || chunk.type === "
|
|
614
|
+
if (chunk.type === "text-delta" || chunk.type === "result" || chunk.type === "part-finish" || chunk.type === "tool-call-args-text-finish") {
|
|
617
615
|
if (chunk.path.length !== 1) {
|
|
618
616
|
controller.error(
|
|
619
617
|
new Error(`${chunk.type} chunks must have a path of length 1`)
|
|
@@ -714,23 +712,9 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
714
712
|
type: "a" /* ToolCallResult */,
|
|
715
713
|
value: {
|
|
716
714
|
toolCallId: part.toolCallId,
|
|
717
|
-
result: chunk.result
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
722
|
-
case "artifact": {
|
|
723
|
-
const part = chunk.meta;
|
|
724
|
-
if (part.type !== "tool-call") {
|
|
725
|
-
throw new Error(
|
|
726
|
-
`Artifact chunk on non-tool-call part not supported: ${part.type}`
|
|
727
|
-
);
|
|
728
|
-
}
|
|
729
|
-
controller.enqueue({
|
|
730
|
-
type: "aui-tool-artifact" /* AuiToolCallArtifact */,
|
|
731
|
-
value: {
|
|
732
|
-
toolCallId: part.toolCallId,
|
|
733
|
-
artifact: chunk.artifact
|
|
715
|
+
result: chunk.result,
|
|
716
|
+
artifact: chunk.artifact,
|
|
717
|
+
...chunk.isError ? { isError: chunk.isError } : {}
|
|
734
718
|
}
|
|
735
719
|
});
|
|
736
720
|
break;
|
|
@@ -845,35 +829,28 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
845
829
|
toolCallController.argsText.append(argsTextDelta);
|
|
846
830
|
break;
|
|
847
831
|
}
|
|
848
|
-
case "aui-tool-artifact" /* AuiToolCallArtifact */: {
|
|
849
|
-
const { toolCallId, artifact } = value;
|
|
850
|
-
const toolCallController = toolCallControllers.get(toolCallId);
|
|
851
|
-
if (!toolCallController)
|
|
852
|
-
throw new Error(
|
|
853
|
-
"Encountered tool call with unknown id: " + toolCallId
|
|
854
|
-
);
|
|
855
|
-
toolCallController.unstable_setArtifact(artifact);
|
|
856
|
-
break;
|
|
857
|
-
}
|
|
858
832
|
case "a" /* ToolCallResult */: {
|
|
859
|
-
const { toolCallId, result } = value;
|
|
833
|
+
const { toolCallId, artifact, result, isError } = value;
|
|
860
834
|
const toolCallController = toolCallControllers.get(toolCallId);
|
|
861
835
|
if (!toolCallController)
|
|
862
836
|
throw new Error(
|
|
863
837
|
"Encountered tool call result with unknown id: " + toolCallId
|
|
864
838
|
);
|
|
865
|
-
toolCallController.
|
|
839
|
+
toolCallController.setResponse({
|
|
840
|
+
artifact,
|
|
841
|
+
result,
|
|
842
|
+
isError
|
|
843
|
+
});
|
|
866
844
|
break;
|
|
867
845
|
}
|
|
868
846
|
case "9" /* ToolCall */: {
|
|
869
847
|
const { toolCallId, toolName, args } = value;
|
|
870
848
|
const toolCallController = controller.addToolCallPart({
|
|
871
849
|
toolCallId,
|
|
872
|
-
toolName
|
|
850
|
+
toolName,
|
|
851
|
+
args
|
|
873
852
|
});
|
|
874
853
|
toolCallControllers.set(toolCallId, toolCallController);
|
|
875
|
-
toolCallController.argsText.append(JSON.stringify(args));
|
|
876
|
-
toolCallController.argsText.close();
|
|
877
854
|
break;
|
|
878
855
|
}
|
|
879
856
|
case "d" /* FinishMessage */:
|
|
@@ -962,4 +939,4 @@ export {
|
|
|
962
939
|
createAssistantStreamResponse,
|
|
963
940
|
AssistantTransformStream
|
|
964
941
|
};
|
|
965
|
-
//# sourceMappingURL=chunk-
|
|
942
|
+
//# sourceMappingURL=chunk-NU5PP6C2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/AssistantStream.ts","../src/core/utils/stream/merge.ts","../src/core/modules/text.ts","../src/core/modules/tool-call.ts","../src/core/utils/Counter.ts","../src/core/utils/stream/path-utils.ts","../src/core/utils/generateId.tsx","../src/core/modules/assistant-stream.ts","../src/core/utils/stream/AssistantTransformStream.ts","../src/core/utils/stream/PipeableTransformStream.ts","../src/core/utils/stream/LineDecoderStream.ts","../src/core/serialization/data-stream/serialization.ts","../src/core/utils/stream/AssistantMetaTransformStream.ts","../src/core/serialization/data-stream/DataStream.ts"],"sourcesContent":["import { AssistantStreamChunk } from \"./AssistantStreamChunk\";\n\nexport type AssistantStream = ReadableStream<AssistantStreamChunk>;\n\nexport type AssistantStreamEncoder = ReadableWritablePair<\n Uint8Array,\n AssistantStreamChunk\n> & {\n headers?: Headers;\n};\n\nexport const AssistantStream = {\n toResponse(stream: AssistantStream, transformer: AssistantStreamEncoder) {\n return new Response(AssistantStream.toByteStream(stream, transformer), {\n headers: transformer.headers ?? {},\n });\n },\n\n fromResponse(\n response: Response,\n transformer: ReadableWritablePair<AssistantStreamChunk, Uint8Array>,\n ) {\n return AssistantStream.fromByteStream(response.body!, transformer);\n },\n\n toByteStream(\n stream: AssistantStream,\n transformer: ReadableWritablePair<Uint8Array, AssistantStreamChunk>,\n ) {\n return stream.pipeThrough(transformer);\n },\n\n fromByteStream(\n readable: ReadableStream<Uint8Array>,\n transformer: ReadableWritablePair<AssistantStreamChunk, Uint8Array>,\n ) {\n return readable.pipeThrough(transformer);\n },\n};\n","import { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\n\ntype MergeStreamItem = {\n reader: ReadableStreamDefaultReader<AssistantStreamChunk>;\n promise?: Promise<unknown> | undefined;\n};\n\nconst promiseWithResolvers = () => {\n let resolve: () => void;\n let reject: (reason?: any) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve!, reject: reject! };\n};\n\nexport const createMergeStream = () => {\n const list: MergeStreamItem[] = [];\n let sealed = false;\n let controller: ReadableStreamDefaultController<AssistantStreamChunk>;\n let currentPull: ReturnType<typeof promiseWithResolvers> | undefined;\n\n const handlePull = (item: MergeStreamItem) => {\n if (!item.promise) {\n // TODO for most streams, we can directly pipeTo to avoid the microTask queue\n // add an option to eagerly pipe the stream to the merge stream\n // ideally, using assitant-stream w sync run method + piping to a sync WritableStream runs in the same microtask\n // this is useful because we often use AssistantStreams internally as a serialization utility, e. g. AssistantTransformStream\n // idea: avoid reader.read() by instead using a WritableStream & if (!hasPendingPull) await waitForPull()?\n item.promise = item.reader\n .read()\n .then(({ done, value }) => {\n item.promise = undefined;\n if (done) {\n list.splice(list.indexOf(item), 1);\n if (sealed && list.length === 0) {\n controller.close();\n }\n } else {\n controller.enqueue(value);\n }\n\n currentPull?.resolve();\n currentPull = undefined;\n })\n .catch((e) => {\n console.error(e);\n\n list.forEach((item) => {\n item.reader.cancel();\n });\n list.length = 0;\n\n controller.error(e);\n\n currentPull?.reject(e);\n currentPull = undefined;\n });\n }\n };\n\n const readable = new ReadableStream<AssistantStreamChunk>({\n start(c) {\n controller = c;\n },\n pull() {\n currentPull = promiseWithResolvers();\n list.forEach((item) => {\n handlePull(item);\n });\n\n return currentPull.promise;\n },\n cancel() {\n list.forEach((item) => {\n item.reader.cancel();\n });\n list.length = 0;\n },\n });\n\n return {\n readable,\n isSealed() {\n return sealed;\n },\n seal() {\n sealed = true;\n if (list.length === 0) controller.close();\n },\n addStream(stream: ReadableStream<AssistantStreamChunk>) {\n if (sealed)\n throw new Error(\n \"Cannot add streams after the run callback has settled.\",\n );\n\n const item = { reader: stream.getReader() };\n list.push(item);\n handlePull(item);\n },\n enqueue(chunk: AssistantStreamChunk) {\n this.addStream(\n new ReadableStream({\n start(c) {\n c.enqueue(chunk);\n c.close();\n },\n }),\n );\n },\n };\n};\n\n// TODO\n// export class SpanContainerMerger {\n// public get isSealed() {\n// return this.mergeStream.isSealed();\n// }\n\n// public get readable() {\n// return this.mergeStream.readable;\n// }\n\n// private subAllocator = new Counter();\n// private mergeStream = createMergeStream();\n\n// constructor() {\n// // id 0 is auto allocated\n// this.subAllocator.up();\n// }\n\n// add(stream: ReadableStream<AssistantStreamChunk>) {\n// this.mergeStream.addStream(\n// stream.pipeThrough(new SpanParentEncoder(this.subAllocator)),\n// );\n// }\n\n// enqueue(chunk: AssistantStreamChunk & { parentId: 0 }) {\n// this.mergeStream.addStream(\n// new ReadableStream({\n// start(c) {\n// c.enqueue(chunk);\n// c.close();\n// },\n// }),\n// );\n// }\n\n// seal() {\n// this.mergeStream.seal();\n// }\n// }\n\n// export class SpanContainerSplitter {\n// public writable;\n\n// private isSealed = false;\n// private writers = new Map<\n// number,\n// WritableStreamDefaultWriter<AssistantStreamChunk>\n// >();\n\n// private closeTasks: Promise<void>[] = [];\n\n// private allocator = new Counter();\n// private subAllocator = new Counter();\n\n// constructor() {\n// // id 0 is auto-allocated\n// this.allocator.up();\n\n// this.writable = new WritableStream({\n// write: (chunk) => {\n// const { type, parentId } = chunk;\n\n// const writer = this.writers.get(parentId);\n// if (writer === undefined) throw new Error(\"Parent id not found\");\n\n// writer.write(chunk);\n\n// if (type === \"span\") {\n// // allocate a new span id\n// this.writers.set(this.allocator.up(), writer);\n// }\n// if (type === \"finish\") {\n// this.writers.delete(parentId);\n// writer.close();\n\n// if (this.writers.size === 0) {\n// const closeTask = this.writable.close();\n// this.closeTasks.push(closeTask);\n// closeTask.then(() => {\n// this.closeTasks.splice(this.closeTasks.indexOf(closeTask), 1);\n// });\n// }\n// }\n// },\n// close: async () => {\n// if (this.writers.size > 0) throw new Error(\"Not all writers closed\");\n\n// // await and throw on any errors\n// await Promise.all(this.closeTasks);\n// },\n// });\n// }\n\n// add(stream: WritableStream<AssistantStreamChunk>) {\n// if (this.isSealed) throw new Error(\"Cannot add streams after sealing\");\n\n// const decoder = new SpanParentDecoder(this.subAllocator);\n// decoder.readable.pipeTo(stream);\n\n// this.writers.set(this.allocator.up(), decoder.writable.getWriter());\n// }\n\n// seal() {\n// this.isSealed = true;\n// if (this.writers.size === 0) this.writable.close();\n// }\n// }\n","import { AssistantStream } from \"../AssistantStream\";\nimport { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport { UnderlyingReadable } from \"../utils/stream/UnderlyingReadable\";\n\nexport type TextStreamController = {\n append(textDelta: string): void;\n close(): void; // TODO reason? error?\n};\n\nclass TextStreamControllerImpl implements TextStreamController {\n private _controller: ReadableStreamDefaultController<AssistantStreamChunk>;\n private _isClosed = false;\n\n constructor(\n controller: ReadableStreamDefaultController<AssistantStreamChunk>,\n ) {\n this._controller = controller;\n }\n\n append(textDelta: string) {\n this._controller.enqueue({\n type: \"text-delta\",\n path: [],\n textDelta,\n });\n return this;\n }\n\n close() {\n if (this._isClosed) return;\n this._isClosed = true;\n this._controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n this._controller.close();\n }\n}\n\nexport const createTextStream = (\n readable: UnderlyingReadable<TextStreamController>,\n): AssistantStream => {\n return new ReadableStream({\n start(c) {\n return readable.start?.(new TextStreamControllerImpl(c));\n },\n pull(c) {\n return readable.pull?.(new TextStreamControllerImpl(c));\n },\n cancel(c) {\n return readable.cancel?.(c);\n },\n });\n};\n\nexport const createTextStreamController = () => {\n let controller!: TextStreamController;\n const stream = createTextStream({\n start(c) {\n controller = c;\n },\n });\n return [stream, controller] as const;\n};\n","import { AssistantStream } from \"../AssistantStream\";\nimport { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport { ToolResponseInit } from \"../ToolResponse\";\nimport { ReadonlyJSONValue } from \"../utils/json/json-value\";\nimport { UnderlyingReadable } from \"../utils/stream/UnderlyingReadable\";\nimport { createTextStream, TextStreamController } from \"./text\";\n\nexport type ToolCallStreamController = {\n argsText: TextStreamController;\n\n setResponse(response: ToolResponseInit<ReadonlyJSONValue>): void;\n close(): void;\n};\n\nclass ToolCallStreamControllerImpl implements ToolCallStreamController {\n private _isClosed = false;\n\n private _mergeTask: Promise<void>;\n constructor(\n private _controller: ReadableStreamDefaultController<AssistantStreamChunk>,\n ) {\n const stream = createTextStream({\n start: (c) => {\n this._argsTextController = c;\n },\n });\n this._mergeTask = stream.pipeTo(\n new WritableStream({\n write: (chunk) => {\n switch (chunk.type) {\n case \"text-delta\":\n this._controller.enqueue(chunk);\n break;\n\n case \"part-finish\":\n this._controller.enqueue({\n type: \"tool-call-args-text-finish\",\n path: [],\n });\n break;\n\n default:\n throw new Error(`Unexpected chunk type: ${chunk.type}`);\n }\n },\n }),\n );\n }\n\n get argsText() {\n return this._argsTextController;\n }\n\n private _argsTextController!: TextStreamController;\n\n setResponse(response: ToolResponseInit<ReadonlyJSONValue>) {\n this._controller.enqueue({\n type: \"result\",\n path: [],\n artifact: response.artifact,\n result: response.result,\n isError: response.isError ?? false,\n });\n }\n\n async close() {\n if (this._isClosed) return;\n\n this._isClosed = true;\n this._argsTextController.close();\n await this._mergeTask;\n\n this._controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n this._controller.close();\n }\n}\n\nexport const createToolCallStream = (\n readable: UnderlyingReadable<ToolCallStreamController>,\n): AssistantStream => {\n return new ReadableStream({\n start(c) {\n return readable.start?.(new ToolCallStreamControllerImpl(c));\n },\n pull(c) {\n return readable.pull?.(new ToolCallStreamControllerImpl(c));\n },\n cancel(c) {\n return readable.cancel?.(c);\n },\n });\n};\n\nexport const createToolCallStreamController = () => {\n let controller!: ToolCallStreamController;\n const stream = createToolCallStream({\n start(c) {\n controller = c;\n },\n });\n return [stream, controller] as const;\n};\n","export class Counter {\n public value = -1;\n\n up() {\n return ++this.value;\n }\n}\n","import { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { Counter } from \"../Counter\";\n\nexport class PathAppendEncoder extends TransformStream<\n AssistantStreamChunk,\n AssistantStreamChunk\n> {\n constructor(idx: number) {\n super({\n transform(chunk, controller) {\n controller.enqueue({\n ...chunk,\n path: [idx, ...chunk.path],\n });\n },\n });\n }\n}\n\nexport class PathAppendDecoder extends TransformStream<\n AssistantStreamChunk,\n AssistantStreamChunk\n> {\n constructor(idx: number) {\n super({\n transform(chunk, controller) {\n const {\n path: [idx2, ...path],\n } = chunk;\n\n if (idx !== idx2)\n throw new Error(`Path mismatch: expected ${idx}, got ${idx2}`);\n\n controller.enqueue({\n ...chunk,\n path,\n });\n },\n });\n }\n}\n\nexport class PathMergeEncoder extends TransformStream<\n AssistantStreamChunk,\n AssistantStreamChunk\n> {\n constructor(counter: Counter) {\n const innerCounter = new Counter();\n const mapping = new Map<number, number>();\n super({\n transform(chunk, controller) {\n if (chunk.type === \"part-start\" && chunk.path.length === 0) {\n mapping.set(innerCounter.up(), counter.up());\n }\n\n const [idx, ...path] = chunk.path;\n if (idx === undefined) {\n controller.enqueue(chunk);\n return;\n }\n const mappedIdx = mapping.get(idx);\n if (mappedIdx === undefined) throw new Error(\"Path not found\");\n\n controller.enqueue({\n ...chunk,\n path: [mappedIdx, ...path],\n });\n },\n });\n }\n}\n","import { customAlphabet } from \"nanoid/non-secure\";\n\nexport const generateId = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n);\n","import { AssistantStream } from \"../AssistantStream\";\nimport { AssistantStreamChunk, PartInit } from \"../AssistantStreamChunk\";\nimport { createMergeStream } from \"../utils/stream/merge\";\nimport { createTextStreamController, TextStreamController } from \"./text\";\nimport {\n createToolCallStreamController,\n ToolCallStreamController,\n} from \"./tool-call\";\nimport { Counter } from \"../utils/Counter\";\nimport {\n PathAppendEncoder,\n PathMergeEncoder,\n} from \"../utils/stream/path-utils\";\nimport { DataStreamEncoder } from \"../serialization/data-stream/DataStream\";\nimport { FilePart, SourcePart } from \"../utils/types\";\nimport { generateId } from \"../utils/generateId\";\nimport {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../utils/json/json-value\";\nimport { ToolResponseInit } from \"../ToolResponse\";\n\ntype ToolCallPartInit = {\n toolCallId?: string;\n toolName: string;\n argsText?: string;\n args?: ReadonlyJSONObject;\n response?: ToolResponseInit<ReadonlyJSONValue>;\n};\n\nexport type AssistantStreamController = {\n appendText(textDelta: string): void;\n appendReasoning(reasoningDelta: string): void;\n appendSource(options: SourcePart): void;\n appendFile(options: FilePart): void;\n addTextPart(): TextStreamController;\n addToolCallPart(options: string): ToolCallStreamController;\n addToolCallPart(options: ToolCallPartInit): ToolCallStreamController;\n enqueue(chunk: AssistantStreamChunk): void;\n merge(stream: AssistantStream): void;\n close(): void;\n};\n\nclass AssistantStreamControllerImpl implements AssistantStreamController {\n private _merger = createMergeStream();\n private _append:\n | {\n controller: TextStreamController;\n kind: \"text\" | \"reasoning\";\n }\n | undefined;\n private _contentCounter = new Counter();\n\n get __internal_isClosed() {\n return this._merger.isSealed();\n }\n\n __internal_getReadable() {\n return this._merger.readable;\n }\n\n private _closeSubscriber: undefined | (() => void);\n __internal_subscribeToClose(callback: () => void) {\n this._closeSubscriber = callback;\n }\n\n private _addPart(part: PartInit, stream: AssistantStream) {\n if (this._append) {\n this._append.controller.close();\n this._append = undefined;\n }\n\n this.enqueue({\n type: \"part-start\",\n part,\n path: [],\n });\n this._merger.addStream(\n stream.pipeThrough(new PathAppendEncoder(this._contentCounter.value)),\n );\n }\n\n merge(stream: AssistantStream) {\n this._merger.addStream(\n stream.pipeThrough(new PathMergeEncoder(this._contentCounter)),\n );\n }\n\n appendText(textDelta: string) {\n if (this._append?.kind !== \"text\") {\n this._append = {\n kind: \"text\",\n controller: this.addTextPart(),\n };\n }\n this._append.controller.append(textDelta);\n }\n\n appendReasoning(textDelta: string) {\n if (this._append?.kind !== \"reasoning\") {\n this._append = {\n kind: \"reasoning\",\n controller: this.addReasoningPart(),\n };\n }\n this._append.controller.append(textDelta);\n }\n\n addTextPart() {\n const [stream, controller] = createTextStreamController();\n this._addPart({ type: \"text\" }, stream);\n return controller;\n }\n\n addReasoningPart() {\n const [stream, controller] = createTextStreamController();\n this._addPart({ type: \"reasoning\" }, stream);\n return controller;\n }\n\n addToolCallPart(\n options: string | ToolCallPartInit,\n ): ToolCallStreamController {\n const opt = typeof options === \"string\" ? { toolName: options } : options;\n const toolName = opt.toolName;\n const toolCallId = opt.toolCallId ?? generateId();\n\n const [stream, controller] = createToolCallStreamController();\n this._addPart({ type: \"tool-call\", toolName, toolCallId }, stream);\n\n if (opt.argsText !== undefined) {\n controller.argsText.append(opt.argsText);\n controller.argsText.close();\n }\n if (opt.args !== undefined) {\n controller.argsText.append(JSON.stringify(opt.args));\n controller.argsText.close();\n }\n if (opt.response !== undefined) {\n controller.setResponse(opt.response);\n }\n\n return controller;\n }\n\n appendSource(options: SourcePart) {\n this._addPart(\n options,\n new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n controller.close();\n },\n }),\n );\n }\n\n appendFile(options: FilePart) {\n this._addPart(\n options,\n new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n controller.close();\n },\n }),\n );\n }\n\n enqueue(chunk: AssistantStreamChunk) {\n this._merger.enqueue(chunk);\n\n if (chunk.type === \"part-start\" && chunk.path.length === 0) {\n this._contentCounter.up();\n }\n }\n\n close() {\n this._merger.seal();\n this._append?.controller?.close();\n\n this._closeSubscriber?.();\n }\n}\n\nexport function createAssistantStream(\n callback: (controller: AssistantStreamController) => PromiseLike<void> | void,\n): AssistantStream {\n const controller = new AssistantStreamControllerImpl();\n\n let promiseOrVoid: PromiseLike<void> | void;\n try {\n promiseOrVoid = callback(controller);\n } catch (e) {\n if (!controller.__internal_isClosed) {\n controller.enqueue({\n type: \"error\",\n path: [],\n error: String(e),\n });\n controller.close();\n }\n throw e;\n }\n\n if (promiseOrVoid instanceof Promise) {\n const runTask = async () => {\n try {\n await promiseOrVoid;\n } catch (e) {\n if (!controller.__internal_isClosed) {\n controller.enqueue({\n type: \"error\",\n path: [],\n error: String(e),\n });\n }\n throw e;\n } finally {\n if (!controller.__internal_isClosed) {\n controller.close();\n }\n }\n };\n runTask();\n } else {\n if (!controller.__internal_isClosed) {\n controller.close();\n }\n }\n\n return controller.__internal_getReadable();\n}\n\nconst promiseWithResolvers = function <T>() {\n let resolve: ((value: T | PromiseLike<T>) => void) | undefined;\n let reject: ((reason?: unknown) => void) | undefined;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n if (!resolve || !reject) throw new Error(\"Failed to create promise\");\n return { promise, resolve, reject };\n};\n\nexport function createAssistantStreamController() {\n const { resolve, promise } = promiseWithResolvers<void>();\n let controller!: AssistantStreamController;\n const stream = createAssistantStream((c) => {\n controller = c;\n\n (controller as AssistantStreamControllerImpl).__internal_subscribeToClose(\n resolve,\n );\n\n return promise;\n });\n return [stream, controller] as const;\n}\n\nexport function createAssistantStreamResponse(\n callback: (controller: AssistantStreamController) => PromiseLike<void> | void,\n) {\n return AssistantStream.toResponse(\n createAssistantStream(callback),\n new DataStreamEncoder(),\n );\n}\n","import { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport {\n AssistantStreamController,\n createAssistantStreamController,\n} from \"../../modules/assistant-stream\";\n\ntype AssistantTransformerFlushCallback = (\n controller: AssistantStreamController,\n) => void | PromiseLike<void>;\n\ntype AssistantTransformerStartCallback = (\n controller: AssistantStreamController,\n) => void | PromiseLike<void>;\n\ntype AssistantTransformerTransformCallback<I> = (\n chunk: I,\n controller: AssistantStreamController,\n) => void | PromiseLike<void>;\n\ntype AssistantTransformer<I> = {\n flush?: AssistantTransformerFlushCallback;\n start?: AssistantTransformerStartCallback;\n transform?: AssistantTransformerTransformCallback<I>;\n};\n\nexport class AssistantTransformStream<I> extends TransformStream<\n I,\n AssistantStreamChunk\n> {\n constructor(\n transformer: AssistantTransformer<I>,\n writableStrategy?: QueuingStrategy<I>,\n readableStrategy?: QueuingStrategy<AssistantStreamChunk>,\n ) {\n const [stream, runController] = createAssistantStreamController();\n\n let runPipeTask: Promise<void>;\n super(\n {\n start(controller) {\n runPipeTask = stream\n .pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n abort(reason?: any) {\n controller.error(reason);\n },\n close() {\n controller.terminate();\n },\n }),\n )\n .catch((error) => {\n controller.error(error);\n });\n\n return transformer.start?.(runController);\n },\n transform(chunk) {\n return transformer.transform?.(chunk, runController);\n },\n async flush() {\n await transformer.flush?.(runController);\n runController.close();\n await runPipeTask;\n },\n },\n writableStrategy,\n readableStrategy,\n );\n }\n}\n","export class PipeableTransformStream<I, O> extends TransformStream<I, O> {\n constructor(transform: (readable: ReadableStream<I>) => ReadableStream<O>) {\n super();\n const readable = transform(super.readable as unknown as ReadableStream<I>);\n Object.defineProperty(this, \"readable\", {\n value: readable,\n writable: false,\n });\n }\n}\n","export class LineDecoderStream extends TransformStream<string, string> {\n private buffer = \"\";\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n\n // Process all complete lines\n for (let i = 0; i < lines.length - 1; i++) {\n controller.enqueue(lines[i]);\n }\n\n // Keep the last incomplete line in the buffer\n this.buffer = lines[lines.length - 1] || \"\";\n },\n flush: (controller) => {\n // flush any remaining content in the buffer\n if (this.buffer) {\n controller.enqueue(this.buffer);\n }\n },\n });\n }\n}\n","import { DataStreamChunk, DataStreamStreamChunkType } from \"./chunk-types\";\n\nexport class DataStreamChunkEncoder extends TransformStream<\n DataStreamChunk,\n string\n> {\n constructor() {\n super({\n transform: (chunk, controller) => {\n controller.enqueue(`${chunk.type}:${JSON.stringify(chunk.value)}\\n`);\n },\n });\n }\n}\n\nexport class DataStreamChunkDecoder extends TransformStream<\n string,\n DataStreamChunk\n> {\n constructor() {\n super({\n transform: (chunk, controller) => {\n const index = chunk.indexOf(\":\");\n if (index === -1) throw new Error(\"Invalid stream part\");\n controller.enqueue({\n type: chunk.slice(0, index) as DataStreamStreamChunkType,\n value: JSON.parse(chunk.slice(index + 1)),\n });\n },\n });\n }\n}\n","import { AssistantStreamChunk, PartInit } from \"../../AssistantStreamChunk\";\n\n/**\n * For chunk types that are associated with a part,\n * we require a non‑nullable meta field.\n */\nexport type AssistantMetaStreamChunk =\n | (AssistantStreamChunk & {\n type: \"text-delta\" | \"part-finish\";\n meta: PartInit;\n })\n | (AssistantStreamChunk & {\n type: \"result\" | \"tool-call-args-text-finish\";\n meta: PartInit & { type: \"tool-call\" };\n })\n | (AssistantStreamChunk & {\n type: Exclude<\n AssistantStreamChunk[\"type\"],\n \"text-delta\" | \"result\" | \"tool-call-args-text-finish\" | \"part-finish\"\n >;\n });\nexport class AssistantMetaTransformStream extends TransformStream<\n AssistantStreamChunk,\n AssistantMetaStreamChunk\n> {\n constructor() {\n // We use an array to record parts as they are introduced.\n const parts: PartInit[] = [];\n\n super({\n transform(chunk, controller) {\n // For chunks that introduce a new part.\n if (chunk.type === \"part-start\") {\n if (chunk.path.length !== 0) {\n controller.error(new Error(\"Nested parts are not supported\"));\n return;\n }\n parts.push(chunk.part);\n controller.enqueue(chunk);\n return;\n }\n\n // For chunks that expect an associated part.\n if (\n chunk.type === \"text-delta\" ||\n chunk.type === \"result\" ||\n chunk.type === \"part-finish\" ||\n chunk.type === \"tool-call-args-text-finish\"\n ) {\n if (chunk.path.length !== 1) {\n controller.error(\n new Error(`${chunk.type} chunks must have a path of length 1`),\n );\n return;\n }\n const idx = chunk.path[0]!;\n if (idx < 0 || idx >= parts.length) {\n controller.error(new Error(`Invalid path index: ${idx}`));\n return;\n }\n const part = parts[idx]!;\n\n controller.enqueue({\n ...chunk,\n meta: part as any, // TODO\n });\n return;\n }\n\n controller.enqueue(chunk);\n },\n });\n }\n}\n","import { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { ToolCallStreamController } from \"../../modules/tool-call\";\nimport { AssistantTransformStream } from \"../../utils/stream/AssistantTransformStream\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport { DataStreamChunk, DataStreamStreamChunkType } from \"./chunk-types\";\nimport { LineDecoderStream } from \"../../utils/stream/LineDecoderStream\";\nimport {\n DataStreamChunkDecoder,\n DataStreamChunkEncoder,\n} from \"./serialization\";\nimport {\n AssistantMetaStreamChunk,\n AssistantMetaTransformStream,\n} from \"../../utils/stream/AssistantMetaTransformStream\";\nimport { TextStreamController } from \"../../modules/text\";\nimport { AssistantStreamEncoder } from \"../../AssistantStream\";\n\nexport class DataStreamEncoder\n extends PipeableTransformStream<AssistantStreamChunk, Uint8Array>\n implements AssistantStreamEncoder\n{\n headers = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"x-vercel-ai-data-stream\": \"v1\",\n });\n\n constructor() {\n super((readable) => {\n const transform = new TransformStream<\n AssistantMetaStreamChunk,\n DataStreamChunk\n >({\n transform(chunk, controller) {\n const type = chunk.type;\n switch (type) {\n case \"part-start\": {\n const part = chunk.part;\n if (part.type === \"tool-call\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.StartToolCall,\n value,\n });\n }\n if (part.type === \"source\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.Source,\n value,\n });\n }\n break;\n }\n case \"text-delta\": {\n const part = chunk.meta;\n switch (part.type) {\n case \"text\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.TextDelta,\n value: chunk.textDelta,\n });\n break;\n }\n case \"reasoning\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.ReasoningDelta,\n value: chunk.textDelta,\n });\n break;\n }\n case \"tool-call\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.ToolCallArgsTextDelta,\n value: {\n toolCallId: part.toolCallId,\n argsTextDelta: chunk.textDelta,\n },\n });\n break;\n }\n default:\n throw new Error(\n `Unsupported part type for text-delta: ${part.type}`,\n );\n }\n break;\n }\n case \"result\": {\n // Only tool-call parts can have results.\n const part = chunk.meta;\n if (part.type !== \"tool-call\") {\n throw new Error(\n `Result chunk on non-tool-call part not supported: ${part.type}`,\n );\n }\n controller.enqueue({\n type: DataStreamStreamChunkType.ToolCallResult,\n value: {\n toolCallId: part.toolCallId,\n result: chunk.result,\n artifact: chunk.artifact,\n ...(chunk.isError ? { isError: chunk.isError } : {}),\n },\n });\n break;\n }\n case \"step-start\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.StartStep,\n value,\n });\n break;\n }\n case \"step-finish\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.FinishStep,\n value,\n });\n break;\n }\n case \"message-finish\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.FinishMessage,\n value,\n });\n break;\n }\n case \"error\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Error,\n value: chunk.error,\n });\n break;\n }\n case \"annotations\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Annotation,\n value: chunk.annotations,\n });\n break;\n }\n case \"data\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Data,\n value: chunk.data,\n });\n break;\n }\n\n // TODO ignore for now\n // in the future, we should create a handler that waits for text parts to finish before continuing\n case \"tool-call-args-text-finish\":\n case \"part-finish\":\n break;\n\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`Unsupported chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n });\n\n return readable\n .pipeThrough(new AssistantMetaTransformStream())\n .pipeThrough(transform)\n .pipeThrough(new DataStreamChunkEncoder())\n .pipeThrough(new TextEncoderStream());\n });\n }\n}\n\nconst TOOL_CALL_ARGS_CLOSING_CHUNKS = [\n DataStreamStreamChunkType.StartToolCall,\n DataStreamStreamChunkType.ToolCall,\n DataStreamStreamChunkType.TextDelta,\n DataStreamStreamChunkType.ReasoningDelta,\n DataStreamStreamChunkType.Source,\n DataStreamStreamChunkType.Error,\n DataStreamStreamChunkType.FinishStep,\n DataStreamStreamChunkType.FinishMessage,\n];\n\nexport class DataStreamDecoder extends PipeableTransformStream<\n Uint8Array,\n AssistantStreamChunk\n> {\n constructor() {\n super((readable) => {\n const toolCallControllers = new Map<string, ToolCallStreamController>();\n let activeToolCallArgsText: TextStreamController | undefined;\n const transform = new AssistantTransformStream<DataStreamChunk>({\n transform(chunk, controller) {\n const { type, value } = chunk;\n\n if (TOOL_CALL_ARGS_CLOSING_CHUNKS.includes(type)) {\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n }\n\n switch (type) {\n case DataStreamStreamChunkType.ReasoningDelta:\n controller.appendReasoning(value);\n break;\n\n case DataStreamStreamChunkType.TextDelta:\n controller.appendText(value);\n break;\n\n case DataStreamStreamChunkType.StartToolCall: {\n const { toolCallId, toolName } = value;\n const toolCallController = controller.addToolCallPart({\n toolCallId,\n toolName,\n });\n toolCallControllers.set(toolCallId, toolCallController);\n\n activeToolCallArgsText = toolCallController.argsText;\n break;\n }\n\n case DataStreamStreamChunkType.ToolCallArgsTextDelta: {\n const { toolCallId, argsTextDelta } = value;\n const toolCallController = toolCallControllers.get(toolCallId);\n if (!toolCallController)\n throw new Error(\n \"Encountered tool call with unknown id: \" + toolCallId,\n );\n toolCallController.argsText.append(argsTextDelta);\n break;\n }\n\n case DataStreamStreamChunkType.ToolCallResult: {\n const { toolCallId, artifact, result, isError } = value;\n const toolCallController = toolCallControllers.get(toolCallId);\n if (!toolCallController)\n throw new Error(\n \"Encountered tool call result with unknown id: \" + toolCallId,\n );\n toolCallController.setResponse({\n artifact,\n result,\n isError,\n });\n break;\n }\n\n case DataStreamStreamChunkType.ToolCall: {\n const { toolCallId, toolName, args } = value;\n\n const toolCallController = controller.addToolCallPart({\n toolCallId,\n toolName,\n args,\n });\n toolCallControllers.set(toolCallId, toolCallController);\n break;\n }\n\n case DataStreamStreamChunkType.FinishMessage:\n controller.enqueue({\n type: \"message-finish\",\n path: [],\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.StartStep:\n controller.enqueue({\n type: \"step-start\",\n path: [],\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.FinishStep:\n controller.enqueue({\n type: \"step-finish\",\n path: [],\n ...value,\n });\n break;\n case DataStreamStreamChunkType.Data:\n controller.enqueue({\n type: \"data\",\n path: [],\n data: value,\n });\n break;\n\n case DataStreamStreamChunkType.Annotation:\n controller.enqueue({\n type: \"annotations\",\n path: [],\n annotations: value,\n });\n break;\n\n case DataStreamStreamChunkType.Source:\n controller.appendSource({\n type: \"source\",\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.Error:\n controller.enqueue({\n type: \"error\",\n path: [],\n error: value,\n });\n break;\n\n case DataStreamStreamChunkType.File:\n controller.appendFile({\n type: \"file\",\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.ReasoningSignature:\n case DataStreamStreamChunkType.RedactedReasoning:\n // ignore these for now\n break;\n\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`unsupported chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n flush() {\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n toolCallControllers.forEach((controller) => controller.close());\n toolCallControllers.clear();\n },\n });\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new DataStreamChunkDecoder())\n .pipeThrough(transform);\n });\n }\n}\n"],"mappings":"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","names":["item","promiseWithResolvers","type"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,22 +1,10 @@
|
|
|
1
|
-
import { a as AssistantStreamChunk, R as ReadonlyJSONValue, c as AssistantMessage, d as AssistantStreamEncoder, A as AssistantStream } from './assistant-stream-
|
|
2
|
-
export { e as createAssistantStream, f as createAssistantStreamResponse } from './assistant-stream-
|
|
1
|
+
import { a as AssistantStreamChunk, T as ToolResponse, R as ReadonlyJSONValue, c as AssistantMessage, d as AssistantStreamEncoder, A as AssistantStream } from './assistant-stream-DolPLJ-R.mjs';
|
|
2
|
+
export { e as createAssistantStream, f as createAssistantStreamResponse } from './assistant-stream-DolPLJ-R.mjs';
|
|
3
3
|
|
|
4
4
|
declare class PipeableTransformStream<I, O> extends TransformStream<I, O> {
|
|
5
5
|
constructor(transform: (readable: ReadableStream<I>) => ReadableStream<O>);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
type ToolResponseOptions<TResult> = {
|
|
9
|
-
result: TResult;
|
|
10
|
-
artifact?: unknown;
|
|
11
|
-
isError?: boolean;
|
|
12
|
-
};
|
|
13
|
-
declare class ToolResponse<TResult> {
|
|
14
|
-
readonly artifact?: unknown;
|
|
15
|
-
readonly result: TResult;
|
|
16
|
-
readonly isError: boolean;
|
|
17
|
-
constructor(options: ToolResponseOptions<TResult>);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
8
|
type ToolCallback = (toolCall: {
|
|
21
9
|
toolCallId: string;
|
|
22
10
|
toolName: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,22 +1,10 @@
|
|
|
1
|
-
import { a as AssistantStreamChunk, R as ReadonlyJSONValue, c as AssistantMessage, d as AssistantStreamEncoder, A as AssistantStream } from './assistant-stream-
|
|
2
|
-
export { e as createAssistantStream, f as createAssistantStreamResponse } from './assistant-stream-
|
|
1
|
+
import { a as AssistantStreamChunk, T as ToolResponse, R as ReadonlyJSONValue, c as AssistantMessage, d as AssistantStreamEncoder, A as AssistantStream } from './assistant-stream-DolPLJ-R.js';
|
|
2
|
+
export { e as createAssistantStream, f as createAssistantStreamResponse } from './assistant-stream-DolPLJ-R.js';
|
|
3
3
|
|
|
4
4
|
declare class PipeableTransformStream<I, O> extends TransformStream<I, O> {
|
|
5
5
|
constructor(transform: (readable: ReadableStream<I>) => ReadableStream<O>);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
type ToolResponseOptions<TResult> = {
|
|
9
|
-
result: TResult;
|
|
10
|
-
artifact?: unknown;
|
|
11
|
-
isError?: boolean;
|
|
12
|
-
};
|
|
13
|
-
declare class ToolResponse<TResult> {
|
|
14
|
-
readonly artifact?: unknown;
|
|
15
|
-
readonly result: TResult;
|
|
16
|
-
readonly isError: boolean;
|
|
17
|
-
constructor(options: ToolResponseOptions<TResult>);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
8
|
type ToolCallback = (toolCall: {
|
|
21
9
|
toolCallId: string;
|
|
22
10
|
toolName: string;
|
package/dist/index.js
CHANGED
|
@@ -235,19 +235,13 @@ var ToolCallStreamControllerImpl = class {
|
|
|
235
235
|
return this._argsTextController;
|
|
236
236
|
}
|
|
237
237
|
_argsTextController;
|
|
238
|
-
|
|
239
|
-
this._controller.enqueue({
|
|
240
|
-
type: "artifact",
|
|
241
|
-
path: [],
|
|
242
|
-
artifact
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
setResult(result, isError) {
|
|
238
|
+
setResponse(response) {
|
|
246
239
|
this._controller.enqueue({
|
|
247
240
|
type: "result",
|
|
248
241
|
path: [],
|
|
249
|
-
|
|
250
|
-
|
|
242
|
+
artifact: response.artifact,
|
|
243
|
+
result: response.result,
|
|
244
|
+
isError: response.isError ?? false
|
|
251
245
|
});
|
|
252
246
|
}
|
|
253
247
|
async close() {
|
|
@@ -463,7 +457,7 @@ var AssistantMetaTransformStream = class extends TransformStream {
|
|
|
463
457
|
controller.enqueue(chunk);
|
|
464
458
|
return;
|
|
465
459
|
}
|
|
466
|
-
if (chunk.type === "text-delta" || chunk.type === "result" || chunk.type === "
|
|
460
|
+
if (chunk.type === "text-delta" || chunk.type === "result" || chunk.type === "part-finish" || chunk.type === "tool-call-args-text-finish") {
|
|
467
461
|
if (chunk.path.length !== 1) {
|
|
468
462
|
controller.error(
|
|
469
463
|
new Error(`${chunk.type} chunks must have a path of length 1`)
|
|
@@ -564,23 +558,9 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
564
558
|
type: "a" /* ToolCallResult */,
|
|
565
559
|
value: {
|
|
566
560
|
toolCallId: part.toolCallId,
|
|
567
|
-
result: chunk.result
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
break;
|
|
571
|
-
}
|
|
572
|
-
case "artifact": {
|
|
573
|
-
const part = chunk.meta;
|
|
574
|
-
if (part.type !== "tool-call") {
|
|
575
|
-
throw new Error(
|
|
576
|
-
`Artifact chunk on non-tool-call part not supported: ${part.type}`
|
|
577
|
-
);
|
|
578
|
-
}
|
|
579
|
-
controller.enqueue({
|
|
580
|
-
type: "aui-tool-artifact" /* AuiToolCallArtifact */,
|
|
581
|
-
value: {
|
|
582
|
-
toolCallId: part.toolCallId,
|
|
583
|
-
artifact: chunk.artifact
|
|
561
|
+
result: chunk.result,
|
|
562
|
+
artifact: chunk.artifact,
|
|
563
|
+
...chunk.isError ? { isError: chunk.isError } : {}
|
|
584
564
|
}
|
|
585
565
|
});
|
|
586
566
|
break;
|
|
@@ -695,35 +675,28 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
695
675
|
toolCallController.argsText.append(argsTextDelta);
|
|
696
676
|
break;
|
|
697
677
|
}
|
|
698
|
-
case "aui-tool-artifact" /* AuiToolCallArtifact */: {
|
|
699
|
-
const { toolCallId, artifact } = value;
|
|
700
|
-
const toolCallController = toolCallControllers.get(toolCallId);
|
|
701
|
-
if (!toolCallController)
|
|
702
|
-
throw new Error(
|
|
703
|
-
"Encountered tool call with unknown id: " + toolCallId
|
|
704
|
-
);
|
|
705
|
-
toolCallController.unstable_setArtifact(artifact);
|
|
706
|
-
break;
|
|
707
|
-
}
|
|
708
678
|
case "a" /* ToolCallResult */: {
|
|
709
|
-
const { toolCallId, result } = value;
|
|
679
|
+
const { toolCallId, artifact, result, isError } = value;
|
|
710
680
|
const toolCallController = toolCallControllers.get(toolCallId);
|
|
711
681
|
if (!toolCallController)
|
|
712
682
|
throw new Error(
|
|
713
683
|
"Encountered tool call result with unknown id: " + toolCallId
|
|
714
684
|
);
|
|
715
|
-
toolCallController.
|
|
685
|
+
toolCallController.setResponse({
|
|
686
|
+
artifact,
|
|
687
|
+
result,
|
|
688
|
+
isError
|
|
689
|
+
});
|
|
716
690
|
break;
|
|
717
691
|
}
|
|
718
692
|
case "9" /* ToolCall */: {
|
|
719
693
|
const { toolCallId, toolName, args } = value;
|
|
720
694
|
const toolCallController = controller.addToolCallPart({
|
|
721
695
|
toolCallId,
|
|
722
|
-
toolName
|
|
696
|
+
toolName,
|
|
697
|
+
args
|
|
723
698
|
});
|
|
724
699
|
toolCallControllers.set(toolCallId, toolCallController);
|
|
725
|
-
toolCallController.argsText.append(JSON.stringify(args));
|
|
726
|
-
toolCallController.argsText.close();
|
|
727
700
|
break;
|
|
728
701
|
}
|
|
729
702
|
case "d" /* FinishMessage */:
|
|
@@ -876,12 +849,16 @@ var AssistantStreamControllerImpl = class {
|
|
|
876
849
|
const toolCallId = opt.toolCallId ?? generateId();
|
|
877
850
|
const [stream, controller] = createToolCallStreamController();
|
|
878
851
|
this._addPart({ type: "tool-call", toolName, toolCallId }, stream);
|
|
852
|
+
if (opt.argsText !== void 0) {
|
|
853
|
+
controller.argsText.append(opt.argsText);
|
|
854
|
+
controller.argsText.close();
|
|
855
|
+
}
|
|
879
856
|
if (opt.args !== void 0) {
|
|
880
857
|
controller.argsText.append(JSON.stringify(opt.args));
|
|
881
858
|
controller.argsText.close();
|
|
882
859
|
}
|
|
883
|
-
if (opt.
|
|
884
|
-
controller.
|
|
860
|
+
if (opt.response !== void 0) {
|
|
861
|
+
controller.setResponse(opt.response);
|
|
885
862
|
}
|
|
886
863
|
return controller;
|
|
887
864
|
}
|
|
@@ -1062,16 +1039,10 @@ var ToolExecutionStream = class extends PipeableTransformStream {
|
|
|
1062
1039
|
},
|
|
1063
1040
|
(c) => {
|
|
1064
1041
|
if (c === void 0) return;
|
|
1065
|
-
if (c.artifact !== void 0) {
|
|
1066
|
-
controller.enqueue({
|
|
1067
|
-
type: "artifact",
|
|
1068
|
-
path: chunk.path,
|
|
1069
|
-
artifact: c.artifact
|
|
1070
|
-
});
|
|
1071
|
-
}
|
|
1072
1042
|
controller.enqueue({
|
|
1073
1043
|
type: "result",
|
|
1074
1044
|
path: chunk.path,
|
|
1045
|
+
artifact: c.artifact,
|
|
1075
1046
|
result: c.result,
|
|
1076
1047
|
isError: c.isError
|
|
1077
1048
|
});
|
|
@@ -1589,6 +1560,7 @@ var handleResult = (message, chunk) => {
|
|
|
1589
1560
|
return {
|
|
1590
1561
|
...part,
|
|
1591
1562
|
state: "result",
|
|
1563
|
+
artifact: chunk.artifact,
|
|
1592
1564
|
result: chunk.result,
|
|
1593
1565
|
isError: chunk.isError ?? false,
|
|
1594
1566
|
status: { type: "complete", reason: "stop" }
|
|
@@ -1598,18 +1570,6 @@ var handleResult = (message, chunk) => {
|
|
|
1598
1570
|
}
|
|
1599
1571
|
});
|
|
1600
1572
|
};
|
|
1601
|
-
var handleArtifact = (message, chunk) => {
|
|
1602
|
-
return updatePartForPath(message, chunk, (part) => {
|
|
1603
|
-
if (part.type === "tool-call") {
|
|
1604
|
-
return {
|
|
1605
|
-
...part,
|
|
1606
|
-
artifact: chunk.artifact
|
|
1607
|
-
};
|
|
1608
|
-
} else {
|
|
1609
|
-
throw new Error("Artifact chunk received but part is not a tool-call");
|
|
1610
|
-
}
|
|
1611
|
-
});
|
|
1612
|
-
};
|
|
1613
1573
|
var handleMessageFinish = (message, chunk) => {
|
|
1614
1574
|
const newStatus = getStatus(chunk);
|
|
1615
1575
|
return { ...message, status: newStatus };
|
|
@@ -1723,9 +1683,6 @@ var AssistantMessageAccumulator = class extends TransformStream {
|
|
|
1723
1683
|
case "result":
|
|
1724
1684
|
message = handleResult(message, chunk);
|
|
1725
1685
|
break;
|
|
1726
|
-
case "artifact":
|
|
1727
|
-
message = handleArtifact(message, chunk);
|
|
1728
|
-
break;
|
|
1729
1686
|
case "message-finish":
|
|
1730
1687
|
message = handleMessageFinish(message, chunk);
|
|
1731
1688
|
break;
|