experimental-a2 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +207 -0
- package/dist/ai-CFNeCrRl.d.ts +334 -0
- package/dist/ai-CFNeCrRl.d.ts.map +1 -0
- package/dist/ai-server.browser.js +2 -0
- package/dist/ai-server.browser.js.map +1 -0
- package/dist/ai-server.d.ts +49 -9
- package/dist/ai-server.d.ts.map +1 -0
- package/dist/ai-server.js +123 -49
- package/dist/ai-server.js.map +1 -0
- package/dist/ai.d.ts +2 -303
- package/dist/ai.js +233 -86
- package/dist/ai.js.map +1 -0
- package/dist/cli-B3VuxoDe.js +599 -0
- package/dist/cli-B3VuxoDe.js.map +1 -0
- package/dist/cli-bin.d.ts +1 -0
- package/dist/cli-bin.js +7 -0
- package/dist/cli-bin.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/client-BKlyLiOU.js +1008 -0
- package/dist/client-BKlyLiOU.js.map +1 -0
- package/dist/client-D7mvIXrF.d.ts +191 -0
- package/dist/client-D7mvIXrF.d.ts.map +1 -0
- package/dist/client.d.ts +2 -90
- package/dist/client.js +1 -409
- package/dist/{contract-CG_adnu_.js → contract-48bUMgcL.js} +12 -2
- package/dist/contract-48bUMgcL.js.map +1 -0
- package/dist/{contract-C_3dIIEU.d.ts → contract-jIfaR085.d.ts} +63 -8
- package/dist/contract-jIfaR085.d.ts.map +1 -0
- package/dist/devtools-J_jZ2vQf.d.ts +152 -0
- package/dist/devtools-J_jZ2vQf.d.ts.map +1 -0
- package/dist/devtools-kJJaORn-.js +340 -0
- package/dist/devtools-kJJaORn-.js.map +1 -0
- package/dist/devtools-server.browser.js +3 -1
- package/dist/devtools-server.browser.js.map +1 -0
- package/dist/devtools-server.d.ts +4 -3
- package/dist/devtools-server.d.ts.map +1 -0
- package/dist/devtools-server.js +226 -43
- package/dist/devtools-server.js.map +1 -0
- package/dist/devtools.d.ts +2 -0
- package/dist/devtools.js +2 -0
- package/dist/{errors-BJRMd-h6.js → errors-BQuJpe82.js} +6 -4
- package/dist/errors-BQuJpe82.js.map +1 -0
- package/dist/{errors-xL_JTXsY.d.ts → errors-W6nwJ-fm.d.ts} +3 -2
- package/dist/errors-W6nwJ-fm.d.ts.map +1 -0
- package/dist/http.d.ts +135 -28
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +647 -61
- package/dist/http.js.map +1 -0
- package/dist/{idempotent-replay-BMyHrP0L.js → idempotent-replay-DuqEkYA7.js} +4 -2
- package/dist/idempotent-replay-DuqEkYA7.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +2 -2
- package/dist/{inspection-E7qbD0Xj.js → inspection-DaxB5jM2.js} +4 -1
- package/dist/inspection-DaxB5jM2.js.map +1 -0
- package/dist/internal-DstsI6Re.js +211 -0
- package/dist/internal-DstsI6Re.js.map +1 -0
- package/dist/otel.d.ts +3 -2
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +2 -0
- package/dist/otel.js.map +1 -0
- package/dist/platform-B4TnJtWu.js +34 -0
- package/dist/platform-B4TnJtWu.js.map +1 -0
- package/dist/react.d.ts +47 -15
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +30 -15
- package/dist/react.js.map +1 -0
- package/dist/retryable-lazy-DZWmHpii.js +2 -0
- package/dist/retryable-lazy-DZWmHpii.js.map +1 -0
- package/dist/scheduler-qstash.d.ts +79 -0
- package/dist/scheduler-qstash.d.ts.map +1 -0
- package/dist/scheduler-qstash.js +501 -0
- package/dist/scheduler-qstash.js.map +1 -0
- package/dist/scheduler-task-BpzhPnRS.js +56 -0
- package/dist/scheduler-task-BpzhPnRS.js.map +1 -0
- package/dist/{recovery-vercel.d.ts → scheduler-vercel.d.ts} +18 -24
- package/dist/scheduler-vercel.d.ts.map +1 -0
- package/dist/scheduler-vercel.js +228 -0
- package/dist/scheduler-vercel.js.map +1 -0
- package/dist/server-C72KOw51.js +1457 -0
- package/dist/server-C72KOw51.js.map +1 -0
- package/dist/server-DUF9pjsx.d.ts +261 -0
- package/dist/server-DUF9pjsx.d.ts.map +1 -0
- package/dist/server.browser.js +2 -0
- package/dist/server.browser.js.map +1 -0
- package/dist/server.d.ts +4 -155
- package/dist/server.js +2 -2
- package/dist/{log-ldf5g8Cx.d.ts → store-DysUkTH3.d.ts} +120 -35
- package/dist/store-DysUkTH3.d.ts.map +1 -0
- package/dist/{log-yJbXUf72.js → store-N8PXxDAS.js} +3 -1
- package/dist/store-N8PXxDAS.js.map +1 -0
- package/dist/store-codec-DTG0Ftek.js +10 -0
- package/dist/store-codec-DTG0Ftek.js.map +1 -0
- package/dist/store-memory.d.ts +12 -0
- package/dist/store-memory.d.ts.map +1 -0
- package/dist/{log-memory.js → store-memory.js} +145 -34
- package/dist/store-memory.js.map +1 -0
- package/dist/{log-polling-DZ1MiKLg.js → store-polling-dSeLxzfb.js} +7 -5
- package/dist/store-polling-dSeLxzfb.js.map +1 -0
- package/dist/{log-postgres.d.ts → store-postgres.d.ts} +7 -6
- package/dist/store-postgres.d.ts.map +1 -0
- package/dist/{log-postgres.js → store-postgres.js} +214 -24
- package/dist/store-postgres.js.map +1 -0
- package/dist/{log-redis-core-CyJ5L8yR.js → store-redis-core-BFLwz0Wj.js} +271 -66
- package/dist/store-redis-core-BFLwz0Wj.js.map +1 -0
- package/dist/{log-redis-http.d.ts → store-redis-http.d.ts} +8 -7
- package/dist/store-redis-http.d.ts.map +1 -0
- package/dist/{log-redis-http.js → store-redis-http.js} +22 -12
- package/dist/store-redis-http.js.map +1 -0
- package/dist/{log-redis.d.ts → store-redis.d.ts} +7 -6
- package/dist/store-redis.d.ts.map +1 -0
- package/dist/{log-redis.js → store-redis.js} +101 -39
- package/dist/store-redis.js.map +1 -0
- package/dist/{log-sqlite.d.ts → store-sqlite.d.ts} +7 -6
- package/dist/store-sqlite.d.ts.map +1 -0
- package/dist/{log-sqlite.js → store-sqlite.js} +118 -22
- package/dist/store-sqlite.js.map +1 -0
- package/dist/{telemetry-Cso0qyHQ.d.ts → telemetry-BjYHTfh2.d.ts} +3 -2
- package/dist/telemetry-BjYHTfh2.d.ts.map +1 -0
- package/dist/testing.browser.d.ts +1 -0
- package/dist/testing.browser.js +6 -0
- package/dist/testing.browser.js.map +1 -0
- package/dist/testing.d.ts +32 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +103 -0
- package/dist/testing.js.map +1 -0
- package/dist/validate-XKT4FSNn.js +2 -0
- package/dist/validate-XKT4FSNn.js.map +1 -0
- package/dist/wire-BFQmSJ-9.js +284 -0
- package/dist/wire-BFQmSJ-9.js.map +1 -0
- package/docs/01-quickstart.mdx +3 -3
- package/docs/concepts/01-contracts.mdx +18 -13
- package/docs/concepts/02-handlers.mdx +7 -7
- package/docs/concepts/03-durability.mdx +21 -21
- package/docs/concepts/04-state.mdx +18 -21
- package/docs/guides/01-timers.mdx +154 -49
- package/docs/guides/02-cancellation.mdx +30 -4
- package/docs/guides/03-react.mdx +76 -57
- package/docs/guides/04-local-first.mdx +1 -1
- package/docs/guides/05-production.mdx +310 -61
- package/docs/guides/06-ai-agents.mdx +252 -74
- package/docs/guides/07-devtools.mdx +137 -12
- package/docs/guides/08-application-data.mdx +1 -1
- package/docs/guides/09-presence.mdx +263 -0
- package/docs/guides/10-transports.mdx +140 -0
- package/docs/index.mdx +18 -14
- package/docs/reference/01-api.mdx +839 -110
- package/docs/reference/02-errors.mdx +13 -6
- package/package.json +24 -7
- package/src/ai-coordinator.ts +358 -0
- package/src/ai-projector.ts +524 -0
- package/src/ai-sdk-step.ts +261 -0
- package/src/ai-server.browser.ts +5 -0
- package/src/ai-server.ts +1719 -0
- package/src/ai.ts +2155 -0
- package/src/cache-indexeddb.ts +10 -0
- package/src/cli-bin.ts +5 -0
- package/src/cli.ts +1046 -0
- package/src/client.ts +1826 -0
- package/src/contract.ts +206 -0
- package/src/deterministic-id.ts +72 -0
- package/src/devtools-app.ts +989 -0
- package/src/devtools-server.browser.ts +5 -0
- package/src/devtools-server.ts +604 -0
- package/src/devtools.ts +716 -0
- package/src/errors.ts +50 -0
- package/src/http.ts +394 -0
- package/src/idempotent-replay.ts +53 -0
- package/src/index.ts +37 -0
- package/src/inspection.ts +39 -0
- package/src/internal.ts +426 -0
- package/src/otel.ts +59 -0
- package/src/platform.ts +60 -0
- package/src/push-envelope.ts +137 -0
- package/src/react.ts +284 -0
- package/src/reducer.ts +108 -0
- package/src/retryable-lazy.ts +27 -0
- package/src/scheduler-qstash.ts +915 -0
- package/src/scheduler-task.ts +106 -0
- package/src/scheduler-vercel.ts +437 -0
- package/src/server.browser.ts +12 -0
- package/src/server.ts +2700 -0
- package/src/session-socket.ts +548 -0
- package/src/sse.ts +141 -0
- package/src/standard-schema.ts +77 -0
- package/src/store-codec.ts +10 -0
- package/src/store-memory.ts +788 -0
- package/src/store-polling.ts +102 -0
- package/src/store-postgres.ts +1212 -0
- package/src/store-redis-core.ts +1494 -0
- package/src/store-redis-http.ts +116 -0
- package/src/store-redis.ts +458 -0
- package/src/store-sqlite.ts +1108 -0
- package/src/store.ts +385 -0
- package/src/telemetry.ts +47 -0
- package/src/testing.browser.ts +5 -0
- package/src/testing.ts +185 -0
- package/src/validate.ts +39 -0
- package/src/wire.ts +454 -0
- package/dist/internal-gCd5qMry.js +0 -44
- package/dist/log-memory.d.ts +0 -11
- package/dist/recovery-vercel.js +0 -119
- package/dist/server-BcLa4RFL.js +0 -877
- package/dist/wire-BVsgR8o9.js +0 -62
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import {
|
|
2
|
+
convertToModelMessages,
|
|
3
|
+
stepCountIs,
|
|
4
|
+
streamText,
|
|
5
|
+
toUIMessageStream,
|
|
6
|
+
} from 'ai'
|
|
7
|
+
import type {
|
|
8
|
+
FinishReason,
|
|
9
|
+
InferUIMessageChunk,
|
|
10
|
+
Instructions,
|
|
11
|
+
LanguageModel,
|
|
12
|
+
LanguageModelUsage,
|
|
13
|
+
TextStreamPart,
|
|
14
|
+
ToolSet,
|
|
15
|
+
UIMessage,
|
|
16
|
+
} from 'ai'
|
|
17
|
+
|
|
18
|
+
type StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]
|
|
19
|
+
|
|
20
|
+
type UIMessageMetadata<M extends UIMessage> =
|
|
21
|
+
M extends UIMessage<infer Metadata> ? Metadata : unknown
|
|
22
|
+
|
|
23
|
+
type ModelStepTimeout<T extends ToolSet> =
|
|
24
|
+
| number
|
|
25
|
+
| Omit<
|
|
26
|
+
Exclude<StreamTextOptions<T>['timeout'], number | undefined>,
|
|
27
|
+
'toolMs' | 'tools'
|
|
28
|
+
>
|
|
29
|
+
|
|
30
|
+
type ControlledStreamTextSetting =
|
|
31
|
+
| '_internal'
|
|
32
|
+
| 'abortSignal'
|
|
33
|
+
| 'instructions'
|
|
34
|
+
| 'messages'
|
|
35
|
+
| 'model'
|
|
36
|
+
| 'onToolExecutionEnd'
|
|
37
|
+
| 'onToolExecutionStart'
|
|
38
|
+
| 'experimental_onToolCallFinish'
|
|
39
|
+
| 'experimental_onToolCallStart'
|
|
40
|
+
| 'experimental_sandbox'
|
|
41
|
+
| 'experimental_toolCallers'
|
|
42
|
+
| 'experimental_toolApprovalSecret'
|
|
43
|
+
| 'prompt'
|
|
44
|
+
| 'prepareStep'
|
|
45
|
+
| 'stopWhen'
|
|
46
|
+
| 'system'
|
|
47
|
+
| 'tools'
|
|
48
|
+
|
|
49
|
+
type RetypedStreamTextSetting =
|
|
50
|
+
| 'experimental_onStart'
|
|
51
|
+
| 'experimental_onStepStart'
|
|
52
|
+
| 'experimental_repairToolCall'
|
|
53
|
+
| 'experimental_transform'
|
|
54
|
+
| 'onStart'
|
|
55
|
+
| 'onStepStart'
|
|
56
|
+
| 'repairToolCall'
|
|
57
|
+
|
|
58
|
+
type ModelFacingTools<T extends ToolSet> = {
|
|
59
|
+
readonly [K in keyof T]: Omit<T[K], 'execute'>
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
type SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =
|
|
63
|
+
NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown
|
|
64
|
+
? EVENT
|
|
65
|
+
: never
|
|
66
|
+
|
|
67
|
+
type ModelPhaseStartEvent<T extends ToolSet> = Omit<
|
|
68
|
+
SettingEvent<T, 'onStart'>,
|
|
69
|
+
'tools'
|
|
70
|
+
> & {
|
|
71
|
+
readonly tools: ModelFacingTools<T> | undefined
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
type ModelPhaseStepStartEvent<T extends ToolSet> = Omit<
|
|
75
|
+
SettingEvent<T, 'onStepStart'>,
|
|
76
|
+
'tools'
|
|
77
|
+
> & {
|
|
78
|
+
readonly tools: ModelFacingTools<T> | undefined
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
type ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>
|
|
82
|
+
|
|
83
|
+
type StreamTextRepairToolCall<T extends ToolSet> = NonNullable<
|
|
84
|
+
StreamTextOptions<T>['repairToolCall']
|
|
85
|
+
>
|
|
86
|
+
|
|
87
|
+
type ModelPhaseRepairToolCall<T extends ToolSet> = (
|
|
88
|
+
options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {
|
|
89
|
+
tools: ModelFacingTools<T>
|
|
90
|
+
},
|
|
91
|
+
) => ReturnType<StreamTextRepairToolCall<T>>
|
|
92
|
+
|
|
93
|
+
type StreamTextTransformSetting<T extends ToolSet> = NonNullable<
|
|
94
|
+
StreamTextOptions<T>['experimental_transform']
|
|
95
|
+
>
|
|
96
|
+
|
|
97
|
+
type StreamTextTransform<T extends ToolSet> = Extract<
|
|
98
|
+
StreamTextTransformSetting<T>,
|
|
99
|
+
(...args: never[]) => unknown
|
|
100
|
+
>
|
|
101
|
+
|
|
102
|
+
type ModelPhaseTransform<T extends ToolSet> = (
|
|
103
|
+
options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {
|
|
104
|
+
tools: ModelFacingTools<T>
|
|
105
|
+
},
|
|
106
|
+
) => ReturnType<StreamTextTransform<T>>
|
|
107
|
+
|
|
108
|
+
/** AI SDK streamText settings that remain meaningful for one durable step. */
|
|
109
|
+
export type AISDKStepSettings<T extends ToolSet> = Partial<
|
|
110
|
+
Omit<
|
|
111
|
+
StreamTextOptions<T>,
|
|
112
|
+
ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'
|
|
113
|
+
>
|
|
114
|
+
> & {
|
|
115
|
+
timeout?: ModelStepTimeout<T>
|
|
116
|
+
onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>
|
|
117
|
+
experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>
|
|
118
|
+
onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>
|
|
119
|
+
experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>
|
|
120
|
+
repairToolCall?: ModelPhaseRepairToolCall<T>
|
|
121
|
+
experimental_repairToolCall?: ModelPhaseRepairToolCall<T>
|
|
122
|
+
experimental_transform?:
|
|
123
|
+
ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {
|
|
127
|
+
model: LanguageModel
|
|
128
|
+
tools: T
|
|
129
|
+
messages: M[]
|
|
130
|
+
responseMessageId: string
|
|
131
|
+
abortSignal: AbortSignal
|
|
132
|
+
instructions?: Instructions
|
|
133
|
+
settings?: AISDKStepSettings<T>
|
|
134
|
+
messageMetadata?: (options: {
|
|
135
|
+
part: TextStreamPart<T>
|
|
136
|
+
}) => UIMessageMetadata<M> | undefined
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export type AISDKStepCompletion = {
|
|
140
|
+
finishReason: FinishReason
|
|
141
|
+
usage: LanguageModelUsage
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export type AISDKStepResult<M extends UIMessage> = {
|
|
145
|
+
stream: ReadableStream<InferUIMessageChunk<M>>
|
|
146
|
+
completion(): AISDKStepCompletion
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [
|
|
150
|
+
'_internal',
|
|
151
|
+
'abortSignal',
|
|
152
|
+
'instructions',
|
|
153
|
+
'messages',
|
|
154
|
+
'model',
|
|
155
|
+
'onToolExecutionEnd',
|
|
156
|
+
'onToolExecutionStart',
|
|
157
|
+
'experimental_onToolCallFinish',
|
|
158
|
+
'experimental_onToolCallStart',
|
|
159
|
+
'experimental_sandbox',
|
|
160
|
+
'experimental_toolCallers',
|
|
161
|
+
'experimental_toolApprovalSecret',
|
|
162
|
+
'prompt',
|
|
163
|
+
'prepareStep',
|
|
164
|
+
'stopWhen',
|
|
165
|
+
'system',
|
|
166
|
+
'tools',
|
|
167
|
+
]
|
|
168
|
+
|
|
169
|
+
const safeSettings = <T extends ToolSet>(
|
|
170
|
+
settings: AISDKStepSettings<T> | undefined,
|
|
171
|
+
): AISDKStepSettings<T> => {
|
|
172
|
+
const result = { ...settings } as AISDKStepSettings<T>
|
|
173
|
+
for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)
|
|
174
|
+
if (typeof result.timeout === 'object' && result.timeout !== null) {
|
|
175
|
+
const timeout = { ...result.timeout } as Record<string, unknown>
|
|
176
|
+
Reflect.deleteProperty(timeout, 'toolMs')
|
|
177
|
+
Reflect.deleteProperty(timeout, 'tools')
|
|
178
|
+
result.timeout = timeout as ModelStepTimeout<T>
|
|
179
|
+
}
|
|
180
|
+
return result
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const modelToolSet = <T extends ToolSet>(tools: T): T =>
|
|
184
|
+
Object.fromEntries(
|
|
185
|
+
Object.entries(tools).map(([name, tool]) => {
|
|
186
|
+
if (tool.type === 'provider' && tool.isProviderExecuted === true) {
|
|
187
|
+
return [name, tool]
|
|
188
|
+
}
|
|
189
|
+
const definition = { ...tool }
|
|
190
|
+
Reflect.deleteProperty(definition, 'execute')
|
|
191
|
+
return [name, definition]
|
|
192
|
+
}),
|
|
193
|
+
) as T
|
|
194
|
+
|
|
195
|
+
const errorMessage = (error: unknown): string =>
|
|
196
|
+
error instanceof Error ? error.message : String(error)
|
|
197
|
+
|
|
198
|
+
/** Run exactly one AI SDK model step while leaving local tool execution to A2. */
|
|
199
|
+
export async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(
|
|
200
|
+
input: AISDKStepInput<M, T>,
|
|
201
|
+
): Promise<AISDKStepResult<M>> {
|
|
202
|
+
const settings = safeSettings(input.settings)
|
|
203
|
+
const tools = modelToolSet(input.tools)
|
|
204
|
+
const messages = await convertToModelMessages(input.messages, { tools })
|
|
205
|
+
const streamOptions = {
|
|
206
|
+
...settings,
|
|
207
|
+
model: input.model,
|
|
208
|
+
tools,
|
|
209
|
+
messages,
|
|
210
|
+
abortSignal: input.abortSignal,
|
|
211
|
+
...(input.instructions === undefined
|
|
212
|
+
? {}
|
|
213
|
+
: { instructions: input.instructions }),
|
|
214
|
+
stopWhen: stepCountIs(1),
|
|
215
|
+
// A2 records stream failures durably; the AI SDK default writes them to
|
|
216
|
+
// stderr in addition to yielding an error part.
|
|
217
|
+
onError: settings.onError ?? (() => {}),
|
|
218
|
+
} as unknown as StreamTextOptions<T>
|
|
219
|
+
const result = streamText<T>(streamOptions)
|
|
220
|
+
|
|
221
|
+
let completion: AISDKStepCompletion | undefined
|
|
222
|
+
let fatalError: { value: unknown } | undefined
|
|
223
|
+
const observed = result.stream.pipeThrough(
|
|
224
|
+
new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({
|
|
225
|
+
transform(part, controller) {
|
|
226
|
+
if (part.type === 'error' && fatalError === undefined) {
|
|
227
|
+
fatalError = { value: part.error }
|
|
228
|
+
} else if (part.type === 'finish') {
|
|
229
|
+
completion = {
|
|
230
|
+
finishReason: part.finishReason,
|
|
231
|
+
usage: part.totalUsage,
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
controller.enqueue(part)
|
|
235
|
+
},
|
|
236
|
+
}),
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
return {
|
|
240
|
+
stream: toUIMessageStream<T, M>({
|
|
241
|
+
stream: observed,
|
|
242
|
+
tools,
|
|
243
|
+
originalMessages: input.messages,
|
|
244
|
+
generateMessageId: () => input.responseMessageId,
|
|
245
|
+
onError: errorMessage,
|
|
246
|
+
...(input.messageMetadata === undefined
|
|
247
|
+
? {}
|
|
248
|
+
: { messageMetadata: input.messageMetadata }),
|
|
249
|
+
}),
|
|
250
|
+
completion() {
|
|
251
|
+
if (fatalError !== undefined) throw fatalError.value
|
|
252
|
+
if (completion === undefined) {
|
|
253
|
+
throw new Error('AI SDK step ended without a finish part')
|
|
254
|
+
}
|
|
255
|
+
if (completion.finishReason === 'error') {
|
|
256
|
+
throw new Error('AI SDK step finished with an error')
|
|
257
|
+
}
|
|
258
|
+
return completion
|
|
259
|
+
},
|
|
260
|
+
}
|
|
261
|
+
}
|