@fairyhunter13/ai-sdk 6.0.116-fork.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7582 -0
- package/README.md +238 -0
- package/dist/index.d.mts +6751 -0
- package/dist/index.d.ts +6751 -0
- package/dist/index.js +14155 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +14127 -0
- package/dist/index.mjs.map +1 -0
- package/dist/internal/index.d.mts +324 -0
- package/dist/internal/index.d.ts +324 -0
- package/dist/internal/index.js +1352 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/internal/index.mjs +1336 -0
- package/dist/internal/index.mjs.map +1 -0
- package/dist/test/index.d.mts +265 -0
- package/dist/test/index.d.ts +265 -0
- package/dist/test/index.js +509 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/index.mjs +472 -0
- package/dist/test/index.mjs.map +1 -0
- package/docs/00-introduction/index.mdx +76 -0
- package/docs/02-foundations/01-overview.mdx +43 -0
- package/docs/02-foundations/02-providers-and-models.mdx +158 -0
- package/docs/02-foundations/03-prompts.mdx +616 -0
- package/docs/02-foundations/04-tools.mdx +251 -0
- package/docs/02-foundations/05-streaming.mdx +62 -0
- package/docs/02-foundations/06-provider-options.mdx +345 -0
- package/docs/02-foundations/index.mdx +49 -0
- package/docs/02-getting-started/00-choosing-a-provider.mdx +110 -0
- package/docs/02-getting-started/01-navigating-the-library.mdx +85 -0
- package/docs/02-getting-started/02-nextjs-app-router.mdx +559 -0
- package/docs/02-getting-started/03-nextjs-pages-router.mdx +542 -0
- package/docs/02-getting-started/04-svelte.mdx +627 -0
- package/docs/02-getting-started/05-nuxt.mdx +566 -0
- package/docs/02-getting-started/06-nodejs.mdx +512 -0
- package/docs/02-getting-started/07-expo.mdx +766 -0
- package/docs/02-getting-started/08-tanstack-start.mdx +583 -0
- package/docs/02-getting-started/09-coding-agents.mdx +179 -0
- package/docs/02-getting-started/index.mdx +44 -0
- package/docs/03-agents/01-overview.mdx +96 -0
- package/docs/03-agents/02-building-agents.mdx +449 -0
- package/docs/03-agents/03-workflows.mdx +386 -0
- package/docs/03-agents/04-loop-control.mdx +394 -0
- package/docs/03-agents/05-configuring-call-options.mdx +286 -0
- package/docs/03-agents/06-memory.mdx +222 -0
- package/docs/03-agents/06-subagents.mdx +362 -0
- package/docs/03-agents/index.mdx +46 -0
- package/docs/03-ai-sdk-core/01-overview.mdx +31 -0
- package/docs/03-ai-sdk-core/05-generating-text.mdx +707 -0
- package/docs/03-ai-sdk-core/10-generating-structured-data.mdx +498 -0
- package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1144 -0
- package/docs/03-ai-sdk-core/16-mcp-tools.mdx +383 -0
- package/docs/03-ai-sdk-core/20-prompt-engineering.mdx +146 -0
- package/docs/03-ai-sdk-core/25-settings.mdx +216 -0
- package/docs/03-ai-sdk-core/26-reasoning.mdx +190 -0
- package/docs/03-ai-sdk-core/30-embeddings.mdx +246 -0
- package/docs/03-ai-sdk-core/31-reranking.mdx +218 -0
- package/docs/03-ai-sdk-core/35-image-generation.mdx +341 -0
- package/docs/03-ai-sdk-core/36-transcription.mdx +227 -0
- package/docs/03-ai-sdk-core/37-speech.mdx +169 -0
- package/docs/03-ai-sdk-core/38-video-generation.mdx +366 -0
- package/docs/03-ai-sdk-core/40-middleware.mdx +485 -0
- package/docs/03-ai-sdk-core/45-provider-management.mdx +349 -0
- package/docs/03-ai-sdk-core/50-error-handling.mdx +149 -0
- package/docs/03-ai-sdk-core/55-testing.mdx +219 -0
- package/docs/03-ai-sdk-core/60-telemetry.mdx +391 -0
- package/docs/03-ai-sdk-core/65-devtools.mdx +107 -0
- package/docs/03-ai-sdk-core/65-event-listeners.mdx +1118 -0
- package/docs/03-ai-sdk-core/index.mdx +99 -0
- package/docs/04-ai-sdk-ui/01-overview.mdx +44 -0
- package/docs/04-ai-sdk-ui/02-chatbot.mdx +1320 -0
- package/docs/04-ai-sdk-ui/03-chatbot-message-persistence.mdx +535 -0
- package/docs/04-ai-sdk-ui/03-chatbot-resume-streams.mdx +263 -0
- package/docs/04-ai-sdk-ui/03-chatbot-tool-usage.mdx +682 -0
- package/docs/04-ai-sdk-ui/04-generative-user-interfaces.mdx +389 -0
- package/docs/04-ai-sdk-ui/05-completion.mdx +181 -0
- package/docs/04-ai-sdk-ui/08-object-generation.mdx +344 -0
- package/docs/04-ai-sdk-ui/20-streaming-data.mdx +397 -0
- package/docs/04-ai-sdk-ui/21-error-handling.mdx +190 -0
- package/docs/04-ai-sdk-ui/21-transport.mdx +174 -0
- package/docs/04-ai-sdk-ui/24-reading-ui-message-streams.mdx +104 -0
- package/docs/04-ai-sdk-ui/25-message-metadata.mdx +152 -0
- package/docs/04-ai-sdk-ui/50-stream-protocol.mdx +503 -0
- package/docs/04-ai-sdk-ui/index.mdx +64 -0
- package/docs/05-ai-sdk-rsc/01-overview.mdx +45 -0
- package/docs/05-ai-sdk-rsc/02-streaming-react-components.mdx +209 -0
- package/docs/05-ai-sdk-rsc/03-generative-ui-state.mdx +279 -0
- package/docs/05-ai-sdk-rsc/03-saving-and-restoring-states.mdx +105 -0
- package/docs/05-ai-sdk-rsc/04-multistep-interfaces.mdx +282 -0
- package/docs/05-ai-sdk-rsc/05-streaming-values.mdx +157 -0
- package/docs/05-ai-sdk-rsc/06-loading-state.mdx +273 -0
- package/docs/05-ai-sdk-rsc/08-error-handling.mdx +94 -0
- package/docs/05-ai-sdk-rsc/09-authentication.mdx +42 -0
- package/docs/05-ai-sdk-rsc/10-migrating-to-ui.mdx +722 -0
- package/docs/05-ai-sdk-rsc/index.mdx +63 -0
- package/docs/06-advanced/01-prompt-engineering.mdx +96 -0
- package/docs/06-advanced/02-stopping-streams.mdx +184 -0
- package/docs/06-advanced/03-backpressure.mdx +173 -0
- package/docs/06-advanced/04-caching.mdx +169 -0
- package/docs/06-advanced/05-multiple-streamables.mdx +68 -0
- package/docs/06-advanced/06-rate-limiting.mdx +60 -0
- package/docs/06-advanced/07-rendering-ui-with-language-models.mdx +225 -0
- package/docs/06-advanced/08-model-as-router.mdx +120 -0
- package/docs/06-advanced/09-multistep-interfaces.mdx +115 -0
- package/docs/06-advanced/09-sequential-generations.mdx +55 -0
- package/docs/06-advanced/10-vercel-deployment-guide.mdx +117 -0
- package/docs/06-advanced/index.mdx +11 -0
- package/docs/07-reference/01-ai-sdk-core/01-generate-text.mdx +2785 -0
- package/docs/07-reference/01-ai-sdk-core/02-stream-text.mdx +3752 -0
- package/docs/07-reference/01-ai-sdk-core/05-embed.mdx +332 -0
- package/docs/07-reference/01-ai-sdk-core/06-embed-many.mdx +330 -0
- package/docs/07-reference/01-ai-sdk-core/06-rerank.mdx +309 -0
- package/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx +251 -0
- package/docs/07-reference/01-ai-sdk-core/11-transcribe.mdx +152 -0
- package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +221 -0
- package/docs/07-reference/01-ai-sdk-core/13-generate-video.mdx +264 -0
- package/docs/07-reference/01-ai-sdk-core/15-agent.mdx +235 -0
- package/docs/07-reference/01-ai-sdk-core/16-tool-loop-agent.mdx +973 -0
- package/docs/07-reference/01-ai-sdk-core/17-create-agent-ui-stream.mdx +154 -0
- package/docs/07-reference/01-ai-sdk-core/18-create-agent-ui-stream-response.mdx +173 -0
- package/docs/07-reference/01-ai-sdk-core/18-pipe-agent-ui-stream-to-response.mdx +150 -0
- package/docs/07-reference/01-ai-sdk-core/20-tool.mdx +209 -0
- package/docs/07-reference/01-ai-sdk-core/22-dynamic-tool.mdx +223 -0
- package/docs/07-reference/01-ai-sdk-core/23-create-mcp-client.mdx +423 -0
- package/docs/07-reference/01-ai-sdk-core/24-mcp-stdio-transport.mdx +68 -0
- package/docs/07-reference/01-ai-sdk-core/25-json-schema.mdx +94 -0
- package/docs/07-reference/01-ai-sdk-core/26-zod-schema.mdx +109 -0
- package/docs/07-reference/01-ai-sdk-core/27-valibot-schema.mdx +58 -0
- package/docs/07-reference/01-ai-sdk-core/28-output.mdx +342 -0
- package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +435 -0
- package/docs/07-reference/01-ai-sdk-core/31-ui-message.mdx +264 -0
- package/docs/07-reference/01-ai-sdk-core/32-validate-ui-messages.mdx +101 -0
- package/docs/07-reference/01-ai-sdk-core/33-safe-validate-ui-messages.mdx +113 -0
- package/docs/07-reference/01-ai-sdk-core/40-provider-registry.mdx +198 -0
- package/docs/07-reference/01-ai-sdk-core/42-custom-provider.mdx +157 -0
- package/docs/07-reference/01-ai-sdk-core/50-cosine-similarity.mdx +52 -0
- package/docs/07-reference/01-ai-sdk-core/60-wrap-language-model.mdx +59 -0
- package/docs/07-reference/01-ai-sdk-core/61-wrap-image-model.mdx +64 -0
- package/docs/07-reference/01-ai-sdk-core/65-language-model-v2-middleware.mdx +74 -0
- package/docs/07-reference/01-ai-sdk-core/66-extract-reasoning-middleware.mdx +68 -0
- package/docs/07-reference/01-ai-sdk-core/67-simulate-streaming-middleware.mdx +71 -0
- package/docs/07-reference/01-ai-sdk-core/68-default-settings-middleware.mdx +80 -0
- package/docs/07-reference/01-ai-sdk-core/69-add-tool-input-examples-middleware.mdx +155 -0
- package/docs/07-reference/01-ai-sdk-core/70-extract-json-middleware.mdx +147 -0
- package/docs/07-reference/01-ai-sdk-core/70-step-count-is.mdx +84 -0
- package/docs/07-reference/01-ai-sdk-core/71-has-tool-call.mdx +120 -0
- package/docs/07-reference/01-ai-sdk-core/75-simulate-readable-stream.mdx +94 -0
- package/docs/07-reference/01-ai-sdk-core/80-smooth-stream.mdx +145 -0
- package/docs/07-reference/01-ai-sdk-core/90-generate-id.mdx +30 -0
- package/docs/07-reference/01-ai-sdk-core/91-create-id-generator.mdx +89 -0
- package/docs/07-reference/01-ai-sdk-core/92-default-generated-file.mdx +68 -0
- package/docs/07-reference/01-ai-sdk-core/index.mdx +160 -0
- package/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx +493 -0
- package/docs/07-reference/02-ai-sdk-ui/02-use-completion.mdx +185 -0
- package/docs/07-reference/02-ai-sdk-ui/03-use-object.mdx +196 -0
- package/docs/07-reference/02-ai-sdk-ui/31-convert-to-model-messages.mdx +231 -0
- package/docs/07-reference/02-ai-sdk-ui/32-prune-messages.mdx +108 -0
- package/docs/07-reference/02-ai-sdk-ui/40-create-ui-message-stream.mdx +162 -0
- package/docs/07-reference/02-ai-sdk-ui/41-create-ui-message-stream-response.mdx +119 -0
- package/docs/07-reference/02-ai-sdk-ui/42-pipe-ui-message-stream-to-response.mdx +77 -0
- package/docs/07-reference/02-ai-sdk-ui/43-read-ui-message-stream.mdx +57 -0
- package/docs/07-reference/02-ai-sdk-ui/46-infer-ui-tools.mdx +99 -0
- package/docs/07-reference/02-ai-sdk-ui/47-infer-ui-tool.mdx +75 -0
- package/docs/07-reference/02-ai-sdk-ui/50-direct-chat-transport.mdx +333 -0
- package/docs/07-reference/02-ai-sdk-ui/index.mdx +89 -0
- package/docs/07-reference/03-ai-sdk-rsc/01-stream-ui.mdx +767 -0
- package/docs/07-reference/03-ai-sdk-rsc/02-create-ai.mdx +90 -0
- package/docs/07-reference/03-ai-sdk-rsc/03-create-streamable-ui.mdx +91 -0
- package/docs/07-reference/03-ai-sdk-rsc/04-create-streamable-value.mdx +78 -0
- package/docs/07-reference/03-ai-sdk-rsc/05-read-streamable-value.mdx +79 -0
- package/docs/07-reference/03-ai-sdk-rsc/06-get-ai-state.mdx +50 -0
- package/docs/07-reference/03-ai-sdk-rsc/07-get-mutable-ai-state.mdx +70 -0
- package/docs/07-reference/03-ai-sdk-rsc/08-use-ai-state.mdx +26 -0
- package/docs/07-reference/03-ai-sdk-rsc/09-use-actions.mdx +42 -0
- package/docs/07-reference/03-ai-sdk-rsc/10-use-ui-state.mdx +35 -0
- package/docs/07-reference/03-ai-sdk-rsc/11-use-streamable-value.mdx +46 -0
- package/docs/07-reference/03-ai-sdk-rsc/20-render.mdx +266 -0
- package/docs/07-reference/03-ai-sdk-rsc/index.mdx +67 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-api-call-error.mdx +31 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-download-error.mdx +28 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-empty-response-body-error.mdx +24 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-invalid-argument-error.mdx +26 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-invalid-data-content-error.mdx +26 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-invalid-message-role-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-invalid-prompt-error.mdx +47 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-invalid-response-data-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-approval-error.mdx +24 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-input-error.mdx +27 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-json-parse-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-load-api-key-error.mdx +24 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-load-setting-error.mdx +24 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-message-conversion-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-content-generated-error.mdx +24 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-image-generated-error.mdx +36 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-object-generated-error.mdx +43 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-output-generated-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-speech-generated-error.mdx +24 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-such-model-error.mdx +26 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-such-provider-error.mdx +28 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-such-tool-error.mdx +26 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-transcript-generated-error.mdx +24 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-no-video-generated-error.mdx +39 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-retry-error.mdx +27 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-too-many-embedding-values-for-call-error.mdx +27 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-not-found-for-approval-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-repair-error.mdx +28 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-type-validation-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-ui-message-stream-error.mdx +67 -0
- package/docs/07-reference/05-ai-sdk-errors/ai-unsupported-functionality-error.mdx +25 -0
- package/docs/07-reference/05-ai-sdk-errors/index.mdx +39 -0
- package/docs/07-reference/index.mdx +28 -0
- package/docs/08-migration-guides/00-versioning.mdx +46 -0
- package/docs/08-migration-guides/23-migration-guide-7-0.mdx +95 -0
- package/docs/08-migration-guides/24-migration-guide-6-0.mdx +823 -0
- package/docs/08-migration-guides/25-migration-guide-5-0-data.mdx +882 -0
- package/docs/08-migration-guides/26-migration-guide-5-0.mdx +3427 -0
- package/docs/08-migration-guides/27-migration-guide-4-2.mdx +99 -0
- package/docs/08-migration-guides/28-migration-guide-4-1.mdx +14 -0
- package/docs/08-migration-guides/29-migration-guide-4-0.mdx +1157 -0
- package/docs/08-migration-guides/36-migration-guide-3-4.mdx +14 -0
- package/docs/08-migration-guides/37-migration-guide-3-3.mdx +64 -0
- package/docs/08-migration-guides/38-migration-guide-3-2.mdx +46 -0
- package/docs/08-migration-guides/39-migration-guide-3-1.mdx +168 -0
- package/docs/08-migration-guides/index.mdx +22 -0
- package/docs/09-troubleshooting/01-azure-stream-slow.mdx +33 -0
- package/docs/09-troubleshooting/03-server-actions-in-client-components.mdx +40 -0
- package/docs/09-troubleshooting/04-strange-stream-output.mdx +36 -0
- package/docs/09-troubleshooting/05-streamable-ui-errors.mdx +16 -0
- package/docs/09-troubleshooting/05-tool-invocation-missing-result.mdx +106 -0
- package/docs/09-troubleshooting/06-streaming-not-working-when-deployed.mdx +31 -0
- package/docs/09-troubleshooting/06-streaming-not-working-when-proxied.mdx +31 -0
- package/docs/09-troubleshooting/06-timeout-on-vercel.mdx +60 -0
- package/docs/09-troubleshooting/07-unclosed-streams.mdx +34 -0
- package/docs/09-troubleshooting/08-use-chat-failed-to-parse-stream.mdx +26 -0
- package/docs/09-troubleshooting/09-client-stream-error.mdx +25 -0
- package/docs/09-troubleshooting/10-use-chat-tools-no-response.mdx +32 -0
- package/docs/09-troubleshooting/11-use-chat-custom-request-options.mdx +149 -0
- package/docs/09-troubleshooting/12-typescript-performance-zod.mdx +46 -0
- package/docs/09-troubleshooting/12-use-chat-an-error-occurred.mdx +59 -0
- package/docs/09-troubleshooting/13-repeated-assistant-messages.mdx +73 -0
- package/docs/09-troubleshooting/14-stream-abort-handling.mdx +73 -0
- package/docs/09-troubleshooting/14-tool-calling-with-structured-outputs.mdx +48 -0
- package/docs/09-troubleshooting/15-abort-breaks-resumable-streams.mdx +55 -0
- package/docs/09-troubleshooting/15-stream-text-not-working.mdx +33 -0
- package/docs/09-troubleshooting/16-streaming-status-delay.mdx +63 -0
- package/docs/09-troubleshooting/17-use-chat-stale-body-data.mdx +141 -0
- package/docs/09-troubleshooting/18-ontoolcall-type-narrowing.mdx +66 -0
- package/docs/09-troubleshooting/19-unsupported-model-version.mdx +50 -0
- package/docs/09-troubleshooting/20-no-object-generated-content-filter.mdx +76 -0
- package/docs/09-troubleshooting/21-missing-tool-results-error.mdx +82 -0
- package/docs/09-troubleshooting/30-model-is-not-assignable-to-type.mdx +21 -0
- package/docs/09-troubleshooting/40-typescript-cannot-find-namespace-jsx.mdx +24 -0
- package/docs/09-troubleshooting/50-react-maximum-update-depth-exceeded.mdx +39 -0
- package/docs/09-troubleshooting/60-jest-cannot-find-module-ai-rsc.mdx +22 -0
- package/docs/09-troubleshooting/70-high-memory-usage-with-images.mdx +108 -0
- package/docs/09-troubleshooting/index.mdx +11 -0
- package/internal.d.ts +1 -0
- package/package.json +120 -0
- package/src/agent/agent.ts +156 -0
- package/src/agent/create-agent-ui-stream-response.ts +61 -0
- package/src/agent/create-agent-ui-stream.ts +84 -0
- package/src/agent/index.ts +37 -0
- package/src/agent/infer-agent-tools.ts +7 -0
- package/src/agent/infer-agent-ui-message.ts +11 -0
- package/src/agent/pipe-agent-ui-stream-to-response.ts +64 -0
- package/src/agent/tool-loop-agent-settings.ts +244 -0
- package/src/agent/tool-loop-agent.ts +205 -0
- package/src/embed/embed-events.ts +109 -0
- package/src/embed/embed-many-result.ts +53 -0
- package/src/embed/embed-many.ts +484 -0
- package/src/embed/embed-result.ts +50 -0
- package/src/embed/embed.ts +294 -0
- package/src/embed/index.ts +5 -0
- package/src/error/index.ts +37 -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/missing-tool-result-error.ts +28 -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 +28 -0
- package/src/error/no-such-tool-error.ts +35 -0
- package/src/error/no-transcript-generated-error.ts +30 -0
- package/src/error/no-video-generated-error.ts +57 -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.ts +361 -0
- package/src/generate-image/index.ts +18 -0
- package/src/generate-object/generate-object-result.ts +67 -0
- package/src/generate-object/generate-object.ts +514 -0
- package/src/generate-object/index.ts +9 -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.ts +984 -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.ts +191 -0
- package/src/generate-speech/generated-audio-file.ts +65 -0
- package/src/generate-speech/index.ts +3 -0
- package/src/generate-text/collect-tool-approvals.ts +116 -0
- package/src/generate-text/content-part.ts +31 -0
- package/src/generate-text/core-events.ts +390 -0
- package/src/generate-text/create-execute-tools-transformation.ts +168 -0
- package/src/generate-text/create-stream-text-part-transform.ts +229 -0
- package/src/generate-text/execute-tool-call.ts +190 -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.ts +1411 -0
- package/src/generate-text/generated-file.ts +70 -0
- package/src/generate-text/index.ts +74 -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.ts +590 -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.ts +167 -0
- package/src/generate-text/reasoning-output.ts +99 -0
- package/src/generate-text/reasoning.ts +10 -0
- package/src/generate-text/response-message.ts +10 -0
- package/src/generate-text/smooth-stream.ts +162 -0
- package/src/generate-text/step-result.ts +310 -0
- package/src/generate-text/stop-condition.ts +29 -0
- package/src/generate-text/stream-text-result.ts +536 -0
- package/src/generate-text/stream-text.ts +2693 -0
- package/src/generate-text/to-response-messages.ts +178 -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/generate-video/generate-video-result.ts +36 -0
- package/src/generate-video/generate-video.ts +402 -0
- package/src/generate-video/index.ts +3 -0
- package/src/global.ts +36 -0
- package/src/index.ts +49 -0
- package/src/logger/index.ts +6 -0
- package/src/logger/log-warnings.ts +140 -0
- package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
- package/src/middleware/default-embedding-settings-middleware.ts +22 -0
- package/src/middleware/default-settings-middleware.ts +33 -0
- package/src/middleware/extract-json-middleware.ts +197 -0
- package/src/middleware/extract-reasoning-middleware.ts +249 -0
- package/src/middleware/index.ts +10 -0
- package/src/middleware/simulate-streaming-middleware.ts +79 -0
- package/src/middleware/wrap-embedding-model.ts +89 -0
- package/src/middleware/wrap-image-model.ts +92 -0
- package/src/middleware/wrap-language-model.ts +108 -0
- package/src/middleware/wrap-provider.ts +51 -0
- package/src/model/as-embedding-model-v3.ts +24 -0
- package/src/model/as-embedding-model-v4.ts +25 -0
- package/src/model/as-image-model-v3.ts +24 -0
- package/src/model/as-image-model-v4.ts +21 -0
- package/src/model/as-language-model-v3.ts +103 -0
- package/src/model/as-language-model-v4.ts +25 -0
- package/src/model/as-provider-v3.ts +36 -0
- package/src/model/as-provider-v4.ts +47 -0
- package/src/model/as-reranking-model-v4.ts +16 -0
- package/src/model/as-speech-model-v3.ts +24 -0
- package/src/model/as-speech-model-v4.ts +21 -0
- package/src/model/as-transcription-model-v3.ts +24 -0
- package/src/model/as-transcription-model-v4.ts +25 -0
- package/src/model/as-video-model-v4.ts +19 -0
- package/src/model/resolve-model.ts +172 -0
- package/src/prompt/call-settings.ts +177 -0
- package/src/prompt/content-part.ts +236 -0
- package/src/prompt/convert-to-language-model-prompt.ts +548 -0
- package/src/prompt/create-tool-model-output.ts +34 -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 +72 -0
- package/src/prompt/prepare-call-settings.ts +110 -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.ts +99 -0
- package/src/prompt/wrap-gateway-error.ts +29 -0
- package/src/registry/custom-provider.ts +210 -0
- package/src/registry/index.ts +7 -0
- package/src/registry/no-such-provider-error.ts +41 -0
- package/src/registry/provider-registry.ts +331 -0
- package/src/rerank/index.ts +2 -0
- package/src/rerank/rerank-result.ts +70 -0
- package/src/rerank/rerank.ts +239 -0
- package/src/telemetry/assemble-operation-name.ts +21 -0
- package/src/telemetry/get-base-telemetry-attributes.ts +55 -0
- package/src/telemetry/get-global-telemetry-integration.ts +110 -0
- package/src/telemetry/get-tracer.ts +20 -0
- package/src/telemetry/index.ts +4 -0
- package/src/telemetry/noop-tracer.ts +69 -0
- package/src/telemetry/open-telemetry-integration.ts +537 -0
- package/src/telemetry/record-span.ts +75 -0
- package/src/telemetry/select-telemetry-attributes.ts +78 -0
- package/src/telemetry/stringify-for-telemetry.ts +33 -0
- package/src/telemetry/telemetry-integration-registry.ts +22 -0
- package/src/telemetry/telemetry-integration.ts +100 -0
- package/src/telemetry/telemetry-settings.ts +55 -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-embedding-model-v4.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-image-model-v4.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-language-model-v4.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-provider-v4.ts +80 -0
- package/src/test/mock-reranking-model-v3.ts +25 -0
- package/src/test/mock-reranking-model-v4.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-speech-model-v4.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-transcription-model-v4.ts +24 -0
- package/src/test/mock-values.ts +4 -0
- package/src/test/mock-video-model-v3.ts +28 -0
- package/src/test/mock-video-model-v4.ts +28 -0
- package/src/test/not-implemented.ts +3 -0
- package/src/text-stream/create-text-stream-response.ts +30 -0
- package/src/text-stream/index.ts +2 -0
- package/src/text-stream/pipe-text-stream-to-response.ts +38 -0
- package/src/transcribe/index.ts +2 -0
- package/src/transcribe/transcribe-result.ts +60 -0
- package/src/transcribe/transcribe.ts +187 -0
- package/src/types/embedding-model-middleware.ts +15 -0
- package/src/types/embedding-model.ts +20 -0
- package/src/types/image-model-middleware.ts +15 -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 +15 -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 +106 -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 +10 -0
- package/src/types/transcription-model-response-metadata.ts +16 -0
- package/src/types/transcription-model.ts +14 -0
- package/src/types/usage.ts +200 -0
- package/src/types/video-model-response-metadata.ts +28 -0
- package/src/types/video-model.ts +15 -0
- package/src/types/warning.ts +7 -0
- package/src/ui/call-completion-api.ts +157 -0
- package/src/ui/chat-transport.ts +83 -0
- package/src/ui/chat.ts +786 -0
- package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
- package/src/ui/convert-to-model-messages.ts +403 -0
- package/src/ui/default-chat-transport.ts +36 -0
- package/src/ui/direct-chat-transport.ts +117 -0
- package/src/ui/http-chat-transport.ts +273 -0
- package/src/ui/index.ts +76 -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.ts +39 -0
- package/src/ui/process-text-stream.ts +16 -0
- package/src/ui/process-ui-message-stream.ts +858 -0
- package/src/ui/text-stream-chat-transport.ts +23 -0
- package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
- package/src/ui/ui-messages.ts +602 -0
- package/src/ui/use-completion.ts +84 -0
- package/src/ui/validate-ui-messages.ts +521 -0
- package/src/ui-message-stream/create-ui-message-stream-response.ts +44 -0
- package/src/ui-message-stream/create-ui-message-stream.ts +145 -0
- package/src/ui-message-stream/get-response-ui-message-id.ts +35 -0
- package/src/ui-message-stream/handle-ui-message-stream-finish.ts +170 -0
- package/src/ui-message-stream/index.ts +14 -0
- package/src/ui-message-stream/json-to-sse-transform-stream.ts +17 -0
- package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +51 -0
- package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
- package/src/ui-message-stream/ui-message-chunks.ts +372 -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-on-step-finish-callback.ts +25 -0
- package/src/ui-message-stream/ui-message-stream-response-init.ts +14 -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.ts +94 -0
- package/src/util/consume-stream.ts +31 -0
- package/src/util/cosine-similarity.ts +46 -0
- package/src/util/create-resolvable-promise.ts +30 -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.ts +226 -0
- package/src/util/download/create-download.ts +13 -0
- package/src/util/download/download-function.ts +45 -0
- package/src/util/download/download.ts +74 -0
- package/src/util/error-handler.ts +1 -0
- package/src/util/fix-json.ts +401 -0
- package/src/util/get-potential-start-index.ts +39 -0
- package/src/util/index.ts +12 -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.ts +43 -0
- package/src/util/merge-objects.ts +79 -0
- package/src/util/notify.ts +22 -0
- package/src/util/now.ts +4 -0
- package/src/util/parse-partial-json.ts +30 -0
- package/src/util/prepare-headers.ts +14 -0
- package/src/util/prepare-retries.ts +47 -0
- package/src/util/retry-error.ts +41 -0
- package/src/util/retry-with-exponential-backoff.ts +154 -0
- package/src/util/serial-job-executor.ts +36 -0
- package/src/util/simulate-readable-stream.ts +39 -0
- package/src/util/split-array.ts +20 -0
- package/src/util/value-of.ts +65 -0
- package/src/util/write-to-server-response.ts +49 -0
- package/src/version.ts +5 -0
- package/test.d.ts +1 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AISDKError } from '@ai-sdk/provider';
|
|
2
|
+
import { TranscriptionModelResponseMetadata } from '../types/transcription-model-response-metadata';
|
|
3
|
+
|
|
4
|
+
const name = 'AI_NoTranscriptGeneratedError';
|
|
5
|
+
const marker = `vercel.ai.error.${name}`;
|
|
6
|
+
const symbol = Symbol.for(marker);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Error that is thrown when no transcript was generated.
|
|
10
|
+
*/
|
|
11
|
+
export class NoTranscriptGeneratedError extends AISDKError {
|
|
12
|
+
private readonly [symbol] = true; // used in isInstance
|
|
13
|
+
|
|
14
|
+
readonly responses: Array<TranscriptionModelResponseMetadata>;
|
|
15
|
+
|
|
16
|
+
constructor(options: {
|
|
17
|
+
responses: Array<TranscriptionModelResponseMetadata>;
|
|
18
|
+
}) {
|
|
19
|
+
super({
|
|
20
|
+
name,
|
|
21
|
+
message: 'No transcript generated.',
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
this.responses = options.responses;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static isInstance(error: unknown): error is NoTranscriptGeneratedError {
|
|
28
|
+
return AISDKError.hasMarker(error, marker);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AISDKError } from '@ai-sdk/provider';
|
|
2
|
+
import { VideoModelResponseMetadata } from '../types/video-model-response-metadata';
|
|
3
|
+
|
|
4
|
+
const name = 'AI_NoVideoGeneratedError';
|
|
5
|
+
const marker = `vercel.ai.error.${name}`;
|
|
6
|
+
const symbol = Symbol.for(marker);
|
|
7
|
+
|
|
8
|
+
export class NoVideoGeneratedError extends AISDKError {
|
|
9
|
+
private readonly [symbol] = true; // used in isInstance
|
|
10
|
+
|
|
11
|
+
readonly responses: Array<VideoModelResponseMetadata>;
|
|
12
|
+
|
|
13
|
+
constructor({
|
|
14
|
+
message = 'No video generated.',
|
|
15
|
+
cause,
|
|
16
|
+
responses,
|
|
17
|
+
}: {
|
|
18
|
+
message?: string;
|
|
19
|
+
cause?: unknown;
|
|
20
|
+
responses: Array<VideoModelResponseMetadata>;
|
|
21
|
+
}) {
|
|
22
|
+
super({ name, message, cause });
|
|
23
|
+
|
|
24
|
+
this.responses = responses;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static isInstance(error: unknown): error is NoVideoGeneratedError {
|
|
28
|
+
return AISDKError.hasMarker(error, marker);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated use `isInstance` instead
|
|
33
|
+
*/
|
|
34
|
+
static isNoVideoGeneratedError(
|
|
35
|
+
error: unknown,
|
|
36
|
+
): error is NoVideoGeneratedError {
|
|
37
|
+
return error instanceof Error &&
|
|
38
|
+
error.name === name &&
|
|
39
|
+
typeof (error as NoVideoGeneratedError).responses !== 'undefined'
|
|
40
|
+
? true
|
|
41
|
+
: false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @deprecated Do not use this method. It will be removed in the next major version.
|
|
46
|
+
*/
|
|
47
|
+
toJSON() {
|
|
48
|
+
return {
|
|
49
|
+
name: this.name,
|
|
50
|
+
message: this.message,
|
|
51
|
+
stack: this.stack,
|
|
52
|
+
|
|
53
|
+
cause: this.cause,
|
|
54
|
+
responses: this.responses,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AISDKError } from '@ai-sdk/provider';
|
|
2
|
+
|
|
3
|
+
const name = 'AI_ToolCallNotFoundForApprovalError';
|
|
4
|
+
const marker = `vercel.ai.error.${name}`;
|
|
5
|
+
const symbol = Symbol.for(marker);
|
|
6
|
+
|
|
7
|
+
export class ToolCallNotFoundForApprovalError extends AISDKError {
|
|
8
|
+
private readonly [symbol] = true; // used in isInstance
|
|
9
|
+
|
|
10
|
+
readonly toolCallId: string;
|
|
11
|
+
readonly approvalId: string;
|
|
12
|
+
|
|
13
|
+
constructor({
|
|
14
|
+
toolCallId,
|
|
15
|
+
approvalId,
|
|
16
|
+
}: {
|
|
17
|
+
toolCallId: string;
|
|
18
|
+
approvalId: string;
|
|
19
|
+
}) {
|
|
20
|
+
super({
|
|
21
|
+
name,
|
|
22
|
+
message: `Tool call "${toolCallId}" not found for approval request "${approvalId}".`,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
this.toolCallId = toolCallId;
|
|
26
|
+
this.approvalId = approvalId;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static isInstance(error: unknown): error is ToolCallNotFoundForApprovalError {
|
|
30
|
+
return AISDKError.hasMarker(error, marker);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AISDKError, getErrorMessage } from '@ai-sdk/provider';
|
|
2
|
+
import { InvalidToolInputError } from './invalid-tool-input-error';
|
|
3
|
+
import { NoSuchToolError } from './no-such-tool-error';
|
|
4
|
+
|
|
5
|
+
const name = 'AI_ToolCallRepairError';
|
|
6
|
+
const marker = `vercel.ai.error.${name}`;
|
|
7
|
+
const symbol = Symbol.for(marker);
|
|
8
|
+
|
|
9
|
+
export class ToolCallRepairError extends AISDKError {
|
|
10
|
+
private readonly [symbol] = true; // used in isInstance
|
|
11
|
+
|
|
12
|
+
readonly originalError: NoSuchToolError | InvalidToolInputError;
|
|
13
|
+
|
|
14
|
+
constructor({
|
|
15
|
+
cause,
|
|
16
|
+
originalError,
|
|
17
|
+
message = `Error repairing tool call: ${getErrorMessage(cause)}`,
|
|
18
|
+
}: {
|
|
19
|
+
message?: string;
|
|
20
|
+
cause: unknown;
|
|
21
|
+
originalError: NoSuchToolError | InvalidToolInputError;
|
|
22
|
+
}) {
|
|
23
|
+
super({ name, message, cause });
|
|
24
|
+
this.originalError = originalError;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static isInstance(error: unknown): error is ToolCallRepairError {
|
|
28
|
+
return AISDKError.hasMarker(error, marker);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AISDKError } from '@ai-sdk/provider';
|
|
2
|
+
|
|
3
|
+
const name = 'AI_UIMessageStreamError';
|
|
4
|
+
const marker = `vercel.ai.error.${name}`;
|
|
5
|
+
const symbol = Symbol.for(marker);
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when a UI message stream contains invalid or out-of-sequence chunks.
|
|
9
|
+
*
|
|
10
|
+
* This typically occurs when:
|
|
11
|
+
* - A delta chunk is received without a corresponding start chunk
|
|
12
|
+
* - An end chunk is received without a corresponding start chunk
|
|
13
|
+
* - A tool invocation is not found for the given toolCallId
|
|
14
|
+
*
|
|
15
|
+
* @see https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-ui-message-stream-error
|
|
16
|
+
*/
|
|
17
|
+
export class UIMessageStreamError extends AISDKError {
|
|
18
|
+
private readonly [symbol] = true; // used in isInstance
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The type of chunk that caused the error (e.g., 'text-delta', 'reasoning-end').
|
|
22
|
+
*/
|
|
23
|
+
readonly chunkType: string;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The ID associated with the failing chunk (part ID or toolCallId).
|
|
27
|
+
*/
|
|
28
|
+
readonly chunkId: string;
|
|
29
|
+
|
|
30
|
+
constructor({
|
|
31
|
+
chunkType,
|
|
32
|
+
chunkId,
|
|
33
|
+
message,
|
|
34
|
+
}: {
|
|
35
|
+
chunkType: string;
|
|
36
|
+
chunkId: string;
|
|
37
|
+
message: string;
|
|
38
|
+
}) {
|
|
39
|
+
super({ name, message });
|
|
40
|
+
|
|
41
|
+
this.chunkType = chunkType;
|
|
42
|
+
this.chunkId = chunkId;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static isInstance(error: unknown): error is UIMessageStreamError {
|
|
46
|
+
return AISDKError.hasMarker(error, marker);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AISDKError } from '@ai-sdk/provider';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Error that is thrown when a model with an unsupported version is used.
|
|
5
|
+
*/
|
|
6
|
+
export class UnsupportedModelVersionError extends AISDKError {
|
|
7
|
+
readonly version: string;
|
|
8
|
+
readonly provider: string;
|
|
9
|
+
readonly modelId: string;
|
|
10
|
+
|
|
11
|
+
constructor(options: { version: string; provider: string; modelId: string }) {
|
|
12
|
+
super({
|
|
13
|
+
name: 'AI_UnsupportedModelVersionError',
|
|
14
|
+
message:
|
|
15
|
+
`Unsupported model version ${options.version} for provider "${options.provider}" and model "${options.modelId}". ` +
|
|
16
|
+
`AI SDK 5 only supports models that implement specification version "v2".`,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
this.version = options.version;
|
|
20
|
+
this.provider = options.provider;
|
|
21
|
+
this.modelId = options.modelId;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { expect } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
FinishReason,
|
|
5
|
+
LanguageModelResponseMetadata,
|
|
6
|
+
LanguageModelUsage,
|
|
7
|
+
} from '../types';
|
|
8
|
+
import { NoObjectGeneratedError } from './no-object-generated-error';
|
|
9
|
+
|
|
10
|
+
export function verifyNoObjectGeneratedError(
|
|
11
|
+
error: unknown,
|
|
12
|
+
expected: {
|
|
13
|
+
message: string;
|
|
14
|
+
response: LanguageModelResponseMetadata & {
|
|
15
|
+
body?: string;
|
|
16
|
+
};
|
|
17
|
+
usage: LanguageModelUsage;
|
|
18
|
+
finishReason: FinishReason;
|
|
19
|
+
},
|
|
20
|
+
) {
|
|
21
|
+
expect(NoObjectGeneratedError.isInstance(error)).toBeTruthy();
|
|
22
|
+
const noObjectGeneratedError = error as NoObjectGeneratedError;
|
|
23
|
+
expect(noObjectGeneratedError.message).toEqual(expected.message);
|
|
24
|
+
expect(noObjectGeneratedError.response).toEqual(expected.response);
|
|
25
|
+
expect(noObjectGeneratedError.usage).toEqual(expected.usage);
|
|
26
|
+
expect(noObjectGeneratedError.finishReason).toEqual(expected.finishReason);
|
|
27
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GeneratedFile } from '../generate-text';
|
|
2
|
+
import { ImageModelProviderMetadata } from '../types/image-model';
|
|
3
|
+
import { ImageModelResponseMetadata } from '../types/image-model-response-metadata';
|
|
4
|
+
import { ImageModelUsage } from '../types/usage';
|
|
5
|
+
import { Warning } from '../types/warning';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The result of a `generateImage` call.
|
|
9
|
+
* It contains the images and additional information.
|
|
10
|
+
*/
|
|
11
|
+
export interface GenerateImageResult {
|
|
12
|
+
/**
|
|
13
|
+
* The first image that was generated.
|
|
14
|
+
*/
|
|
15
|
+
readonly image: GeneratedFile;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The images that were generated.
|
|
19
|
+
*/
|
|
20
|
+
readonly images: Array<GeneratedFile>;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Warnings for the call, e.g. unsupported settings.
|
|
24
|
+
*/
|
|
25
|
+
readonly warnings: Array<Warning>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Response metadata from the provider. There may be multiple responses if we made multiple calls to the model.
|
|
29
|
+
*/
|
|
30
|
+
readonly responses: Array<ImageModelResponseMetadata>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Provider-specific metadata. They are passed through from the provider to the AI SDK and enable provider-specific
|
|
34
|
+
* results that can be fully encapsulated in the provider.
|
|
35
|
+
*/
|
|
36
|
+
readonly providerMetadata: ImageModelProviderMetadata;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Combined token usage across all underlying provider calls for this image generation.
|
|
40
|
+
*/
|
|
41
|
+
readonly usage: ImageModelUsage;
|
|
42
|
+
}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ImageModelV4,
|
|
3
|
+
ImageModelV4CallOptions,
|
|
4
|
+
ImageModelV4File,
|
|
5
|
+
ImageModelV4ProviderMetadata,
|
|
6
|
+
} from '@ai-sdk/provider';
|
|
7
|
+
import {
|
|
8
|
+
convertBase64ToUint8Array,
|
|
9
|
+
DataContent,
|
|
10
|
+
ProviderOptions,
|
|
11
|
+
withUserAgentSuffix,
|
|
12
|
+
} from '@ai-sdk/provider-utils';
|
|
13
|
+
import { NoImageGeneratedError } from '../error/no-image-generated-error';
|
|
14
|
+
import {
|
|
15
|
+
DefaultGeneratedFile,
|
|
16
|
+
GeneratedFile,
|
|
17
|
+
} from '../generate-text/generated-file';
|
|
18
|
+
import { logWarnings } from '../logger/log-warnings';
|
|
19
|
+
import { resolveImageModel } from '../model/resolve-model';
|
|
20
|
+
import type { ImageModel } from '../types/image-model';
|
|
21
|
+
import { ImageModelResponseMetadata } from '../types/image-model-response-metadata';
|
|
22
|
+
import { addImageModelUsage, ImageModelUsage } from '../types/usage';
|
|
23
|
+
import { Warning } from '../types/warning';
|
|
24
|
+
import {
|
|
25
|
+
detectMediaType,
|
|
26
|
+
imageMediaTypeSignatures,
|
|
27
|
+
} from '../util/detect-media-type';
|
|
28
|
+
import { prepareRetries } from '../util/prepare-retries';
|
|
29
|
+
import { VERSION } from '../version';
|
|
30
|
+
import { GenerateImageResult } from './generate-image-result';
|
|
31
|
+
import { convertDataContentToUint8Array } from '../prompt/data-content';
|
|
32
|
+
import { splitDataUrl } from '../prompt/split-data-url';
|
|
33
|
+
|
|
34
|
+
export type GenerateImagePrompt =
|
|
35
|
+
| string
|
|
36
|
+
| {
|
|
37
|
+
images: Array<DataContent>;
|
|
38
|
+
text?: string;
|
|
39
|
+
mask?: DataContent;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Generates images using an image model.
|
|
44
|
+
*
|
|
45
|
+
* @param model - The image model to use.
|
|
46
|
+
* @param prompt - The prompt that should be used to generate the image.
|
|
47
|
+
* @param n - Number of images to generate. Default: 1.
|
|
48
|
+
* @param maxImagesPerCall - Maximum number of images to generate in a single API call.
|
|
49
|
+
* @param size - Size of the images to generate. Must have the format `{width}x{height}`.
|
|
50
|
+
* @param aspectRatio - Aspect ratio of the images to generate. Must have the format `{width}:{height}`.
|
|
51
|
+
* @param seed - Seed for the image generation.
|
|
52
|
+
* @param providerOptions - Additional provider-specific options that are passed through to the provider
|
|
53
|
+
* as body parameters.
|
|
54
|
+
* @param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.
|
|
55
|
+
* @param abortSignal - An optional abort signal that can be used to cancel the call.
|
|
56
|
+
* @param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
|
|
57
|
+
*
|
|
58
|
+
* @returns A result object that contains the generated images.
|
|
59
|
+
*/
|
|
60
|
+
export async function generateImage({
|
|
61
|
+
model: modelArg,
|
|
62
|
+
prompt: promptArg,
|
|
63
|
+
n = 1,
|
|
64
|
+
maxImagesPerCall,
|
|
65
|
+
size,
|
|
66
|
+
aspectRatio,
|
|
67
|
+
seed,
|
|
68
|
+
providerOptions,
|
|
69
|
+
maxRetries: maxRetriesArg,
|
|
70
|
+
abortSignal,
|
|
71
|
+
headers,
|
|
72
|
+
}: {
|
|
73
|
+
/**
|
|
74
|
+
* The image model to use.
|
|
75
|
+
*/
|
|
76
|
+
model: ImageModel;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The prompt that should be used to generate the image.
|
|
80
|
+
*/
|
|
81
|
+
prompt: GenerateImagePrompt;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Number of images to generate.
|
|
85
|
+
*/
|
|
86
|
+
n?: number;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Maximum number of images to generate in a single API call. If not provided, the model's default will be used.
|
|
90
|
+
*/
|
|
91
|
+
maxImagesPerCall?: number;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Size of the images to generate. Must have the format `{width}x{height}`. If not provided, the default size will be used.
|
|
95
|
+
*/
|
|
96
|
+
size?: `${number}x${number}`;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Aspect ratio of the images to generate. Must have the format `{width}:{height}`. If not provided, the default aspect ratio will be used.
|
|
100
|
+
*/
|
|
101
|
+
aspectRatio?: `${number}:${number}`;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Seed for the image generation. If not provided, the default seed will be used.
|
|
105
|
+
*/
|
|
106
|
+
seed?: number;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Additional provider-specific options that are passed through to the provider
|
|
110
|
+
* as body parameters.
|
|
111
|
+
*
|
|
112
|
+
* The outer record is keyed by the provider name, and the inner
|
|
113
|
+
* record is keyed by the provider-specific metadata key.
|
|
114
|
+
* ```ts
|
|
115
|
+
* {
|
|
116
|
+
* "openai": {
|
|
117
|
+
* "style": "vivid"
|
|
118
|
+
* }
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
providerOptions?: ProviderOptions;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Maximum number of retries per image model call. Set to 0 to disable retries.
|
|
126
|
+
*
|
|
127
|
+
* @default 2
|
|
128
|
+
*/
|
|
129
|
+
maxRetries?: number;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Abort signal.
|
|
133
|
+
*/
|
|
134
|
+
abortSignal?: AbortSignal;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Additional headers to include in the request.
|
|
138
|
+
* Only applicable for HTTP-based providers.
|
|
139
|
+
*/
|
|
140
|
+
headers?: Record<string, string>;
|
|
141
|
+
}): Promise<GenerateImageResult> {
|
|
142
|
+
const model = resolveImageModel(modelArg);
|
|
143
|
+
|
|
144
|
+
const headersWithUserAgent = withUserAgentSuffix(
|
|
145
|
+
headers ?? {},
|
|
146
|
+
`ai/${VERSION}`,
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const { retry } = prepareRetries({
|
|
150
|
+
maxRetries: maxRetriesArg,
|
|
151
|
+
abortSignal,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// default to 1 if the model has not specified limits on
|
|
155
|
+
// how many images can be generated in a single call
|
|
156
|
+
const maxImagesPerCallWithDefault =
|
|
157
|
+
maxImagesPerCall ?? (await invokeModelMaxImagesPerCall(model)) ?? 1;
|
|
158
|
+
|
|
159
|
+
// parallelize calls to the model:
|
|
160
|
+
const callCount = Math.ceil(n / maxImagesPerCallWithDefault);
|
|
161
|
+
const callImageCounts = Array.from({ length: callCount }, (_, i) => {
|
|
162
|
+
if (i < callCount - 1) {
|
|
163
|
+
return maxImagesPerCallWithDefault;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const remainder = n % maxImagesPerCallWithDefault;
|
|
167
|
+
return remainder === 0 ? maxImagesPerCallWithDefault : remainder;
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const results = await Promise.all(
|
|
171
|
+
callImageCounts.map(async callImageCount =>
|
|
172
|
+
retry(() => {
|
|
173
|
+
const { prompt, files, mask } = normalizePrompt(promptArg);
|
|
174
|
+
|
|
175
|
+
return model.doGenerate({
|
|
176
|
+
prompt,
|
|
177
|
+
files,
|
|
178
|
+
mask,
|
|
179
|
+
n: callImageCount,
|
|
180
|
+
abortSignal,
|
|
181
|
+
headers: headersWithUserAgent,
|
|
182
|
+
size,
|
|
183
|
+
aspectRatio,
|
|
184
|
+
seed,
|
|
185
|
+
providerOptions: providerOptions ?? {},
|
|
186
|
+
});
|
|
187
|
+
}),
|
|
188
|
+
),
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
// collect result images, warnings, and response metadata
|
|
192
|
+
const images: Array<DefaultGeneratedFile> = [];
|
|
193
|
+
const warnings: Array<Warning> = [];
|
|
194
|
+
const responses: Array<ImageModelResponseMetadata> = [];
|
|
195
|
+
const providerMetadata: ImageModelV4ProviderMetadata = {};
|
|
196
|
+
let totalUsage: ImageModelUsage = {
|
|
197
|
+
inputTokens: undefined,
|
|
198
|
+
outputTokens: undefined,
|
|
199
|
+
totalTokens: undefined,
|
|
200
|
+
};
|
|
201
|
+
for (const result of results) {
|
|
202
|
+
images.push(
|
|
203
|
+
...result.images.map(
|
|
204
|
+
image =>
|
|
205
|
+
new DefaultGeneratedFile({
|
|
206
|
+
data: image,
|
|
207
|
+
mediaType:
|
|
208
|
+
detectMediaType({
|
|
209
|
+
data: image,
|
|
210
|
+
signatures: imageMediaTypeSignatures,
|
|
211
|
+
}) ?? 'image/png',
|
|
212
|
+
}),
|
|
213
|
+
),
|
|
214
|
+
);
|
|
215
|
+
warnings.push(...result.warnings);
|
|
216
|
+
|
|
217
|
+
if (result.usage != null) {
|
|
218
|
+
totalUsage = addImageModelUsage(totalUsage, result.usage);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (result.providerMetadata) {
|
|
222
|
+
for (const [providerName, metadata] of Object.entries<{
|
|
223
|
+
images: unknown;
|
|
224
|
+
}>(result.providerMetadata)) {
|
|
225
|
+
if (providerName === 'gateway') {
|
|
226
|
+
const currentEntry = providerMetadata[providerName];
|
|
227
|
+
if (currentEntry != null && typeof currentEntry === 'object') {
|
|
228
|
+
providerMetadata[providerName] = {
|
|
229
|
+
...(currentEntry as object),
|
|
230
|
+
...metadata,
|
|
231
|
+
} as ImageModelV4ProviderMetadata[string];
|
|
232
|
+
} else {
|
|
233
|
+
providerMetadata[providerName] =
|
|
234
|
+
metadata as ImageModelV4ProviderMetadata[string];
|
|
235
|
+
}
|
|
236
|
+
const imagesValue = (
|
|
237
|
+
providerMetadata[providerName] as { images?: unknown }
|
|
238
|
+
).images;
|
|
239
|
+
if (Array.isArray(imagesValue) && imagesValue.length === 0) {
|
|
240
|
+
delete (providerMetadata[providerName] as { images?: unknown })
|
|
241
|
+
.images;
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
providerMetadata[providerName] ??= { images: [] };
|
|
245
|
+
providerMetadata[providerName].images.push(
|
|
246
|
+
...result.providerMetadata[providerName].images,
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
responses.push(result.response);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
logWarnings({ warnings, provider: model.provider, model: model.modelId });
|
|
256
|
+
|
|
257
|
+
if (!images.length) {
|
|
258
|
+
throw new NoImageGeneratedError({ responses });
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return new DefaultGenerateImageResult({
|
|
262
|
+
images,
|
|
263
|
+
warnings,
|
|
264
|
+
responses,
|
|
265
|
+
providerMetadata,
|
|
266
|
+
usage: totalUsage,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
class DefaultGenerateImageResult implements GenerateImageResult {
|
|
271
|
+
readonly images: Array<GeneratedFile>;
|
|
272
|
+
readonly warnings: Array<Warning>;
|
|
273
|
+
readonly responses: Array<ImageModelResponseMetadata>;
|
|
274
|
+
readonly providerMetadata: ImageModelV4ProviderMetadata;
|
|
275
|
+
readonly usage: ImageModelUsage;
|
|
276
|
+
|
|
277
|
+
constructor(options: {
|
|
278
|
+
images: Array<GeneratedFile>;
|
|
279
|
+
warnings: Array<Warning>;
|
|
280
|
+
responses: Array<ImageModelResponseMetadata>;
|
|
281
|
+
providerMetadata: ImageModelV4ProviderMetadata;
|
|
282
|
+
usage: ImageModelUsage;
|
|
283
|
+
}) {
|
|
284
|
+
this.images = options.images;
|
|
285
|
+
this.warnings = options.warnings;
|
|
286
|
+
this.responses = options.responses;
|
|
287
|
+
this.providerMetadata = options.providerMetadata;
|
|
288
|
+
this.usage = options.usage;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
get image() {
|
|
292
|
+
return this.images[0];
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
async function invokeModelMaxImagesPerCall(model: ImageModelV4) {
|
|
297
|
+
const isFunction = model.maxImagesPerCall instanceof Function;
|
|
298
|
+
|
|
299
|
+
if (!isFunction) {
|
|
300
|
+
return model.maxImagesPerCall;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return model.maxImagesPerCall({
|
|
304
|
+
modelId: model.modelId,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function normalizePrompt(
|
|
309
|
+
prompt: GenerateImagePrompt,
|
|
310
|
+
): Pick<ImageModelV4CallOptions, 'prompt' | 'files' | 'mask'> {
|
|
311
|
+
if (typeof prompt === 'string') {
|
|
312
|
+
return { prompt, files: undefined, mask: undefined };
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
prompt: prompt.text,
|
|
317
|
+
files: prompt.images.map(toImageModelV4File),
|
|
318
|
+
mask: prompt.mask ? toImageModelV4File(prompt.mask) : undefined,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function toImageModelV4File(dataContent: DataContent): ImageModelV4File {
|
|
323
|
+
if (typeof dataContent === 'string' && dataContent.startsWith('http')) {
|
|
324
|
+
return {
|
|
325
|
+
type: 'url',
|
|
326
|
+
url: dataContent,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Handle data URLs
|
|
331
|
+
if (typeof dataContent === 'string' && dataContent.startsWith('data:')) {
|
|
332
|
+
const { mediaType: dataUrlMediaType, base64Content } =
|
|
333
|
+
splitDataUrl(dataContent);
|
|
334
|
+
|
|
335
|
+
if (base64Content != null) {
|
|
336
|
+
const uint8Data = convertBase64ToUint8Array(base64Content);
|
|
337
|
+
return {
|
|
338
|
+
type: 'file',
|
|
339
|
+
data: uint8Data,
|
|
340
|
+
mediaType:
|
|
341
|
+
dataUrlMediaType ||
|
|
342
|
+
detectMediaType({
|
|
343
|
+
data: uint8Data,
|
|
344
|
+
signatures: imageMediaTypeSignatures,
|
|
345
|
+
}) ||
|
|
346
|
+
'image/png',
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const uint8Data = convertDataContentToUint8Array(dataContent);
|
|
352
|
+
return {
|
|
353
|
+
type: 'file',
|
|
354
|
+
data: uint8Data,
|
|
355
|
+
mediaType:
|
|
356
|
+
detectMediaType({
|
|
357
|
+
data: uint8Data,
|
|
358
|
+
signatures: imageMediaTypeSignatures,
|
|
359
|
+
}) || 'image/png',
|
|
360
|
+
};
|
|
361
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { generateImage } from './generate-image';
|
|
2
|
+
export type { GenerateImageResult } from './generate-image-result';
|
|
3
|
+
|
|
4
|
+
// deprecated exports
|
|
5
|
+
|
|
6
|
+
import { generateImage } from './generate-image';
|
|
7
|
+
/**
|
|
8
|
+
* @deprecated Use `generateImage` instead.
|
|
9
|
+
*/
|
|
10
|
+
const experimental_generateImage = generateImage;
|
|
11
|
+
export { experimental_generateImage };
|
|
12
|
+
|
|
13
|
+
import type { GenerateImageResult } from './generate-image-result';
|
|
14
|
+
/**
|
|
15
|
+
* @deprecated Use `GenerateImageResult` instead.
|
|
16
|
+
*/
|
|
17
|
+
type Experimental_GenerateImageResult = GenerateImageResult;
|
|
18
|
+
export type { Experimental_GenerateImageResult };
|