ai 6.0.33 → 6.0.35
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 +16 -0
- package/dist/index.d.mts +50 -21
- package/dist/index.d.ts +50 -21
- package/dist/index.js +348 -286
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +280 -219
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js +1 -1
- package/dist/internal/index.mjs +1 -1
- package/docs/02-foundations/03-prompts.mdx +2 -2
- package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/28-output.mdx +1 -1
- package/docs/07-reference/05-ai-sdk-errors/ai-ui-message-stream-error.mdx +67 -0
- package/package.json +6 -4
- package/src/agent/agent.ts +116 -0
- package/src/agent/create-agent-ui-stream-response.test.ts +258 -0
- package/src/agent/create-agent-ui-stream-response.ts +50 -0
- package/src/agent/create-agent-ui-stream.ts +73 -0
- package/src/agent/index.ts +33 -0
- package/src/agent/infer-agent-tools.ts +7 -0
- package/src/agent/infer-agent-ui-message.test-d.ts +54 -0
- package/src/agent/infer-agent-ui-message.ts +11 -0
- package/src/agent/pipe-agent-ui-stream-to-response.ts +52 -0
- package/src/agent/tool-loop-agent-on-finish-callback.ts +31 -0
- package/src/agent/tool-loop-agent-on-step-finish-callback.ts +11 -0
- package/src/agent/tool-loop-agent-settings.ts +182 -0
- package/src/agent/tool-loop-agent.test-d.ts +114 -0
- package/src/agent/tool-loop-agent.test.ts +442 -0
- package/src/agent/tool-loop-agent.ts +114 -0
- package/src/embed/__snapshots__/embed-many.test.ts.snap +191 -0
- package/src/embed/__snapshots__/embed.test.ts.snap +81 -0
- package/src/embed/embed-many-result.ts +53 -0
- package/src/embed/embed-many.test.ts +653 -0
- package/src/embed/embed-many.ts +378 -0
- package/src/embed/embed-result.ts +50 -0
- package/src/embed/embed.test.ts +298 -0
- package/src/embed/embed.ts +211 -0
- package/src/embed/index.ts +4 -0
- package/src/error/index.ts +35 -0
- package/src/error/invalid-argument-error.ts +34 -0
- package/src/error/invalid-stream-part-error.ts +28 -0
- package/src/error/invalid-tool-approval-error.ts +26 -0
- package/src/error/invalid-tool-input-error.ts +33 -0
- package/src/error/no-image-generated-error.ts +39 -0
- package/src/error/no-object-generated-error.ts +70 -0
- package/src/error/no-output-generated-error.ts +26 -0
- package/src/error/no-speech-generated-error.ts +18 -0
- package/src/error/no-such-tool-error.ts +35 -0
- package/src/error/no-transcript-generated-error.ts +20 -0
- package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
- package/src/error/tool-call-repair-error.ts +30 -0
- package/src/error/ui-message-stream-error.ts +48 -0
- package/src/error/unsupported-model-version-error.ts +23 -0
- package/src/error/verify-no-object-generated-error.ts +27 -0
- package/src/generate-image/generate-image-result.ts +42 -0
- package/src/generate-image/generate-image.test.ts +1420 -0
- package/src/generate-image/generate-image.ts +360 -0
- package/src/generate-image/index.ts +18 -0
- package/src/generate-object/__snapshots__/generate-object.test.ts.snap +133 -0
- package/src/generate-object/__snapshots__/stream-object.test.ts.snap +297 -0
- package/src/generate-object/generate-object-result.ts +67 -0
- package/src/generate-object/generate-object.test-d.ts +49 -0
- package/src/generate-object/generate-object.test.ts +1191 -0
- package/src/generate-object/generate-object.ts +518 -0
- package/src/generate-object/index.ts +9 -0
- package/src/generate-object/inject-json-instruction.test.ts +181 -0
- package/src/generate-object/inject-json-instruction.ts +30 -0
- package/src/generate-object/output-strategy.ts +415 -0
- package/src/generate-object/parse-and-validate-object-result.ts +111 -0
- package/src/generate-object/repair-text.ts +12 -0
- package/src/generate-object/stream-object-result.ts +120 -0
- package/src/generate-object/stream-object.test-d.ts +74 -0
- package/src/generate-object/stream-object.test.ts +1950 -0
- package/src/generate-object/stream-object.ts +986 -0
- package/src/generate-object/validate-object-generation-input.ts +144 -0
- package/src/generate-speech/generate-speech-result.ts +30 -0
- package/src/generate-speech/generate-speech.test.ts +300 -0
- package/src/generate-speech/generate-speech.ts +190 -0
- package/src/generate-speech/generated-audio-file.ts +65 -0
- package/src/generate-speech/index.ts +3 -0
- package/src/generate-text/__snapshots__/generate-text.test.ts.snap +1872 -0
- package/src/generate-text/__snapshots__/stream-text.test.ts.snap +1255 -0
- package/src/generate-text/collect-tool-approvals.test.ts +553 -0
- package/src/generate-text/collect-tool-approvals.ts +116 -0
- package/src/generate-text/content-part.ts +25 -0
- package/src/generate-text/execute-tool-call.ts +129 -0
- package/src/generate-text/extract-reasoning-content.ts +17 -0
- package/src/generate-text/extract-text-content.ts +15 -0
- package/src/generate-text/generate-text-result.ts +168 -0
- package/src/generate-text/generate-text.test-d.ts +68 -0
- package/src/generate-text/generate-text.test.ts +7011 -0
- package/src/generate-text/generate-text.ts +1223 -0
- package/src/generate-text/generated-file.ts +70 -0
- package/src/generate-text/index.ts +57 -0
- package/src/generate-text/is-approval-needed.ts +29 -0
- package/src/generate-text/output-utils.ts +23 -0
- package/src/generate-text/output.test.ts +698 -0
- package/src/generate-text/output.ts +590 -0
- package/src/generate-text/parse-tool-call.test.ts +570 -0
- package/src/generate-text/parse-tool-call.ts +188 -0
- package/src/generate-text/prepare-step.ts +103 -0
- package/src/generate-text/prune-messages.test.ts +720 -0
- package/src/generate-text/prune-messages.ts +167 -0
- package/src/generate-text/reasoning-output.ts +20 -0
- package/src/generate-text/reasoning.ts +8 -0
- package/src/generate-text/response-message.ts +10 -0
- package/src/generate-text/run-tools-transformation.test.ts +1143 -0
- package/src/generate-text/run-tools-transformation.ts +420 -0
- package/src/generate-text/smooth-stream.test.ts +2101 -0
- package/src/generate-text/smooth-stream.ts +162 -0
- package/src/generate-text/step-result.ts +238 -0
- package/src/generate-text/stop-condition.ts +29 -0
- package/src/generate-text/stream-text-result.ts +463 -0
- package/src/generate-text/stream-text.test-d.ts +200 -0
- package/src/generate-text/stream-text.test.ts +19979 -0
- package/src/generate-text/stream-text.ts +2505 -0
- package/src/generate-text/to-response-messages.test.ts +922 -0
- package/src/generate-text/to-response-messages.ts +163 -0
- package/src/generate-text/tool-approval-request-output.ts +21 -0
- package/src/generate-text/tool-call-repair-function.ts +27 -0
- package/src/generate-text/tool-call.ts +47 -0
- package/src/generate-text/tool-error.ts +34 -0
- package/src/generate-text/tool-output-denied.ts +21 -0
- package/src/generate-text/tool-output.ts +7 -0
- package/src/generate-text/tool-result.ts +36 -0
- package/src/generate-text/tool-set.ts +14 -0
- package/src/global.ts +24 -0
- package/src/index.ts +50 -0
- package/src/logger/index.ts +6 -0
- package/src/logger/log-warnings.test.ts +351 -0
- package/src/logger/log-warnings.ts +119 -0
- package/src/middleware/__snapshots__/simulate-streaming-middleware.test.ts.snap +64 -0
- package/src/middleware/add-tool-input-examples-middleware.test.ts +476 -0
- package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
- package/src/middleware/default-embedding-settings-middleware.test.ts +126 -0
- package/src/middleware/default-embedding-settings-middleware.ts +22 -0
- package/src/middleware/default-settings-middleware.test.ts +388 -0
- package/src/middleware/default-settings-middleware.ts +33 -0
- package/src/middleware/extract-json-middleware.test.ts +827 -0
- package/src/middleware/extract-json-middleware.ts +197 -0
- package/src/middleware/extract-reasoning-middleware.test.ts +1028 -0
- package/src/middleware/extract-reasoning-middleware.ts +238 -0
- package/src/middleware/index.ts +10 -0
- package/src/middleware/simulate-streaming-middleware.test.ts +911 -0
- package/src/middleware/simulate-streaming-middleware.ts +79 -0
- package/src/middleware/wrap-embedding-model.test.ts +358 -0
- package/src/middleware/wrap-embedding-model.ts +86 -0
- package/src/middleware/wrap-image-model.test.ts +423 -0
- package/src/middleware/wrap-image-model.ts +85 -0
- package/src/middleware/wrap-language-model.test.ts +518 -0
- package/src/middleware/wrap-language-model.ts +104 -0
- package/src/middleware/wrap-provider.test.ts +120 -0
- package/src/middleware/wrap-provider.ts +51 -0
- package/src/model/as-embedding-model-v3.test.ts +319 -0
- package/src/model/as-embedding-model-v3.ts +24 -0
- package/src/model/as-image-model-v3.test.ts +409 -0
- package/src/model/as-image-model-v3.ts +24 -0
- package/src/model/as-language-model-v3.test.ts +508 -0
- package/src/model/as-language-model-v3.ts +103 -0
- package/src/model/as-provider-v3.ts +36 -0
- package/src/model/as-speech-model-v3.test.ts +356 -0
- package/src/model/as-speech-model-v3.ts +24 -0
- package/src/model/as-transcription-model-v3.test.ts +529 -0
- package/src/model/as-transcription-model-v3.ts +24 -0
- package/src/model/resolve-model.test.ts +244 -0
- package/src/model/resolve-model.ts +126 -0
- package/src/prompt/call-settings.ts +148 -0
- package/src/prompt/content-part.ts +209 -0
- package/src/prompt/convert-to-language-model-prompt.test.ts +2018 -0
- package/src/prompt/convert-to-language-model-prompt.ts +442 -0
- package/src/prompt/create-tool-model-output.test.ts +508 -0
- package/src/prompt/create-tool-model-output.ts +34 -0
- package/src/prompt/data-content.test.ts +15 -0
- package/src/prompt/data-content.ts +134 -0
- package/src/prompt/index.ts +27 -0
- package/src/prompt/invalid-data-content-error.ts +29 -0
- package/src/prompt/invalid-message-role-error.ts +27 -0
- package/src/prompt/message-conversion-error.ts +28 -0
- package/src/prompt/message.ts +68 -0
- package/src/prompt/prepare-call-settings.test.ts +159 -0
- package/src/prompt/prepare-call-settings.ts +108 -0
- package/src/prompt/prepare-tools-and-tool-choice.test.ts +461 -0
- package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
- package/src/prompt/prompt.ts +43 -0
- package/src/prompt/split-data-url.ts +17 -0
- package/src/prompt/standardize-prompt.test.ts +82 -0
- package/src/prompt/standardize-prompt.ts +99 -0
- package/src/prompt/wrap-gateway-error.ts +29 -0
- package/src/registry/custom-provider.test.ts +211 -0
- package/src/registry/custom-provider.ts +155 -0
- package/src/registry/index.ts +7 -0
- package/src/registry/no-such-provider-error.ts +41 -0
- package/src/registry/provider-registry.test.ts +691 -0
- package/src/registry/provider-registry.ts +328 -0
- package/src/rerank/index.ts +2 -0
- package/src/rerank/rerank-result.ts +70 -0
- package/src/rerank/rerank.test.ts +516 -0
- package/src/rerank/rerank.ts +237 -0
- package/src/telemetry/assemble-operation-name.ts +21 -0
- package/src/telemetry/get-base-telemetry-attributes.ts +53 -0
- package/src/telemetry/get-tracer.ts +20 -0
- package/src/telemetry/noop-tracer.ts +69 -0
- package/src/telemetry/record-span.ts +63 -0
- package/src/telemetry/select-telemetry-attributes.ts +78 -0
- package/src/telemetry/select-temetry-attributes.test.ts +114 -0
- package/src/telemetry/stringify-for-telemetry.test.ts +114 -0
- package/src/telemetry/stringify-for-telemetry.ts +33 -0
- package/src/telemetry/telemetry-settings.ts +44 -0
- package/src/test/mock-embedding-model-v2.ts +35 -0
- package/src/test/mock-embedding-model-v3.ts +48 -0
- package/src/test/mock-image-model-v2.ts +28 -0
- package/src/test/mock-image-model-v3.ts +28 -0
- package/src/test/mock-language-model-v2.ts +72 -0
- package/src/test/mock-language-model-v3.ts +77 -0
- package/src/test/mock-provider-v2.ts +68 -0
- package/src/test/mock-provider-v3.ts +80 -0
- package/src/test/mock-reranking-model-v3.ts +25 -0
- package/src/test/mock-server-response.ts +69 -0
- package/src/test/mock-speech-model-v2.ts +24 -0
- package/src/test/mock-speech-model-v3.ts +24 -0
- package/src/test/mock-tracer.ts +156 -0
- package/src/test/mock-transcription-model-v2.ts +24 -0
- package/src/test/mock-transcription-model-v3.ts +24 -0
- package/src/test/mock-values.ts +4 -0
- package/src/test/not-implemented.ts +3 -0
- package/src/text-stream/create-text-stream-response.test.ts +38 -0
- package/src/text-stream/create-text-stream-response.ts +18 -0
- package/src/text-stream/index.ts +2 -0
- package/src/text-stream/pipe-text-stream-to-response.test.ts +38 -0
- package/src/text-stream/pipe-text-stream-to-response.ts +26 -0
- package/src/transcribe/index.ts +2 -0
- package/src/transcribe/transcribe-result.ts +60 -0
- package/src/transcribe/transcribe.test.ts +313 -0
- package/src/transcribe/transcribe.ts +173 -0
- package/src/types/embedding-model-middleware.ts +3 -0
- package/src/types/embedding-model.ts +18 -0
- package/src/types/image-model-middleware.ts +3 -0
- package/src/types/image-model-response-metadata.ts +16 -0
- package/src/types/image-model.ts +19 -0
- package/src/types/index.ts +29 -0
- package/src/types/json-value.ts +15 -0
- package/src/types/language-model-middleware.ts +3 -0
- package/src/types/language-model-request-metadata.ts +6 -0
- package/src/types/language-model-response-metadata.ts +21 -0
- package/src/types/language-model.ts +104 -0
- package/src/types/provider-metadata.ts +16 -0
- package/src/types/provider.ts +55 -0
- package/src/types/reranking-model.ts +6 -0
- package/src/types/speech-model-response-metadata.ts +21 -0
- package/src/types/speech-model.ts +6 -0
- package/src/types/transcription-model-response-metadata.ts +16 -0
- package/src/types/transcription-model.ts +9 -0
- package/src/types/usage.ts +200 -0
- package/src/types/warning.ts +7 -0
- package/src/ui/__snapshots__/append-response-messages.test.ts.snap +416 -0
- package/src/ui/__snapshots__/convert-to-model-messages.test.ts.snap +419 -0
- package/src/ui/__snapshots__/process-chat-text-response.test.ts.snap +142 -0
- package/src/ui/call-completion-api.ts +157 -0
- package/src/ui/chat-transport.ts +83 -0
- package/src/ui/chat.test-d.ts +233 -0
- package/src/ui/chat.test.ts +2695 -0
- package/src/ui/chat.ts +716 -0
- package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
- package/src/ui/convert-to-model-messages.test.ts +2775 -0
- package/src/ui/convert-to-model-messages.ts +373 -0
- package/src/ui/default-chat-transport.ts +36 -0
- package/src/ui/direct-chat-transport.test.ts +446 -0
- package/src/ui/direct-chat-transport.ts +118 -0
- package/src/ui/http-chat-transport.test.ts +185 -0
- package/src/ui/http-chat-transport.ts +292 -0
- package/src/ui/index.ts +71 -0
- package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
- package/src/ui/last-assistant-message-is-complete-with-tool-calls.test.ts +371 -0
- package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
- package/src/ui/process-text-stream.test.ts +38 -0
- package/src/ui/process-text-stream.ts +16 -0
- package/src/ui/process-ui-message-stream.test.ts +8294 -0
- package/src/ui/process-ui-message-stream.ts +761 -0
- package/src/ui/text-stream-chat-transport.ts +23 -0
- package/src/ui/transform-text-to-ui-message-stream.test.ts +124 -0
- package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
- package/src/ui/ui-messages.test.ts +48 -0
- package/src/ui/ui-messages.ts +534 -0
- package/src/ui/use-completion.ts +84 -0
- package/src/ui/validate-ui-messages.test.ts +1428 -0
- package/src/ui/validate-ui-messages.ts +476 -0
- package/src/ui-message-stream/create-ui-message-stream-response.test.ts +266 -0
- package/src/ui-message-stream/create-ui-message-stream-response.ts +32 -0
- package/src/ui-message-stream/create-ui-message-stream.test.ts +639 -0
- package/src/ui-message-stream/create-ui-message-stream.ts +124 -0
- package/src/ui-message-stream/get-response-ui-message-id.test.ts +55 -0
- package/src/ui-message-stream/get-response-ui-message-id.ts +24 -0
- package/src/ui-message-stream/handle-ui-message-stream-finish.test.ts +429 -0
- package/src/ui-message-stream/handle-ui-message-stream-finish.ts +135 -0
- package/src/ui-message-stream/index.ts +13 -0
- package/src/ui-message-stream/json-to-sse-transform-stream.ts +12 -0
- package/src/ui-message-stream/pipe-ui-message-stream-to-response.test.ts +90 -0
- package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +40 -0
- package/src/ui-message-stream/read-ui-message-stream.test.ts +122 -0
- package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
- package/src/ui-message-stream/ui-message-chunks.test-d.ts +18 -0
- package/src/ui-message-stream/ui-message-chunks.ts +344 -0
- package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
- package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
- package/src/ui-message-stream/ui-message-stream-response-init.ts +5 -0
- package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
- package/src/util/as-array.ts +3 -0
- package/src/util/async-iterable-stream.test.ts +241 -0
- package/src/util/async-iterable-stream.ts +94 -0
- package/src/util/consume-stream.ts +29 -0
- package/src/util/cosine-similarity.test.ts +57 -0
- package/src/util/cosine-similarity.ts +47 -0
- package/src/util/create-resolvable-promise.ts +30 -0
- package/src/util/create-stitchable-stream.test.ts +239 -0
- package/src/util/create-stitchable-stream.ts +112 -0
- package/src/util/data-url.ts +17 -0
- package/src/util/deep-partial.ts +84 -0
- package/src/util/detect-media-type.test.ts +670 -0
- package/src/util/detect-media-type.ts +184 -0
- package/src/util/download/download-function.ts +45 -0
- package/src/util/download/download.test.ts +69 -0
- package/src/util/download/download.ts +46 -0
- package/src/util/error-handler.ts +1 -0
- package/src/util/fix-json.test.ts +279 -0
- package/src/util/fix-json.ts +401 -0
- package/src/util/get-potential-start-index.test.ts +34 -0
- package/src/util/get-potential-start-index.ts +30 -0
- package/src/util/index.ts +11 -0
- package/src/util/is-deep-equal-data.test.ts +119 -0
- package/src/util/is-deep-equal-data.ts +48 -0
- package/src/util/is-non-empty-object.ts +5 -0
- package/src/util/job.ts +1 -0
- package/src/util/log-v2-compatibility-warning.ts +21 -0
- package/src/util/merge-abort-signals.test.ts +155 -0
- package/src/util/merge-abort-signals.ts +43 -0
- package/src/util/merge-objects.test.ts +118 -0
- package/src/util/merge-objects.ts +79 -0
- package/src/util/now.ts +4 -0
- package/src/util/parse-partial-json.test.ts +80 -0
- package/src/util/parse-partial-json.ts +30 -0
- package/src/util/prepare-headers.test.ts +51 -0
- package/src/util/prepare-headers.ts +14 -0
- package/src/util/prepare-retries.test.ts +10 -0
- package/src/util/prepare-retries.ts +47 -0
- package/src/util/retry-error.ts +41 -0
- package/src/util/retry-with-exponential-backoff.test.ts +446 -0
- package/src/util/retry-with-exponential-backoff.ts +154 -0
- package/src/util/serial-job-executor.test.ts +162 -0
- package/src/util/serial-job-executor.ts +36 -0
- package/src/util/simulate-readable-stream.test.ts +98 -0
- package/src/util/simulate-readable-stream.ts +39 -0
- package/src/util/split-array.test.ts +60 -0
- package/src/util/split-array.ts +20 -0
- package/src/util/value-of.ts +65 -0
- package/src/util/write-to-server-response.test.ts +266 -0
- package/src/util/write-to-server-response.ts +49 -0
- package/src/version.ts +5 -0
package/dist/internal/index.js
CHANGED
|
@@ -153,7 +153,7 @@ var import_provider_utils2 = require("@ai-sdk/provider-utils");
|
|
|
153
153
|
var import_provider_utils3 = require("@ai-sdk/provider-utils");
|
|
154
154
|
|
|
155
155
|
// src/version.ts
|
|
156
|
-
var VERSION = true ? "6.0.
|
|
156
|
+
var VERSION = true ? "6.0.35" : "0.0.0-test";
|
|
157
157
|
|
|
158
158
|
// src/util/download/download.ts
|
|
159
159
|
var download = async ({ url }) => {
|
package/dist/internal/index.mjs
CHANGED
|
@@ -128,7 +128,7 @@ import {
|
|
|
128
128
|
} from "@ai-sdk/provider-utils";
|
|
129
129
|
|
|
130
130
|
// src/version.ts
|
|
131
|
-
var VERSION = true ? "6.0.
|
|
131
|
+
var VERSION = true ? "6.0.35" : "0.0.0-test";
|
|
132
132
|
|
|
133
133
|
// src/util/download/download.ts
|
|
134
134
|
var download = async ({ url }) => {
|
|
@@ -153,7 +153,7 @@ const messages: ModelMessage[] = [
|
|
|
153
153
|
{
|
|
154
154
|
type: 'image',
|
|
155
155
|
image:
|
|
156
|
-
'https://github.com/vercel/ai/blob/main/examples/ai-
|
|
156
|
+
'https://github.com/vercel/ai/blob/main/examples/ai-functions/data/comic-cat.png?raw=true',
|
|
157
157
|
// Sets image detail configuration for image part:
|
|
158
158
|
providerOptions: {
|
|
159
159
|
openai: { imageDetail: 'low' },
|
|
@@ -268,7 +268,7 @@ const result = await generateText({
|
|
|
268
268
|
{
|
|
269
269
|
type: 'image',
|
|
270
270
|
image:
|
|
271
|
-
'https://github.com/vercel/ai/blob/main/examples/ai-
|
|
271
|
+
'https://github.com/vercel/ai/blob/main/examples/ai-functions/data/comic-cat.png?raw=true',
|
|
272
272
|
},
|
|
273
273
|
],
|
|
274
274
|
},
|
|
@@ -22,7 +22,7 @@ The `tools` parameter of `generateText` and `streamText` is an object that has t
|
|
|
22
22
|
|
|
23
23
|
```ts highlight="6-17"
|
|
24
24
|
import { z } from 'zod';
|
|
25
|
-
import { generateText, tool,
|
|
25
|
+
import { generateText, tool, stepCountIs } from 'ai';
|
|
26
26
|
__PROVIDER_IMPORT__;
|
|
27
27
|
|
|
28
28
|
const result = await generateText({
|
|
@@ -217,7 +217,7 @@ import { generateText, Output } from 'ai';
|
|
|
217
217
|
const { output } = await generateText({
|
|
218
218
|
model: yourModel,
|
|
219
219
|
output: Output.choice({
|
|
220
|
-
options: ['sunny', 'rainy', 'snowy'],
|
|
220
|
+
options: ['sunny', 'rainy', 'snowy'] as const,
|
|
221
221
|
}),
|
|
222
222
|
prompt: 'Is the weather sunny, rainy, or snowy today?',
|
|
223
223
|
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AI_UIMessageStreamError
|
|
3
|
+
description: Learn how to fix AI_UIMessageStreamError
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI_UIMessageStreamError
|
|
7
|
+
|
|
8
|
+
This error occurs when a UI message stream contains invalid or out-of-sequence chunks.
|
|
9
|
+
|
|
10
|
+
Common causes:
|
|
11
|
+
|
|
12
|
+
- Receiving a `text-delta` chunk without a preceding `text-start` chunk
|
|
13
|
+
- Receiving a `text-end` chunk without a preceding `text-start` chunk
|
|
14
|
+
- Receiving a `reasoning-delta` chunk without a preceding `reasoning-start` chunk
|
|
15
|
+
- Receiving a `reasoning-end` chunk without a preceding `reasoning-start` chunk
|
|
16
|
+
- Receiving a `tool-input-delta` chunk without a preceding `tool-input-start` chunk
|
|
17
|
+
- Attempting to access a tool invocation that doesn't exist
|
|
18
|
+
|
|
19
|
+
This error often surfaces when an upstream request fails **before any tokens are streamed** and a custom transport tries to write an inline error message to the UI stream without the proper start chunk.
|
|
20
|
+
|
|
21
|
+
## Properties
|
|
22
|
+
|
|
23
|
+
- `chunkType`: The type of chunk that caused the error (e.g., `text-delta`, `reasoning-end`, `tool-input-delta`)
|
|
24
|
+
- `chunkId`: The ID associated with the failing chunk (part ID or toolCallId)
|
|
25
|
+
- `message`: The error message with details about what went wrong
|
|
26
|
+
|
|
27
|
+
## Checking for this Error
|
|
28
|
+
|
|
29
|
+
You can check if an error is an instance of `AI_UIMessageStreamError` using:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { UIMessageStreamError } from 'ai';
|
|
33
|
+
|
|
34
|
+
if (UIMessageStreamError.isInstance(error)) {
|
|
35
|
+
console.log('Chunk type:', error.chunkType);
|
|
36
|
+
console.log('Chunk ID:', error.chunkId);
|
|
37
|
+
// Handle the error
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Common Solutions
|
|
42
|
+
|
|
43
|
+
1. **Ensure proper chunk ordering**: Always send a `*-start` chunk before any `*-delta` or `*-end` chunks for the same ID:
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// Correct order
|
|
47
|
+
writer.write({ type: 'text-start', id: 'my-text' });
|
|
48
|
+
writer.write({ type: 'text-delta', id: 'my-text', delta: 'Hello' });
|
|
49
|
+
writer.write({ type: 'text-end', id: 'my-text' });
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
2. **Verify IDs match**: Ensure the `id` used in `*-delta` and `*-end` chunks matches the `id` used in the corresponding `*-start` chunk.
|
|
53
|
+
|
|
54
|
+
3. **Handle error paths correctly**: When writing error messages in custom transports, ensure you emit the full start/delta/end sequence:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// When handling errors in custom transports
|
|
58
|
+
writer.write({ type: 'text-start', id: errorId });
|
|
59
|
+
writer.write({
|
|
60
|
+
type: 'text-delta',
|
|
61
|
+
id: errorId,
|
|
62
|
+
delta: 'Request failed...',
|
|
63
|
+
});
|
|
64
|
+
writer.write({ type: 'text-end', id: errorId });
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
4. **Check stream producer logic**: Review your streaming implementation to ensure chunks are sent in the correct order, especially when dealing with concurrent operations or merged streams.
|
package/package.json
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.35",
|
|
4
4
|
"description": "AI SDK by Vercel - The AI Toolkit for TypeScript and JavaScript",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"module": "./dist/index.mjs",
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
|
+
"source": "./src/index.ts",
|
|
10
11
|
"files": [
|
|
11
12
|
"dist/**/*",
|
|
12
13
|
"docs/**/*",
|
|
14
|
+
"src",
|
|
13
15
|
"CHANGELOG.md",
|
|
14
16
|
"internal.d.ts",
|
|
15
17
|
"README.md",
|
|
@@ -40,9 +42,9 @@
|
|
|
40
42
|
},
|
|
41
43
|
"dependencies": {
|
|
42
44
|
"@opentelemetry/api": "1.9.0",
|
|
43
|
-
"@ai-sdk/gateway": "3.0.
|
|
44
|
-
"@ai-sdk/provider": "3.0.
|
|
45
|
-
"@ai-sdk/provider-utils": "4.0.
|
|
45
|
+
"@ai-sdk/gateway": "3.0.14",
|
|
46
|
+
"@ai-sdk/provider": "3.0.3",
|
|
47
|
+
"@ai-sdk/provider-utils": "4.0.6"
|
|
46
48
|
},
|
|
47
49
|
"devDependencies": {
|
|
48
50
|
"@edge-runtime/vm": "^5.0.0",
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ModelMessage } from '@ai-sdk/provider-utils';
|
|
2
|
+
import { GenerateTextResult } from '../generate-text/generate-text-result';
|
|
3
|
+
import { Output } from '../generate-text/output';
|
|
4
|
+
import { StreamTextTransform } from '../generate-text/stream-text';
|
|
5
|
+
import { StreamTextResult } from '../generate-text/stream-text-result';
|
|
6
|
+
import { ToolSet } from '../generate-text/tool-set';
|
|
7
|
+
import { TimeoutConfiguration } from '../prompt/call-settings';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Parameters for calling an agent.
|
|
11
|
+
*/
|
|
12
|
+
export type AgentCallParameters<CALL_OPTIONS> = ([CALL_OPTIONS] extends [never]
|
|
13
|
+
? { options?: never }
|
|
14
|
+
: { options: CALL_OPTIONS }) &
|
|
15
|
+
(
|
|
16
|
+
| {
|
|
17
|
+
/**
|
|
18
|
+
* A prompt. It can be either a text prompt or a list of messages.
|
|
19
|
+
*
|
|
20
|
+
* You can either use `prompt` or `messages` but not both.
|
|
21
|
+
*/
|
|
22
|
+
prompt: string | Array<ModelMessage>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A list of messages.
|
|
26
|
+
*
|
|
27
|
+
* You can either use `prompt` or `messages` but not both.
|
|
28
|
+
*/
|
|
29
|
+
messages?: never;
|
|
30
|
+
}
|
|
31
|
+
| {
|
|
32
|
+
/**
|
|
33
|
+
* A list of messages.
|
|
34
|
+
*
|
|
35
|
+
* You can either use `prompt` or `messages` but not both.
|
|
36
|
+
*/
|
|
37
|
+
messages: Array<ModelMessage>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A prompt. It can be either a text prompt or a list of messages.
|
|
41
|
+
*
|
|
42
|
+
* You can either use `prompt` or `messages` but not both.
|
|
43
|
+
*/
|
|
44
|
+
prompt?: never;
|
|
45
|
+
}
|
|
46
|
+
) & {
|
|
47
|
+
/**
|
|
48
|
+
* Abort signal.
|
|
49
|
+
*/
|
|
50
|
+
abortSignal?: AbortSignal;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Timeout in milliseconds. Can be specified as a number or as an object with `totalMs`.
|
|
54
|
+
*/
|
|
55
|
+
timeout?: TimeoutConfiguration;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Parameters for streaming an output from an agent.
|
|
60
|
+
*/
|
|
61
|
+
export type AgentStreamParameters<
|
|
62
|
+
CALL_OPTIONS,
|
|
63
|
+
TOOLS extends ToolSet,
|
|
64
|
+
> = AgentCallParameters<CALL_OPTIONS> & {
|
|
65
|
+
/**
|
|
66
|
+
* Optional stream transformations.
|
|
67
|
+
* They are applied in the order they are provided.
|
|
68
|
+
* The stream transformations must maintain the stream structure for streamText to work correctly.
|
|
69
|
+
*/
|
|
70
|
+
experimental_transform?:
|
|
71
|
+
| StreamTextTransform<TOOLS>
|
|
72
|
+
| Array<StreamTextTransform<TOOLS>>;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* An Agent receives a prompt (text or messages) and generates or streams an output
|
|
77
|
+
* that consists of steps, tool calls, data parts, etc.
|
|
78
|
+
*
|
|
79
|
+
* You can implement your own Agent by implementing the `Agent` interface,
|
|
80
|
+
* or use the `ToolLoopAgent` class.
|
|
81
|
+
*/
|
|
82
|
+
export interface Agent<
|
|
83
|
+
CALL_OPTIONS = never,
|
|
84
|
+
TOOLS extends ToolSet = {},
|
|
85
|
+
OUTPUT extends Output = never,
|
|
86
|
+
> {
|
|
87
|
+
/**
|
|
88
|
+
* The specification version of the agent interface. This will enable
|
|
89
|
+
* us to evolve the agent interface and retain backwards compatibility.
|
|
90
|
+
*/
|
|
91
|
+
readonly version: 'agent-v1';
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The id of the agent.
|
|
95
|
+
*/
|
|
96
|
+
readonly id: string | undefined;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The tools that the agent can use.
|
|
100
|
+
*/
|
|
101
|
+
readonly tools: TOOLS;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Generates an output from the agent (non-streaming).
|
|
105
|
+
*/
|
|
106
|
+
generate(
|
|
107
|
+
options: AgentCallParameters<CALL_OPTIONS>,
|
|
108
|
+
): PromiseLike<GenerateTextResult<TOOLS, OUTPUT>>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Streams an output from the agent (streaming).
|
|
112
|
+
*/
|
|
113
|
+
stream(
|
|
114
|
+
options: AgentStreamParameters<CALL_OPTIONS, TOOLS>,
|
|
115
|
+
): PromiseLike<StreamTextResult<TOOLS, OUTPUT>>;
|
|
116
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { LanguageModelV3CallOptions } from '@ai-sdk/provider';
|
|
2
|
+
import { tool } from '@ai-sdk/provider-utils';
|
|
3
|
+
import {
|
|
4
|
+
convertArrayToReadableStream,
|
|
5
|
+
convertReadableStreamToArray,
|
|
6
|
+
} from '@ai-sdk/provider-utils/test';
|
|
7
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
8
|
+
import { z } from 'zod/v4';
|
|
9
|
+
import { MockLanguageModelV3 } from '../test/mock-language-model-v3';
|
|
10
|
+
import { createAgentUIStreamResponse } from './create-agent-ui-stream-response';
|
|
11
|
+
import { ToolLoopAgent } from './tool-loop-agent';
|
|
12
|
+
|
|
13
|
+
describe('createAgentUIStreamResponse', () => {
|
|
14
|
+
describe('when using tools toModelOutput', () => {
|
|
15
|
+
let recordedInputs: LanguageModelV3CallOptions[];
|
|
16
|
+
let response: Response;
|
|
17
|
+
let decodedChunks: string[];
|
|
18
|
+
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
recordedInputs = [];
|
|
21
|
+
|
|
22
|
+
const agent = new ToolLoopAgent({
|
|
23
|
+
model: new MockLanguageModelV3({
|
|
24
|
+
doStream: async input => {
|
|
25
|
+
recordedInputs.push(input);
|
|
26
|
+
return {
|
|
27
|
+
stream: convertArrayToReadableStream([
|
|
28
|
+
{
|
|
29
|
+
type: 'stream-start',
|
|
30
|
+
warnings: [],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
type: 'response-metadata',
|
|
34
|
+
id: 'id-0',
|
|
35
|
+
modelId: 'mock-model-id',
|
|
36
|
+
timestamp: new Date(0),
|
|
37
|
+
},
|
|
38
|
+
{ type: 'text-start', id: '1' },
|
|
39
|
+
{ type: 'text-delta', id: '1', delta: 'Hello' },
|
|
40
|
+
{ type: 'text-delta', id: '1', delta: ', ' },
|
|
41
|
+
{ type: 'text-delta', id: '1', delta: `world!` },
|
|
42
|
+
{ type: 'text-end', id: '1' },
|
|
43
|
+
{
|
|
44
|
+
type: 'finish',
|
|
45
|
+
finishReason: { unified: 'stop', raw: 'stop' },
|
|
46
|
+
usage: {
|
|
47
|
+
inputTokens: {
|
|
48
|
+
total: 10,
|
|
49
|
+
noCache: 10,
|
|
50
|
+
cacheRead: undefined,
|
|
51
|
+
cacheWrite: undefined,
|
|
52
|
+
},
|
|
53
|
+
outputTokens: {
|
|
54
|
+
total: 10,
|
|
55
|
+
text: 10,
|
|
56
|
+
reasoning: undefined,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
providerMetadata: {
|
|
60
|
+
testProvider: { testKey: 'testValue' },
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
]),
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
}),
|
|
67
|
+
tools: {
|
|
68
|
+
example: tool({
|
|
69
|
+
description: 'Example tool',
|
|
70
|
+
inputSchema: z.object({
|
|
71
|
+
input: z.string(),
|
|
72
|
+
}),
|
|
73
|
+
outputSchema: z.object({
|
|
74
|
+
value: z.string(),
|
|
75
|
+
}),
|
|
76
|
+
// important: tool has toModelOutput that needs to be called
|
|
77
|
+
toModelOutput: ({ output }) => ({
|
|
78
|
+
type: 'content',
|
|
79
|
+
value: [{ type: 'text', text: output.value }],
|
|
80
|
+
}),
|
|
81
|
+
}),
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
response = await createAgentUIStreamResponse({
|
|
86
|
+
agent,
|
|
87
|
+
uiMessages: [
|
|
88
|
+
{
|
|
89
|
+
role: 'user',
|
|
90
|
+
id: 'msg-1',
|
|
91
|
+
parts: [
|
|
92
|
+
{
|
|
93
|
+
type: 'text' as const,
|
|
94
|
+
text: 'Hello, world!',
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
role: 'assistant',
|
|
100
|
+
id: 'msg-2',
|
|
101
|
+
parts: [
|
|
102
|
+
{
|
|
103
|
+
type: 'tool-example' as const,
|
|
104
|
+
toolCallId: 'call-1',
|
|
105
|
+
state: 'output-available',
|
|
106
|
+
input: {
|
|
107
|
+
input: 'Hello, world!',
|
|
108
|
+
},
|
|
109
|
+
output: {
|
|
110
|
+
value: 'Example tool: Hello, world!',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// consume the response
|
|
119
|
+
const decoder = new TextDecoder();
|
|
120
|
+
const encodedStream = response.body!;
|
|
121
|
+
const chunks = await convertReadableStreamToArray(encodedStream);
|
|
122
|
+
decodedChunks = chunks.map(chunk => decoder.decode(chunk));
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('should have a single call that contains the tool result as text', () => {
|
|
126
|
+
expect(recordedInputs).toMatchInlineSnapshot(`
|
|
127
|
+
[
|
|
128
|
+
{
|
|
129
|
+
"abortSignal": undefined,
|
|
130
|
+
"frequencyPenalty": undefined,
|
|
131
|
+
"headers": undefined,
|
|
132
|
+
"includeRawChunks": false,
|
|
133
|
+
"maxOutputTokens": undefined,
|
|
134
|
+
"presencePenalty": undefined,
|
|
135
|
+
"prompt": [
|
|
136
|
+
{
|
|
137
|
+
"content": [
|
|
138
|
+
{
|
|
139
|
+
"providerOptions": undefined,
|
|
140
|
+
"text": "Hello, world!",
|
|
141
|
+
"type": "text",
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
"providerOptions": undefined,
|
|
145
|
+
"role": "user",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"content": [
|
|
149
|
+
{
|
|
150
|
+
"input": {
|
|
151
|
+
"input": "Hello, world!",
|
|
152
|
+
},
|
|
153
|
+
"providerExecuted": undefined,
|
|
154
|
+
"providerOptions": undefined,
|
|
155
|
+
"toolCallId": "call-1",
|
|
156
|
+
"toolName": "example",
|
|
157
|
+
"type": "tool-call",
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
"providerOptions": undefined,
|
|
161
|
+
"role": "assistant",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"content": [
|
|
165
|
+
{
|
|
166
|
+
"output": {
|
|
167
|
+
"type": "content",
|
|
168
|
+
"value": [
|
|
169
|
+
{
|
|
170
|
+
"text": "Example tool: Hello, world!",
|
|
171
|
+
"type": "text",
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
"providerOptions": undefined,
|
|
176
|
+
"toolCallId": "call-1",
|
|
177
|
+
"toolName": "example",
|
|
178
|
+
"type": "tool-result",
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
"providerOptions": undefined,
|
|
182
|
+
"role": "tool",
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
"providerOptions": undefined,
|
|
186
|
+
"responseFormat": undefined,
|
|
187
|
+
"seed": undefined,
|
|
188
|
+
"stopSequences": undefined,
|
|
189
|
+
"temperature": undefined,
|
|
190
|
+
"toolChoice": {
|
|
191
|
+
"type": "auto",
|
|
192
|
+
},
|
|
193
|
+
"tools": [
|
|
194
|
+
{
|
|
195
|
+
"description": "Example tool",
|
|
196
|
+
"inputSchema": {
|
|
197
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
198
|
+
"additionalProperties": false,
|
|
199
|
+
"properties": {
|
|
200
|
+
"input": {
|
|
201
|
+
"type": "string",
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
"required": [
|
|
205
|
+
"input",
|
|
206
|
+
],
|
|
207
|
+
"type": "object",
|
|
208
|
+
},
|
|
209
|
+
"name": "example",
|
|
210
|
+
"providerOptions": undefined,
|
|
211
|
+
"type": "function",
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
"topK": undefined,
|
|
215
|
+
"topP": undefined,
|
|
216
|
+
},
|
|
217
|
+
]
|
|
218
|
+
`);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('should return the UI message stream response', () => {
|
|
222
|
+
expect(decodedChunks).toMatchInlineSnapshot(`
|
|
223
|
+
[
|
|
224
|
+
"data: {"type":"start"}
|
|
225
|
+
|
|
226
|
+
",
|
|
227
|
+
"data: {"type":"start-step"}
|
|
228
|
+
|
|
229
|
+
",
|
|
230
|
+
"data: {"type":"text-start","id":"1"}
|
|
231
|
+
|
|
232
|
+
",
|
|
233
|
+
"data: {"type":"text-delta","id":"1","delta":"Hello"}
|
|
234
|
+
|
|
235
|
+
",
|
|
236
|
+
"data: {"type":"text-delta","id":"1","delta":", "}
|
|
237
|
+
|
|
238
|
+
",
|
|
239
|
+
"data: {"type":"text-delta","id":"1","delta":"world!"}
|
|
240
|
+
|
|
241
|
+
",
|
|
242
|
+
"data: {"type":"text-end","id":"1"}
|
|
243
|
+
|
|
244
|
+
",
|
|
245
|
+
"data: {"type":"finish-step"}
|
|
246
|
+
|
|
247
|
+
",
|
|
248
|
+
"data: {"type":"finish","finishReason":"stop"}
|
|
249
|
+
|
|
250
|
+
",
|
|
251
|
+
"data: [DONE]
|
|
252
|
+
|
|
253
|
+
",
|
|
254
|
+
]
|
|
255
|
+
`);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { StreamTextTransform, UIMessageStreamOptions } from '../generate-text';
|
|
2
|
+
import { Output } from '../generate-text/output';
|
|
3
|
+
import { ToolSet } from '../generate-text/tool-set';
|
|
4
|
+
import { TimeoutConfiguration } from '../prompt/call-settings';
|
|
5
|
+
import { createUIMessageStreamResponse } from '../ui-message-stream';
|
|
6
|
+
import { UIMessageStreamResponseInit } from '../ui-message-stream/ui-message-stream-response-init';
|
|
7
|
+
import { InferUITools, UIMessage } from '../ui/ui-messages';
|
|
8
|
+
import { Agent } from './agent';
|
|
9
|
+
import { createAgentUIStream } from './create-agent-ui-stream';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Runs the agent and returns a response object with a UI message stream.
|
|
13
|
+
*
|
|
14
|
+
* @param agent - The agent to run.
|
|
15
|
+
* @param uiMessages - The input UI messages.
|
|
16
|
+
*
|
|
17
|
+
* @returns The response object.
|
|
18
|
+
*/
|
|
19
|
+
export async function createAgentUIStreamResponse<
|
|
20
|
+
CALL_OPTIONS = never,
|
|
21
|
+
TOOLS extends ToolSet = {},
|
|
22
|
+
OUTPUT extends Output = never,
|
|
23
|
+
MESSAGE_METADATA = unknown,
|
|
24
|
+
>({
|
|
25
|
+
headers,
|
|
26
|
+
status,
|
|
27
|
+
statusText,
|
|
28
|
+
consumeSseStream,
|
|
29
|
+
...options
|
|
30
|
+
}: {
|
|
31
|
+
agent: Agent<CALL_OPTIONS, TOOLS, OUTPUT>;
|
|
32
|
+
uiMessages: unknown[];
|
|
33
|
+
abortSignal?: AbortSignal;
|
|
34
|
+
timeout?: TimeoutConfiguration;
|
|
35
|
+
options?: CALL_OPTIONS;
|
|
36
|
+
experimental_transform?:
|
|
37
|
+
| StreamTextTransform<TOOLS>
|
|
38
|
+
| Array<StreamTextTransform<TOOLS>>;
|
|
39
|
+
} & UIMessageStreamResponseInit &
|
|
40
|
+
UIMessageStreamOptions<
|
|
41
|
+
UIMessage<MESSAGE_METADATA, never, InferUITools<TOOLS>>
|
|
42
|
+
>): Promise<Response> {
|
|
43
|
+
return createUIMessageStreamResponse({
|
|
44
|
+
headers,
|
|
45
|
+
status,
|
|
46
|
+
statusText,
|
|
47
|
+
consumeSseStream,
|
|
48
|
+
stream: await createAgentUIStream(options),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { StreamTextTransform, UIMessageStreamOptions } from '../generate-text';
|
|
2
|
+
import { Output } from '../generate-text/output';
|
|
3
|
+
import { ToolSet } from '../generate-text/tool-set';
|
|
4
|
+
import { TimeoutConfiguration } from '../prompt/call-settings';
|
|
5
|
+
import { InferUIMessageChunk } from '../ui-message-stream';
|
|
6
|
+
import { convertToModelMessages } from '../ui/convert-to-model-messages';
|
|
7
|
+
import { InferUITools, UIMessage } from '../ui/ui-messages';
|
|
8
|
+
import { validateUIMessages } from '../ui/validate-ui-messages';
|
|
9
|
+
import { AsyncIterableStream } from '../util/async-iterable-stream';
|
|
10
|
+
import { Agent } from './agent';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Runs the agent and stream the output as a UI message stream.
|
|
14
|
+
*
|
|
15
|
+
* @param agent - The agent to run.
|
|
16
|
+
* @param uiMessages - The input UI messages.
|
|
17
|
+
* @param abortSignal - The abort signal. Optional.
|
|
18
|
+
* @param timeout - Timeout in milliseconds. Optional.
|
|
19
|
+
* @param options - The options for the agent.
|
|
20
|
+
* @param experimental_transform - The stream transformations. Optional.
|
|
21
|
+
*
|
|
22
|
+
* @returns The UI message stream.
|
|
23
|
+
*/
|
|
24
|
+
export async function createAgentUIStream<
|
|
25
|
+
CALL_OPTIONS = never,
|
|
26
|
+
TOOLS extends ToolSet = {},
|
|
27
|
+
OUTPUT extends Output = never,
|
|
28
|
+
MESSAGE_METADATA = unknown,
|
|
29
|
+
>({
|
|
30
|
+
agent,
|
|
31
|
+
uiMessages,
|
|
32
|
+
options,
|
|
33
|
+
abortSignal,
|
|
34
|
+
timeout,
|
|
35
|
+
experimental_transform,
|
|
36
|
+
...uiMessageStreamOptions
|
|
37
|
+
}: {
|
|
38
|
+
agent: Agent<CALL_OPTIONS, TOOLS, OUTPUT>;
|
|
39
|
+
uiMessages: unknown[];
|
|
40
|
+
abortSignal?: AbortSignal;
|
|
41
|
+
timeout?: TimeoutConfiguration;
|
|
42
|
+
options?: CALL_OPTIONS;
|
|
43
|
+
experimental_transform?:
|
|
44
|
+
| StreamTextTransform<TOOLS>
|
|
45
|
+
| Array<StreamTextTransform<TOOLS>>;
|
|
46
|
+
} & UIMessageStreamOptions<
|
|
47
|
+
UIMessage<MESSAGE_METADATA, never, InferUITools<TOOLS>>
|
|
48
|
+
>): Promise<
|
|
49
|
+
AsyncIterableStream<
|
|
50
|
+
InferUIMessageChunk<UIMessage<MESSAGE_METADATA, never, InferUITools<TOOLS>>>
|
|
51
|
+
>
|
|
52
|
+
> {
|
|
53
|
+
const validatedMessages = await validateUIMessages<
|
|
54
|
+
UIMessage<MESSAGE_METADATA, never, InferUITools<TOOLS>>
|
|
55
|
+
>({
|
|
56
|
+
messages: uiMessages,
|
|
57
|
+
tools: agent.tools,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const modelMessages = await convertToModelMessages(validatedMessages, {
|
|
61
|
+
tools: agent.tools,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const result = await agent.stream({
|
|
65
|
+
prompt: modelMessages,
|
|
66
|
+
options: options as CALL_OPTIONS,
|
|
67
|
+
abortSignal,
|
|
68
|
+
timeout,
|
|
69
|
+
experimental_transform,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return result.toUIMessageStream(uiMessageStreamOptions);
|
|
73
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export {
|
|
2
|
+
type Agent,
|
|
3
|
+
type AgentCallParameters,
|
|
4
|
+
type AgentStreamParameters,
|
|
5
|
+
} from './agent';
|
|
6
|
+
export { type ToolLoopAgentOnFinishCallback } from './tool-loop-agent-on-finish-callback';
|
|
7
|
+
export { type ToolLoopAgentOnStepFinishCallback } from './tool-loop-agent-on-step-finish-callback';
|
|
8
|
+
export {
|
|
9
|
+
type ToolLoopAgentSettings,
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @deprecated Use `ToolLoopAgentSettings` instead.
|
|
13
|
+
*/
|
|
14
|
+
type ToolLoopAgentSettings as Experimental_AgentSettings,
|
|
15
|
+
} from './tool-loop-agent-settings';
|
|
16
|
+
export {
|
|
17
|
+
ToolLoopAgent,
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated Use `ToolLoopAgent` instead.
|
|
21
|
+
*/
|
|
22
|
+
ToolLoopAgent as Experimental_Agent,
|
|
23
|
+
} from './tool-loop-agent';
|
|
24
|
+
export {
|
|
25
|
+
/**
|
|
26
|
+
* @deprecated Use `InferAgentUIMessage` instead.
|
|
27
|
+
*/
|
|
28
|
+
type InferAgentUIMessage as Experimental_InferAgentUIMessage,
|
|
29
|
+
type InferAgentUIMessage,
|
|
30
|
+
} from './infer-agent-ui-message';
|
|
31
|
+
export { createAgentUIStreamResponse } from './create-agent-ui-stream-response';
|
|
32
|
+
export { createAgentUIStream } from './create-agent-ui-stream';
|
|
33
|
+
export { pipeAgentUIStreamToResponse } from './pipe-agent-ui-stream-to-response';
|