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,40 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { AssistantStreamChunk } from "../../AssistantStreamChunk";
|
|
2
|
+
import { ToolCallStreamController } from "../../modules/tool-call";
|
|
3
|
+
import { AssistantTransformStream } from "../../utils/stream/AssistantTransformStream";
|
|
4
|
+
import { PipeableTransformStream } from "../../utils/stream/PipeableTransformStream";
|
|
5
|
+
import { DataStreamChunk, DataStreamStreamChunkType } from "./chunk-types";
|
|
6
|
+
import { LineDecoderStream } from "../../utils/stream/LineDecoderStream";
|
|
6
7
|
import {
|
|
7
8
|
DataStreamChunkDecoder,
|
|
8
|
-
DataStreamChunkEncoder
|
|
9
|
-
} from "./serialization
|
|
9
|
+
DataStreamChunkEncoder,
|
|
10
|
+
} from "./serialization";
|
|
10
11
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
AssistantMetaStreamChunk,
|
|
13
|
+
AssistantMetaTransformStream,
|
|
14
|
+
} from "../../utils/stream/AssistantMetaTransformStream";
|
|
15
|
+
import { TextStreamController } from "../../modules/text";
|
|
16
|
+
import { AssistantStreamEncoder } from "../../AssistantStream";
|
|
17
|
+
|
|
18
|
+
export class DataStreamEncoder
|
|
19
|
+
extends PipeableTransformStream<AssistantStreamChunk, Uint8Array>
|
|
20
|
+
implements AssistantStreamEncoder
|
|
21
|
+
{
|
|
14
22
|
headers = new Headers({
|
|
15
23
|
"Content-Type": "text/plain; charset=utf-8",
|
|
16
|
-
"x-vercel-ai-data-stream": "v1"
|
|
24
|
+
"x-vercel-ai-data-stream": "v1",
|
|
17
25
|
});
|
|
26
|
+
|
|
18
27
|
constructor() {
|
|
19
28
|
super((readable) => {
|
|
20
|
-
const transform = new TransformStream
|
|
29
|
+
const transform = new TransformStream<
|
|
30
|
+
AssistantMetaStreamChunk,
|
|
31
|
+
DataStreamChunk
|
|
32
|
+
>({
|
|
21
33
|
transform(chunk, controller) {
|
|
22
34
|
const type = chunk.type;
|
|
23
35
|
switch (type) {
|
|
24
36
|
case "part-start": {
|
|
25
37
|
const part = chunk.part;
|
|
26
38
|
if (part.type === "tool-call") {
|
|
27
|
-
const { type
|
|
39
|
+
const { type, ...value } = part;
|
|
28
40
|
controller.enqueue({
|
|
29
41
|
type: DataStreamStreamChunkType.StartToolCall,
|
|
30
|
-
value
|
|
42
|
+
value,
|
|
31
43
|
});
|
|
32
44
|
}
|
|
33
45
|
if (part.type === "source") {
|
|
34
|
-
const { type
|
|
46
|
+
const { type, ...value } = part;
|
|
35
47
|
controller.enqueue({
|
|
36
48
|
type: DataStreamStreamChunkType.Source,
|
|
37
|
-
value
|
|
49
|
+
value,
|
|
38
50
|
});
|
|
39
51
|
}
|
|
40
52
|
break;
|
|
@@ -45,14 +57,14 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
45
57
|
case "text": {
|
|
46
58
|
controller.enqueue({
|
|
47
59
|
type: DataStreamStreamChunkType.TextDelta,
|
|
48
|
-
value: chunk.textDelta
|
|
60
|
+
value: chunk.textDelta,
|
|
49
61
|
});
|
|
50
62
|
break;
|
|
51
63
|
}
|
|
52
64
|
case "reasoning": {
|
|
53
65
|
controller.enqueue({
|
|
54
66
|
type: DataStreamStreamChunkType.ReasoningDelta,
|
|
55
|
-
value: chunk.textDelta
|
|
67
|
+
value: chunk.textDelta,
|
|
56
68
|
});
|
|
57
69
|
break;
|
|
58
70
|
}
|
|
@@ -61,23 +73,24 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
61
73
|
type: DataStreamStreamChunkType.ToolCallArgsTextDelta,
|
|
62
74
|
value: {
|
|
63
75
|
toolCallId: part.toolCallId,
|
|
64
|
-
argsTextDelta: chunk.textDelta
|
|
65
|
-
}
|
|
76
|
+
argsTextDelta: chunk.textDelta,
|
|
77
|
+
},
|
|
66
78
|
});
|
|
67
79
|
break;
|
|
68
80
|
}
|
|
69
81
|
default:
|
|
70
82
|
throw new Error(
|
|
71
|
-
`Unsupported part type for text-delta: ${part.type}
|
|
83
|
+
`Unsupported part type for text-delta: ${part.type}`,
|
|
72
84
|
);
|
|
73
85
|
}
|
|
74
86
|
break;
|
|
75
87
|
}
|
|
76
88
|
case "result": {
|
|
89
|
+
// Only tool-call parts can have results.
|
|
77
90
|
const part = chunk.meta;
|
|
78
91
|
if (part.type !== "tool-call") {
|
|
79
92
|
throw new Error(
|
|
80
|
-
`Result chunk on non-tool-call part not supported: ${part.type}
|
|
93
|
+
`Result chunk on non-tool-call part not supported: ${part.type}`,
|
|
81
94
|
);
|
|
82
95
|
}
|
|
83
96
|
controller.enqueue({
|
|
@@ -86,73 +99,81 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
86
99
|
toolCallId: part.toolCallId,
|
|
87
100
|
result: chunk.result,
|
|
88
101
|
artifact: chunk.artifact,
|
|
89
|
-
...chunk.isError ? { isError: chunk.isError } : {}
|
|
90
|
-
}
|
|
102
|
+
...(chunk.isError ? { isError: chunk.isError } : {}),
|
|
103
|
+
},
|
|
91
104
|
});
|
|
92
105
|
break;
|
|
93
106
|
}
|
|
94
107
|
case "step-start": {
|
|
95
|
-
const { type
|
|
108
|
+
const { type, ...value } = chunk;
|
|
96
109
|
controller.enqueue({
|
|
97
110
|
type: DataStreamStreamChunkType.StartStep,
|
|
98
|
-
value
|
|
111
|
+
value,
|
|
99
112
|
});
|
|
100
113
|
break;
|
|
101
114
|
}
|
|
102
115
|
case "step-finish": {
|
|
103
|
-
const { type
|
|
116
|
+
const { type, ...value } = chunk;
|
|
104
117
|
controller.enqueue({
|
|
105
118
|
type: DataStreamStreamChunkType.FinishStep,
|
|
106
|
-
value
|
|
119
|
+
value,
|
|
107
120
|
});
|
|
108
121
|
break;
|
|
109
122
|
}
|
|
110
123
|
case "message-finish": {
|
|
111
|
-
const { type
|
|
124
|
+
const { type, ...value } = chunk;
|
|
112
125
|
controller.enqueue({
|
|
113
126
|
type: DataStreamStreamChunkType.FinishMessage,
|
|
114
|
-
value
|
|
127
|
+
value,
|
|
115
128
|
});
|
|
116
129
|
break;
|
|
117
130
|
}
|
|
118
131
|
case "error": {
|
|
119
132
|
controller.enqueue({
|
|
120
133
|
type: DataStreamStreamChunkType.Error,
|
|
121
|
-
value: chunk.error
|
|
134
|
+
value: chunk.error,
|
|
122
135
|
});
|
|
123
136
|
break;
|
|
124
137
|
}
|
|
125
138
|
case "annotations": {
|
|
126
139
|
controller.enqueue({
|
|
127
140
|
type: DataStreamStreamChunkType.Annotation,
|
|
128
|
-
value: chunk.annotations
|
|
141
|
+
value: chunk.annotations,
|
|
129
142
|
});
|
|
130
143
|
break;
|
|
131
144
|
}
|
|
132
145
|
case "data": {
|
|
133
146
|
controller.enqueue({
|
|
134
147
|
type: DataStreamStreamChunkType.Data,
|
|
135
|
-
value: chunk.data
|
|
148
|
+
value: chunk.data,
|
|
136
149
|
});
|
|
137
150
|
break;
|
|
138
151
|
}
|
|
152
|
+
|
|
139
153
|
// TODO ignore for now
|
|
140
154
|
// in the future, we should create a handler that waits for text parts to finish before continuing
|
|
141
155
|
case "tool-call-args-text-finish":
|
|
142
156
|
case "part-finish":
|
|
143
157
|
break;
|
|
158
|
+
|
|
144
159
|
default: {
|
|
145
|
-
const exhaustiveCheck = type;
|
|
160
|
+
const exhaustiveCheck: never = type;
|
|
146
161
|
throw new Error(`Unsupported chunk type: ${exhaustiveCheck}`);
|
|
147
162
|
}
|
|
148
163
|
}
|
|
149
|
-
}
|
|
164
|
+
},
|
|
150
165
|
});
|
|
151
|
-
|
|
166
|
+
|
|
167
|
+
return readable
|
|
168
|
+
.pipeThrough(new AssistantMetaTransformStream())
|
|
169
|
+
.pipeThrough(transform)
|
|
170
|
+
.pipeThrough(new DataStreamChunkEncoder())
|
|
171
|
+
.pipeThrough(new TextEncoderStream());
|
|
152
172
|
});
|
|
153
173
|
}
|
|
154
|
-
}
|
|
155
|
-
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const TOOL_CALL_ARGS_CLOSING_CHUNKS = [
|
|
156
177
|
DataStreamStreamChunkType.StartToolCall,
|
|
157
178
|
DataStreamStreamChunkType.ToolCall,
|
|
158
179
|
DataStreamStreamChunkType.TextDelta,
|
|
@@ -160,63 +181,76 @@ var TOOL_CALL_ARGS_CLOSING_CHUNKS = [
|
|
|
160
181
|
DataStreamStreamChunkType.Source,
|
|
161
182
|
DataStreamStreamChunkType.Error,
|
|
162
183
|
DataStreamStreamChunkType.FinishStep,
|
|
163
|
-
DataStreamStreamChunkType.FinishMessage
|
|
184
|
+
DataStreamStreamChunkType.FinishMessage,
|
|
164
185
|
];
|
|
165
|
-
|
|
186
|
+
|
|
187
|
+
export class DataStreamDecoder extends PipeableTransformStream<
|
|
188
|
+
Uint8Array,
|
|
189
|
+
AssistantStreamChunk
|
|
190
|
+
> {
|
|
166
191
|
constructor() {
|
|
167
192
|
super((readable) => {
|
|
168
|
-
const toolCallControllers =
|
|
169
|
-
let activeToolCallArgsText;
|
|
170
|
-
const transform = new AssistantTransformStream({
|
|
193
|
+
const toolCallControllers = new Map<string, ToolCallStreamController>();
|
|
194
|
+
let activeToolCallArgsText: TextStreamController | undefined;
|
|
195
|
+
const transform = new AssistantTransformStream<DataStreamChunk>({
|
|
171
196
|
transform(chunk, controller) {
|
|
172
197
|
const { type, value } = chunk;
|
|
198
|
+
|
|
173
199
|
if (TOOL_CALL_ARGS_CLOSING_CHUNKS.includes(type)) {
|
|
174
200
|
activeToolCallArgsText?.close();
|
|
175
|
-
activeToolCallArgsText =
|
|
201
|
+
activeToolCallArgsText = undefined;
|
|
176
202
|
}
|
|
203
|
+
|
|
177
204
|
switch (type) {
|
|
178
205
|
case DataStreamStreamChunkType.ReasoningDelta:
|
|
179
206
|
controller.appendReasoning(value);
|
|
180
207
|
break;
|
|
208
|
+
|
|
181
209
|
case DataStreamStreamChunkType.TextDelta:
|
|
182
210
|
controller.appendText(value);
|
|
183
211
|
break;
|
|
212
|
+
|
|
184
213
|
case DataStreamStreamChunkType.StartToolCall: {
|
|
185
214
|
const { toolCallId, toolName } = value;
|
|
186
215
|
const toolCallController = controller.addToolCallPart({
|
|
187
216
|
toolCallId,
|
|
188
|
-
toolName
|
|
217
|
+
toolName,
|
|
189
218
|
});
|
|
190
219
|
toolCallControllers.set(toolCallId, toolCallController);
|
|
220
|
+
|
|
191
221
|
activeToolCallArgsText = toolCallController.argsText;
|
|
192
222
|
break;
|
|
193
223
|
}
|
|
224
|
+
|
|
194
225
|
case DataStreamStreamChunkType.ToolCallArgsTextDelta: {
|
|
195
226
|
const { toolCallId, argsTextDelta } = value;
|
|
196
227
|
const toolCallController = toolCallControllers.get(toolCallId);
|
|
197
228
|
if (!toolCallController)
|
|
198
229
|
throw new Error(
|
|
199
|
-
"Encountered tool call with unknown id: " + toolCallId
|
|
230
|
+
"Encountered tool call with unknown id: " + toolCallId,
|
|
200
231
|
);
|
|
201
232
|
toolCallController.argsText.append(argsTextDelta);
|
|
202
233
|
break;
|
|
203
234
|
}
|
|
235
|
+
|
|
204
236
|
case DataStreamStreamChunkType.ToolCallResult: {
|
|
205
237
|
const { toolCallId, artifact, result, isError } = value;
|
|
206
238
|
const toolCallController = toolCallControllers.get(toolCallId);
|
|
207
239
|
if (!toolCallController)
|
|
208
240
|
throw new Error(
|
|
209
|
-
"Encountered tool call result with unknown id: " + toolCallId
|
|
241
|
+
"Encountered tool call result with unknown id: " + toolCallId,
|
|
210
242
|
);
|
|
211
243
|
toolCallController.setResponse({
|
|
212
244
|
artifact,
|
|
213
245
|
result,
|
|
214
|
-
isError
|
|
246
|
+
isError,
|
|
215
247
|
});
|
|
216
248
|
break;
|
|
217
249
|
}
|
|
250
|
+
|
|
218
251
|
case DataStreamStreamChunkType.ToolCall: {
|
|
219
252
|
const { toolCallId, toolName, args } = value;
|
|
253
|
+
|
|
220
254
|
let toolCallController = toolCallControllers.get(toolCallId);
|
|
221
255
|
if (toolCallController) {
|
|
222
256
|
toolCallController.argsText.close();
|
|
@@ -224,88 +258,98 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
224
258
|
toolCallController = controller.addToolCallPart({
|
|
225
259
|
toolCallId,
|
|
226
260
|
toolName,
|
|
227
|
-
args
|
|
261
|
+
args,
|
|
228
262
|
});
|
|
229
263
|
toolCallControllers.set(toolCallId, toolCallController);
|
|
230
264
|
}
|
|
231
265
|
break;
|
|
232
266
|
}
|
|
267
|
+
|
|
233
268
|
case DataStreamStreamChunkType.FinishMessage:
|
|
234
269
|
controller.enqueue({
|
|
235
270
|
type: "message-finish",
|
|
236
271
|
path: [],
|
|
237
|
-
...value
|
|
272
|
+
...value,
|
|
238
273
|
});
|
|
239
274
|
break;
|
|
275
|
+
|
|
240
276
|
case DataStreamStreamChunkType.StartStep:
|
|
241
277
|
controller.enqueue({
|
|
242
278
|
type: "step-start",
|
|
243
279
|
path: [],
|
|
244
|
-
...value
|
|
280
|
+
...value,
|
|
245
281
|
});
|
|
246
282
|
break;
|
|
283
|
+
|
|
247
284
|
case DataStreamStreamChunkType.FinishStep:
|
|
248
285
|
controller.enqueue({
|
|
249
286
|
type: "step-finish",
|
|
250
287
|
path: [],
|
|
251
|
-
...value
|
|
288
|
+
...value,
|
|
252
289
|
});
|
|
253
290
|
break;
|
|
254
291
|
case DataStreamStreamChunkType.Data:
|
|
255
292
|
controller.enqueue({
|
|
256
293
|
type: "data",
|
|
257
294
|
path: [],
|
|
258
|
-
data: value
|
|
295
|
+
data: value,
|
|
259
296
|
});
|
|
260
297
|
break;
|
|
298
|
+
|
|
261
299
|
case DataStreamStreamChunkType.Annotation:
|
|
262
300
|
controller.enqueue({
|
|
263
301
|
type: "annotations",
|
|
264
302
|
path: [],
|
|
265
|
-
annotations: value
|
|
303
|
+
annotations: value,
|
|
266
304
|
});
|
|
267
305
|
break;
|
|
306
|
+
|
|
268
307
|
case DataStreamStreamChunkType.Source:
|
|
269
308
|
controller.appendSource({
|
|
270
309
|
type: "source",
|
|
271
|
-
...value
|
|
310
|
+
...value,
|
|
272
311
|
});
|
|
273
312
|
break;
|
|
313
|
+
|
|
274
314
|
case DataStreamStreamChunkType.Error:
|
|
275
315
|
controller.enqueue({
|
|
276
316
|
type: "error",
|
|
277
317
|
path: [],
|
|
278
|
-
error: value
|
|
318
|
+
error: value,
|
|
279
319
|
});
|
|
280
320
|
break;
|
|
321
|
+
|
|
281
322
|
case DataStreamStreamChunkType.File:
|
|
282
323
|
controller.appendFile({
|
|
283
324
|
type: "file",
|
|
284
|
-
...value
|
|
325
|
+
...value,
|
|
285
326
|
});
|
|
286
327
|
break;
|
|
328
|
+
|
|
287
329
|
case DataStreamStreamChunkType.ReasoningSignature:
|
|
288
330
|
case DataStreamStreamChunkType.RedactedReasoning:
|
|
331
|
+
// ignore these for now
|
|
289
332
|
break;
|
|
333
|
+
|
|
290
334
|
default: {
|
|
291
|
-
const exhaustiveCheck = type;
|
|
335
|
+
const exhaustiveCheck: never = type;
|
|
292
336
|
throw new Error(`unsupported chunk type: ${exhaustiveCheck}`);
|
|
293
337
|
}
|
|
294
338
|
}
|
|
295
339
|
},
|
|
296
340
|
flush() {
|
|
297
341
|
activeToolCallArgsText?.close();
|
|
298
|
-
activeToolCallArgsText =
|
|
342
|
+
activeToolCallArgsText = undefined;
|
|
299
343
|
toolCallControllers.forEach((controller) => controller.close());
|
|
300
344
|
toolCallControllers.clear();
|
|
301
|
-
}
|
|
345
|
+
},
|
|
302
346
|
});
|
|
303
|
-
|
|
347
|
+
|
|
348
|
+
return readable
|
|
349
|
+
.pipeThrough(new TextDecoderStream())
|
|
350
|
+
.pipeThrough(new LineDecoderStream())
|
|
351
|
+
.pipeThrough(new DataStreamChunkDecoder())
|
|
352
|
+
.pipeThrough(transform);
|
|
304
353
|
});
|
|
305
354
|
}
|
|
306
|
-
}
|
|
307
|
-
export {
|
|
308
|
-
DataStreamDecoder,
|
|
309
|
-
DataStreamEncoder
|
|
310
|
-
};
|
|
311
|
-
//# sourceMappingURL=DataStream.mjs.map
|
|
355
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ReadonlyJSONObject,
|
|
3
|
+
ReadonlyJSONValue,
|
|
4
|
+
} from "../../../utils/json/json-value";
|
|
5
|
+
|
|
6
|
+
export type DataStreamChunk = {
|
|
7
|
+
[K in DataStreamStreamChunkType]: {
|
|
8
|
+
type: K;
|
|
9
|
+
value: DataStreamStreamChunkValue[K];
|
|
10
|
+
};
|
|
11
|
+
}[DataStreamStreamChunkType];
|
|
12
|
+
|
|
13
|
+
type LanguageModelV1FinishReason =
|
|
14
|
+
| "stop"
|
|
15
|
+
| "length"
|
|
16
|
+
| "content-filter"
|
|
17
|
+
| "tool-calls"
|
|
18
|
+
| "error"
|
|
19
|
+
| "other"
|
|
20
|
+
| "unknown";
|
|
21
|
+
|
|
22
|
+
type LanguageModelV1Usage = {
|
|
23
|
+
promptTokens: number;
|
|
24
|
+
completionTokens: number;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export enum DataStreamStreamChunkType {
|
|
28
|
+
TextDelta = "0",
|
|
29
|
+
Data = "2",
|
|
30
|
+
Error = "3",
|
|
31
|
+
Annotation = "8",
|
|
32
|
+
ToolCall = "9",
|
|
33
|
+
ToolCallResult = "a",
|
|
34
|
+
StartToolCall = "b",
|
|
35
|
+
ToolCallArgsTextDelta = "c",
|
|
36
|
+
FinishMessage = "d",
|
|
37
|
+
FinishStep = "e",
|
|
38
|
+
StartStep = "f",
|
|
39
|
+
ReasoningDelta = "g",
|
|
40
|
+
Source = "h",
|
|
41
|
+
RedactedReasoning = "i",
|
|
42
|
+
ReasoningSignature = "j",
|
|
43
|
+
File = "k",
|
|
44
|
+
}
|
|
45
|
+
type DataStreamStreamChunkValue = {
|
|
46
|
+
[DataStreamStreamChunkType.TextDelta]: string;
|
|
47
|
+
[DataStreamStreamChunkType.Data]: ReadonlyJSONValue[];
|
|
48
|
+
[DataStreamStreamChunkType.Annotation]: ReadonlyJSONValue[];
|
|
49
|
+
[DataStreamStreamChunkType.ToolCall]: {
|
|
50
|
+
toolCallId: string;
|
|
51
|
+
toolName: string;
|
|
52
|
+
args: ReadonlyJSONObject;
|
|
53
|
+
};
|
|
54
|
+
[DataStreamStreamChunkType.StartToolCall]: {
|
|
55
|
+
toolCallId: string;
|
|
56
|
+
toolName: string;
|
|
57
|
+
};
|
|
58
|
+
[DataStreamStreamChunkType.ToolCallArgsTextDelta]: {
|
|
59
|
+
toolCallId: string;
|
|
60
|
+
argsTextDelta: string;
|
|
61
|
+
};
|
|
62
|
+
[DataStreamStreamChunkType.ToolCallResult]: {
|
|
63
|
+
toolCallId: string;
|
|
64
|
+
result: ReadonlyJSONValue;
|
|
65
|
+
|
|
66
|
+
// aui-extensions
|
|
67
|
+
artifact?: ReadonlyJSONValue | undefined;
|
|
68
|
+
isError?: boolean;
|
|
69
|
+
};
|
|
70
|
+
[DataStreamStreamChunkType.Error]: string;
|
|
71
|
+
[DataStreamStreamChunkType.FinishStep]: {
|
|
72
|
+
finishReason: LanguageModelV1FinishReason;
|
|
73
|
+
usage: LanguageModelV1Usage;
|
|
74
|
+
isContinued: boolean;
|
|
75
|
+
};
|
|
76
|
+
[DataStreamStreamChunkType.FinishMessage]: {
|
|
77
|
+
finishReason: LanguageModelV1FinishReason;
|
|
78
|
+
usage: LanguageModelV1Usage;
|
|
79
|
+
};
|
|
80
|
+
[DataStreamStreamChunkType.StartStep]: {
|
|
81
|
+
messageId: string;
|
|
82
|
+
};
|
|
83
|
+
[DataStreamStreamChunkType.ReasoningDelta]: string;
|
|
84
|
+
[DataStreamStreamChunkType.Source]: {
|
|
85
|
+
sourceType: "url";
|
|
86
|
+
id: string;
|
|
87
|
+
url: string;
|
|
88
|
+
title?: string;
|
|
89
|
+
};
|
|
90
|
+
[DataStreamStreamChunkType.RedactedReasoning]: { data: string };
|
|
91
|
+
[DataStreamStreamChunkType.ReasoningSignature]: { signature: string };
|
|
92
|
+
[DataStreamStreamChunkType.File]: { data: string; mimeType: string };
|
|
93
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DataStreamChunk, DataStreamStreamChunkType } from "./chunk-types";
|
|
2
|
+
|
|
3
|
+
export class DataStreamChunkEncoder extends TransformStream<
|
|
4
|
+
DataStreamChunk,
|
|
5
|
+
string
|
|
6
|
+
> {
|
|
7
|
+
constructor() {
|
|
8
|
+
super({
|
|
9
|
+
transform: (chunk, controller) => {
|
|
10
|
+
controller.enqueue(`${chunk.type}:${JSON.stringify(chunk.value)}\n`);
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class DataStreamChunkDecoder extends TransformStream<
|
|
17
|
+
string,
|
|
18
|
+
DataStreamChunk
|
|
19
|
+
> {
|
|
20
|
+
constructor() {
|
|
21
|
+
super({
|
|
22
|
+
transform: (chunk, controller) => {
|
|
23
|
+
const index = chunk.indexOf(":");
|
|
24
|
+
if (index === -1) throw new Error("Invalid stream part");
|
|
25
|
+
controller.enqueue({
|
|
26
|
+
type: chunk.slice(0, index) as DataStreamStreamChunkType,
|
|
27
|
+
value: JSON.parse(chunk.slice(index + 1)),
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|