assistant-stream 0.1.8 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai-sdk/package.json +2 -2
- package/dist/ai-sdk/index.js +7 -34
- package/dist/ai-sdk/index.js.map +1 -1
- package/dist/ai-sdk/language-model.js +5 -31
- package/dist/ai-sdk/language-model.js.map +1 -1
- package/dist/ai-sdk.js +4 -32
- package/dist/ai-sdk.js.map +1 -1
- package/dist/core/AssistantStream.js +3 -29
- package/dist/core/AssistantStream.js.map +1 -1
- package/dist/core/AssistantStreamChunk.js +0 -18
- package/dist/core/AssistantStreamChunk.js.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.js +9 -35
- package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +22 -48
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/index.js +16 -46
- package/dist/core/index.js.map +1 -1
- package/dist/core/modules/assistant-stream.js +29 -52
- package/dist/core/modules/assistant-stream.js.map +1 -1
- package/dist/core/modules/text.js +6 -33
- package/dist/core/modules/text.js.map +1 -1
- package/dist/core/modules/tool-call.js +8 -35
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/serialization/PlainText.js +9 -36
- package/dist/core/serialization/PlainText.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.js +57 -79
- package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js +2 -28
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/serialization/data-stream/serialization.js +6 -33
- package/dist/core/serialization/data-stream/serialization.js.map +1 -1
- package/dist/core/tool/ToolCallReader.js +30 -55
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js +18 -52
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.js +5 -31
- package/dist/core/tool/ToolResponse.js.map +1 -1
- package/dist/core/tool/index.js +9 -35
- package/dist/core/tool/index.js.map +1 -1
- package/dist/core/tool/tool-types.js +0 -18
- package/dist/core/tool/tool-types.js.map +1 -1
- package/dist/core/tool/toolResultStream.js +8 -35
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/tool/type-path-utils.js +0 -18
- package/dist/core/tool/type-path-utils.js.map +1 -1
- package/dist/core/utils/Counter.js +4 -30
- package/dist/core/utils/Counter.js.map +1 -1
- package/dist/core/utils/generateId.js +4 -30
- package/dist/core/utils/generateId.js.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.js +4 -30
- package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.js +8 -32
- package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.js +4 -30
- package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.js +4 -30
- package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.js +0 -18
- package/dist/core/utils/stream/UnderlyingReadable.js.map +1 -1
- package/dist/core/utils/stream/merge.js +5 -31
- package/dist/core/utils/stream/merge.js.map +1 -1
- package/dist/core/utils/stream/path-utils.js +10 -38
- package/dist/core/utils/stream/path-utils.js.map +1 -1
- package/dist/core/utils/types.js +0 -18
- package/dist/core/utils/types.js.map +1 -1
- package/dist/core/utils/withPromiseOrValue.js +2 -28
- package/dist/core/utils/withPromiseOrValue.js.map +1 -1
- package/dist/index.js +1 -24
- package/dist/index.js.map +1 -1
- package/dist/utils/AsyncIterableStream.js +2 -28
- package/dist/utils/AsyncIterableStream.js.map +1 -1
- package/dist/utils/json/fix-json.js +2 -28
- package/dist/utils/json/fix-json.js.map +1 -1
- package/dist/utils/json/is-json.js +2 -30
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/json/json-value.js +0 -18
- package/dist/utils/json/json-value.js.map +1 -1
- package/dist/utils/json/parse-partial-json-object.js +12 -50
- package/dist/utils/json/parse-partial-json-object.js.map +1 -1
- package/dist/utils/promiseWithResolvers.js +3 -29
- package/dist/utils/promiseWithResolvers.js.map +1 -1
- package/dist/utils.js +9 -32
- package/dist/utils.js.map +1 -1
- package/package.json +7 -9
- package/{dist/ai-sdk/index.mjs → src/ai-sdk/index.ts} +64 -33
- package/{dist/ai-sdk/language-model.mjs → src/ai-sdk/language-model.ts} +35 -19
- package/src/ai-sdk.ts +2 -0
- package/src/core/AssistantStream.ts +39 -0
- package/src/core/AssistantStreamChunk.ts +93 -0
- package/src/core/accumulators/AssistantMessageStream.ts +56 -0
- package/{dist/core/accumulators/assistant-message-accumulator.mjs → src/core/accumulators/assistant-message-accumulator.ts} +152 -67
- package/src/core/index.ts +17 -0
- package/{dist/core/modules/assistant-stream.mjs → src/core/modules/assistant-stream.ts} +122 -60
- package/src/core/modules/text.ts +64 -0
- package/{dist/core/modules/tool-call.mjs → src/core/modules/tool-call.ts} +48 -27
- package/src/core/serialization/PlainText.ts +68 -0
- package/{dist/core/serialization/data-stream/DataStream.mjs → src/core/serialization/data-stream/DataStream.ts} +111 -67
- package/src/core/serialization/data-stream/chunk-types.ts +93 -0
- package/src/core/serialization/data-stream/serialization.ts +32 -0
- package/src/core/tool/ToolCallReader.ts +432 -0
- package/{dist/core/tool/ToolExecutionStream.mjs → src/core/tool/ToolExecutionStream.ts} +83 -35
- package/src/core/tool/ToolResponse.ts +31 -0
- package/src/core/tool/index.ts +8 -0
- package/src/core/tool/tool-types.ts +107 -0
- package/src/core/tool/toolResultStream.ts +119 -0
- package/src/core/tool/type-path-utils.ts +36 -0
- package/src/core/utils/Counter.ts +7 -0
- package/src/core/utils/generateId.tsx +6 -0
- package/src/core/utils/stream/AssistantMetaTransformStream.ts +74 -0
- package/src/core/utils/stream/AssistantTransformStream.ts +74 -0
- package/{dist/core/utils/stream/LineDecoderStream.mjs → src/core/utils/stream/LineDecoderStream.ts} +12 -10
- package/src/core/utils/stream/PipeableTransformStream.ts +10 -0
- package/src/core/utils/stream/UnderlyingReadable.ts +5 -0
- package/src/core/utils/stream/merge.ts +212 -0
- package/src/core/utils/stream/path-utils.ts +71 -0
- package/src/core/utils/types.ts +150 -0
- package/src/core/utils/withPromiseOrValue.ts +20 -0
- package/src/index.ts +1 -0
- package/src/utils/AsyncIterableStream.ts +24 -0
- package/{dist/utils/json/fix-json.mjs → src/utils/json/fix-json.ts} +146 -20
- package/src/utils/json/is-json.ts +43 -0
- package/src/utils/json/json-value.ts +13 -0
- package/src/utils/json/parse-partial-json-object.test.ts +225 -0
- package/src/utils/json/parse-partial-json-object.ts +103 -0
- package/src/utils/promiseWithResolvers.ts +10 -0
- package/src/utils.ts +13 -0
- package/dist/ai-sdk/index.mjs.map +0 -1
- package/dist/ai-sdk/language-model.mjs.map +0 -1
- package/dist/ai-sdk.mjs +0 -7
- package/dist/ai-sdk.mjs.map +0 -1
- package/dist/core/AssistantStream.mjs +0 -21
- package/dist/core/AssistantStream.mjs.map +0 -1
- package/dist/core/AssistantStreamChunk.mjs +0 -1
- package/dist/core/AssistantStreamChunk.mjs.map +0 -1
- package/dist/core/accumulators/AssistantMessageStream.mjs +0 -54
- package/dist/core/accumulators/AssistantMessageStream.mjs.map +0 -1
- package/dist/core/accumulators/assistant-message-accumulator.mjs.map +0 -1
- package/dist/core/index.mjs +0 -26
- package/dist/core/index.mjs.map +0 -1
- package/dist/core/modules/assistant-stream.mjs.map +0 -1
- package/dist/core/modules/text.mjs +0 -52
- package/dist/core/modules/text.mjs.map +0 -1
- package/dist/core/modules/tool-call.mjs.map +0 -1
- package/dist/core/serialization/PlainText.mjs +0 -44
- package/dist/core/serialization/PlainText.mjs.map +0 -1
- package/dist/core/serialization/data-stream/DataStream.mjs.map +0 -1
- package/dist/core/serialization/data-stream/chunk-types.mjs +0 -24
- package/dist/core/serialization/data-stream/chunk-types.mjs.map +0 -1
- package/dist/core/serialization/data-stream/serialization.mjs +0 -30
- package/dist/core/serialization/data-stream/serialization.mjs.map +0 -1
- package/dist/core/tool/ToolCallReader.mjs +0 -315
- package/dist/core/tool/ToolCallReader.mjs.map +0 -1
- package/dist/core/tool/ToolExecutionStream.mjs.map +0 -1
- package/dist/core/tool/ToolResponse.mjs +0 -22
- package/dist/core/tool/ToolResponse.mjs.map +0 -1
- package/dist/core/tool/index.mjs +0 -14
- package/dist/core/tool/index.mjs.map +0 -1
- package/dist/core/tool/tool-types.mjs +0 -1
- package/dist/core/tool/tool-types.mjs.map +0 -1
- package/dist/core/tool/toolResultStream.mjs +0 -78
- package/dist/core/tool/toolResultStream.mjs.map +0 -1
- package/dist/core/tool/type-path-utils.mjs +0 -1
- package/dist/core/tool/type-path-utils.mjs.map +0 -1
- package/dist/core/utils/Counter.mjs +0 -11
- package/dist/core/utils/Counter.mjs.map +0 -1
- package/dist/core/utils/generateId.mjs +0 -10
- package/dist/core/utils/generateId.mjs.map +0 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.mjs +0 -44
- package/dist/core/utils/stream/AssistantMetaTransformStream.mjs.map +0 -1
- package/dist/core/utils/stream/AssistantTransformStream.mjs +0 -46
- package/dist/core/utils/stream/AssistantTransformStream.mjs.map +0 -1
- package/dist/core/utils/stream/LineDecoderStream.mjs.map +0 -1
- package/dist/core/utils/stream/PipeableTransformStream.mjs +0 -15
- package/dist/core/utils/stream/PipeableTransformStream.mjs.map +0 -1
- package/dist/core/utils/stream/UnderlyingReadable.mjs +0 -1
- package/dist/core/utils/stream/UnderlyingReadable.mjs.map +0 -1
- package/dist/core/utils/stream/merge.mjs +0 -85
- package/dist/core/utils/stream/merge.mjs.map +0 -1
- package/dist/core/utils/stream/path-utils.mjs +0 -61
- package/dist/core/utils/stream/path-utils.mjs.map +0 -1
- package/dist/core/utils/types.mjs +0 -1
- package/dist/core/utils/types.mjs.map +0 -1
- package/dist/core/utils/withPromiseOrValue.mjs +0 -17
- package/dist/core/utils/withPromiseOrValue.mjs.map +0 -1
- package/dist/index.mjs +0 -3
- package/dist/index.mjs.map +0 -1
- package/dist/utils/AsyncIterableStream.mjs +0 -21
- package/dist/utils/AsyncIterableStream.mjs.map +0 -1
- package/dist/utils/json/fix-json.mjs.map +0 -1
- package/dist/utils/json/is-json.mjs +0 -29
- package/dist/utils/json/is-json.mjs.map +0 -1
- package/dist/utils/json/json-value.mjs +0 -1
- package/dist/utils/json/json-value.mjs.map +0 -1
- package/dist/utils/json/parse-partial-json-object.mjs +0 -65
- package/dist/utils/json/parse-partial-json-object.mjs.map +0 -1
- package/dist/utils/promiseWithResolvers.mjs +0 -15
- package/dist/utils/promiseWithResolvers.mjs.map +0 -1
- package/dist/utils.mjs +0 -14
- package/dist/utils.mjs.map +0 -1
- package/utils/README.md +0 -1
- package/utils/package.json +0 -5
|
@@ -1,141 +1,201 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { createMergeStream } from "../utils/stream/merge
|
|
4
|
-
import { createTextStreamController } from "./text
|
|
1
|
+
import { AssistantStream } from "../AssistantStream";
|
|
2
|
+
import { AssistantStreamChunk, PartInit } from "../AssistantStreamChunk";
|
|
3
|
+
import { createMergeStream } from "../utils/stream/merge";
|
|
4
|
+
import { createTextStreamController, TextStreamController } from "./text";
|
|
5
5
|
import {
|
|
6
|
-
createToolCallStreamController
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
createToolCallStreamController,
|
|
7
|
+
ToolCallStreamController,
|
|
8
|
+
} from "./tool-call";
|
|
9
|
+
import { Counter } from "../utils/Counter";
|
|
9
10
|
import {
|
|
10
11
|
PathAppendEncoder,
|
|
11
|
-
PathMergeEncoder
|
|
12
|
-
} from "../utils/stream/path-utils
|
|
13
|
-
import { DataStreamEncoder } from "../serialization/data-stream/DataStream
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
PathMergeEncoder,
|
|
13
|
+
} from "../utils/stream/path-utils";
|
|
14
|
+
import { DataStreamEncoder } from "../serialization/data-stream/DataStream";
|
|
15
|
+
import { FilePart, SourcePart } from "../utils/types";
|
|
16
|
+
import { generateId } from "../utils/generateId";
|
|
17
|
+
import {
|
|
18
|
+
ReadonlyJSONObject,
|
|
19
|
+
ReadonlyJSONValue,
|
|
20
|
+
} from "../../utils/json/json-value";
|
|
21
|
+
import { ToolResponseInit } from "../tool/ToolResponse";
|
|
22
|
+
import { promiseWithResolvers } from "../../utils/promiseWithResolvers";
|
|
23
|
+
|
|
24
|
+
type ToolCallPartInit = {
|
|
25
|
+
toolCallId?: string;
|
|
26
|
+
toolName: string;
|
|
27
|
+
argsText?: string;
|
|
28
|
+
args?: ReadonlyJSONObject;
|
|
29
|
+
response?: ToolResponseInit<ReadonlyJSONValue>;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type AssistantStreamController = {
|
|
33
|
+
appendText(textDelta: string): void;
|
|
34
|
+
appendReasoning(reasoningDelta: string): void;
|
|
35
|
+
appendSource(options: SourcePart): void;
|
|
36
|
+
appendFile(options: FilePart): void;
|
|
37
|
+
addTextPart(): TextStreamController;
|
|
38
|
+
addToolCallPart(options: string): ToolCallStreamController;
|
|
39
|
+
addToolCallPart(options: ToolCallPartInit): ToolCallStreamController;
|
|
40
|
+
enqueue(chunk: AssistantStreamChunk): void;
|
|
41
|
+
merge(stream: AssistantStream): void;
|
|
42
|
+
close(): void;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
class AssistantStreamControllerImpl implements AssistantStreamController {
|
|
46
|
+
private _merger = createMergeStream();
|
|
47
|
+
private _append:
|
|
48
|
+
| {
|
|
49
|
+
controller: TextStreamController;
|
|
50
|
+
kind: "text" | "reasoning";
|
|
51
|
+
}
|
|
52
|
+
| undefined;
|
|
53
|
+
private _contentCounter = new Counter();
|
|
54
|
+
|
|
20
55
|
get __internal_isClosed() {
|
|
21
56
|
return this._merger.isSealed();
|
|
22
57
|
}
|
|
58
|
+
|
|
23
59
|
__internal_getReadable() {
|
|
24
60
|
return this._merger.readable;
|
|
25
61
|
}
|
|
26
|
-
|
|
27
|
-
|
|
62
|
+
|
|
63
|
+
private _closeSubscriber: undefined | (() => void);
|
|
64
|
+
__internal_subscribeToClose(callback: () => void) {
|
|
28
65
|
this._closeSubscriber = callback;
|
|
29
66
|
}
|
|
30
|
-
|
|
67
|
+
|
|
68
|
+
private _addPart(part: PartInit, stream: AssistantStream) {
|
|
31
69
|
if (this._append) {
|
|
32
70
|
this._append.controller.close();
|
|
33
|
-
this._append =
|
|
71
|
+
this._append = undefined;
|
|
34
72
|
}
|
|
73
|
+
|
|
35
74
|
this.enqueue({
|
|
36
75
|
type: "part-start",
|
|
37
76
|
part,
|
|
38
|
-
path: []
|
|
77
|
+
path: [],
|
|
39
78
|
});
|
|
40
79
|
this._merger.addStream(
|
|
41
|
-
stream.pipeThrough(new PathAppendEncoder(this._contentCounter.value))
|
|
80
|
+
stream.pipeThrough(new PathAppendEncoder(this._contentCounter.value)),
|
|
42
81
|
);
|
|
43
82
|
}
|
|
44
|
-
|
|
83
|
+
|
|
84
|
+
merge(stream: AssistantStream) {
|
|
45
85
|
this._merger.addStream(
|
|
46
|
-
stream.pipeThrough(new PathMergeEncoder(this._contentCounter))
|
|
86
|
+
stream.pipeThrough(new PathMergeEncoder(this._contentCounter)),
|
|
47
87
|
);
|
|
48
88
|
}
|
|
49
|
-
|
|
89
|
+
|
|
90
|
+
appendText(textDelta: string) {
|
|
50
91
|
if (this._append?.kind !== "text") {
|
|
51
92
|
this._append = {
|
|
52
93
|
kind: "text",
|
|
53
|
-
controller: this.addTextPart()
|
|
94
|
+
controller: this.addTextPart(),
|
|
54
95
|
};
|
|
55
96
|
}
|
|
56
97
|
this._append.controller.append(textDelta);
|
|
57
98
|
}
|
|
58
|
-
|
|
99
|
+
|
|
100
|
+
appendReasoning(textDelta: string) {
|
|
59
101
|
if (this._append?.kind !== "reasoning") {
|
|
60
102
|
this._append = {
|
|
61
103
|
kind: "reasoning",
|
|
62
|
-
controller: this.addReasoningPart()
|
|
104
|
+
controller: this.addReasoningPart(),
|
|
63
105
|
};
|
|
64
106
|
}
|
|
65
107
|
this._append.controller.append(textDelta);
|
|
66
108
|
}
|
|
109
|
+
|
|
67
110
|
addTextPart() {
|
|
68
111
|
const [stream, controller] = createTextStreamController();
|
|
69
112
|
this._addPart({ type: "text" }, stream);
|
|
70
113
|
return controller;
|
|
71
114
|
}
|
|
115
|
+
|
|
72
116
|
addReasoningPart() {
|
|
73
117
|
const [stream, controller] = createTextStreamController();
|
|
74
118
|
this._addPart({ type: "reasoning" }, stream);
|
|
75
119
|
return controller;
|
|
76
120
|
}
|
|
77
|
-
|
|
121
|
+
|
|
122
|
+
addToolCallPart(
|
|
123
|
+
options: string | ToolCallPartInit,
|
|
124
|
+
): ToolCallStreamController {
|
|
78
125
|
const opt = typeof options === "string" ? { toolName: options } : options;
|
|
79
126
|
const toolName = opt.toolName;
|
|
80
127
|
const toolCallId = opt.toolCallId ?? generateId();
|
|
128
|
+
|
|
81
129
|
const [stream, controller] = createToolCallStreamController();
|
|
82
130
|
this._addPart({ type: "tool-call", toolName, toolCallId }, stream);
|
|
83
|
-
|
|
131
|
+
|
|
132
|
+
if (opt.argsText !== undefined) {
|
|
84
133
|
controller.argsText.append(opt.argsText);
|
|
85
134
|
controller.argsText.close();
|
|
86
135
|
}
|
|
87
|
-
if (opt.args !==
|
|
136
|
+
if (opt.args !== undefined) {
|
|
88
137
|
controller.argsText.append(JSON.stringify(opt.args));
|
|
89
138
|
controller.argsText.close();
|
|
90
139
|
}
|
|
91
|
-
if (opt.response !==
|
|
140
|
+
if (opt.response !== undefined) {
|
|
92
141
|
controller.setResponse(opt.response);
|
|
93
142
|
}
|
|
143
|
+
|
|
94
144
|
return controller;
|
|
95
145
|
}
|
|
96
|
-
|
|
146
|
+
|
|
147
|
+
appendSource(options: SourcePart) {
|
|
97
148
|
this._addPart(
|
|
98
149
|
options,
|
|
99
150
|
new ReadableStream({
|
|
100
151
|
start(controller) {
|
|
101
152
|
controller.enqueue({
|
|
102
153
|
type: "part-finish",
|
|
103
|
-
path: []
|
|
154
|
+
path: [],
|
|
104
155
|
});
|
|
105
156
|
controller.close();
|
|
106
|
-
}
|
|
107
|
-
})
|
|
157
|
+
},
|
|
158
|
+
}),
|
|
108
159
|
);
|
|
109
160
|
}
|
|
110
|
-
|
|
161
|
+
|
|
162
|
+
appendFile(options: FilePart) {
|
|
111
163
|
this._addPart(
|
|
112
164
|
options,
|
|
113
165
|
new ReadableStream({
|
|
114
166
|
start(controller) {
|
|
115
167
|
controller.enqueue({
|
|
116
168
|
type: "part-finish",
|
|
117
|
-
path: []
|
|
169
|
+
path: [],
|
|
118
170
|
});
|
|
119
171
|
controller.close();
|
|
120
|
-
}
|
|
121
|
-
})
|
|
172
|
+
},
|
|
173
|
+
}),
|
|
122
174
|
);
|
|
123
175
|
}
|
|
124
|
-
|
|
176
|
+
|
|
177
|
+
enqueue(chunk: AssistantStreamChunk) {
|
|
125
178
|
this._merger.enqueue(chunk);
|
|
179
|
+
|
|
126
180
|
if (chunk.type === "part-start" && chunk.path.length === 0) {
|
|
127
181
|
this._contentCounter.up();
|
|
128
182
|
}
|
|
129
183
|
}
|
|
184
|
+
|
|
130
185
|
close() {
|
|
131
186
|
this._merger.seal();
|
|
132
187
|
this._append?.controller?.close();
|
|
188
|
+
|
|
133
189
|
this._closeSubscriber?.();
|
|
134
190
|
}
|
|
135
|
-
}
|
|
136
|
-
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function createAssistantStream(
|
|
194
|
+
callback: (controller: AssistantStreamController) => PromiseLike<void> | void,
|
|
195
|
+
): AssistantStream {
|
|
137
196
|
const controller = new AssistantStreamControllerImpl();
|
|
138
|
-
|
|
197
|
+
|
|
198
|
+
let promiseOrVoid: PromiseLike<void> | void;
|
|
139
199
|
try {
|
|
140
200
|
promiseOrVoid = callback(controller);
|
|
141
201
|
} catch (e) {
|
|
@@ -143,12 +203,13 @@ function createAssistantStream(callback) {
|
|
|
143
203
|
controller.enqueue({
|
|
144
204
|
type: "error",
|
|
145
205
|
path: [],
|
|
146
|
-
error: String(e)
|
|
206
|
+
error: String(e),
|
|
147
207
|
});
|
|
148
208
|
controller.close();
|
|
149
209
|
}
|
|
150
210
|
throw e;
|
|
151
211
|
}
|
|
212
|
+
|
|
152
213
|
if (promiseOrVoid instanceof Promise) {
|
|
153
214
|
const runTask = async () => {
|
|
154
215
|
try {
|
|
@@ -158,7 +219,7 @@ function createAssistantStream(callback) {
|
|
|
158
219
|
controller.enqueue({
|
|
159
220
|
type: "error",
|
|
160
221
|
path: [],
|
|
161
|
-
error: String(e)
|
|
222
|
+
error: String(e),
|
|
162
223
|
});
|
|
163
224
|
}
|
|
164
225
|
throw e;
|
|
@@ -174,29 +235,30 @@ function createAssistantStream(callback) {
|
|
|
174
235
|
controller.close();
|
|
175
236
|
}
|
|
176
237
|
}
|
|
238
|
+
|
|
177
239
|
return controller.__internal_getReadable();
|
|
178
240
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
241
|
+
|
|
242
|
+
export function createAssistantStreamController() {
|
|
243
|
+
const { resolve, promise } = promiseWithResolvers<void>();
|
|
244
|
+
let controller!: AssistantStreamController;
|
|
182
245
|
const stream = createAssistantStream((c) => {
|
|
183
246
|
controller = c;
|
|
184
|
-
|
|
185
|
-
|
|
247
|
+
|
|
248
|
+
(controller as AssistantStreamControllerImpl).__internal_subscribeToClose(
|
|
249
|
+
resolve,
|
|
186
250
|
);
|
|
251
|
+
|
|
187
252
|
return promise;
|
|
188
253
|
});
|
|
189
|
-
return [stream, controller];
|
|
254
|
+
return [stream, controller] as const;
|
|
190
255
|
}
|
|
191
|
-
|
|
256
|
+
|
|
257
|
+
export function createAssistantStreamResponse(
|
|
258
|
+
callback: (controller: AssistantStreamController) => PromiseLike<void> | void,
|
|
259
|
+
) {
|
|
192
260
|
return AssistantStream.toResponse(
|
|
193
261
|
createAssistantStream(callback),
|
|
194
|
-
new DataStreamEncoder()
|
|
262
|
+
new DataStreamEncoder(),
|
|
195
263
|
);
|
|
196
264
|
}
|
|
197
|
-
export {
|
|
198
|
-
createAssistantStream,
|
|
199
|
-
createAssistantStreamController,
|
|
200
|
-
createAssistantStreamResponse
|
|
201
|
-
};
|
|
202
|
-
//# sourceMappingURL=assistant-stream.mjs.map
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { AssistantStream } from "../AssistantStream";
|
|
2
|
+
import { AssistantStreamChunk } from "../AssistantStreamChunk";
|
|
3
|
+
import { UnderlyingReadable } from "../utils/stream/UnderlyingReadable";
|
|
4
|
+
|
|
5
|
+
export type TextStreamController = {
|
|
6
|
+
append(textDelta: string): void;
|
|
7
|
+
close(): void; // TODO reason? error?
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
class TextStreamControllerImpl implements TextStreamController {
|
|
11
|
+
private _controller: ReadableStreamDefaultController<AssistantStreamChunk>;
|
|
12
|
+
private _isClosed = false;
|
|
13
|
+
|
|
14
|
+
constructor(
|
|
15
|
+
controller: ReadableStreamDefaultController<AssistantStreamChunk>,
|
|
16
|
+
) {
|
|
17
|
+
this._controller = controller;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
append(textDelta: string) {
|
|
21
|
+
this._controller.enqueue({
|
|
22
|
+
type: "text-delta",
|
|
23
|
+
path: [],
|
|
24
|
+
textDelta,
|
|
25
|
+
});
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
close() {
|
|
30
|
+
if (this._isClosed) return;
|
|
31
|
+
this._isClosed = true;
|
|
32
|
+
this._controller.enqueue({
|
|
33
|
+
type: "part-finish",
|
|
34
|
+
path: [],
|
|
35
|
+
});
|
|
36
|
+
this._controller.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const createTextStream = (
|
|
41
|
+
readable: UnderlyingReadable<TextStreamController>,
|
|
42
|
+
): AssistantStream => {
|
|
43
|
+
return new ReadableStream({
|
|
44
|
+
start(c) {
|
|
45
|
+
return readable.start?.(new TextStreamControllerImpl(c));
|
|
46
|
+
},
|
|
47
|
+
pull(c) {
|
|
48
|
+
return readable.pull?.(new TextStreamControllerImpl(c));
|
|
49
|
+
},
|
|
50
|
+
cancel(c) {
|
|
51
|
+
return readable.cancel?.(c);
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const createTextStreamController = () => {
|
|
57
|
+
let controller!: TextStreamController;
|
|
58
|
+
const stream = createTextStream({
|
|
59
|
+
start(c) {
|
|
60
|
+
controller = c;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
return [stream, controller] as const;
|
|
64
|
+
};
|
|
@@ -1,12 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { AssistantStream } from "../AssistantStream";
|
|
2
|
+
import { AssistantStreamChunk } from "../AssistantStreamChunk";
|
|
3
|
+
import { ToolResponseInit } from "../tool/ToolResponse";
|
|
4
|
+
import { ReadonlyJSONValue } from "../../utils/json/json-value";
|
|
5
|
+
import { UnderlyingReadable } from "../utils/stream/UnderlyingReadable";
|
|
6
|
+
import { createTextStream, TextStreamController } from "./text";
|
|
7
|
+
|
|
8
|
+
export type ToolCallStreamController = {
|
|
9
|
+
argsText: TextStreamController;
|
|
10
|
+
|
|
11
|
+
setResponse(response: ToolResponseInit<ReadonlyJSONValue>): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
class ToolCallStreamControllerImpl implements ToolCallStreamController {
|
|
16
|
+
private _isClosed = false;
|
|
17
|
+
|
|
18
|
+
private _mergeTask: Promise<void>;
|
|
19
|
+
constructor(
|
|
20
|
+
private _controller: ReadableStreamDefaultController<AssistantStreamChunk>,
|
|
21
|
+
) {
|
|
6
22
|
const stream = createTextStream({
|
|
7
23
|
start: (c) => {
|
|
8
24
|
this._argsTextController = c;
|
|
9
|
-
}
|
|
25
|
+
},
|
|
10
26
|
});
|
|
11
27
|
this._mergeTask = stream.pipeTo(
|
|
12
28
|
new WritableStream({
|
|
@@ -15,47 +31,56 @@ var ToolCallStreamControllerImpl = class {
|
|
|
15
31
|
case "text-delta":
|
|
16
32
|
this._controller.enqueue(chunk);
|
|
17
33
|
break;
|
|
34
|
+
|
|
18
35
|
case "part-finish":
|
|
19
36
|
this._controller.enqueue({
|
|
20
37
|
type: "tool-call-args-text-finish",
|
|
21
|
-
path: []
|
|
38
|
+
path: [],
|
|
22
39
|
});
|
|
23
40
|
break;
|
|
41
|
+
|
|
24
42
|
default:
|
|
25
43
|
throw new Error(`Unexpected chunk type: ${chunk.type}`);
|
|
26
44
|
}
|
|
27
|
-
}
|
|
28
|
-
})
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
29
47
|
);
|
|
30
48
|
}
|
|
31
|
-
|
|
32
|
-
_mergeTask;
|
|
49
|
+
|
|
33
50
|
get argsText() {
|
|
34
51
|
return this._argsTextController;
|
|
35
52
|
}
|
|
36
|
-
|
|
37
|
-
|
|
53
|
+
|
|
54
|
+
private _argsTextController!: TextStreamController;
|
|
55
|
+
|
|
56
|
+
setResponse(response: ToolResponseInit<ReadonlyJSONValue>) {
|
|
38
57
|
this._controller.enqueue({
|
|
39
58
|
type: "result",
|
|
40
59
|
path: [],
|
|
41
60
|
artifact: response.artifact,
|
|
42
61
|
result: response.result,
|
|
43
|
-
isError: response.isError ?? false
|
|
62
|
+
isError: response.isError ?? false,
|
|
44
63
|
});
|
|
45
64
|
}
|
|
65
|
+
|
|
46
66
|
async close() {
|
|
47
67
|
if (this._isClosed) return;
|
|
68
|
+
|
|
48
69
|
this._isClosed = true;
|
|
49
70
|
this._argsTextController.close();
|
|
50
71
|
await this._mergeTask;
|
|
72
|
+
|
|
51
73
|
this._controller.enqueue({
|
|
52
74
|
type: "part-finish",
|
|
53
|
-
path: []
|
|
75
|
+
path: [],
|
|
54
76
|
});
|
|
55
77
|
this._controller.close();
|
|
56
78
|
}
|
|
57
|
-
}
|
|
58
|
-
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export const createToolCallStream = (
|
|
82
|
+
readable: UnderlyingReadable<ToolCallStreamController>,
|
|
83
|
+
): AssistantStream => {
|
|
59
84
|
return new ReadableStream({
|
|
60
85
|
start(c) {
|
|
61
86
|
return readable.start?.(new ToolCallStreamControllerImpl(c));
|
|
@@ -65,20 +90,16 @@ var createToolCallStream = (readable) => {
|
|
|
65
90
|
},
|
|
66
91
|
cancel(c) {
|
|
67
92
|
return readable.cancel?.(c);
|
|
68
|
-
}
|
|
93
|
+
},
|
|
69
94
|
});
|
|
70
95
|
};
|
|
71
|
-
|
|
72
|
-
|
|
96
|
+
|
|
97
|
+
export const createToolCallStreamController = () => {
|
|
98
|
+
let controller!: ToolCallStreamController;
|
|
73
99
|
const stream = createToolCallStream({
|
|
74
100
|
start(c) {
|
|
75
101
|
controller = c;
|
|
76
|
-
}
|
|
102
|
+
},
|
|
77
103
|
});
|
|
78
|
-
return [stream, controller];
|
|
79
|
-
};
|
|
80
|
-
export {
|
|
81
|
-
createToolCallStream,
|
|
82
|
-
createToolCallStreamController
|
|
104
|
+
return [stream, controller] as const;
|
|
83
105
|
};
|
|
84
|
-
//# sourceMappingURL=tool-call.mjs.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AssistantStreamEncoder } from "../AssistantStream";
|
|
2
|
+
import { AssistantStreamChunk } from "../AssistantStreamChunk";
|
|
3
|
+
import { AssistantTransformStream } from "../utils/stream/AssistantTransformStream";
|
|
4
|
+
import { PipeableTransformStream } from "../utils/stream/PipeableTransformStream";
|
|
5
|
+
|
|
6
|
+
export class PlainTextEncoder
|
|
7
|
+
extends PipeableTransformStream<AssistantStreamChunk, Uint8Array>
|
|
8
|
+
implements AssistantStreamEncoder
|
|
9
|
+
{
|
|
10
|
+
headers = new Headers({
|
|
11
|
+
"Content-Type": "text/plain; charset=utf-8",
|
|
12
|
+
"x-vercel-ai-data-stream": "v1",
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
constructor() {
|
|
16
|
+
super((readable) => {
|
|
17
|
+
const transform = new TransformStream<AssistantStreamChunk, string>({
|
|
18
|
+
transform(chunk, controller) {
|
|
19
|
+
const type = chunk.type;
|
|
20
|
+
switch (type) {
|
|
21
|
+
case "text-delta":
|
|
22
|
+
controller.enqueue(chunk.textDelta);
|
|
23
|
+
break;
|
|
24
|
+
|
|
25
|
+
default:
|
|
26
|
+
const unsupportedType:
|
|
27
|
+
| "part-start"
|
|
28
|
+
| "part-finish"
|
|
29
|
+
| "tool-call-args-text-finish"
|
|
30
|
+
| "data"
|
|
31
|
+
| "step-start"
|
|
32
|
+
| "step-finish"
|
|
33
|
+
| "message-finish"
|
|
34
|
+
| "annotations"
|
|
35
|
+
| "tool-call-begin"
|
|
36
|
+
| "tool-call-delta"
|
|
37
|
+
| "result"
|
|
38
|
+
| "error" = type;
|
|
39
|
+
throw new Error(`unsupported chunk type: ${unsupportedType}`);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return readable
|
|
45
|
+
.pipeThrough(transform)
|
|
46
|
+
.pipeThrough(new TextEncoderStream());
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export class PlainTextDecoder extends PipeableTransformStream<
|
|
52
|
+
Uint8Array,
|
|
53
|
+
AssistantStreamChunk
|
|
54
|
+
> {
|
|
55
|
+
constructor() {
|
|
56
|
+
super((readable) => {
|
|
57
|
+
const transform = new AssistantTransformStream<string>({
|
|
58
|
+
transform(chunk, controller) {
|
|
59
|
+
controller.appendText(chunk);
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return readable
|
|
64
|
+
.pipeThrough(new TextDecoderStream())
|
|
65
|
+
.pipeThrough(transform);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|