@fondation-io/ai 7.0.0-beta.45
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 +7687 -0
- package/README.md +238 -0
- package/dist/index.d.mts +7056 -0
- package/dist/index.d.ts +7056 -0
- package/dist/index.js +14607 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +14578 -0
- package/dist/index.mjs.map +1 -0
- package/dist/internal/index.d.mts +303 -0
- package/dist/internal/index.d.ts +303 -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 +160 -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 +1148 -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 +236 -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 +1303 -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 +534 -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 +323 -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 +252 -0
- package/src/agent/tool-loop-agent.ts +205 -0
- package/src/embed/embed-events.ts +181 -0
- package/src/embed/embed-many-result.ts +53 -0
- package/src/embed/embed-many.ts +428 -0
- package/src/embed/embed-result.ts +50 -0
- package/src/embed/embed.ts +266 -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 +144 -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 +1445 -0
- package/src/generate-text/generated-file.ts +70 -0
- package/src/generate-text/index.ts +78 -0
- package/src/generate-text/invoke-tool-callbacks-from-stream.ts +81 -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-model-call.ts +418 -0
- package/src/generate-text/stream-text-result.ts +536 -0
- package/src/generate-text/stream-text.ts +2696 -0
- package/src/generate-text/to-response-messages.ts +195 -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 +169 -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 +8 -0
- package/src/rerank/rerank-events.ts +189 -0
- package/src/rerank/rerank-result.ts +70 -0
- package/src/rerank/rerank.ts +348 -0
- package/src/telemetry/assemble-operation-name.ts +21 -0
- package/src/telemetry/get-base-telemetry-attributes.ts +45 -0
- package/src/telemetry/get-global-telemetry-integration.ts +126 -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 +875 -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 +139 -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,112 @@
|
|
|
1
|
+
import { createResolvablePromise } from './create-resolvable-promise';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates a stitchable stream that can pipe one stream at a time.
|
|
5
|
+
*
|
|
6
|
+
* @template T - The type of values emitted by the streams.
|
|
7
|
+
* @returns {Object} An object containing the stitchable stream and control methods.
|
|
8
|
+
*/
|
|
9
|
+
export function createStitchableStream<T>(): {
|
|
10
|
+
stream: ReadableStream<T>;
|
|
11
|
+
addStream: (innerStream: ReadableStream<T>) => void;
|
|
12
|
+
close: () => void;
|
|
13
|
+
terminate: () => void;
|
|
14
|
+
} {
|
|
15
|
+
let innerStreamReaders: ReadableStreamDefaultReader<T>[] = [];
|
|
16
|
+
let controller: ReadableStreamDefaultController<T> | null = null;
|
|
17
|
+
let isClosed = false;
|
|
18
|
+
let waitForNewStream = createResolvablePromise<void>();
|
|
19
|
+
|
|
20
|
+
const terminate = () => {
|
|
21
|
+
isClosed = true;
|
|
22
|
+
waitForNewStream.resolve();
|
|
23
|
+
|
|
24
|
+
innerStreamReaders.forEach(reader => reader.cancel());
|
|
25
|
+
innerStreamReaders = [];
|
|
26
|
+
controller?.close();
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const processPull = async () => {
|
|
30
|
+
// Case 1: Outer stream is closed and no more inner streams
|
|
31
|
+
if (isClosed && innerStreamReaders.length === 0) {
|
|
32
|
+
controller?.close();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Case 2: No inner streams available, but outer stream is open
|
|
37
|
+
// wait for a new inner stream to be added or the outer stream to close
|
|
38
|
+
if (innerStreamReaders.length === 0) {
|
|
39
|
+
waitForNewStream = createResolvablePromise<void>();
|
|
40
|
+
await waitForNewStream.promise;
|
|
41
|
+
return processPull();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const { value, done } = await innerStreamReaders[0].read();
|
|
46
|
+
|
|
47
|
+
if (done) {
|
|
48
|
+
// Case 3: Current inner stream is done
|
|
49
|
+
innerStreamReaders.shift(); // Remove the finished stream
|
|
50
|
+
|
|
51
|
+
if (innerStreamReaders.length === 0 && isClosed) {
|
|
52
|
+
// when closed and no more inner streams, stop pulling
|
|
53
|
+
controller?.close();
|
|
54
|
+
} else {
|
|
55
|
+
// continue pulling from the next stream
|
|
56
|
+
await processPull();
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
// Case 4: Current inner stream returns an item
|
|
60
|
+
controller?.enqueue(value);
|
|
61
|
+
}
|
|
62
|
+
} catch (error) {
|
|
63
|
+
// Case 5: Current inner stream throws an error
|
|
64
|
+
controller?.error(error);
|
|
65
|
+
innerStreamReaders.shift(); // Remove the errored stream
|
|
66
|
+
terminate(); // we have errored, terminate all streams
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
stream: new ReadableStream<T>({
|
|
72
|
+
start(controllerParam) {
|
|
73
|
+
controller = controllerParam;
|
|
74
|
+
},
|
|
75
|
+
pull: processPull,
|
|
76
|
+
async cancel() {
|
|
77
|
+
for (const reader of innerStreamReaders) {
|
|
78
|
+
await reader.cancel();
|
|
79
|
+
}
|
|
80
|
+
innerStreamReaders = [];
|
|
81
|
+
isClosed = true;
|
|
82
|
+
},
|
|
83
|
+
}),
|
|
84
|
+
addStream: (innerStream: ReadableStream<T>) => {
|
|
85
|
+
if (isClosed) {
|
|
86
|
+
throw new Error('Cannot add inner stream: outer stream is closed');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
innerStreamReaders.push(innerStream.getReader());
|
|
90
|
+
waitForNewStream.resolve();
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Gracefully close the outer stream. This will let the inner streams
|
|
95
|
+
* finish processing and then close the outer stream.
|
|
96
|
+
*/
|
|
97
|
+
close: () => {
|
|
98
|
+
isClosed = true;
|
|
99
|
+
waitForNewStream.resolve();
|
|
100
|
+
|
|
101
|
+
if (innerStreamReaders.length === 0) {
|
|
102
|
+
controller?.close();
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Immediately close the outer stream. This will cancel all inner streams
|
|
108
|
+
* and close the outer stream.
|
|
109
|
+
*/
|
|
110
|
+
terminate,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a data URL of type text/* to a text string.
|
|
3
|
+
*/
|
|
4
|
+
export function getTextFromDataUrl(dataUrl: string): string {
|
|
5
|
+
const [header, base64Content] = dataUrl.split(',');
|
|
6
|
+
const mediaType = header.split(';')[0].split(':')[1];
|
|
7
|
+
|
|
8
|
+
if (mediaType == null || base64Content == null) {
|
|
9
|
+
throw new Error('Invalid data URL format');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
return window.atob(base64Content);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
throw new Error(`Error decoding data URL`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// License for this File only:
|
|
2
|
+
//
|
|
3
|
+
// MIT License
|
|
4
|
+
//
|
|
5
|
+
// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
|
6
|
+
// Copyright (c) Vercel, Inc. (https://vercel.com)
|
|
7
|
+
//
|
|
8
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
|
9
|
+
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation
|
|
10
|
+
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
|
|
11
|
+
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
12
|
+
//
|
|
13
|
+
// The above copyright notice and this permission notice shall be included in all copies or substantial portions
|
|
14
|
+
// of the Software.
|
|
15
|
+
//
|
|
16
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
17
|
+
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
18
|
+
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
|
19
|
+
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
20
|
+
// IN THE SOFTWARE.
|
|
21
|
+
|
|
22
|
+
import { FlexibleSchema, InferSchema } from '@ai-sdk/provider-utils';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a type from an object with all keys and nested keys set to optional.
|
|
26
|
+
* The helper supports normal objects and schemas (which are resolved automatically).
|
|
27
|
+
* It always recurses into arrays.
|
|
28
|
+
*
|
|
29
|
+
* Adopted from [type-fest](https://github.com/sindresorhus/type-fest/tree/main) PartialDeep.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export type DeepPartial<T> = T extends FlexibleSchema
|
|
33
|
+
? DeepPartialInternal<InferSchema<T>> // resolve schemas first to prevent infinite recursion
|
|
34
|
+
: DeepPartialInternal<T>;
|
|
35
|
+
|
|
36
|
+
type DeepPartialInternal<T> = T extends
|
|
37
|
+
| null
|
|
38
|
+
| undefined
|
|
39
|
+
| string
|
|
40
|
+
| number
|
|
41
|
+
| boolean
|
|
42
|
+
| symbol
|
|
43
|
+
| bigint
|
|
44
|
+
| void
|
|
45
|
+
| Date
|
|
46
|
+
| RegExp
|
|
47
|
+
| ((...arguments_: any[]) => unknown)
|
|
48
|
+
| (new (...arguments_: any[]) => unknown)
|
|
49
|
+
? T
|
|
50
|
+
: T extends Map<infer KeyType, infer ValueType>
|
|
51
|
+
? PartialMap<KeyType, ValueType>
|
|
52
|
+
: T extends Set<infer ItemType>
|
|
53
|
+
? PartialSet<ItemType>
|
|
54
|
+
: T extends ReadonlyMap<infer KeyType, infer ValueType>
|
|
55
|
+
? PartialReadonlyMap<KeyType, ValueType>
|
|
56
|
+
: T extends ReadonlySet<infer ItemType>
|
|
57
|
+
? PartialReadonlySet<ItemType>
|
|
58
|
+
: T extends object
|
|
59
|
+
? T extends ReadonlyArray<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
|
|
60
|
+
? ItemType[] extends T // Test for arrays (non-tuples) specifically
|
|
61
|
+
? readonly ItemType[] extends T // Differentiate readonly and mutable arrays
|
|
62
|
+
? ReadonlyArray<DeepPartialInternal<ItemType | undefined>>
|
|
63
|
+
: Array<DeepPartialInternal<ItemType | undefined>>
|
|
64
|
+
: PartialObject<T> // Tuples behave properly
|
|
65
|
+
: PartialObject<T>
|
|
66
|
+
: unknown;
|
|
67
|
+
|
|
68
|
+
type PartialMap<KeyType, ValueType> = {} & Map<
|
|
69
|
+
DeepPartialInternal<KeyType>,
|
|
70
|
+
DeepPartialInternal<ValueType>
|
|
71
|
+
>;
|
|
72
|
+
|
|
73
|
+
type PartialSet<T> = {} & Set<DeepPartialInternal<T>>;
|
|
74
|
+
|
|
75
|
+
type PartialReadonlyMap<KeyType, ValueType> = {} & ReadonlyMap<
|
|
76
|
+
DeepPartialInternal<KeyType>,
|
|
77
|
+
DeepPartialInternal<ValueType>
|
|
78
|
+
>;
|
|
79
|
+
|
|
80
|
+
type PartialReadonlySet<T> = {} & ReadonlySet<DeepPartialInternal<T>>;
|
|
81
|
+
|
|
82
|
+
type PartialObject<ObjectType extends object> = {
|
|
83
|
+
[KeyType in keyof ObjectType]?: DeepPartialInternal<ObjectType[KeyType]>;
|
|
84
|
+
};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { convertBase64ToUint8Array } from '@ai-sdk/provider-utils';
|
|
2
|
+
|
|
3
|
+
export const imageMediaTypeSignatures = [
|
|
4
|
+
{
|
|
5
|
+
mediaType: 'image/gif' as const,
|
|
6
|
+
bytesPrefix: [0x47, 0x49, 0x46], // GIF
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
mediaType: 'image/png' as const,
|
|
10
|
+
bytesPrefix: [0x89, 0x50, 0x4e, 0x47], // PNG
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
mediaType: 'image/jpeg' as const,
|
|
14
|
+
bytesPrefix: [0xff, 0xd8], // JPEG
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
mediaType: 'image/webp' as const,
|
|
18
|
+
bytesPrefix: [
|
|
19
|
+
0x52,
|
|
20
|
+
0x49,
|
|
21
|
+
0x46,
|
|
22
|
+
0x46, // "RIFF"
|
|
23
|
+
null,
|
|
24
|
+
null,
|
|
25
|
+
null,
|
|
26
|
+
null, // file size (variable)
|
|
27
|
+
0x57,
|
|
28
|
+
0x45,
|
|
29
|
+
0x42,
|
|
30
|
+
0x50, // "WEBP"
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
mediaType: 'image/bmp' as const,
|
|
35
|
+
bytesPrefix: [0x42, 0x4d],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
mediaType: 'image/tiff' as const,
|
|
39
|
+
bytesPrefix: [0x49, 0x49, 0x2a, 0x00],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
mediaType: 'image/tiff' as const,
|
|
43
|
+
bytesPrefix: [0x4d, 0x4d, 0x00, 0x2a],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
mediaType: 'image/avif' as const,
|
|
47
|
+
bytesPrefix: [
|
|
48
|
+
0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66,
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
mediaType: 'image/heic' as const,
|
|
53
|
+
bytesPrefix: [
|
|
54
|
+
0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63,
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
] as const;
|
|
58
|
+
|
|
59
|
+
export const audioMediaTypeSignatures = [
|
|
60
|
+
{
|
|
61
|
+
mediaType: 'audio/mpeg' as const,
|
|
62
|
+
bytesPrefix: [0xff, 0xfb],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
mediaType: 'audio/mpeg' as const,
|
|
66
|
+
bytesPrefix: [0xff, 0xfa],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
mediaType: 'audio/mpeg' as const,
|
|
70
|
+
bytesPrefix: [0xff, 0xf3],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
mediaType: 'audio/mpeg' as const,
|
|
74
|
+
bytesPrefix: [0xff, 0xf2],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
mediaType: 'audio/mpeg' as const,
|
|
78
|
+
bytesPrefix: [0xff, 0xe3],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
mediaType: 'audio/mpeg' as const,
|
|
82
|
+
bytesPrefix: [0xff, 0xe2],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
mediaType: 'audio/wav' as const,
|
|
86
|
+
bytesPrefix: [
|
|
87
|
+
0x52, // R
|
|
88
|
+
0x49, // I
|
|
89
|
+
0x46, // F
|
|
90
|
+
0x46, // F
|
|
91
|
+
null,
|
|
92
|
+
null,
|
|
93
|
+
null,
|
|
94
|
+
null,
|
|
95
|
+
0x57, // W
|
|
96
|
+
0x41, // A
|
|
97
|
+
0x56, // V
|
|
98
|
+
0x45, // E
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
mediaType: 'audio/ogg' as const,
|
|
103
|
+
bytesPrefix: [0x4f, 0x67, 0x67, 0x53],
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
mediaType: 'audio/flac' as const,
|
|
107
|
+
bytesPrefix: [0x66, 0x4c, 0x61, 0x43],
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
mediaType: 'audio/aac' as const,
|
|
111
|
+
bytesPrefix: [0x40, 0x15, 0x00, 0x00],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
mediaType: 'audio/mp4' as const,
|
|
115
|
+
bytesPrefix: [0x66, 0x74, 0x79, 0x70],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
mediaType: 'audio/webm',
|
|
119
|
+
bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3],
|
|
120
|
+
},
|
|
121
|
+
] as const;
|
|
122
|
+
|
|
123
|
+
export const videoMediaTypeSignatures = [
|
|
124
|
+
{
|
|
125
|
+
mediaType: 'video/mp4' as const,
|
|
126
|
+
bytesPrefix: [
|
|
127
|
+
0x00,
|
|
128
|
+
0x00,
|
|
129
|
+
0x00,
|
|
130
|
+
null,
|
|
131
|
+
0x66,
|
|
132
|
+
0x74,
|
|
133
|
+
0x79,
|
|
134
|
+
0x70, // ftyp
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
mediaType: 'video/webm' as const,
|
|
139
|
+
bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3], // EBML
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
mediaType: 'video/quicktime' as const,
|
|
143
|
+
bytesPrefix: [
|
|
144
|
+
0x00,
|
|
145
|
+
0x00,
|
|
146
|
+
0x00,
|
|
147
|
+
0x14,
|
|
148
|
+
0x66,
|
|
149
|
+
0x74,
|
|
150
|
+
0x79,
|
|
151
|
+
0x70,
|
|
152
|
+
0x71,
|
|
153
|
+
0x74, // ftypqt
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
mediaType: 'video/x-msvideo' as const,
|
|
158
|
+
bytesPrefix: [0x52, 0x49, 0x46, 0x46], // RIFF (AVI)
|
|
159
|
+
},
|
|
160
|
+
] as const;
|
|
161
|
+
|
|
162
|
+
const stripID3 = (data: Uint8Array | string) => {
|
|
163
|
+
const bytes =
|
|
164
|
+
typeof data === 'string' ? convertBase64ToUint8Array(data) : data;
|
|
165
|
+
const id3Size =
|
|
166
|
+
((bytes[6] & 0x7f) << 21) |
|
|
167
|
+
((bytes[7] & 0x7f) << 14) |
|
|
168
|
+
((bytes[8] & 0x7f) << 7) |
|
|
169
|
+
(bytes[9] & 0x7f);
|
|
170
|
+
|
|
171
|
+
// The raw MP3 starts here
|
|
172
|
+
return bytes.slice(id3Size + 10);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
function stripID3TagsIfPresent(data: Uint8Array | string): Uint8Array | string {
|
|
176
|
+
const hasId3 =
|
|
177
|
+
(typeof data === 'string' && data.startsWith('SUQz')) ||
|
|
178
|
+
(typeof data !== 'string' &&
|
|
179
|
+
data.length > 10 &&
|
|
180
|
+
data[0] === 0x49 && // 'I'
|
|
181
|
+
data[1] === 0x44 && // 'D'
|
|
182
|
+
data[2] === 0x33); // '3'
|
|
183
|
+
|
|
184
|
+
return hasId3 ? stripID3(data) : data;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Detect the media IANA media type of a file using a list of signatures.
|
|
189
|
+
*
|
|
190
|
+
* @param data - The file data.
|
|
191
|
+
* @param signatures - The signatures to use for detection.
|
|
192
|
+
* @returns The media type of the file.
|
|
193
|
+
*/
|
|
194
|
+
export function detectMediaType({
|
|
195
|
+
data,
|
|
196
|
+
signatures,
|
|
197
|
+
}: {
|
|
198
|
+
data: Uint8Array | string;
|
|
199
|
+
signatures:
|
|
200
|
+
| typeof audioMediaTypeSignatures
|
|
201
|
+
| typeof imageMediaTypeSignatures
|
|
202
|
+
| typeof videoMediaTypeSignatures;
|
|
203
|
+
}): (typeof signatures)[number]['mediaType'] | undefined {
|
|
204
|
+
const processedData = stripID3TagsIfPresent(data);
|
|
205
|
+
|
|
206
|
+
// Convert the first ~18 bytes (24 base64 chars) for consistent detection logic:
|
|
207
|
+
const bytes =
|
|
208
|
+
typeof processedData === 'string'
|
|
209
|
+
? convertBase64ToUint8Array(
|
|
210
|
+
processedData.substring(0, Math.min(processedData.length, 24)),
|
|
211
|
+
)
|
|
212
|
+
: processedData;
|
|
213
|
+
|
|
214
|
+
for (const signature of signatures) {
|
|
215
|
+
if (
|
|
216
|
+
bytes.length >= signature.bytesPrefix.length &&
|
|
217
|
+
signature.bytesPrefix.every(
|
|
218
|
+
(byte, index) => byte === null || bytes[index] === byte,
|
|
219
|
+
)
|
|
220
|
+
) {
|
|
221
|
+
return signature.mediaType;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { download as internalDownload } from './download';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates a download function with configurable options.
|
|
5
|
+
*
|
|
6
|
+
* @param options - Configuration options for the download function.
|
|
7
|
+
* @param options.maxBytes - Maximum allowed download size in bytes. Default: 2 GiB.
|
|
8
|
+
* @returns A download function that can be passed to `transcribe()` or `experimental_generateVideo()`.
|
|
9
|
+
*/
|
|
10
|
+
export function createDownload(options?: { maxBytes?: number }) {
|
|
11
|
+
return ({ url, abortSignal }: { url: URL; abortSignal?: AbortSignal }) =>
|
|
12
|
+
internalDownload({ url, maxBytes: options?.maxBytes, abortSignal });
|
|
13
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { download as originalDownload } from './download';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Experimental. Can change in patch versions without warning.
|
|
5
|
+
*
|
|
6
|
+
* Download function. Called with the array of URLs and a boolean indicating
|
|
7
|
+
* whether the URL is supported by the model.
|
|
8
|
+
*
|
|
9
|
+
* The download function can decide for each URL:
|
|
10
|
+
* - to return null (which means that the URL should be passed to the model)
|
|
11
|
+
* - to download the asset and return the data (incl. retries, authentication, etc.)
|
|
12
|
+
*
|
|
13
|
+
* Should throw DownloadError if the download fails.
|
|
14
|
+
*
|
|
15
|
+
* Should return an array of objects sorted by the order of the requested downloads.
|
|
16
|
+
* For each object, the data should be a Uint8Array if the URL was downloaded.
|
|
17
|
+
* For each object, the mediaType should be the media type of the downloaded asset.
|
|
18
|
+
* For each object, the data should be null if the URL should be passed through as is.
|
|
19
|
+
*/
|
|
20
|
+
export type DownloadFunction = (
|
|
21
|
+
options: Array<{
|
|
22
|
+
url: URL;
|
|
23
|
+
isUrlSupportedByModel: boolean;
|
|
24
|
+
}>,
|
|
25
|
+
) => PromiseLike<
|
|
26
|
+
Array<{
|
|
27
|
+
data: Uint8Array;
|
|
28
|
+
mediaType: string | undefined;
|
|
29
|
+
} | null>
|
|
30
|
+
>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Default download function.
|
|
34
|
+
* Downloads the file if it is not supported by the model.
|
|
35
|
+
*/
|
|
36
|
+
export const createDefaultDownloadFunction =
|
|
37
|
+
(download: typeof originalDownload = originalDownload): DownloadFunction =>
|
|
38
|
+
requestedDownloads =>
|
|
39
|
+
Promise.all(
|
|
40
|
+
requestedDownloads.map(async requestedDownload =>
|
|
41
|
+
requestedDownload.isUrlSupportedByModel
|
|
42
|
+
? null
|
|
43
|
+
: download(requestedDownload),
|
|
44
|
+
),
|
|
45
|
+
);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DownloadError,
|
|
3
|
+
readResponseWithSizeLimit,
|
|
4
|
+
DEFAULT_MAX_DOWNLOAD_SIZE,
|
|
5
|
+
validateDownloadUrl,
|
|
6
|
+
} from '@ai-sdk/provider-utils';
|
|
7
|
+
import {
|
|
8
|
+
withUserAgentSuffix,
|
|
9
|
+
getRuntimeEnvironmentUserAgent,
|
|
10
|
+
} from '@ai-sdk/provider-utils';
|
|
11
|
+
import { VERSION } from '../../version';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Download a file from a URL.
|
|
15
|
+
*
|
|
16
|
+
* @param url - The URL to download from.
|
|
17
|
+
* @param maxBytes - Maximum allowed download size in bytes. Defaults to 100 MiB.
|
|
18
|
+
* @param abortSignal - An optional abort signal to cancel the download.
|
|
19
|
+
* @returns The downloaded data and media type.
|
|
20
|
+
*
|
|
21
|
+
* @throws DownloadError if the download fails or exceeds maxBytes.
|
|
22
|
+
*/
|
|
23
|
+
export const download = async ({
|
|
24
|
+
url,
|
|
25
|
+
maxBytes,
|
|
26
|
+
abortSignal,
|
|
27
|
+
}: {
|
|
28
|
+
url: URL;
|
|
29
|
+
maxBytes?: number;
|
|
30
|
+
abortSignal?: AbortSignal;
|
|
31
|
+
}) => {
|
|
32
|
+
const urlText = url.toString();
|
|
33
|
+
validateDownloadUrl(urlText);
|
|
34
|
+
try {
|
|
35
|
+
const response = await fetch(urlText, {
|
|
36
|
+
headers: withUserAgentSuffix(
|
|
37
|
+
{},
|
|
38
|
+
`ai-sdk/${VERSION}`,
|
|
39
|
+
getRuntimeEnvironmentUserAgent(),
|
|
40
|
+
),
|
|
41
|
+
signal: abortSignal,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Validate final URL after redirects to prevent SSRF via open redirect
|
|
45
|
+
if (response.redirected) {
|
|
46
|
+
validateDownloadUrl(response.url);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
throw new DownloadError({
|
|
51
|
+
url: urlText,
|
|
52
|
+
statusCode: response.status,
|
|
53
|
+
statusText: response.statusText,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const data = await readResponseWithSizeLimit({
|
|
58
|
+
response,
|
|
59
|
+
url: urlText,
|
|
60
|
+
maxBytes: maxBytes ?? DEFAULT_MAX_DOWNLOAD_SIZE,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
data,
|
|
65
|
+
mediaType: response.headers.get('content-type') ?? undefined,
|
|
66
|
+
};
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (DownloadError.isInstance(error)) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
throw new DownloadError({ url: urlText, cause: error });
|
|
73
|
+
}
|
|
74
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type ErrorHandler = (error: unknown) => void;
|