ai 6.0.33 → 6.0.34
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 +10 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +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/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 +34 -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/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 +8052 -0
- package/src/ui/process-ui-message-stream.ts +713 -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
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expectTypeOf, it } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
DataUIPart,
|
|
4
|
+
DynamicToolUIPart,
|
|
5
|
+
FileUIPart,
|
|
6
|
+
ReasoningUIPart,
|
|
7
|
+
SourceDocumentUIPart,
|
|
8
|
+
SourceUrlUIPart,
|
|
9
|
+
StepStartUIPart,
|
|
10
|
+
TextUIPart,
|
|
11
|
+
UIMessage,
|
|
12
|
+
} from '../ui/ui-messages';
|
|
13
|
+
import { ToolLoopAgent } from './tool-loop-agent';
|
|
14
|
+
import { InferAgentUIMessage } from './infer-agent-ui-message';
|
|
15
|
+
|
|
16
|
+
describe('InferAgentUIMessage', () => {
|
|
17
|
+
it('should not contain arbitrary static tools when no tools are provided', () => {
|
|
18
|
+
const agent = new ToolLoopAgent({
|
|
19
|
+
model: 'openai/gpt-4o',
|
|
20
|
+
// no tools
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
type Message = InferAgentUIMessage<typeof agent>;
|
|
24
|
+
|
|
25
|
+
expectTypeOf<Message>().toMatchTypeOf<UIMessage<unknown, never, {}>>();
|
|
26
|
+
|
|
27
|
+
type MessagePart = Message['parts'][number];
|
|
28
|
+
|
|
29
|
+
expectTypeOf<MessagePart>().toMatchTypeOf<
|
|
30
|
+
| TextUIPart
|
|
31
|
+
| ReasoningUIPart
|
|
32
|
+
// No static tools, so no ToolUIPart
|
|
33
|
+
| DynamicToolUIPart
|
|
34
|
+
| SourceUrlUIPart
|
|
35
|
+
| SourceDocumentUIPart
|
|
36
|
+
| FileUIPart
|
|
37
|
+
| DataUIPart<never>
|
|
38
|
+
| StepStartUIPart
|
|
39
|
+
>();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should include metadata when provided', () => {
|
|
43
|
+
const agent = new ToolLoopAgent({
|
|
44
|
+
model: 'openai/gpt-4o',
|
|
45
|
+
// no tools
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
type Message = InferAgentUIMessage<typeof agent, { foo: string }>;
|
|
49
|
+
|
|
50
|
+
expectTypeOf<Message>().toMatchTypeOf<
|
|
51
|
+
UIMessage<{ foo: string }, never, {}>
|
|
52
|
+
>();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { InferUITools, UIMessage } from '../ui/ui-messages';
|
|
2
|
+
import { InferAgentTools } from './infer-agent-tools';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Infer the UI message type of an agent.
|
|
6
|
+
*/
|
|
7
|
+
export type InferAgentUIMessage<AGENT, MESSAGE_METADATA = unknown> = UIMessage<
|
|
8
|
+
MESSAGE_METADATA,
|
|
9
|
+
never,
|
|
10
|
+
InferUITools<InferAgentTools<AGENT>>
|
|
11
|
+
>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ServerResponse } from 'node:http';
|
|
2
|
+
import { StreamTextTransform, UIMessageStreamOptions } from '../generate-text';
|
|
3
|
+
import { Output } from '../generate-text/output';
|
|
4
|
+
import { ToolSet } from '../generate-text/tool-set';
|
|
5
|
+
import { TimeoutConfiguration } from '../prompt/call-settings';
|
|
6
|
+
import { pipeUIMessageStreamToResponse } from '../ui-message-stream';
|
|
7
|
+
import { UIMessageStreamResponseInit } from '../ui-message-stream/ui-message-stream-response-init';
|
|
8
|
+
import { InferUITools, UIMessage } from '../ui/ui-messages';
|
|
9
|
+
import { Agent } from './agent';
|
|
10
|
+
import { createAgentUIStream } from './create-agent-ui-stream';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Pipes the agent UI message stream to a Node.js ServerResponse object.
|
|
14
|
+
*
|
|
15
|
+
* @param agent - The agent to run.
|
|
16
|
+
* @param uiMessages - The input UI messages.
|
|
17
|
+
*/
|
|
18
|
+
export async function pipeAgentUIStreamToResponse<
|
|
19
|
+
CALL_OPTIONS = never,
|
|
20
|
+
TOOLS extends ToolSet = {},
|
|
21
|
+
OUTPUT extends Output = never,
|
|
22
|
+
MESSAGE_METADATA = unknown,
|
|
23
|
+
>({
|
|
24
|
+
response,
|
|
25
|
+
headers,
|
|
26
|
+
status,
|
|
27
|
+
statusText,
|
|
28
|
+
consumeSseStream,
|
|
29
|
+
...options
|
|
30
|
+
}: {
|
|
31
|
+
response: ServerResponse;
|
|
32
|
+
agent: Agent<CALL_OPTIONS, TOOLS, OUTPUT>;
|
|
33
|
+
uiMessages: unknown[];
|
|
34
|
+
abortSignal?: AbortSignal;
|
|
35
|
+
timeout?: TimeoutConfiguration;
|
|
36
|
+
options?: CALL_OPTIONS;
|
|
37
|
+
experimental_transform?:
|
|
38
|
+
| StreamTextTransform<TOOLS>
|
|
39
|
+
| Array<StreamTextTransform<TOOLS>>;
|
|
40
|
+
} & UIMessageStreamResponseInit &
|
|
41
|
+
UIMessageStreamOptions<
|
|
42
|
+
UIMessage<MESSAGE_METADATA, never, InferUITools<TOOLS>>
|
|
43
|
+
>): Promise<void> {
|
|
44
|
+
pipeUIMessageStreamToResponse({
|
|
45
|
+
response,
|
|
46
|
+
headers,
|
|
47
|
+
status,
|
|
48
|
+
statusText,
|
|
49
|
+
consumeSseStream,
|
|
50
|
+
stream: await createAgentUIStream(options),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { StepResult } from '../generate-text/step-result';
|
|
2
|
+
import { ToolSet } from '../generate-text/tool-set';
|
|
3
|
+
import { LanguageModelUsage } from '../types/usage';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
Callback that is set using the `onFinish` option.
|
|
7
|
+
|
|
8
|
+
@param event - The event that is passed to the callback.
|
|
9
|
+
*/
|
|
10
|
+
export type ToolLoopAgentOnFinishCallback<TOOLS extends ToolSet = {}> = (
|
|
11
|
+
event: StepResult<TOOLS> & {
|
|
12
|
+
/**
|
|
13
|
+
* Details for all steps.
|
|
14
|
+
*/
|
|
15
|
+
readonly steps: StepResult<TOOLS>[];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Total usage for all steps. This is the sum of the usage of all steps.
|
|
19
|
+
*/
|
|
20
|
+
readonly totalUsage: LanguageModelUsage;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Context that is passed into tool calls.
|
|
24
|
+
*
|
|
25
|
+
* Experimental (can break in patch releases).
|
|
26
|
+
*
|
|
27
|
+
* @default undefined
|
|
28
|
+
*/
|
|
29
|
+
experimental_context?: unknown;
|
|
30
|
+
},
|
|
31
|
+
) => PromiseLike<void> | void;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { StepResult } from '../generate-text/step-result';
|
|
2
|
+
import { ToolSet } from '../generate-text/tool-set';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
Callback that is set using the `onStepFinish` option.
|
|
6
|
+
|
|
7
|
+
@param stepResult - The result of the step.
|
|
8
|
+
*/
|
|
9
|
+
export type ToolLoopAgentOnStepFinishCallback<TOOLS extends ToolSet = {}> = (
|
|
10
|
+
stepResult: StepResult<TOOLS>,
|
|
11
|
+
) => Promise<void> | void;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FlexibleSchema,
|
|
3
|
+
MaybePromiseLike,
|
|
4
|
+
ProviderOptions,
|
|
5
|
+
SystemModelMessage,
|
|
6
|
+
} from '@ai-sdk/provider-utils';
|
|
7
|
+
import { Output } from '../generate-text/output';
|
|
8
|
+
import { PrepareStepFunction } from '../generate-text/prepare-step';
|
|
9
|
+
import { StopCondition } from '../generate-text/stop-condition';
|
|
10
|
+
import { ToolCallRepairFunction } from '../generate-text/tool-call-repair-function';
|
|
11
|
+
import { ToolSet } from '../generate-text/tool-set';
|
|
12
|
+
import { CallSettings } from '../prompt/call-settings';
|
|
13
|
+
import { Prompt } from '../prompt/prompt';
|
|
14
|
+
import { TelemetrySettings } from '../telemetry/telemetry-settings';
|
|
15
|
+
import { LanguageModel, ToolChoice } from '../types/language-model';
|
|
16
|
+
import { DownloadFunction } from '../util/download/download-function';
|
|
17
|
+
import { AgentCallParameters } from './agent';
|
|
18
|
+
import { ToolLoopAgentOnFinishCallback } from './tool-loop-agent-on-finish-callback';
|
|
19
|
+
import { ToolLoopAgentOnStepFinishCallback } from './tool-loop-agent-on-step-finish-callback';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Configuration options for an agent.
|
|
23
|
+
*/
|
|
24
|
+
export type ToolLoopAgentSettings<
|
|
25
|
+
CALL_OPTIONS = never,
|
|
26
|
+
TOOLS extends ToolSet = {},
|
|
27
|
+
OUTPUT extends Output = never,
|
|
28
|
+
> = Omit<CallSettings, 'abortSignal'> & {
|
|
29
|
+
/**
|
|
30
|
+
* The id of the agent.
|
|
31
|
+
*/
|
|
32
|
+
id?: string;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The instructions for the agent.
|
|
36
|
+
*
|
|
37
|
+
* It can be a string, or, if you need to pass additional provider options (e.g. for caching), a `SystemModelMessage`.
|
|
38
|
+
*/
|
|
39
|
+
instructions?: string | SystemModelMessage | Array<SystemModelMessage>;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
The language model to use.
|
|
43
|
+
*/
|
|
44
|
+
model: LanguageModel;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
The tools that the model can call. The model needs to support calling tools.
|
|
48
|
+
*/
|
|
49
|
+
tools?: TOOLS;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
The tool choice strategy. Default: 'auto'.
|
|
53
|
+
*/
|
|
54
|
+
toolChoice?: ToolChoice<NoInfer<TOOLS>>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
Condition for stopping the generation when there are tool results in the last step.
|
|
58
|
+
When the condition is an array, any of the conditions can be met to stop the generation.
|
|
59
|
+
|
|
60
|
+
@default stepCountIs(20)
|
|
61
|
+
*/
|
|
62
|
+
stopWhen?:
|
|
63
|
+
| StopCondition<NoInfer<TOOLS>>
|
|
64
|
+
| Array<StopCondition<NoInfer<TOOLS>>>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
Optional telemetry configuration (experimental).
|
|
68
|
+
*/
|
|
69
|
+
experimental_telemetry?: TelemetrySettings;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
Limits the tools that are available for the model to call without
|
|
73
|
+
changing the tool call and result types in the result.
|
|
74
|
+
*/
|
|
75
|
+
activeTools?: Array<keyof NoInfer<TOOLS>>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
Optional specification for generating structured outputs.
|
|
79
|
+
*/
|
|
80
|
+
output?: OUTPUT;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
Optional function that you can use to provide different settings for a step.
|
|
84
|
+
*/
|
|
85
|
+
prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
A function that attempts to repair a tool call that failed to parse.
|
|
89
|
+
*/
|
|
90
|
+
experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Callback that is called when each step (LLM call) is finished, including intermediate steps.
|
|
94
|
+
*/
|
|
95
|
+
onStepFinish?: ToolLoopAgentOnStepFinishCallback<NoInfer<TOOLS>>;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Callback that is called when all steps are finished and the response is complete.
|
|
99
|
+
*/
|
|
100
|
+
onFinish?: ToolLoopAgentOnFinishCallback<NoInfer<TOOLS>>;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
Additional provider-specific options. They are passed through
|
|
104
|
+
to the provider from the AI SDK and enable provider-specific
|
|
105
|
+
functionality that can be fully encapsulated in the provider.
|
|
106
|
+
*/
|
|
107
|
+
providerOptions?: ProviderOptions;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Context that is passed into tool calls.
|
|
111
|
+
*
|
|
112
|
+
* Experimental (can break in patch releases).
|
|
113
|
+
*
|
|
114
|
+
* @default undefined
|
|
115
|
+
*/
|
|
116
|
+
experimental_context?: unknown;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
Custom download function to use for URLs.
|
|
120
|
+
|
|
121
|
+
By default, files are downloaded if the model does not support the URL for the given media type.
|
|
122
|
+
*/
|
|
123
|
+
experimental_download?: DownloadFunction | undefined;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The schema for the call options.
|
|
127
|
+
*/
|
|
128
|
+
callOptionsSchema?: FlexibleSchema<CALL_OPTIONS>;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Prepare the parameters for the generateText or streamText call.
|
|
132
|
+
*
|
|
133
|
+
* You can use this to have templates based on call options.
|
|
134
|
+
*/
|
|
135
|
+
prepareCall?: (
|
|
136
|
+
options: AgentCallParameters<CALL_OPTIONS> &
|
|
137
|
+
Pick<
|
|
138
|
+
ToolLoopAgentSettings<CALL_OPTIONS, TOOLS, OUTPUT>,
|
|
139
|
+
| 'model'
|
|
140
|
+
| 'tools'
|
|
141
|
+
| 'maxOutputTokens'
|
|
142
|
+
| 'temperature'
|
|
143
|
+
| 'topP'
|
|
144
|
+
| 'topK'
|
|
145
|
+
| 'presencePenalty'
|
|
146
|
+
| 'frequencyPenalty'
|
|
147
|
+
| 'stopSequences'
|
|
148
|
+
| 'seed'
|
|
149
|
+
| 'headers'
|
|
150
|
+
| 'instructions'
|
|
151
|
+
| 'stopWhen'
|
|
152
|
+
| 'experimental_telemetry'
|
|
153
|
+
| 'activeTools'
|
|
154
|
+
| 'providerOptions'
|
|
155
|
+
| 'experimental_context'
|
|
156
|
+
| 'experimental_download'
|
|
157
|
+
>,
|
|
158
|
+
) => MaybePromiseLike<
|
|
159
|
+
Pick<
|
|
160
|
+
ToolLoopAgentSettings<CALL_OPTIONS, TOOLS, OUTPUT>,
|
|
161
|
+
| 'model'
|
|
162
|
+
| 'tools'
|
|
163
|
+
| 'maxOutputTokens'
|
|
164
|
+
| 'temperature'
|
|
165
|
+
| 'topP'
|
|
166
|
+
| 'topK'
|
|
167
|
+
| 'presencePenalty'
|
|
168
|
+
| 'frequencyPenalty'
|
|
169
|
+
| 'stopSequences'
|
|
170
|
+
| 'seed'
|
|
171
|
+
| 'headers'
|
|
172
|
+
| 'instructions'
|
|
173
|
+
| 'stopWhen'
|
|
174
|
+
| 'experimental_telemetry'
|
|
175
|
+
| 'activeTools'
|
|
176
|
+
| 'providerOptions'
|
|
177
|
+
| 'experimental_context'
|
|
178
|
+
| 'experimental_download'
|
|
179
|
+
> &
|
|
180
|
+
Omit<Prompt, 'system'>
|
|
181
|
+
>;
|
|
182
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { describe, expectTypeOf, it } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { Output } from '../generate-text';
|
|
4
|
+
import { MockLanguageModelV3 } from '../test/mock-language-model-v3';
|
|
5
|
+
import { AsyncIterableStream } from '../util/async-iterable-stream';
|
|
6
|
+
import { DeepPartial } from '../util/deep-partial';
|
|
7
|
+
import { AgentCallParameters, AgentStreamParameters } from './agent';
|
|
8
|
+
import { ToolLoopAgent } from './tool-loop-agent';
|
|
9
|
+
|
|
10
|
+
describe('ToolLoopAgent', () => {
|
|
11
|
+
describe('generate', () => {
|
|
12
|
+
it('should not allow system prompt', async () => {
|
|
13
|
+
const agent = new ToolLoopAgent({
|
|
14
|
+
model: new MockLanguageModelV3(),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
await agent.generate({
|
|
18
|
+
// @ts-expect-error - system prompt is not allowed
|
|
19
|
+
system: '123',
|
|
20
|
+
prompt: 'Hello, world!',
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should require options when call options are provided', async () => {
|
|
25
|
+
const agent = new ToolLoopAgent<{ callOption: string }>({
|
|
26
|
+
model: new MockLanguageModelV3(),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
expectTypeOf<Parameters<typeof agent.generate>[0]>().toEqualTypeOf<
|
|
30
|
+
AgentCallParameters<{ callOption: string }>
|
|
31
|
+
>();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should not require options when call options are not provided', async () => {
|
|
35
|
+
const agent = new ToolLoopAgent({
|
|
36
|
+
model: new MockLanguageModelV3(),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
expectTypeOf<Parameters<typeof agent.generate>[0]>().toEqualTypeOf<
|
|
40
|
+
AgentCallParameters<never>
|
|
41
|
+
>();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should infer output type', async () => {
|
|
45
|
+
const agent = new ToolLoopAgent({
|
|
46
|
+
model: new MockLanguageModelV3(),
|
|
47
|
+
output: Output.object({
|
|
48
|
+
schema: z.object({ value: z.string() }),
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const generateResult = await agent.generate({
|
|
53
|
+
prompt: 'Hello, world!',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const output = generateResult.output;
|
|
57
|
+
|
|
58
|
+
expectTypeOf<typeof output>().toEqualTypeOf<{ value: string }>();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('stream', () => {
|
|
63
|
+
it('should not allow system prompt', () => {
|
|
64
|
+
const agent = new ToolLoopAgent({
|
|
65
|
+
model: new MockLanguageModelV3(),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
agent.stream({
|
|
69
|
+
// @ts-expect-error - system prompt is not allowed
|
|
70
|
+
system: '123',
|
|
71
|
+
prompt: 'Hello, world!',
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should require options when call options are provided', async () => {
|
|
76
|
+
const agent = new ToolLoopAgent<{ callOption: string }>({
|
|
77
|
+
model: new MockLanguageModelV3(),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
expectTypeOf<Parameters<typeof agent.stream>[0]>().toEqualTypeOf<
|
|
81
|
+
AgentStreamParameters<{ callOption: string }, {}>
|
|
82
|
+
>();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should not require options when call options are not provided', async () => {
|
|
86
|
+
const agent = new ToolLoopAgent({
|
|
87
|
+
model: new MockLanguageModelV3(),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
expectTypeOf<Parameters<typeof agent.stream>[0]>().toEqualTypeOf<
|
|
91
|
+
AgentStreamParameters<never, {}>
|
|
92
|
+
>();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('should infer output type', async () => {
|
|
96
|
+
const agent = new ToolLoopAgent({
|
|
97
|
+
model: new MockLanguageModelV3(),
|
|
98
|
+
output: Output.object({
|
|
99
|
+
schema: z.object({ value: z.string() }),
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const streamResult = await agent.stream({
|
|
104
|
+
prompt: 'Hello, world!',
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const partialOutputStream = streamResult.partialOutputStream;
|
|
108
|
+
|
|
109
|
+
expectTypeOf<typeof partialOutputStream>().toEqualTypeOf<
|
|
110
|
+
AsyncIterableStream<DeepPartial<{ value: string }>>
|
|
111
|
+
>();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|