diff --git a/.changeset/ai-sdk-seven.md b/.changeset/ai-sdk-seven.md new file mode 100644 index 0000000000..4c211b76c3 --- /dev/null +++ b/.changeset/ai-sdk-seven.md @@ -0,0 +1,8 @@ +--- +"workers-ai-provider": major +"ai-gateway-provider": major +--- + +Add support for AI SDK 7 + +Bumps peer dependencies to require `ai@^7` and `@ai-sdk/provider@^4`. This is a breaking change for users on AI SDK 6, who should stay on the previous major version of these packages. diff --git a/demos/agent-scheduler/package.json b/demos/agent-scheduler/package.json index 1f822bd021..064a88f52c 100644 --- a/demos/agent-scheduler/package.json +++ b/demos/agent-scheduler/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/agent-task-manager-human-in-the-loop/package.json b/demos/agent-task-manager-human-in-the-loop/package.json index 8cc7d568d8..ac1f62b340 100644 --- a/demos/agent-task-manager-human-in-the-loop/package.json +++ b/demos/agent-task-manager-human-in-the-loop/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/agent-task-manager/package.json b/demos/agent-task-manager/package.json index 525d0b1590..41d951d53f 100644 --- a/demos/agent-task-manager/package.json +++ b/demos/agent-task-manager/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/evaluator-optimiser/package.json b/demos/evaluator-optimiser/package.json index b4e723306e..a422c02cdf 100644 --- a/demos/evaluator-optimiser/package.json +++ b/demos/evaluator-optimiser/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/image-generation/package.json b/demos/image-generation/package.json index 0b24909fdf..6ccb58de19 100644 --- a/demos/image-generation/package.json +++ b/demos/image-generation/package.json @@ -16,7 +16,7 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/model-scraper/package.json b/demos/model-scraper/package.json index edb7f65da5..ae4e393488 100644 --- a/demos/model-scraper/package.json +++ b/demos/model-scraper/package.json @@ -19,9 +19,9 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "@ai-sdk/openai": "^3.0.71", + "@ai-sdk/openai": "^4.0.5", "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/orchestrator-workers/package.json b/demos/orchestrator-workers/package.json index 47c7fc9c9a..839a768265 100644 --- a/demos/orchestrator-workers/package.json +++ b/demos/orchestrator-workers/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/parallelisation/package.json b/demos/parallelisation/package.json index 5fd9da05f3..cfb93cb257 100644 --- a/demos/parallelisation/package.json +++ b/demos/parallelisation/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/prompt-chaining/package.json b/demos/prompt-chaining/package.json index 336ee361ac..832c7817d9 100644 --- a/demos/prompt-chaining/package.json +++ b/demos/prompt-chaining/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/routing/package.json b/demos/routing/package.json index f6207c165c..009983fb1f 100644 --- a/demos/routing/package.json +++ b/demos/routing/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/structured-output-node/package.json b/demos/structured-output-node/package.json index e2125c6dcc..47ee52c244 100644 --- a/demos/structured-output-node/package.json +++ b/demos/structured-output-node/package.json @@ -10,7 +10,7 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "ai": "^6.0.204", + "ai": "^7.0.11", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" }, diff --git a/demos/structured-output/package.json b/demos/structured-output/package.json index 57502659bf..f9b04b5247 100644 --- a/demos/structured-output/package.json +++ b/demos/structured-output/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/text-generation-stream/package.json b/demos/text-generation-stream/package.json index 1901bbaad8..cecdc6b6eb 100644 --- a/demos/text-generation-stream/package.json +++ b/demos/text-generation-stream/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/text-generation/package.json b/demos/text-generation/package.json index fc10434bf8..cc880cb6de 100644 --- a/demos/text-generation/package.json +++ b/demos/text-generation/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/tool-calling-stream-traditional/package.json b/demos/tool-calling-stream-traditional/package.json index 3596561863..2ec9829367 100644 --- a/demos/tool-calling-stream-traditional/package.json +++ b/demos/tool-calling-stream-traditional/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "zod": "^4.4.3" }, diff --git a/demos/tool-calling-stream/package.json b/demos/tool-calling-stream/package.json index 8a3376bdeb..d3933f9741 100644 --- a/demos/tool-calling-stream/package.json +++ b/demos/tool-calling-stream/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/tool-calling-stream/src/index.ts b/demos/tool-calling-stream/src/index.ts index acb46ee594..d524e3bf24 100644 --- a/demos/tool-calling-stream/src/index.ts +++ b/demos/tool-calling-stream/src/index.ts @@ -1,4 +1,4 @@ -import { stepCountIs, streamText, tool } from "ai"; +import { isStepCount, streamText, tool } from "ai"; import { Hono } from "hono"; import { cors } from "hono/cors"; import { createWorkersAI } from "workers-ai-provider"; @@ -35,7 +35,7 @@ app.post("/", async (c) => { }), }), }, - stopWhen: stepCountIs(5), + stopWhen: isStepCount(5), }); return result.toUIMessageStreamResponse(); diff --git a/demos/tool-calling/package.json b/demos/tool-calling/package.json index 98c8e254d2..9eff9eab04 100644 --- a/demos/tool-calling/package.json +++ b/demos/tool-calling/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "workers-ai-provider": "^3.2.1", "zod": "^4.4.3" diff --git a/demos/tool-calling/src/index.ts b/demos/tool-calling/src/index.ts index 21d3380e5e..9403868d23 100644 --- a/demos/tool-calling/src/index.ts +++ b/demos/tool-calling/src/index.ts @@ -1,4 +1,4 @@ -import { generateText, stepCountIs, tool } from "ai"; +import { generateText, isStepCount, tool } from "ai"; import { Hono } from "hono"; import { cors } from "hono/cors"; import { createWorkersAI } from "workers-ai-provider"; @@ -31,7 +31,7 @@ app.post("/", async (c) => { }), }), }, - stopWhen: stepCountIs(5), + stopWhen: isStepCount(5), }); return c.json(result); diff --git a/demos/ui-worker/package.json b/demos/ui-worker/package.json index d87492007c..43c99e21f0 100644 --- a/demos/ui-worker/package.json +++ b/demos/ui-worker/package.json @@ -16,8 +16,8 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "@ai-sdk/openai": "^3.0.71", - "@ai-sdk/react": "^3.0.206", + "@ai-sdk/openai": "^4.0.5", + "@ai-sdk/react": "^4.0.12", "@mantine/charts": "^9.4.1", "@mantine/code-highlight": "^9.4.1", "@mantine/core": "^9.4.1", @@ -26,7 +26,7 @@ "@mantine/hooks": "^9.4.1", "@mantine/modals": "^9.4.1", "@mantine/notifications": "^9.4.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "react": "^19.2.7", "react-dom": "^19.2.7", diff --git a/demos/vision/package.json b/demos/vision/package.json index 661f3be7a6..a7a4911b0f 100644 --- a/demos/vision/package.json +++ b/demos/vision/package.json @@ -14,7 +14,7 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "ai": "^6.0.204", + "ai": "^7.0.11", "hono": "^4.12.27", "react": "^19.2.7", "react-dom": "^19.2.7", diff --git a/examples/workers-ai/package.json b/examples/workers-ai/package.json index aaf9bb7e95..0de1f5aadb 100644 --- a/examples/workers-ai/package.json +++ b/examples/workers-ai/package.json @@ -9,10 +9,10 @@ "deploy": "vite build && wrangler deploy" }, "dependencies": { - "@ai-sdk/anthropic": "^3.0.84", - "@ai-sdk/openai": "^3.0.71", - "@ai-sdk/react": "^3.0.206", - "ai": "^6.0.204", + "@ai-sdk/anthropic": "^4.0.5", + "@ai-sdk/openai": "^4.0.5", + "@ai-sdk/react": "^4.0.12", + "ai": "^7.0.11", "react": "^19.2.7", "react-dom": "^19.2.7", "workers-ai-provider": "workspace:*", diff --git a/examples/workers-ai/src/server/index.ts b/examples/workers-ai/src/server/index.ts index 9637ea05c7..d79bb7ea06 100644 --- a/examples/workers-ai/src/server/index.ts +++ b/examples/workers-ai/src/server/index.ts @@ -19,13 +19,13 @@ */ import { streamText, - stepCountIs, + isStepCount, tool, embedMany, convertToModelMessages, generateImage, - experimental_transcribe as transcribe, - experimental_generateSpeech as generateSpeech, + transcribe, + generateSpeech, rerank, } from "ai"; import { createWorkersAI } from "workers-ai-provider"; @@ -83,7 +83,7 @@ export default { // eslint-disable-next-line @typescript-eslint/no-explicit-any model: workersai(model as any), messages, - stopWhen: stepCountIs(10), + stopWhen: isStepCount(10), tools: { getWeather: tool({ description: @@ -332,7 +332,7 @@ export default { onDispatch, }); - const result = streamText({ model, messages, stopWhen: stepCountIs(5) }); + const result = streamText({ model, messages, stopWhen: isStepCount(5) }); return result.toUIMessageStreamResponse({ sendReasoning: true }); } diff --git a/package.json b/package.json index 85f5ff36ef..c0f523b804 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "postinstall": "nx run-many --target=build --projects='packages/*'" }, "devDependencies": { - "@ai-sdk/openai": "^3.0.71", + "@ai-sdk/openai": "^4.0.5", "@changesets/changelog-github": "^0.7.0", "@changesets/cli": "^2.31.0", "@cloudflare/workers-oauth-provider": "^0.8.1", @@ -17,7 +17,7 @@ "@types/node": "^26.0.1", "@types/wait-on": "^5.3.4", "agents": "^0.17.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "dotenv": "^17.4.2", "get-port": "^7.2.0", "hono": "^4.12.27", diff --git a/packages/ai-gateway-provider/package.json b/packages/ai-gateway-provider/package.json index a5673a0e76..134b42b51a 100644 --- a/packages/ai-gateway-provider/package.json +++ b/packages/ai-gateway-provider/package.json @@ -198,28 +198,28 @@ "typescript": "6.0.3" }, "peerDependencies": { - "@ai-sdk/openai-compatible": "^2.0.0", - "@ai-sdk/provider": "^3.0.0", - "@ai-sdk/provider-utils": "^4.0.0", - "ai": "^6.0.0" + "@ai-sdk/openai-compatible": "^3.0.3", + "@ai-sdk/provider": "^4.0.1", + "@ai-sdk/provider-utils": "^5.0.3", + "ai": "^7.0.11" }, "optionalDependencies": { - "@ai-sdk/amazon-bedrock": "^4.0.117", - "@ai-sdk/anthropic": "^3.0.84", - "@ai-sdk/azure": "^3.0.74", - "@ai-sdk/cerebras": "^2.0.56", - "@ai-sdk/cohere": "^3.0.38", - "@ai-sdk/deepgram": "^2.0.35", - "@ai-sdk/deepseek": "^2.0.38", - "@ai-sdk/elevenlabs": "^2.0.35", - "@ai-sdk/fireworks": "^2.0.56", - "@ai-sdk/google": "^3.0.82", - "@ai-sdk/google-vertex": "^4.0.145", - "@ai-sdk/groq": "^3.0.41", - "@ai-sdk/mistral": "^3.0.39", - "@ai-sdk/openai": "^3.0.71", - "@ai-sdk/perplexity": "^3.0.35", - "@ai-sdk/xai": "^3.0.95", + "@ai-sdk/amazon-bedrock": "^5.0.8", + "@ai-sdk/anthropic": "^4.0.5", + "@ai-sdk/azure": "^4.0.5", + "@ai-sdk/cerebras": "^3.0.3", + "@ai-sdk/cohere": "^4.0.3", + "@ai-sdk/deepgram": "^3.0.3", + "@ai-sdk/deepseek": "^3.0.3", + "@ai-sdk/elevenlabs": "^3.0.4", + "@ai-sdk/fireworks": "^3.0.4", + "@ai-sdk/google": "^4.0.6", + "@ai-sdk/google-vertex": "^5.0.8", + "@ai-sdk/groq": "^4.0.3", + "@ai-sdk/mistral": "^4.0.3", + "@ai-sdk/openai": "^4.0.5", + "@ai-sdk/perplexity": "^4.0.4", + "@ai-sdk/xai": "^4.0.4", "@openrouter/ai-sdk-provider": "^2.10.0" } } diff --git a/packages/ai-gateway-provider/src/index.ts b/packages/ai-gateway-provider/src/index.ts index 9e6f07ba65..22cd35363b 100644 --- a/packages/ai-gateway-provider/src/index.ts +++ b/packages/ai-gateway-provider/src/index.ts @@ -4,7 +4,7 @@ import { type ResumableStreamOptions, type ResumeExpiredPolicy, } from "@cloudflare/gateway-core"; -import type { LanguageModelV3 } from "@ai-sdk/provider"; +import type { LanguageModelV4 } from "@ai-sdk/provider"; import type { FetchFunction } from "@ai-sdk/provider-utils"; import { CF_TEMP_TOKEN } from "./auth"; import { providers } from "./providers"; @@ -42,19 +42,19 @@ async function readGatewayErrorCode(resp: Response): Promise return undefined; } -type InternalLanguageModelV3 = LanguageModelV3 & { +type InternalLanguageModelV4 = LanguageModelV4 & { config?: { fetch?: FetchFunction | undefined }; }; -export class AiGatewayChatLanguageModel implements LanguageModelV3 { - readonly specificationVersion = "v3"; +export class AiGatewayChatLanguageModel implements LanguageModelV4 { + readonly specificationVersion = "v4"; readonly defaultObjectGenerationMode = "json"; readonly supportedUrls: Record | PromiseLike> = { // No URLS are supported for this language model }; - readonly models: InternalLanguageModelV3[]; + readonly models: InternalLanguageModelV4[]; readonly config: AiGatewaySettings; get modelId(): string { @@ -73,13 +73,13 @@ export class AiGatewayChatLanguageModel implements LanguageModelV3 { return this.models[0].provider; } - constructor(models: LanguageModelV3[], config: AiGatewaySettings) { + constructor(models: LanguageModelV4[], config: AiGatewaySettings) { this.models = models; this.config = config; } async processModelRequest< - T extends LanguageModelV3["doStream"] | LanguageModelV3["doGenerate"], + T extends LanguageModelV4["doStream"] | LanguageModelV4["doGenerate"], >( options: Parameters[0], modelMethod: "doStream" | "doGenerate", @@ -245,15 +245,15 @@ export class AiGatewayChatLanguageModel implements LanguageModelV3 { } async doStream( - options: Parameters[0], - ): Promise>> { - return this.processModelRequest(options, "doStream"); + options: Parameters[0], + ): Promise>> { + return this.processModelRequest(options, "doStream"); } async doGenerate( - options: Parameters[0], - ): Promise>> { - return this.processModelRequest(options, "doGenerate"); + options: Parameters[0], + ): Promise>> { + return this.processModelRequest(options, "doGenerate"); } } @@ -264,9 +264,9 @@ export class AiGatewayChatLanguageModel implements LanguageModelV3 { * that succeeds wins, selected via `cf-aig-step`). */ export interface AiGateway { - (models: LanguageModelV3 | LanguageModelV3[]): LanguageModelV3; + (models: LanguageModelV4 | LanguageModelV4[]): LanguageModelV4; - chat(models: LanguageModelV3 | LanguageModelV3[]): LanguageModelV3; + chat(models: LanguageModelV4 | LanguageModelV4[]): LanguageModelV4; } export type AiGatewayRetries = { @@ -338,11 +338,11 @@ export type AiGatewayBindingSettings = { export type AiGatewaySettings = AiGatewayAPISettings | AiGatewayBindingSettings; export function createAiGateway(options: AiGatewaySettings): AiGateway { - const createChatModel = (models: LanguageModelV3 | LanguageModelV3[]) => { + const createChatModel = (models: LanguageModelV4 | LanguageModelV4[]) => { return new AiGatewayChatLanguageModel(Array.isArray(models) ? models : [models], options); }; - const provider = (models: LanguageModelV3 | LanguageModelV3[]) => createChatModel(models); + const provider = (models: LanguageModelV4 | LanguageModelV4[]) => createChatModel(models); provider.chat = createChatModel; diff --git a/packages/ai-gateway-provider/test/google-vertex-patch.test.ts b/packages/ai-gateway-provider/test/google-vertex-patch.test.ts new file mode 100644 index 0000000000..5faaf1f3f5 --- /dev/null +++ b/packages/ai-gateway-provider/test/google-vertex-patch.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from "vitest"; +import { CF_TEMP_TOKEN } from "../src/auth"; +import { createVertex } from "../src/providers/google-vertex"; + +/** + * Regression test for the `@ai-sdk/google-vertex` pnpm patch (see + * `patches/@ai-sdk__google-vertex.patch`). + * + * The patch short-circuits `generateAuthToken` to return `cfApiKey` instead of + * exchanging Google service-account credentials for an OAuth token. The patch + * is keyed by a semver range in `pnpm-workspace.yaml`, and pnpm applies range + * patches best-effort: if a future version reshuffles `dist/`, the patch can + * silently stop applying with no install error. Without it, this call throws + * while building a JWT from the credential-less config — so asserting the + * Authorization header here is what turns that silent failure into a red CI. + */ +describe("google-vertex pnpm patch", () => { + it("sends CF_TEMP_TOKEN as the bearer token (patch is applied)", async () => { + const sentinel = new Error("stop-after-headers"); + let authorization: string | null | undefined; + + const capturingFetch = (async (_input: RequestInfo | URL, init?: RequestInit) => { + authorization = new Headers(init?.headers).get("authorization"); + throw sentinel; + }) as typeof globalThis.fetch; + + const vertex = createVertex({ + project: "test-project", + location: "us-central1", + fetch: capturingFetch, + }); + const model = vertex("gemini-2.0-flash"); + + await expect( + model.doGenerate({ + prompt: [{ role: "user", content: [{ type: "text", text: "hi" }] }], + }), + ).rejects.toThrow(); + + expect(authorization).toBe(`Bearer ${CF_TEMP_TOKEN}`); + }); +}); diff --git a/packages/gateway-core/package.json b/packages/gateway-core/package.json index 96f0d6b46f..3a53fdc935 100644 --- a/packages/gateway-core/package.json +++ b/packages/gateway-core/package.json @@ -23,7 +23,7 @@ "type-check": "tsc --noEmit" }, "devDependencies": { - "@ai-sdk/provider": "^3.0.10", + "@ai-sdk/provider": "^4.0.1", "@cloudflare/workers-types": "^4.20260628.1", "tsdown": "^0.22.3", "typescript": "6.0.3" diff --git a/packages/gateway-core/src/workers-ai.ts b/packages/gateway-core/src/workers-ai.ts index 51e3f10dfa..a0d4da967d 100644 --- a/packages/gateway-core/src/workers-ai.ts +++ b/packages/gateway-core/src/workers-ai.ts @@ -1,7 +1,7 @@ /** * Shared, framework-agnostic Workers AI helpers. * - * These are the pieces that `workers-ai-provider` (native `LanguageModelV3`) and + * These are the pieces that `workers-ai-provider` (native `LanguageModelV4`) and * `@cloudflare/tanstack-ai` (OpenAI-SDK shim) both need: the SSE byte decoder, * message normalization for the binding's stricter schema, response-text * extraction across WAI's response shapes, and the gpt-oss forced-tool-call diff --git a/packages/workers-ai-provider/README.md b/packages/workers-ai-provider/README.md index 5aec858880..b6000d4163 100644 --- a/packages/workers-ai-provider/README.md +++ b/packages/workers-ai-provider/README.md @@ -171,7 +171,7 @@ Images can be provided as `Uint8Array`, base64 strings, or data URLs. Multiple i ## Tool calling ```ts -import { generateText, stepCountIs } from "ai"; +import { generateText, isStepCount } from "ai"; import { z } from "zod"; const { text } = await generateText({ @@ -184,7 +184,7 @@ const { text } = await generateText({ execute: async ({ city }) => ({ city, temperature: 18, condition: "Cloudy" }), }, }, - stopWhen: stepCountIs(2), + stopWhen: isStepCount(2), }); ``` diff --git a/packages/workers-ai-provider/package.json b/packages/workers-ai-provider/package.json index 591d1a3c95..0f412b5887 100644 --- a/packages/workers-ai-provider/package.json +++ b/packages/workers-ai-provider/package.json @@ -65,21 +65,21 @@ "type-check": "tsc --noEmit" }, "devDependencies": { - "@ai-sdk/anthropic": "^3.0.84", - "@ai-sdk/google": "^3.0.0", - "@ai-sdk/openai": "^3.0.71", - "@ai-sdk/provider": "^3.0.10", + "@ai-sdk/anthropic": "^4.0.5", + "@ai-sdk/google": "^4.0.6", + "@ai-sdk/openai": "^4.0.5", + "@ai-sdk/provider": "^4.0.1", "@cloudflare/gateway-core": "workspace:*", "@cloudflare/workers-types": "^4.20260628.1", - "ai": "^6.0.204", + "ai": "^7.0.11", "zod": "^4.4.3" }, "peerDependencies": { - "@ai-sdk/anthropic": "^3.0.0", - "@ai-sdk/google": "^3.0.0", - "@ai-sdk/openai": "^3.0.0", - "@ai-sdk/provider": "^3.0.0", - "ai": "^6.0.0" + "@ai-sdk/anthropic": "^4.0.0", + "@ai-sdk/google": "^4.0.0", + "@ai-sdk/openai": "^4.0.0", + "@ai-sdk/provider": "^4.0.0", + "ai": "^7.0.0" }, "peerDependenciesMeta": { "@ai-sdk/anthropic": { diff --git a/packages/workers-ai-provider/src/aisearch-chat-language-model.ts b/packages/workers-ai-provider/src/aisearch-chat-language-model.ts index e41362ccac..59b5159ee1 100644 --- a/packages/workers-ai-provider/src/aisearch-chat-language-model.ts +++ b/packages/workers-ai-provider/src/aisearch-chat-language-model.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3, SharedV3Warning } from "@ai-sdk/provider"; +import type { LanguageModelV4, SharedV4Warning } from "@ai-sdk/provider"; import type { AISearchChatSettings } from "./aisearch-chat-settings"; import { convertToWorkersAIChatMessages } from "./convert-to-workersai-chat-messages"; @@ -13,8 +13,8 @@ type AISearchChatConfig = { gateway?: GatewayOptions; }; -export class AISearchChatLanguageModel implements LanguageModelV3 { - readonly specificationVersion = "v3"; +export class AISearchChatLanguageModel implements LanguageModelV4 { + readonly specificationVersion = "v4"; readonly defaultObjectGenerationMode = "json"; readonly supportedUrls: Record | PromiseLike> = {}; @@ -43,8 +43,8 @@ export class AISearchChatLanguageModel implements LanguageModelV3 { frequencyPenalty, presencePenalty, responseFormat, - }: Parameters[0]): SharedV3Warning[] { - const warnings: SharedV3Warning[] = []; + }: Parameters[0]): SharedV4Warning[] { + const warnings: SharedV4Warning[] = []; if (tools != null && tools.length > 0) { console.warn( @@ -72,14 +72,14 @@ export class AISearchChatLanguageModel implements LanguageModelV3 { * Build the search query from messages. * Flattens the conversation into a single string for aiSearch. */ - private buildQuery(prompt: Parameters[0]["prompt"]): string { + private buildQuery(prompt: Parameters[0]["prompt"]): string { const { messages } = convertToWorkersAIChatMessages(prompt); return messages.map(({ content, role }) => `${role}: ${content}`).join("\n\n"); } async doGenerate( - options: Parameters[0], - ): Promise>> { + options: Parameters[0], + ): Promise>> { const warnings = this.getWarnings(options); const query = this.buildQuery(options.prompt); @@ -109,8 +109,8 @@ export class AISearchChatLanguageModel implements LanguageModelV3 { } async doStream( - options: Parameters[0], - ): Promise>> { + options: Parameters[0], + ): Promise>> { const warnings = this.getWarnings(options); const query = this.buildQuery(options.prompt); diff --git a/packages/workers-ai-provider/src/client-fallback.ts b/packages/workers-ai-provider/src/client-fallback.ts index 3f38c4775f..04b0d0935e 100644 --- a/packages/workers-ai-provider/src/client-fallback.ts +++ b/packages/workers-ai-provider/src/client-fallback.ts @@ -1,8 +1,8 @@ import type { - LanguageModelV3, - LanguageModelV3CallOptions, - LanguageModelV3GenerateResult, - LanguageModelV3StreamResult, + LanguageModelV4, + LanguageModelV4CallOptions, + LanguageModelV4GenerateResult, + LanguageModelV4StreamResult, } from "@ai-sdk/provider"; import { type FallbackAttempt, WorkersAIFallbackError, WorkersAIGatewayError } from "./errors"; import type { Transport } from "./gateway-delegate"; @@ -12,7 +12,7 @@ export interface FallbackLeg { /** The model slug this leg dispatches. */ slug: string; /** The built AI SDK model. */ - model: LanguageModelV3; + model: LanguageModelV4; /** Transport the leg uses. */ transport: Transport; } @@ -26,13 +26,13 @@ export interface FallbackLeg { * produced a stream). Errors that surface *mid-stream* — after content has * already been emitted — are not recoverable here and propagate as-is. */ -export function createClientFallbackModel(legs: FallbackLeg[]): LanguageModelV3 { +export function createClientFallbackModel(legs: FallbackLeg[]): LanguageModelV4 { if (legs.length === 0) { throw new Error("createClientFallbackModel requires at least one model leg."); } const primary = legs[0].model; - async function attempt(run: (model: LanguageModelV3) => PromiseLike): Promise { + async function attempt(run: (model: LanguageModelV4) => PromiseLike): Promise { const attempts: FallbackAttempt[] = []; for (const leg of legs) { try { @@ -54,16 +54,16 @@ export function createClientFallbackModel(legs: FallbackLeg[]): LanguageModelV3 } return { - specificationVersion: "v3", + specificationVersion: "v4", provider: primary.provider, modelId: primary.modelId, supportedUrls: primary.supportedUrls, doGenerate( - options: LanguageModelV3CallOptions, - ): PromiseLike { + options: LanguageModelV4CallOptions, + ): PromiseLike { return attempt((m) => m.doGenerate(options)); }, - doStream(options: LanguageModelV3CallOptions): PromiseLike { + doStream(options: LanguageModelV4CallOptions): PromiseLike { return attempt((m) => m.doStream(options)); }, }; diff --git a/packages/workers-ai-provider/src/convert-to-workersai-chat-messages.ts b/packages/workers-ai-provider/src/convert-to-workersai-chat-messages.ts index bb40d24552..3327d03b9c 100644 --- a/packages/workers-ai-provider/src/convert-to-workersai-chat-messages.ts +++ b/packages/workers-ai-provider/src/convert-to-workersai-chat-messages.ts @@ -1,45 +1,72 @@ -import type { LanguageModelV3DataContent, LanguageModelV3Prompt } from "@ai-sdk/provider"; +import type { LanguageModelV4Prompt, SharedV4FileData } from "@ai-sdk/provider"; import { UnsupportedFunctionalityError } from "@ai-sdk/provider"; import { toWorkersAIToolCallId } from "./utils"; import type { WorkersAIContentPart, WorkersAIChatPrompt } from "./workersai-chat-prompt"; /** - * Normalise any LanguageModelV3DataContent value to a Uint8Array. + * Normalise a tagged `SharedV4FileData` value to a Uint8Array. * * Handles: - * - Uint8Array → returned as-is - * - string → decoded from base64 (with or without data-URL prefix) - * - URL → not supported (Workers AI needs raw bytes, not a reference) + * - { type: 'data' } → Uint8Array returned as-is; string decoded from + * base64 (with or without data-URL prefix) + * - { type: 'url' } → not supported (Workers AI needs raw bytes, not a reference) + * - { type: 'reference' } → not supported (Workers AI has no file store to resolve it) + * - { type: 'text' } → not supported for image parts */ -function toUint8Array(data: LanguageModelV3DataContent): Uint8Array | null { - if (data instanceof Uint8Array) { - return data; - } - - if (typeof data === "string") { - let base64 = data; - if (base64.startsWith("data:")) { - const commaIndex = base64.indexOf(","); - if (commaIndex >= 0) { - base64 = base64.slice(commaIndex + 1); +function toUint8Array(fileData: SharedV4FileData): Uint8Array | null { + switch (fileData.type) { + case "data": { + const data = fileData.data; + if (data instanceof Uint8Array) { + return data; + } + let base64 = data; + if (base64.startsWith("data:")) { + const commaIndex = base64.indexOf(","); + if (commaIndex >= 0) { + base64 = base64.slice(commaIndex + 1); + } + } + const binaryString = atob(base64); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); } + return bytes; } - const binaryString = atob(base64); - const bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); + + case "url": { + throw new Error( + "URL image sources are not supported by Workers AI. " + + "Provide image data as a Uint8Array or base64 string instead.", + ); } - return bytes; - } - if (data instanceof URL) { - throw new Error( - "URL image sources are not supported by Workers AI. " + - "Provide image data as a Uint8Array or base64 string instead.", - ); - } + case "reference": { + throw new UnsupportedFunctionalityError({ + functionality: "file-part-provider-reference", + message: + "Provider file references are not supported by Workers AI. " + + "Provide image data as a Uint8Array or base64 string instead.", + }); + } - return null; + case "text": { + throw new UnsupportedFunctionalityError({ + functionality: "file-part-inline-text", + message: + "Inline text file parts are not supported by Workers AI chat. " + + "Pass text as a regular text part instead.", + }); + } + + default: { + const exhaustiveCheck = fileData satisfies never; + throw new Error( + `Unsupported file data type: ${(exhaustiveCheck as { type: string }).type}`, + ); + } + } } function assertImageMediaType(mediaType: string | undefined): string { @@ -76,7 +103,7 @@ function uint8ArrayToBase64(bytes: Uint8Array): string { return btoa(binary); } -export function convertToWorkersAIChatMessages(prompt: LanguageModelV3Prompt): { +export function convertToWorkersAIChatMessages(prompt: LanguageModelV4Prompt): { messages: WorkersAIChatPrompt; } { const messages: WorkersAIChatPrompt = []; @@ -164,6 +191,18 @@ export function convertToWorkersAIChatMessages(prompt: LanguageModelV3Prompt): { break; } + case "reasoning-file": { + // Files inside reasoning traces (new in spec v4) cannot be + // replayed to Workers AI - no action needed + break; + } + + case "custom": { + // Provider-specific custom parts (new in spec v4) from other + // providers are not replayable to Workers AI - no action needed + break; + } + case "tool-call": { toolCalls.push({ function: { diff --git a/packages/workers-ai-provider/src/gateway-delegate.ts b/packages/workers-ai-provider/src/gateway-delegate.ts index 53cb46e394..383f8071ac 100644 --- a/packages/workers-ai-provider/src/gateway-delegate.ts +++ b/packages/workers-ai-provider/src/gateway-delegate.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3, LanguageModelV3CallOptions } from "@ai-sdk/provider"; +import type { LanguageModelV4, LanguageModelV4CallOptions } from "@ai-sdk/provider"; import { asText, buildGatewayEntry, @@ -154,7 +154,7 @@ export interface ProviderPlugin { modelId: string; fetch: typeof globalThis.fetch; baseURL?: string; - }): LanguageModelV3; + }): LanguageModelV4; } // --------------------------------------------------------------------------- @@ -401,7 +401,7 @@ export interface GatewayDelegateConfig { } export interface GatewayDelegate { - (slug: string, options?: DelegateCallOptions): LanguageModelV3; + (slug: string, options?: DelegateCallOptions): LanguageModelV4; } /** @@ -431,7 +431,7 @@ export function createGatewayDelegate(config: GatewayDelegateConfig): GatewayDel const buildOne = ( slug: string, options: DelegateCallOptions, - ): { model: LanguageModelV3; transport: Transport } => { + ): { model: LanguageModelV4; transport: Transport } => { const parsed = parseSlug(slug); const info = resolveProvider(slug, parsed); @@ -816,7 +816,7 @@ function makeServerFallbackModel(params: { opts: DelegateCallOptions; selection: Selection; callOptions: DelegateCallOptions; -}): LanguageModelV3 { +}): LanguageModelV4 { const { binding, gatewayId, gatewayOptions, legs, opts, selection, callOptions } = params; const first = legs[0]!; @@ -834,7 +834,7 @@ function makeServerFallbackModel(params: { const dispatch = async ( method: "doGenerate" | "doStream", - options: LanguageModelV3CallOptions, + options: LanguageModelV4CallOptions, ): Promise => { // 1) Capture each leg's native request without hitting the network. const entries: GatewayEntry[] = []; @@ -854,7 +854,7 @@ function makeServerFallbackModel(params: { ...(leg.info.baseURL ? { baseURL: leg.info.baseURL } : {}), }); try { - await (model[method] as (o: LanguageModelV3CallOptions) => Promise)( + await (model[method] as (o: LanguageModelV4CallOptions) => Promise)( options, ); } catch (e) { @@ -905,21 +905,21 @@ function makeServerFallbackModel(params: { fetch: (async () => resp) as typeof globalThis.fetch, ...(winner.info.baseURL ? { baseURL: winner.info.baseURL } : {}), }); - return (winnerModel[method] as (o: LanguageModelV3CallOptions) => Promise)( + return (winnerModel[method] as (o: LanguageModelV4CallOptions) => Promise)( options, ); }; return { - specificationVersion: "v3", + specificationVersion: "v4", provider: refModel.provider, modelId: refModel.modelId, supportedUrls: refModel.supportedUrls, doGenerate(options) { - return dispatch("doGenerate", options) as ReturnType; + return dispatch("doGenerate", options) as ReturnType; }, doStream(options) { - return dispatch("doStream", options) as ReturnType; + return dispatch("doStream", options) as ReturnType; }, - } as LanguageModelV3; + } as LanguageModelV4; } diff --git a/packages/workers-ai-provider/src/google.ts b/packages/workers-ai-provider/src/google.ts index 37dcaff05d..8daa2ade1f 100644 --- a/packages/workers-ai-provider/src/google.ts +++ b/packages/workers-ai-provider/src/google.ts @@ -1,4 +1,4 @@ -import { createGoogleGenerativeAI } from "@ai-sdk/google"; +import { createGoogle } from "@ai-sdk/google"; import type { ProviderPlugin } from "./gateway-delegate"; /** @@ -13,7 +13,5 @@ export const google: ProviderPlugin = { create: ({ modelId, fetch, baseURL }) => // apiKey is a placeholder — the gateway handles auth (unified billing / BYOK) // and the delegate strips the x-goog-api-key header on the gateway path. - createGoogleGenerativeAI({ apiKey: "unused", fetch, ...(baseURL ? { baseURL } : {}) })( - modelId, - ), + createGoogle({ apiKey: "unused", fetch, ...(baseURL ? { baseURL } : {}) })(modelId), }; diff --git a/packages/workers-ai-provider/src/index.ts b/packages/workers-ai-provider/src/index.ts index e4af8b96b8..6a007d4b2f 100644 --- a/packages/workers-ai-provider/src/index.ts +++ b/packages/workers-ai-provider/src/index.ts @@ -508,7 +508,7 @@ export function createWorkersAI(options: WorkersAISettings): WorkersAI { "catalog", ); } - // The delegate returns a `LanguageModelV3` built by the configured plugin. + // The delegate returns a `LanguageModelV4` built by the configured plugin. // It's structurally compatible with the AI SDK consumers this provider is // used with; the cast keeps the public return type unchanged. return getDelegate(modelId)( diff --git a/packages/workers-ai-provider/src/map-workersai-finish-reason.ts b/packages/workers-ai-provider/src/map-workersai-finish-reason.ts index 1d330c1d5e..a9512fc639 100644 --- a/packages/workers-ai-provider/src/map-workersai-finish-reason.ts +++ b/packages/workers-ai-provider/src/map-workersai-finish-reason.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3FinishReason } from "@ai-sdk/provider"; +import type { LanguageModelV4FinishReason } from "@ai-sdk/provider"; /** * Map a Workers AI finish reason to the AI SDK unified finish reason. @@ -9,7 +9,7 @@ import type { LanguageModelV3FinishReason } from "@ai-sdk/provider"; */ export function mapWorkersAIFinishReason( finishReasonOrResponse: string | null | undefined | Record, -): LanguageModelV3FinishReason { +): LanguageModelV4FinishReason { let finishReason: string | null | undefined; if ( diff --git a/packages/workers-ai-provider/src/map-workersai-usage.ts b/packages/workers-ai-provider/src/map-workersai-usage.ts index 41a2e321f9..93299e7be4 100644 --- a/packages/workers-ai-provider/src/map-workersai-usage.ts +++ b/packages/workers-ai-provider/src/map-workersai-usage.ts @@ -1,7 +1,7 @@ -import type { LanguageModelV3Usage } from "@ai-sdk/provider"; +import type { LanguageModelV4Usage } from "@ai-sdk/provider"; /** - * Map Workers AI usage data to the AI SDK V3 usage format. + * Map Workers AI usage data to the AI SDK v4 usage format. * Accepts any object that may have a `usage` property with token counts. * * Workers AI mirrors the OpenAI usage shape, including @@ -11,7 +11,7 @@ import type { LanguageModelV3Usage } from "@ai-sdk/provider"; */ export function mapWorkersAIUsage( output: Record | AiTextGenerationOutput | AiTextToImageOutput, -): LanguageModelV3Usage { +): LanguageModelV4Usage { const usage = ( output as { usage?: { @@ -30,7 +30,7 @@ export function mapWorkersAIUsage( const cachedTokens = usage.prompt_tokens_details?.cached_tokens; // Clamp at 0 in case the provider ever reports cached_tokens > prompt_tokens; - // the v3 spec expects non-negative counts. + // the v4 spec expects non-negative counts. const noCache = cachedTokens !== undefined ? Math.max(0, promptTokens - cachedTokens) : undefined; diff --git a/packages/workers-ai-provider/src/openai.ts b/packages/workers-ai-provider/src/openai.ts index 65a2ca5466..7312f64e68 100644 --- a/packages/workers-ai-provider/src/openai.ts +++ b/packages/workers-ai-provider/src/openai.ts @@ -11,8 +11,9 @@ import type { ProviderPlugin } from "./gateway-delegate"; * * Requires `@ai-sdk/openai` (an optional peer dependency — install it yourself). * - * Uses `.chat()` (Chat Completions) deliberately: AI SDK v6's bare `openai()` - * defaults to the Responses API, which the AI Gateway run catalog does not serve. + * Uses `.chat()` (Chat Completions) deliberately: the bare `openai()` call + * (AI SDK v6+) defaults to the Responses API, which the AI Gateway run catalog + * does not serve. */ export const openai: ProviderPlugin = { wireFormat: "openai", diff --git a/packages/workers-ai-provider/src/streaming.ts b/packages/workers-ai-provider/src/streaming.ts index f1937cf8e9..114d54f70a 100644 --- a/packages/workers-ai-provider/src/streaming.ts +++ b/packages/workers-ai-provider/src/streaming.ts @@ -1,7 +1,7 @@ import type { - LanguageModelV3FinishReason, - LanguageModelV3StreamPart, - LanguageModelV3Usage, + LanguageModelV4FinishReason, + LanguageModelV4StreamPart, + LanguageModelV4Usage, } from "@ai-sdk/provider"; import { SSEDecoder } from "@cloudflare/gateway-core"; import { generateId } from "ai"; @@ -15,16 +15,16 @@ import { } from "./utils"; /** - * Prepend a stream-start event to an existing LanguageModelV3 stream. + * Prepend a stream-start event to an existing LanguageModelV4 stream. * Uses pipeThrough for proper backpressure and error propagation. */ export function prependStreamStart( - source: ReadableStream, - warnings: LanguageModelV3StreamPart extends { type: "stream-start" } ? never : unknown, -): ReadableStream { + source: ReadableStream, + warnings: LanguageModelV4StreamPart extends { type: "stream-start" } ? never : unknown, +): ReadableStream { let sentStart = false; return source.pipeThrough( - new TransformStream({ + new TransformStream({ transform(chunk, controller) { if (!sentStart) { sentStart = true; @@ -59,7 +59,7 @@ function isNullFinalizationChunk(tc: Record): boolean { } /** - * Maps a Workers AI SSE stream into AI SDK V3 LanguageModelV3StreamPart events. + * Maps a Workers AI SSE stream into AI SDK LanguageModelV4StreamPart events. * * Uses a TransformStream pipeline for proper backpressure — chunks are emitted * one at a time as the downstream consumer pulls, not buffered eagerly. @@ -74,7 +74,7 @@ export function getMappedStream( tools: Array<{ function: { name?: string } }> | undefined; toolChoice: unknown; }, -): ReadableStream { +): ReadableStream { const rawStream = response instanceof ReadableStream ? response @@ -97,7 +97,7 @@ export function getMappedStream( let anyToolCallStarted = false; // State shared across the transform - let usage: LanguageModelV3Usage = { + let usage: LanguageModelV4Usage = { outputTokens: { total: 0, text: undefined, reasoning: undefined }, inputTokens: { total: 0, @@ -109,7 +109,7 @@ export function getMappedStream( }; let textId: string | null = null; let reasoningId: string | null = null; - let finishReason: LanguageModelV3FinishReason | null = null; + let finishReason: LanguageModelV4FinishReason | null = null; let receivedDone = false; let receivedAnyData = false; @@ -125,9 +125,9 @@ export function getMappedStream( // Step 1: Decode bytes into SSE lines const sseStream = rawStream.pipeThrough(new SSEDecoder()); - // Step 2: Transform SSE events into LanguageModelV3StreamPart + // Step 2: Transform SSE events into LanguageModelV4StreamPart return sseStream.pipeThrough( - new TransformStream({ + new TransformStream({ transform(data, controller) { if (!data || data === "[DONE]") { if (data === "[DONE]") receivedDone = true; @@ -315,12 +315,12 @@ export function getMappedStream( // Detect premature termination const effectiveFinishReason = salvagedToolCalls - ? ({ unified: "tool-calls", raw: "stop" } as LanguageModelV3FinishReason) + ? ({ unified: "tool-calls", raw: "stop" } as LanguageModelV4FinishReason) : !receivedDone && receivedAnyData && !finishReason ? ({ unified: "error", raw: "stream-truncated", - } as LanguageModelV3FinishReason) + } as LanguageModelV4FinishReason) : (finishReason ?? { unified: "stop", raw: "stop" }); controller.enqueue({ @@ -337,7 +337,7 @@ export function getMappedStream( */ function closeToolCall( index: number, - controller: TransformStreamDefaultController, + controller: TransformStreamDefaultController, ) { const tc = activeToolCalls.get(index); if (!tc || closedToolCalls.has(index)) return; @@ -367,7 +367,7 @@ export function getMappedStream( */ function emitToolCallDeltas( toolCalls: Record[], - controller: TransformStreamDefaultController, + controller: TransformStreamDefaultController, ) { for (const tc of toolCalls) { if (isNullFinalizationChunk(tc)) { diff --git a/packages/workers-ai-provider/src/utils.ts b/packages/workers-ai-provider/src/utils.ts index 46e03ab7ab..42ba34a8fb 100644 --- a/packages/workers-ai-provider/src/utils.ts +++ b/packages/workers-ai-provider/src/utils.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3, LanguageModelV3ToolCall } from "@ai-sdk/provider"; +import type { LanguageModelV4, LanguageModelV4ToolCall } from "@ai-sdk/provider"; import { getToolNames, isForcedToolChoice, @@ -332,8 +332,8 @@ export function buildJsonSchemaPayload( // --------------------------------------------------------------------------- export function prepareToolsAndToolChoice( - tools: Parameters[0]["tools"], - toolChoice: Parameters[0]["toolChoice"], + tools: Parameters[0]["tools"], + toolChoice: Parameters[0]["toolChoice"], ) { if (tools == null) { return { tool_choice: undefined, tools: undefined }; @@ -476,7 +476,7 @@ function mergePartialToolCalls(partialCalls: PartialToolCall[]) { return Object.values(mergedCallsByIndex); } -function processToolCall(toolCall: FlatToolCall | OpenAIToolCall): LanguageModelV3ToolCall { +function processToolCall(toolCall: FlatToolCall | OpenAIToolCall): LanguageModelV4ToolCall { // OpenAI format: has function.name (the key discriminator) const fn = "function" in toolCall && typeof toolCall.function === "object" && toolCall.function @@ -508,7 +508,7 @@ function processToolCall(toolCall: FlatToolCall | OpenAIToolCall): LanguageModel }; } -export function processToolCalls(output: Record): LanguageModelV3ToolCall[] { +export function processToolCalls(output: Record): LanguageModelV4ToolCall[] { if (output.tool_calls && Array.isArray(output.tool_calls)) { return output.tool_calls.map((toolCall: FlatToolCall | OpenAIToolCall) => processToolCall(toolCall), @@ -540,12 +540,12 @@ export function processPartialToolCalls(partialToolCalls: PartialToolCall[]) { * * The recovery logic (which JSON shapes count as a leaked call) lives in * `@cloudflare/gateway-core`; this wrapper only layers the framework id on each - * neutral result so the existing `LanguageModelV3ToolCall` shape is preserved. + * neutral result so the existing `LanguageModelV4ToolCall` shape is preserved. */ export function parseLeakedToolCalls( text: string, knownToolNames: Set, -): LanguageModelV3ToolCall[] { +): LanguageModelV4ToolCall[] { return coreParseLeakedToolCalls(text, knownToolNames).map((call) => ({ input: call.input, toolCallId: createAISDKToolCallId(undefined), @@ -584,7 +584,7 @@ export function salvageToolCallsFromText( tools: Array<{ function: { name?: string } }> | undefined; toolChoice: unknown; }, -): LanguageModelV3ToolCall[] | null { +): LanguageModelV4ToolCall[] | null { if (!isForcedToolChoice(context.toolChoice)) return null; // Never override real tool calls. diff --git a/packages/workers-ai-provider/src/workersai-chat-language-model.ts b/packages/workers-ai-provider/src/workersai-chat-language-model.ts index d06e9f2498..38f7ce8f74 100644 --- a/packages/workers-ai-provider/src/workersai-chat-language-model.ts +++ b/packages/workers-ai-provider/src/workersai-chat-language-model.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3, SharedV3Warning, LanguageModelV3StreamPart } from "@ai-sdk/provider"; +import type { LanguageModelV4, SharedV4Warning, LanguageModelV4StreamPart } from "@ai-sdk/provider"; import { generateId } from "ai"; import { convertToWorkersAIChatMessages } from "./convert-to-workersai-chat-messages"; import { mapWorkersAIFinishReason } from "./map-workersai-finish-reason"; @@ -24,8 +24,33 @@ type WorkersAIChatConfig = { isBinding: boolean; }; -export class WorkersAIChatLanguageModel implements LanguageModelV3 { - readonly specificationVersion = "v3"; +/** + * Map the unified `reasoning` call option (spec v4) to Workers AI's + * `reasoning_effort`. Workers AI accepts "low" | "medium" | "high" | null + * (null disables reasoning), so `minimal` and `xhigh` are clamped to the + * nearest supported effort. `provider-default` (and absence) returns + * undefined so the settings-level `reasoning_effort` still applies. + */ +function mapUnifiedReasoningEffort( + reasoning: Parameters[0]["reasoning"], +): "low" | "medium" | "high" | null | undefined { + switch (reasoning) { + case undefined: + case "provider-default": + return undefined; + case "none": + return null; + case "minimal": + return "low"; + case "xhigh": + return "high"; + default: + return reasoning; + } +} + +export class WorkersAIChatLanguageModel implements LanguageModelV4 { + readonly specificationVersion = "v4"; readonly defaultObjectGenerationMode = "json"; readonly supportedUrls: Record | PromiseLike> = {}; @@ -59,10 +84,11 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { frequencyPenalty, presencePenalty, seed, - }: Parameters[0]) { + reasoning, + }: Parameters[0]) { const type = responseFormat?.type ?? "text"; - const warnings: SharedV3Warning[] = []; + const warnings: SharedV4Warning[] = []; if (frequencyPenalty != null) { warnings.push({ feature: "frequencyPenalty", type: "unsupported" }); @@ -72,6 +98,16 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { warnings.push({ feature: "presencePenalty", type: "unsupported" }); } + if (reasoning === "minimal" || reasoning === "xhigh") { + warnings.push({ + type: "compatibility", + feature: "reasoning", + details: + `Workers AI supports reasoning_effort "low" | "medium" | "high"; ` + + `"${reasoning}" was mapped to "${reasoning === "minimal" ? "low" : "high"}".`, + }); + } + const baseArgs = { max_tokens: maxOutputTokens, model: this.modelId, @@ -145,11 +181,20 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { * * `reasoning_effort: null` is a valid value ("disable reasoning"), so we * check `!== undefined` rather than truthiness. + * + * The unified `reasoning` call option (spec v4) is mapped onto + * `reasoning_effort` between the two: an explicit per-call + * `providerOptions["workers-ai"].reasoning_effort` wins, then the unified + * option, then settings. */ private buildRunInputs( args: ReturnType["args"], messages: ReturnType["messages"], - options?: { stream?: boolean; providerOptions?: Record }, + options?: { + stream?: boolean; + providerOptions?: Record; + reasoning?: Parameters[0]["reasoning"]; + }, ) { // The AI SDK types this as `Record` but we defensively // accept anything and only treat it as a lookup if it's a plain object. @@ -159,10 +204,13 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { rawPerCall !== null && typeof rawPerCall === "object" && !Array.isArray(rawPerCall) ? (rawPerCall as Record) : {}; + const unifiedReasoningEffort = mapUnifiedReasoningEffort(options?.reasoning); const reasoningEffort = "reasoning_effort" in perCall ? perCall.reasoning_effort - : this.settings.reasoning_effort; + : unifiedReasoningEffort !== undefined + ? unifiedReasoningEffort + : this.settings.reasoning_effort; const chatTemplateKwargs = "chat_template_kwargs" in perCall ? perCall.chat_template_kwargs @@ -229,7 +277,7 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { private extractContent( outputRecord: Record, args: ReturnType["args"], - warnings: SharedV3Warning[], + warnings: SharedV4Warning[], ) { const choices = outputRecord.choices as | Array<{ message?: { reasoning_content?: string; reasoning?: string } }> @@ -268,13 +316,14 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { } async doGenerate( - options: Parameters[0], - ): Promise>> { + options: Parameters[0], + ): Promise>> { const { args, warnings } = this.getArgs(options); const { messages } = convertToWorkersAIChatMessages(options.prompt); const inputs = this.buildRunInputs(args, messages, { providerOptions: options.providerOptions, + reasoning: options.reasoning, }); const runOptions = this.getRunOptions(); @@ -325,14 +374,15 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { } async doStream( - options: Parameters[0], - ): Promise>> { + options: Parameters[0], + ): Promise>> { const { args, warnings } = this.getArgs(options); const { messages } = convertToWorkersAIChatMessages(options.prompt); const inputs = this.buildRunInputs(args, messages, { stream: true, providerOptions: options.providerOptions, + reasoning: options.reasoning, }); const runOptions = this.getRunOptions(); @@ -381,11 +431,11 @@ export class WorkersAIChatLanguageModel implements LanguageModelV3 { let reasoningId: string | null = null; return { - stream: new ReadableStream({ + stream: new ReadableStream({ start(controller) { controller.enqueue({ type: "stream-start", - warnings: warnings as SharedV3Warning[], + warnings: warnings as SharedV4Warning[], }); if (reasoningContent) { diff --git a/packages/workers-ai-provider/src/workersai-embedding-model.ts b/packages/workers-ai-provider/src/workersai-embedding-model.ts index 35047fbb08..088938bffd 100644 --- a/packages/workers-ai-provider/src/workersai-embedding-model.ts +++ b/packages/workers-ai-provider/src/workersai-embedding-model.ts @@ -1,7 +1,7 @@ import type { - EmbeddingModelV3, - EmbeddingModelV3CallOptions, - EmbeddingModelV3Result, + EmbeddingModelV4, + EmbeddingModelV4CallOptions, + EmbeddingModelV4Result, } from "@ai-sdk/provider"; import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider"; import { normalizeBindingError } from "./workersai-error"; @@ -24,8 +24,8 @@ export type WorkersAIEmbeddingSettings = { [key: string]: unknown; }; -export class WorkersAIEmbeddingModel implements EmbeddingModelV3 { - readonly specificationVersion = "v3"; +export class WorkersAIEmbeddingModel implements EmbeddingModelV4 { + readonly specificationVersion = "v4"; readonly modelId: EmbeddingModels; private readonly config: WorkersAIEmbeddingConfig; private readonly settings: WorkersAIEmbeddingSettings; @@ -56,7 +56,7 @@ export class WorkersAIEmbeddingModel implements EmbeddingModelV3 { async doEmbed({ values, abortSignal, - }: EmbeddingModelV3CallOptions): Promise { + }: EmbeddingModelV4CallOptions): Promise { if (values.length > this.maxEmbeddingsPerCall) { throw new TooManyEmbeddingValuesForCallError({ maxEmbeddingsPerCall: this.maxEmbeddingsPerCall, diff --git a/packages/workers-ai-provider/src/workersai-image-model.ts b/packages/workers-ai-provider/src/workersai-image-model.ts index 488802883e..f68b0ea210 100644 --- a/packages/workers-ai-provider/src/workersai-image-model.ts +++ b/packages/workers-ai-provider/src/workersai-image-model.ts @@ -1,4 +1,4 @@ -import type { ImageModelV3, SharedV3Warning } from "@ai-sdk/provider"; +import type { ImageModelV4, SharedV4Warning } from "@ai-sdk/provider"; import { normalizeBindingError } from "./workersai-error"; import type { WorkersAIImageSettings } from "./workersai-image-settings"; import type { ImageGenerationModels } from "./workersai-models"; @@ -9,8 +9,8 @@ export type WorkersAIImageConfig = { gateway?: GatewayOptions; }; -export class WorkersAIImageModel implements ImageModelV3 { - readonly specificationVersion = "v3"; +export class WorkersAIImageModel implements ImageModelV4 { + readonly specificationVersion = "v4"; get maxImagesPerCall(): number { return this.settings.maxImagesPerCall ?? 1; @@ -33,12 +33,12 @@ export class WorkersAIImageModel implements ImageModelV3 { aspectRatio, seed, abortSignal, - }: Parameters[0]): Promise< - Awaited> + }: Parameters[0]): Promise< + Awaited> > { const { width, height } = getDimensionsFromSizeString(size); - const warnings: Array = []; + const warnings: Array = []; if (aspectRatio != null) { warnings.push({ diff --git a/packages/workers-ai-provider/src/workersai-reranking-model.ts b/packages/workers-ai-provider/src/workersai-reranking-model.ts index 15429e8c20..2a75375e82 100644 --- a/packages/workers-ai-provider/src/workersai-reranking-model.ts +++ b/packages/workers-ai-provider/src/workersai-reranking-model.ts @@ -1,4 +1,4 @@ -import type { RerankingModelV3, SharedV3Warning } from "@ai-sdk/provider"; +import type { RerankingModelV4, SharedV4Warning } from "@ai-sdk/provider"; import { normalizeBindingError } from "./workersai-error"; import type { WorkersAIRerankingSettings } from "./workersai-reranking-settings"; import type { RerankingModels } from "./workersai-models"; @@ -10,7 +10,7 @@ export type WorkersAIRerankingConfig = { }; /** - * Workers AI reranking model implementing the AI SDK's `RerankingModelV3` interface. + * Workers AI reranking model implementing the AI SDK's `RerankingModelV4` interface. * * Supports BGE reranker models (`@cf/baai/bge-reranker-base`, `bge-reranker-v2-m3`). * @@ -18,8 +18,8 @@ export type WorkersAIRerankingConfig = { * - Input: `{ query, contexts: [{ text }], top_k? }` * - Output: `{ response: [{ id, score }] }` */ -export class WorkersAIRerankingModel implements RerankingModelV3 { - readonly specificationVersion = "v3"; +export class WorkersAIRerankingModel implements RerankingModelV4 { + readonly specificationVersion = "v4"; get provider(): string { return this.config.provider; @@ -32,11 +32,11 @@ export class WorkersAIRerankingModel implements RerankingModelV3 { ) {} async doRerank( - options: Parameters[0], - ): Promise>> { + options: Parameters[0], + ): Promise>> { const { documents, query, topN, abortSignal } = options; - const warnings: Array = []; + const warnings: Array = []; // Convert AI SDK documents to Workers AI contexts format const contexts = documentsToContexts(documents, warnings); @@ -100,8 +100,8 @@ export class WorkersAIRerankingModel implements RerankingModelV3 { * - `{ type: 'object', values: JSONObject[] }` — JSON objects (stringified for Workers AI) */ function documentsToContexts( - documents: Parameters[0]["documents"], - warnings: Array, + documents: Parameters[0]["documents"], + warnings: Array, ): Array<{ text: string }> { if (documents.type === "text") { return documents.values.map((text) => ({ text })); diff --git a/packages/workers-ai-provider/src/workersai-speech-model.ts b/packages/workers-ai-provider/src/workersai-speech-model.ts index 7e114caba6..af3046bfda 100644 --- a/packages/workers-ai-provider/src/workersai-speech-model.ts +++ b/packages/workers-ai-provider/src/workersai-speech-model.ts @@ -1,4 +1,4 @@ -import type { SpeechModelV3, SharedV3Warning } from "@ai-sdk/provider"; +import type { SpeechModelV4, SharedV4Warning } from "@ai-sdk/provider"; import { apiCallErrorFromResponse, normalizeBindingError } from "./workersai-error"; import type { WorkersAISpeechSettings } from "./workersai-speech-settings"; import type { SpeechModels } from "./workersai-models"; @@ -10,13 +10,13 @@ export type WorkersAISpeechConfig = { }; /** - * Workers AI speech (text-to-speech) model implementing the AI SDK's `SpeechModelV3` interface. + * Workers AI speech (text-to-speech) model implementing the AI SDK's `SpeechModelV4` interface. * * Currently supports Deepgram Aura-1 (`@cf/deepgram/aura-1`). * The model accepts `{ text, voice?, speed? }` and returns raw audio bytes. */ -export class WorkersAISpeechModel implements SpeechModelV3 { - readonly specificationVersion = "v3"; +export class WorkersAISpeechModel implements SpeechModelV4 { + readonly specificationVersion = "v4"; get provider(): string { return this.config.provider; @@ -29,11 +29,11 @@ export class WorkersAISpeechModel implements SpeechModelV3 { ) {} async doGenerate( - options: Parameters[0], - ): Promise>> { + options: Parameters[0], + ): Promise>> { const { text, voice, speed, abortSignal } = options; - const warnings: Array = []; + const warnings: Array = []; if (options.instructions) { warnings.push({ diff --git a/packages/workers-ai-provider/src/workersai-transcription-model.ts b/packages/workers-ai-provider/src/workersai-transcription-model.ts index 4edc5cb170..f241ae77cc 100644 --- a/packages/workers-ai-provider/src/workersai-transcription-model.ts +++ b/packages/workers-ai-provider/src/workersai-transcription-model.ts @@ -1,4 +1,4 @@ -import type { TranscriptionModelV3, SharedV3Warning } from "@ai-sdk/provider"; +import type { TranscriptionModelV4, SharedV4Warning } from "@ai-sdk/provider"; import type { WorkersAITranscriptionSettings } from "./workersai-transcription-settings"; import type { TranscriptionModels } from "./workersai-models"; import { createRunBinary, type CreateRunConfig } from "./utils"; @@ -21,14 +21,14 @@ export type WorkersAITranscriptionConfig = { }; /** - * Workers AI transcription model implementing the AI SDK's `TranscriptionModelV3` interface. + * Workers AI transcription model implementing the AI SDK's `TranscriptionModelV4` interface. * * Supports: * - Whisper models (`@cf/openai/whisper`, `whisper-tiny-en`, `whisper-large-v3-turbo`) * - Deepgram Nova-3 (`@cf/deepgram/nova-3`) — uses a different input/output format */ -export class WorkersAITranscriptionModel implements TranscriptionModelV3 { - readonly specificationVersion = "v3"; +export class WorkersAITranscriptionModel implements TranscriptionModelV4 { + readonly specificationVersion = "v4"; get provider(): string { return this.config.provider; @@ -41,11 +41,11 @@ export class WorkersAITranscriptionModel implements TranscriptionModelV3 { ) {} async doGenerate( - options: Parameters[0], - ): Promise>> { + options: Parameters[0], + ): Promise>> { const { audio, mediaType, abortSignal } = options; - const warnings: Array = []; + const warnings: Array = []; // The AI SDK always converts audio to Uint8Array via // convertDataContentToUint8Array before calling doGenerate. @@ -114,8 +114,8 @@ export class WorkersAITranscriptionModel implements TranscriptionModelV3 { private normalizeWhisperResponse( raw: Record, - warnings: Array, - ): Awaited> { + warnings: Array, + ): Awaited> { const text = (raw.text as string) ?? ""; // Build segments from Whisper's various formats @@ -199,8 +199,8 @@ export class WorkersAITranscriptionModel implements TranscriptionModelV3 { private normalizeNova3Response( raw: Record, - warnings: Array, - ): Awaited> { + warnings: Array, + ): Awaited> { // Nova-3 format: { results: { channels: [{ alternatives: [{ transcript, words }] }] } } const results = raw.results as Record | undefined; const channels = results?.channels as diff --git a/packages/workers-ai-provider/test/autorag.test.ts b/packages/workers-ai-provider/test/autorag.test.ts index e49ff033b4..a0491288e1 100644 --- a/packages/workers-ai-provider/test/autorag.test.ts +++ b/packages/workers-ai-provider/test/autorag.test.ts @@ -184,7 +184,7 @@ describe("AI Search - provider API", () => { }); const model = aisearch(); - expect(model.specificationVersion).toBe("v3"); + expect(model.specificationVersion).toBe("v4"); expect(model.provider).toBe("aisearch.chat"); }); @@ -194,7 +194,7 @@ describe("AI Search - provider API", () => { }); const model = aisearch.chat(); - expect(model.specificationVersion).toBe("v3"); + expect(model.specificationVersion).toBe("v4"); expect(model.provider).toBe("aisearch.chat"); }); diff --git a/packages/workers-ai-provider/test/client-fallback.test.ts b/packages/workers-ai-provider/test/client-fallback.test.ts index 3b92e01789..8618c84346 100644 --- a/packages/workers-ai-provider/test/client-fallback.test.ts +++ b/packages/workers-ai-provider/test/client-fallback.test.ts @@ -1,12 +1,12 @@ -import type { LanguageModelV3, LanguageModelV3StreamResult } from "@ai-sdk/provider"; +import type { LanguageModelV4, LanguageModelV4StreamResult } from "@ai-sdk/provider"; import { describe, expect, it, vi } from "vitest"; import { createClientFallbackModel, type FallbackLeg } from "../src/client-fallback"; import { WorkersAIFallbackError, WorkersAIGatewayError } from "../src/errors"; -function stubModel(modelId: string, behavior: { ok: true } | { throw: unknown }): LanguageModelV3 { - const result = { stream: new ReadableStream() } as unknown as LanguageModelV3StreamResult; +function stubModel(modelId: string, behavior: { ok: true } | { throw: unknown }): LanguageModelV4 { + const result = { stream: new ReadableStream() } as unknown as LanguageModelV4StreamResult; return { - specificationVersion: "v3", + specificationVersion: "v4", provider: "stub", modelId, supportedUrls: {}, @@ -21,7 +21,7 @@ function stubModel(modelId: string, behavior: { ok: true } | { throw: unknown }) }; } -function leg(slug: string, model: LanguageModelV3): FallbackLeg { +function leg(slug: string, model: LanguageModelV4): FallbackLeg { return { slug, model, transport: "run" }; } diff --git a/packages/workers-ai-provider/test/convert-to-workersai-chat-messages.test.ts b/packages/workers-ai-provider/test/convert-to-workersai-chat-messages.test.ts index 10817ee12f..e86aaad8d1 100644 --- a/packages/workers-ai-provider/test/convert-to-workersai-chat-messages.test.ts +++ b/packages/workers-ai-provider/test/convert-to-workersai-chat-messages.test.ts @@ -291,7 +291,7 @@ describe("convertToWorkersAIChatMessages", () => { { type: "text" as const, text: "What's in this image?" }, { type: "file" as const, - data: imageData, + data: { type: "data" as const, data: imageData }, mediaType: "image/png", providerOptions: undefined, }, @@ -323,7 +323,7 @@ describe("convertToWorkersAIChatMessages", () => { { type: "text" as const, text: "First" }, { type: "file" as const, - data: new Uint8Array([1, 2, 3]), + data: { type: "data" as const, data: new Uint8Array([1, 2, 3]) }, mediaType: "image/png", providerOptions: undefined, }, @@ -348,7 +348,7 @@ describe("convertToWorkersAIChatMessages", () => { content: [ { type: "file" as const, - data: new Uint8Array([1, 2, 3]), + data: { type: "data" as const, data: new Uint8Array([1, 2, 3]) }, mediaType: "image/jpeg", providerOptions: undefined, }, @@ -377,7 +377,7 @@ describe("convertToWorkersAIChatMessages", () => { { type: "text" as const, text: "Describe this image" }, { type: "file" as const, - data: base64, + data: { type: "data" as const, data: base64 }, mediaType: "image/png", providerOptions: undefined, }, @@ -407,7 +407,7 @@ describe("convertToWorkersAIChatMessages", () => { { type: "text" as const, text: "What is this?" }, { type: "file" as const, - data: dataUrl, + data: { type: "data" as const, data: dataUrl }, mediaType: "image/jpeg", providerOptions: undefined, }, @@ -432,7 +432,7 @@ describe("convertToWorkersAIChatMessages", () => { content: [ { type: "file" as const, - data: new URL("https://example.com/image.png"), + data: { type: "url" as const, url: new URL("https://example.com/image.png") }, mediaType: "image/png", providerOptions: undefined, }, @@ -453,7 +453,7 @@ describe("convertToWorkersAIChatMessages", () => { { type: "text" as const, text: "Summarize this PDF" }, { type: "file" as const, - data: new Uint8Array([0x25, 0x50, 0x44, 0x46]), + data: { type: "data" as const, data: new Uint8Array([0x25, 0x50, 0x44, 0x46]) }, mediaType: "application/pdf", providerOptions: undefined, }, @@ -473,7 +473,7 @@ describe("convertToWorkersAIChatMessages", () => { content: [ { type: "file" as const, - data: new Uint8Array([1, 2, 3]), + data: { type: "data" as const, data: new Uint8Array([1, 2, 3]) }, providerOptions: undefined, } as any, ], @@ -492,7 +492,7 @@ describe("convertToWorkersAIChatMessages", () => { content: [ { type: "file" as const, - data: new Uint8Array([0x25, 0x50, 0x44, 0x46]), + data: { type: "data" as const, data: new Uint8Array([0x25, 0x50, 0x44, 0x46]) }, mediaType: "application/pdf", providerOptions: undefined, }, @@ -513,7 +513,7 @@ describe("convertToWorkersAIChatMessages", () => { { type: "text" as const, text: "What is this?" }, { type: "file" as const, - data: new Uint8Array([0xff, 0xd8, 0xff, 0xe0]), + data: { type: "data" as const, data: new Uint8Array([0xff, 0xd8, 0xff, 0xe0]) }, mediaType: "IMAGE/JPEG", providerOptions: undefined, }, @@ -554,13 +554,13 @@ describe("convertToWorkersAIChatMessages", () => { { type: "text" as const, text: "Compare these images" }, { type: "file" as const, - data: new Uint8Array([1, 2, 3]), + data: { type: "data" as const, data: new Uint8Array([1, 2, 3]) }, mediaType: "image/png", providerOptions: undefined, }, { type: "file" as const, - data: new Uint8Array([4, 5, 6]), + data: { type: "data" as const, data: new Uint8Array([4, 5, 6]) }, mediaType: "image/jpeg", providerOptions: undefined, }, @@ -675,7 +675,7 @@ describe("convertToWorkersAIChatMessages", () => { describe("tool result output unwrapping", () => { it("should unwrap text output — not stringify the wrapper object", () => { - // LanguageModelV3ToolResultOutput is { type: 'text', value: string } + // LanguageModelV4ToolResultOutput is { type: 'text', value: string } // The value must be sent to the API, not the wrapper object itself. const { messages } = convertToWorkersAIChatMessages([ { diff --git a/packages/workers-ai-provider/test/create-workers-ai.test.ts b/packages/workers-ai-provider/test/create-workers-ai.test.ts index 724fd77469..bd61da3c64 100644 --- a/packages/workers-ai-provider/test/create-workers-ai.test.ts +++ b/packages/workers-ai-provider/test/create-workers-ai.test.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3 } from "@ai-sdk/provider"; +import type { LanguageModelV4 } from "@ai-sdk/provider"; import { generateText } from "ai"; import { describe, expect, it, vi } from "vitest"; import { createWorkersAI } from "../src/index"; @@ -25,10 +25,10 @@ const openaiPlugin: ProviderPlugin = { wireFormat: "openai", create: ({ modelId }) => ({ - specificationVersion: "v3", + specificationVersion: "v4", modelId, provider: "test.openai", - }) as unknown as LanguageModelV3, + }) as unknown as LanguageModelV4, }; // --------------------------------------------------------------------------- diff --git a/packages/workers-ai-provider/test/e2e/fixtures/binding-worker/src/index.ts b/packages/workers-ai-provider/test/e2e/fixtures/binding-worker/src/index.ts index 8e859dc31c..fd2be9856f 100644 --- a/packages/workers-ai-provider/test/e2e/fixtures/binding-worker/src/index.ts +++ b/packages/workers-ai-provider/test/e2e/fixtures/binding-worker/src/index.ts @@ -8,12 +8,12 @@ import { createWorkersAI, createAISearch } from "../../../../../src/index"; import { generateText, streamText, - stepCountIs, + isStepCount, Output, embedMany, generateImage, - experimental_transcribe as transcribe, - experimental_generateSpeech as generateSpeech, + transcribe, + generateSpeech, rerank, } from "ai"; import { z } from "zod/v4"; @@ -143,7 +143,7 @@ export default { }), }, }, - stopWhen: stepCountIs(2), + stopWhen: isStepCount(2), }); return jsonResponse({ @@ -177,7 +177,7 @@ export default { }), }, }, - stopWhen: stepCountIs(4), + stopWhen: isStepCount(4), }); const toolCallCount = result.steps.reduce( diff --git a/packages/workers-ai-provider/test/e2e/workers-ai-rest.e2e.test.ts b/packages/workers-ai-provider/test/e2e/workers-ai-rest.e2e.test.ts index e45a2a7e24..74acf0313f 100644 --- a/packages/workers-ai-provider/test/e2e/workers-ai-rest.e2e.test.ts +++ b/packages/workers-ai-provider/test/e2e/workers-ai-rest.e2e.test.ts @@ -16,12 +16,12 @@ import { config } from "dotenv"; import { generateText, streamText, - stepCountIs, + isStepCount, Output, generateImage, embedMany, - experimental_transcribe as transcribe, - experimental_generateSpeech as generateSpeech, + transcribe, + generateSpeech, rerank, } from "ai"; import { z } from "zod/v4"; @@ -306,7 +306,7 @@ describe.skipIf(skip())("Workers AI REST E2E", () => { }), }, }, - stopWhen: stepCountIs(2), + stopWhen: isStepCount(2), }); // Check if tool was called (step count > 1 means round-trip happened) @@ -366,7 +366,7 @@ describe.skipIf(skip())("Workers AI REST E2E", () => { }), }, }, - stopWhen: stepCountIs(4), + stopWhen: isStepCount(4), }); const toolCallCount = result.steps.reduce( diff --git a/packages/workers-ai-provider/test/gateway-delegate.test.ts b/packages/workers-ai-provider/test/gateway-delegate.test.ts index d886e081f0..038cf11a33 100644 --- a/packages/workers-ai-provider/test/gateway-delegate.test.ts +++ b/packages/workers-ai-provider/test/gateway-delegate.test.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3 } from "@ai-sdk/provider"; +import type { LanguageModelV4 } from "@ai-sdk/provider"; import { describe, expect, it, vi } from "vitest"; import { createGatewayDelegate, @@ -162,7 +162,7 @@ function capturePlugin(wireFormat: "openai" | "anthropic" | "google"): { wireFormat, create: ({ modelId, fetch }) => { captured = fetch; - return { specificationVersion: "v3", modelId } as unknown as LanguageModelV3; + return { specificationVersion: "v4", modelId } as unknown as LanguageModelV4; }, }, getFetch: () => { @@ -196,13 +196,13 @@ function fallbackPlugin( return `${modelId}:${await resp.text()}`; }; return { - specificationVersion: "v3", + specificationVersion: "v4", provider: wireFormat, modelId, supportedUrls: {}, doGenerate: async () => ({ content: [{ type: "text", text: await call() }] }), doStream: async () => ({ stream: new ReadableStream(), text: await call() }), - } as unknown as LanguageModelV3; + } as unknown as LanguageModelV4; }, }; } diff --git a/packages/workers-ai-provider/test/map-workersai-finish-reason.test.ts b/packages/workers-ai-provider/test/map-workersai-finish-reason.test.ts index 996ed6d8c7..624402b8fc 100644 --- a/packages/workers-ai-provider/test/map-workersai-finish-reason.test.ts +++ b/packages/workers-ai-provider/test/map-workersai-finish-reason.test.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV3FinishReason } from "@ai-sdk/provider"; +import type { LanguageModelV4FinishReason } from "@ai-sdk/provider"; import { describe, expect, it } from "vitest"; import { mapWorkersAIFinishReason } from "../src/map-workersai-finish-reason"; @@ -63,7 +63,7 @@ describe("mapWorkersAIFinishReason", () => { }); describe("return type validation", () => { - it("should return a valid LanguageModelV3FinishReason type", () => { + it("should return a valid LanguageModelV4FinishReason type", () => { const validUnifiedReasons = ["stop", "length", "tool-calls", "error", "other"]; // Test that all our mapped unified values are valid @@ -80,7 +80,7 @@ describe("mapWorkersAIFinishReason", () => { describe("comprehensive mapping test", () => { it("should handle all expected inputs correctly", () => { - const testCases: Array<[string | null | undefined, LanguageModelV3FinishReason]> = [ + const testCases: Array<[string | null | undefined, LanguageModelV4FinishReason]> = [ ["stop", { unified: "stop", raw: "stop" }], ["length", { unified: "length", raw: "length" }], ["model_length", { unified: "length", raw: "model_length" }], diff --git a/packages/workers-ai-provider/test/rest-media.test.ts b/packages/workers-ai-provider/test/rest-media.test.ts index 95d3a38875..bd49bb3c90 100644 --- a/packages/workers-ai-provider/test/rest-media.test.ts +++ b/packages/workers-ai-provider/test/rest-media.test.ts @@ -1,6 +1,6 @@ import { - experimental_generateSpeech as generateSpeech, - experimental_transcribe as transcribe, + generateSpeech, + transcribe, generateImage, rerank, } from "ai"; diff --git a/packages/workers-ai-provider/test/speech.test.ts b/packages/workers-ai-provider/test/speech.test.ts index 909f8b97fc..4d065aad64 100644 --- a/packages/workers-ai-provider/test/speech.test.ts +++ b/packages/workers-ai-provider/test/speech.test.ts @@ -1,5 +1,5 @@ import { APICallError } from "@ai-sdk/provider"; -import { experimental_generateSpeech as generateSpeech } from "ai"; +import { generateSpeech } from "ai"; import { describe, expect, it } from "vitest"; import { createWorkersAI } from "../src/index"; diff --git a/packages/workers-ai-provider/test/transcription.test.ts b/packages/workers-ai-provider/test/transcription.test.ts index 0322fd0b3e..4986088525 100644 --- a/packages/workers-ai-provider/test/transcription.test.ts +++ b/packages/workers-ai-provider/test/transcription.test.ts @@ -1,5 +1,5 @@ import { APICallError } from "@ai-sdk/provider"; -import { experimental_transcribe as transcribe } from "ai"; +import { transcribe } from "ai"; import { describe, expect, it } from "vitest"; import { createWorkersAI } from "../src/index"; diff --git a/patches/@ai-sdk__google-vertex.patch b/patches/@ai-sdk__google-vertex.patch index ce169e466b..4a79c6a704 100644 --- a/patches/@ai-sdk__google-vertex.patch +++ b/patches/@ai-sdk__google-vertex.patch @@ -1,20 +1,8 @@ diff --git a/dist/edge/index.js b/dist/edge/index.js -index 079ab83ed4518113abdc847cc2f644a654a656ec..beffbc925b35aea015d27e936cf5208bcbcc9c8b 100644 +index 55d5aaabb7f76c338498f01e31d13e54561113d0..c1fac12d90d253c6dc87d99e4af1f6a6fe43f086 100644 --- a/dist/edge/index.js +++ b/dist/edge/index.js -@@ -587,6 +587,7 @@ var buildJwt = async (credentials) => { - }; - async function generateAuthToken(credentials) { - try { -+ if(credentials.cfApiKey) return credentials.cfApiKey; - const creds = credentials || await loadCredentials(); - const jwt = await buildJwt(creds); - const response = await fetch("https://oauth2.googleapis.com/token", { -diff --git a/dist/edge/index.mjs b/dist/edge/index.mjs -index 89a0c0ef49b4beaa1d53fdff49f1dea93333dc8a..be6988f70fc17c058183c17da2fd9f1a9a9dee26 100644 ---- a/dist/edge/index.mjs -+++ b/dist/edge/index.mjs -@@ -587,6 +587,7 @@ var buildJwt = async (credentials) => { +@@ -1412,6 +1412,7 @@ var buildJwt = async (credentials) => { }; async function generateAuthToken(credentials) { try { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e730c80e0..4eb8597ad4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,15 +5,15 @@ settings: excludeLinksFromLockfile: false patchedDependencies: - '@ai-sdk/google-vertex': 5015d8c7ff40e99b6b6d204430f0750dda43beda4beda4e6817b38cd2b057184 + '@ai-sdk/google-vertex@^5': 7af1853481d7b74666d27cebbed5fce392545d6167e30bd53188c8c439aa77d0 importers: .: devDependencies: '@ai-sdk/openai': - specifier: ^3.0.71 - version: 3.0.71(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@changesets/changelog-github': specifier: ^0.7.0 version: 0.7.0 @@ -34,10 +34,10 @@ importers: version: 5.3.4 agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) dotenv: specifier: ^17.4.2 version: 17.4.2 @@ -88,16 +88,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -131,16 +131,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -174,16 +174,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -217,16 +217,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -272,14 +272,14 @@ importers: demos/image-generation: dependencies: ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -524,20 +524,20 @@ importers: demos/model-scraper: dependencies: '@ai-sdk/openai': - specifier: ^3.0.71 - version: 3.0.71(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@4.0.5(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -571,16 +571,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -614,16 +614,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -657,16 +657,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1054,16 +1054,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1094,16 +1094,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1136,11 +1136,11 @@ importers: demos/structured-output-node: dependencies: ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1165,16 +1165,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1205,16 +1205,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1248,16 +1248,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1291,16 +1291,16 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1334,10 +1334,10 @@ importers: dependencies: agents: specifier: ^0.17.1 - version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@6.0.204(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 @@ -1373,11 +1373,11 @@ importers: demos/ui-worker: dependencies: '@ai-sdk/openai': - specifier: ^3.0.71 - version: 3.0.71(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/react': - specifier: ^3.0.206 - version: 3.0.206(react@19.2.7)(zod@4.4.3) + specifier: ^4.0.12 + version: 4.0.12(react@19.2.7)(zod@4.4.3) '@mantine/charts': specifier: ^9.4.1 version: 9.4.1(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(recharts@3.9.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@18.3.1)(react@19.2.7)(redux@5.0.1)) @@ -1403,8 +1403,8 @@ importers: specifier: ^9.4.1 version: 9.4.1(@mantine/core@9.4.1(@mantine/hooks@9.4.1(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.4.1(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 @@ -1467,8 +1467,8 @@ importers: demos/vision: dependencies: ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.27 @@ -1480,7 +1480,7 @@ importers: version: 19.2.7(react@19.2.7) workers-ai-provider: specifier: ^3.2.1 - version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)) + version: 3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1559,17 +1559,17 @@ importers: examples/workers-ai: dependencies: '@ai-sdk/anthropic': - specifier: ^3.0.84 - version: 3.0.84(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/openai': - specifier: ^3.0.71 - version: 3.0.71(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/react': - specifier: ^3.0.206 - version: 3.0.206(react@19.2.7)(zod@4.4.3) + specifier: ^4.0.12 + version: 4.0.12(react@19.2.7)(zod@4.4.3) ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) react: specifier: ^19.2.7 version: 19.2.7 @@ -1617,17 +1617,17 @@ importers: packages/ai-gateway-provider: dependencies: '@ai-sdk/openai-compatible': - specifier: ^2.0.0 - version: 2.0.50(zod@4.4.3) + specifier: ^3.0.3 + version: 3.0.3(zod@4.4.3) '@ai-sdk/provider': - specifier: ^3.0.0 - version: 3.0.10 + specifier: ^4.0.1 + version: 4.0.1 '@ai-sdk/provider-utils': - specifier: ^4.0.0 - version: 4.0.29(zod@4.4.3) + specifier: ^5.0.3 + version: 5.0.3(zod@4.4.3) ai: - specifier: ^6.0.0 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) devDependencies: '@cloudflare/gateway-core': specifier: workspace:* @@ -1640,62 +1640,62 @@ importers: version: 6.0.3 optionalDependencies: '@ai-sdk/amazon-bedrock': - specifier: ^4.0.117 - version: 4.0.117(zod@4.4.3) + specifier: ^5.0.8 + version: 5.0.8(zod@4.4.3) '@ai-sdk/anthropic': - specifier: ^3.0.84 - version: 3.0.84(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/azure': - specifier: ^3.0.74 - version: 3.0.74(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/cerebras': - specifier: ^2.0.56 - version: 2.0.56(zod@4.4.3) + specifier: ^3.0.3 + version: 3.0.3(zod@4.4.3) '@ai-sdk/cohere': - specifier: ^3.0.38 - version: 3.0.38(zod@4.4.3) + specifier: ^4.0.3 + version: 4.0.3(zod@4.4.3) '@ai-sdk/deepgram': - specifier: ^2.0.35 - version: 2.0.35(zod@4.4.3) + specifier: ^3.0.3 + version: 3.0.3(zod@4.4.3) '@ai-sdk/deepseek': - specifier: ^2.0.38 - version: 2.0.38(zod@4.4.3) + specifier: ^3.0.3 + version: 3.0.3(zod@4.4.3) '@ai-sdk/elevenlabs': - specifier: ^2.0.35 - version: 2.0.35(zod@4.4.3) + specifier: ^3.0.4 + version: 3.0.4(zod@4.4.3) '@ai-sdk/fireworks': - specifier: ^2.0.56 - version: 2.0.56(zod@4.4.3) + specifier: ^3.0.4 + version: 3.0.4(zod@4.4.3) '@ai-sdk/google': - specifier: ^3.0.82 - version: 3.0.82(zod@4.4.3) + specifier: ^4.0.6 + version: 4.0.6(zod@4.4.3) '@ai-sdk/google-vertex': - specifier: ^4.0.145 - version: 4.0.145(patch_hash=5015d8c7ff40e99b6b6d204430f0750dda43beda4beda4e6817b38cd2b057184)(zod@4.4.3) + specifier: ^5.0.8 + version: 5.0.8(patch_hash=7af1853481d7b74666d27cebbed5fce392545d6167e30bd53188c8c439aa77d0)(zod@4.4.3) '@ai-sdk/groq': - specifier: ^3.0.41 - version: 3.0.41(zod@4.4.3) + specifier: ^4.0.3 + version: 4.0.3(zod@4.4.3) '@ai-sdk/mistral': - specifier: ^3.0.39 - version: 3.0.39(zod@4.4.3) + specifier: ^4.0.3 + version: 4.0.3(zod@4.4.3) '@ai-sdk/openai': - specifier: ^3.0.71 - version: 3.0.71(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/perplexity': - specifier: ^3.0.35 - version: 3.0.35(zod@4.4.3) + specifier: ^4.0.4 + version: 4.0.4(zod@4.4.3) '@ai-sdk/xai': - specifier: ^3.0.95 - version: 3.0.95(zod@4.4.3) + specifier: ^4.0.4 + version: 4.0.4(zod@4.4.3) '@openrouter/ai-sdk-provider': specifier: ^2.10.0 - version: 2.10.0(ai@6.0.204(zod@4.4.3))(zod@4.4.3) + version: 2.10.0(ai@7.0.11(zod@4.4.3))(zod@4.4.3) packages/gateway-core: devDependencies: '@ai-sdk/provider': - specifier: ^3.0.10 - version: 3.0.10 + specifier: ^4.0.1 + version: 4.0.1 '@cloudflare/workers-types': specifier: ^4.20260628.1 version: 4.20260628.1 @@ -1756,17 +1756,17 @@ importers: packages/workers-ai-provider: devDependencies: '@ai-sdk/anthropic': - specifier: ^3.0.84 - version: 3.0.84(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/google': - specifier: ^3.0.0 - version: 3.0.82(zod@4.4.3) + specifier: ^4.0.6 + version: 4.0.6(zod@4.4.3) '@ai-sdk/openai': - specifier: ^3.0.71 - version: 3.0.71(zod@4.4.3) + specifier: ^4.0.5 + version: 4.0.5(zod@4.4.3) '@ai-sdk/provider': - specifier: ^3.0.10 - version: 3.0.10 + specifier: ^4.0.1 + version: 4.0.1 '@cloudflare/gateway-core': specifier: workspace:* version: link:../gateway-core @@ -1774,8 +1774,8 @@ importers: specifier: ^4.20260628.1 version: 4.20260628.1 ai: - specifier: ^6.0.204 - version: 6.0.204(zod@4.4.3) + specifier: ^7.0.11 + version: 7.0.11(zod@4.4.3) zod: specifier: ^4.4.3 version: 4.4.3 @@ -1785,9 +1785,9 @@ packages: '@ag-ui/core@0.0.52': resolution: {integrity: sha512-Xo0bUaNV56EqylzcrAuhUkQX7et7+SZIrqZZtEByGwEq/I1EHny6ZMkWHLkKR7UNi0FJZwJyhKYmKJS3B2SEgA==} - '@ai-sdk/amazon-bedrock@4.0.117': - resolution: {integrity: sha512-MebXAEsdvNdzKZCbVxFK0668KhYrs6W3mMH5fWT5Yc0TMSSTbwPI9fIw0sOzxLWd9TE9cJz73vVPjQjtG3vj/Q==} - engines: {node: '>=18'} + '@ai-sdk/amazon-bedrock@5.0.8': + resolution: {integrity: sha512-E4TozODmCKGS5VlCBnCR1Iffd0e0hkcbjpjzlqvxQPTJlw0hm9sJ3vltAIRU3wTKVTn0BfZiKzYylu2CAEyP6g==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1797,45 +1797,51 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/azure@3.0.74': - resolution: {integrity: sha512-v71b/dQ12HDOWqZhdCSvLgxkFnFrFhqTn/hMBCXx2wS0B+QZwTT9wluX4ZCEGQCiUBkA6Vs+8AzowwXgp4Yo+w==} - engines: {node: '>=18'} + '@ai-sdk/anthropic@4.0.5': + resolution: {integrity: sha512-JyJYKWGYz8vfoQ1pCm48a9zgX3Gvb2/6iGHb+8pEelpqnOiUq3aDHVq+nYMf9VepqcjCuH0JSOwBrKiPg/PD9w==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/cerebras@2.0.56': - resolution: {integrity: sha512-TI5qdzS1heqVl7XeKepUMdE3MW1lTq2lRPNy2LxVp9ohQ5REcQHqAR9V9ZNLE4xq/LgBxofjKCmbSfRHk3iegA==} - engines: {node: '>=18'} + '@ai-sdk/azure@4.0.5': + resolution: {integrity: sha512-/zVpvIbQEtFIWSb49bbWJ6xB3eQsJGibStCruTc/3SRfeQw8sco/1sCLsmCTK/+W0aeyv+iswCcPjBJBAXbNUw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/cohere@3.0.38': - resolution: {integrity: sha512-1hicLBI4iRb4MGDyE2pm1XF/jo9oIfT+IjTa032azkMEvXillopazvd1XxyCZHsH3obFe1o9xsXkRLti8kyrIg==} - engines: {node: '>=18'} + '@ai-sdk/cerebras@3.0.3': + resolution: {integrity: sha512-/qfq+Mg1iqldJJ9JWmFSNyms5/TgaZ0L9YEsfdVKhpqfEctZsp3vRjdLDpc+GzyuxMj3KmQ559wfNL9NvlvFAg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/deepgram@2.0.35': - resolution: {integrity: sha512-awBjUhosRS9qfo5IHP1S+JMiVortq59mtlceVO4cQZ0ijbdwjv1z598umeXxggyjpgo4awFivU4uTzCtVQ+cAA==} - engines: {node: '>=18'} + '@ai-sdk/cohere@4.0.3': + resolution: {integrity: sha512-wDX+2IY/i9hiatxfp8UsvCo5TrQB6DnWOvqp4CK0b7cfPOQ0+dO+R3P5hDSluP7LFoHL+LJW3y+j436U+rvzUQ==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/deepseek@2.0.38': - resolution: {integrity: sha512-IkBQPEfRUbPEcWzigT76KttqoDqM4FR8H8cp5pgAw5RdDN++nUoJa0uZan3LuOp4IC8BKGZABJCqB97CMIYLdQ==} - engines: {node: '>=18'} + '@ai-sdk/deepgram@3.0.3': + resolution: {integrity: sha512-S13S8f23+qr4x8HGfUJK2UtNcWjeRXq5UMPhGncuZgAnBNxeveMFbNh2FHlKAiGJlIuWC8dndRnuVzJkRk7itQ==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/elevenlabs@2.0.35': - resolution: {integrity: sha512-KjgM2IDMwm1qTKaW2n2qCr2ok9/wlhUC9ggNvyYYeCupEEGR8Gki1oFRA16PsBcyEr98k+kaKw4cF6D0XaVWWA==} - engines: {node: '>=18'} + '@ai-sdk/deepseek@3.0.3': + resolution: {integrity: sha512-OCfJ8GEcDMbPESx1ijKDE1QKLst08dWsbR/gDbrzJV+NtAi1UkcrkiP7OclmWGuHEBMdZ7rHbM+muCXy+9mFsg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/fireworks@2.0.56': - resolution: {integrity: sha512-fzgsoDFC+9LAUZaeIToeGpJ9ridPwqUjFYKT2QpXx6p/WnaQE7yHQyoifJ6MuP/rlDbNt/DK1UQWsAkOtcTk1w==} - engines: {node: '>=18'} + '@ai-sdk/elevenlabs@3.0.4': + resolution: {integrity: sha512-7XvEkA8hz4IDKIBNXIyC2V2hDu2/17O3oN7P/ZJ21eTnjd0QeHsSVLnjRBb7QKePjVB+DeZww88oTqJgkp+Ajg==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/fireworks@3.0.4': + resolution: {integrity: sha512-oXQXMufnQUWBVslhZoaoaJ3F5v+wZVreg6O/uHIf+l389onPE/g+CIt/JMDmcLqrx6A+m6Lhc2t82QYSwUlJOA==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1845,9 +1851,15 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google-vertex@4.0.145': - resolution: {integrity: sha512-48wlju7ksjARn6aa1vUZtPFDp+PXadHDpOsE8YHvi4wKVUf7Sxma+WYZNkIDts1b9Alv0BBZlkn5azLNciHD6g==} - engines: {node: '>=18'} + '@ai-sdk/gateway@4.0.8': + resolution: {integrity: sha512-esHzojMp+LllqOnEu6sYa6NKOmPcE5UObPV61LE6L2QAzCH6WHMgTS+Q/HF5HU3lVUWsHtkDzN7TNqMfv/ecCg==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/google-vertex@5.0.8': + resolution: {integrity: sha512-WRu4srlMC5l2DygS1q6Tb8Dqgcwwrdu9Lb/u+0LaLMJZK/zzfhO3bGpGpNxiIsv+k9GYQxvAc3o9NpPcgX9I5g==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1857,21 +1869,33 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/groq@3.0.41': - resolution: {integrity: sha512-J3zWdzUdSgE2B8e70i/4b5TGEzDc2Z2xN18AKUs9XCzPF7k6WHyaCCahDUB7JIhRN8Q2nWJ+LQQthl144vq9fg==} - engines: {node: '>=18'} + '@ai-sdk/google@4.0.6': + resolution: {integrity: sha512-YJnWlHVqG6Lq3NY5Z0hs1+8+P4GFTBLPkmnuFIGdsYi19qB7C36IpK2JOzdkyE47waVJuu6tq/d0rFyHZzY2MQ==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/mistral@3.0.39': - resolution: {integrity: sha512-drPs9K3a7A8LKvISzbXDoKlRD00CqeacKSSrjFDswCfCr1xS/4/GYUyJDt7UKykHW//iiiElSFWoea95yRQchg==} - engines: {node: '>=18'} + '@ai-sdk/groq@4.0.3': + resolution: {integrity: sha512-qi5McU6i4a3QY88/IVI7SIdqMil7ab4SUrON4f10k0lkt0xdzWZF4wD1ViGnq+8zKt00zi2j6DuXi21iyPtnbQ==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@2.0.50': - resolution: {integrity: sha512-HyuxddF2Yv5G8qxK/0uksAINjQ4h6TpwOqHuqzsCM0u78/JWAW2OXcIplQeB44PIAORgPjbMzrw9DhnPYHMskA==} - engines: {node: '>=18'} + '@ai-sdk/mcp@2.0.5': + resolution: {integrity: sha512-0FW3pcvfGEZ9VPSLSsDHxFN9+tMsUVZurVryCnsBWayzsueUPD6RYKkI9vYoqWAIwWFDEemCwZHeMzdHF/wsZQ==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/mistral@4.0.3': + resolution: {integrity: sha512-Y6Ulu3kHi4udEyIa6Jne5+7U3zznZdfmZ8+FVH9YAUOiA1Z3LRKXAZuj07Xclf8DqFJsqk2L6d7iuvGW5O8xrQ==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai-compatible@3.0.3': + resolution: {integrity: sha512-+mDaUS0q460pVs3oW2/Ps/vj4M2EZnYr1v6ng8TmzxnZPrYBuK7PGQIfckqFdWIdUI/gG8BXcaf8vukLKyGU6Q==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1881,9 +1905,15 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/perplexity@3.0.35': - resolution: {integrity: sha512-TAWWUF2W+qJrjtWhKN61o0dNguqS7NTDpILlsa39TTeCBZghlyLtiEIGjeclWzP/P/InicXza8ebw+dkGN36lg==} - engines: {node: '>=18'} + '@ai-sdk/openai@4.0.5': + resolution: {integrity: sha512-a9cYQNAKAbkMTt6bHAvDuLv3klwtJT9m0A6x7s8EZlf1ebcxadg/1CONaYh1GA80ZRA9UQHJUS2wHoOphkQQkg==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/perplexity@4.0.4': + resolution: {integrity: sha512-MVJzFO2w1/hcVQUEio1TartXjisfO9EPNBOphe0dnErWw08UBfqGmBvEyx4Nk24L8nz1uibSEGH+KNK0rqKABg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1893,19 +1923,35 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@5.0.3': + resolution: {integrity: sha512-El0JOXXGcHFe6+owJ1UV0VgB9XtdivP8vcZni+rUIt6lt+cBHCnUdddaA6LE2avJGJ5AD0uXSY+uAvRL2tSvgw==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider@3.0.10': resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} engines: {node: '>=18'} + '@ai-sdk/provider@4.0.1': + resolution: {integrity: sha512-6p3C/vGqVIjcptBu1DnVd/BZJ2wWmV9TUv9192vT6ZvT9KNED8EwRTqyqFpoQZKgSbMDSvBSq3dqR524Nt/Crw==} + engines: {node: '>=22'} + '@ai-sdk/react@3.0.206': resolution: {integrity: sha512-26gbPT876BZVXJlSNjqkCDOFiqfxAAhYn+a/ryV6ce5TWo6EfWQZeEiLrZOS6bxaOi7xxkB5uPZaZKFaIJndjQ==} engines: {node: '>=18'} peerDependencies: react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 - '@ai-sdk/xai@3.0.95': - resolution: {integrity: sha512-8pN/bekiBy4Nf0h9G934mpNg+izj+sAgKjqd3GcoGZKhj2I7d40khQlFxgzoA2xOQNzMfcKKNAUQb22EulB8OQ==} - engines: {node: '>=18'} + '@ai-sdk/react@4.0.12': + resolution: {integrity: sha512-uQmGQb1VEihU8cZ6mihgxfdILD35tx8QBkD9ni+HqBL9Lbdx6wOcgoMZUiYS/jATVqUXmmcZlhsplfj5EBc2bA==} + engines: {node: '>=22'} + peerDependencies: + react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 + + '@ai-sdk/xai@4.0.4': + resolution: {integrity: sha512-Wo3A2SzN2oRnFZEluYwBikKHv0M98fPW+gv2AQyEkecRklQuyZpqJeHWdAoE2WFIAhaEC0y2YBjmGe72mB3qqg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1927,17 +1973,6 @@ packages: zod: optional: true - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/types@3.901.0': - resolution: {integrity: sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==} - engines: {node: '>=18.0.0'} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -3617,40 +3652,20 @@ packages: resolution: {integrity: sha512-jejr34a8B4L5AS713wOAx1LAqNkW16HVMDEa6sYBvFDc/llUBl8hXaiI4BwF+Al+Sug19Vn2O7iokTVIhVvZ1Q==} engines: {node: '>= 18', npm: '>= 8.6.0'} - '@smithy/eventstream-codec@4.2.0': - resolution: {integrity: sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==} + '@smithy/core@3.28.0': + resolution: {integrity: sha512-N/LoLG8pZ1zv5cIWpdF6vmSjtZtXKK9G0OqT5yYCOZU+CzPq1+nYA95VoKJBGWRScs7YbMugZ7lZx8Fj1vdHoA==} engines: {node: '>=18.0.0'} - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.6.0': - resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} + '@smithy/eventstream-codec@4.4.4': + resolution: {integrity: sha512-DStvMemWlcZRXkP9XdCsinolM6yZd4fL2NiQItC8n/I+JC6utkLr0Dc+wLjLqjPyAJR1zXt7inSflea217yGlw==} engines: {node: '>=18.0.0'} - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + '@smithy/types@4.15.0': + resolution: {integrity: sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + '@smithy/util-utf8@4.4.4': + resolution: {integrity: sha512-kvxCWygmILHgwuIQKxocTHblTsF1eWLF/rBN5qjY7QmHfIglcqJoe/p9mo7uOR/dA+h3eVZVLZcmscxp+WtDCA==} engines: {node: '>=18.0.0'} '@speed-highlight/core@1.2.7': @@ -3971,6 +3986,9 @@ packages: '@vitest/utils@4.1.9': resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + '@workos-inc/node@10.7.0': resolution: {integrity: sha512-rffa9znZuIv4yo+9JRxGOLTTSxh0XhOT6jlsktgqEi9MuB9V0VFHRzLd3bTpkq+J9sgrPZNGpvX4aWNfMqt5cQ==} engines: {node: '>=22.11.0'} @@ -4037,6 +4055,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + ai@7.0.11: + resolution: {integrity: sha512-ecCtume1NKJG/8oIkV8G26KL9jmFJRx6+Gjx2260FcDZqIUGPiF1uBoNeGy4S1vxbHmFxUul4D7axqiXZZ1XuA==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -4738,6 +4762,10 @@ packages: resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} engines: {node: '>=18'} + gaxios@7.1.5: + resolution: {integrity: sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg==} + engines: {node: '>=18'} + gcp-metadata@8.1.2: resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} engines: {node: '>=18'} @@ -4794,6 +4822,10 @@ packages: resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} engines: {node: '>=18'} + google-auth-library@10.9.0: + resolution: {integrity: sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==} + engines: {node: '>=18'} + google-logging-utils@1.1.3: resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} engines: {node: '>=14'} @@ -5556,6 +5588,10 @@ packages: resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + postcss-js@4.0.1: resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -6063,8 +6099,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - swr@2.3.3: - resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} + swr@2.4.2: + resolution: {integrity: sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw==} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -6318,6 +6354,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utf-8-validate@5.0.10: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} @@ -6562,14 +6603,14 @@ snapshots: dependencies: zod: 3.25.76 - '@ai-sdk/amazon-bedrock@4.0.117(zod@4.4.3)': + '@ai-sdk/amazon-bedrock@5.0.8(zod@4.4.3)': dependencies: - '@ai-sdk/anthropic': 3.0.84(zod@4.4.3) - '@ai-sdk/openai': 3.0.71(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) - '@smithy/eventstream-codec': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@ai-sdk/anthropic': 4.0.5(zod@4.4.3) + '@ai-sdk/openai': 4.0.5(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + '@smithy/eventstream-codec': 4.4.4 + '@smithy/util-utf8': 4.4.4 aws4fetch: 1.0.20 zod: 4.4.3 optional: true @@ -6579,57 +6620,64 @@ snapshots: '@ai-sdk/provider': 3.0.10 '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) zod: 4.4.3 + optional: true - '@ai-sdk/azure@3.0.74(zod@4.4.3)': + '@ai-sdk/anthropic@4.0.5(zod@4.4.3)': dependencies: - '@ai-sdk/deepseek': 2.0.38(zod@4.4.3) - '@ai-sdk/openai': 3.0.71(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + zod: 4.4.3 + + '@ai-sdk/azure@4.0.5(zod@4.4.3)': + dependencies: + '@ai-sdk/deepseek': 3.0.3(zod@4.4.3) + '@ai-sdk/openai': 4.0.5(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/cerebras@2.0.56(zod@4.4.3)': + '@ai-sdk/cerebras@3.0.3(zod@4.4.3)': dependencies: - '@ai-sdk/openai-compatible': 2.0.50(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/openai-compatible': 3.0.3(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/cohere@3.0.38(zod@4.4.3)': + '@ai-sdk/cohere@4.0.3(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/deepgram@2.0.35(zod@4.4.3)': + '@ai-sdk/deepgram@3.0.3(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/deepseek@2.0.38(zod@4.4.3)': + '@ai-sdk/deepseek@3.0.3(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/elevenlabs@2.0.35(zod@4.4.3)': + '@ai-sdk/elevenlabs@3.0.4(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/fireworks@2.0.56(zod@4.4.3)': + '@ai-sdk/fireworks@3.0.4(zod@4.4.3)': dependencies: - '@ai-sdk/openai-compatible': 2.0.50(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/openai-compatible': 3.0.3(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true @@ -6639,15 +6687,23 @@ snapshots: '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) '@vercel/oidc': 3.2.0 zod: 4.4.3 + optional: true - '@ai-sdk/google-vertex@4.0.145(patch_hash=5015d8c7ff40e99b6b6d204430f0750dda43beda4beda4e6817b38cd2b057184)(zod@4.4.3)': + '@ai-sdk/gateway@4.0.8(zod@4.4.3)': dependencies: - '@ai-sdk/anthropic': 3.0.84(zod@4.4.3) - '@ai-sdk/google': 3.0.82(zod@4.4.3) - '@ai-sdk/openai-compatible': 2.0.50(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) - google-auth-library: 10.5.0 + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + '@vercel/oidc': 3.2.0 + zod: 4.4.3 + + '@ai-sdk/google-vertex@5.0.8(patch_hash=7af1853481d7b74666d27cebbed5fce392545d6167e30bd53188c8c439aa77d0)(zod@4.4.3)': + dependencies: + '@ai-sdk/anthropic': 4.0.5(zod@4.4.3) + '@ai-sdk/google': 4.0.6(zod@4.4.3) + '@ai-sdk/openai-compatible': 3.0.3(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + google-auth-library: 10.9.0 zod: 4.4.3 transitivePeerDependencies: - supports-color @@ -6658,25 +6714,39 @@ snapshots: '@ai-sdk/provider': 3.0.10 '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) zod: 4.4.3 + optional: true - '@ai-sdk/groq@3.0.41(zod@4.4.3)': + '@ai-sdk/google@4.0.6(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + zod: 4.4.3 + + '@ai-sdk/groq@4.0.3(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/mistral@3.0.39(zod@4.4.3)': + '@ai-sdk/mcp@2.0.5(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + pkce-challenge: 5.0.1 + zod: 4.4.3 + + '@ai-sdk/mistral@4.0.3(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true - '@ai-sdk/openai-compatible@2.0.50(zod@4.4.3)': + '@ai-sdk/openai-compatible@3.0.3(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 '@ai-sdk/openai@3.0.71(zod@4.4.3)': @@ -6684,11 +6754,18 @@ snapshots: '@ai-sdk/provider': 3.0.10 '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) zod: 4.4.3 + optional: true - '@ai-sdk/perplexity@3.0.35(zod@4.4.3)': + '@ai-sdk/openai@4.0.5(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + zod: 4.4.3 + + '@ai-sdk/perplexity@4.0.4(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true @@ -6698,26 +6775,53 @@ snapshots: '@standard-schema/spec': 1.1.0 eventsource-parser: 3.1.0 zod: 4.4.3 + optional: true + + '@ai-sdk/provider-utils@5.0.3(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 4.0.1 + '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.1.0 + zod: 4.4.3 '@ai-sdk/provider@3.0.10': dependencies: json-schema: 0.4.0 + optional: true + + '@ai-sdk/provider@4.0.1': + dependencies: + json-schema: 0.4.0 '@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3)': dependencies: '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) ai: 6.0.204(zod@4.4.3) react: 19.2.7 - swr: 2.3.3(react@19.2.7) + swr: 2.4.2(react@19.2.7) throttleit: 2.1.0 transitivePeerDependencies: - zod + optional: true - '@ai-sdk/xai@3.0.95(zod@4.4.3)': + '@ai-sdk/react@4.0.12(react@19.2.7)(zod@4.4.3)': dependencies: - '@ai-sdk/openai-compatible': 2.0.50(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) + '@ai-sdk/mcp': 2.0.5(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + ai: 7.0.11(zod@4.4.3) + react: 19.2.7 + swr: 2.4.2(react@19.2.7) + throttleit: 2.1.0 + transitivePeerDependencies: + - zod + + '@ai-sdk/xai@4.0.4(zod@4.4.3)': + dependencies: + '@ai-sdk/openai-compatible': 3.0.3(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) zod: 4.4.3 optional: true @@ -6737,26 +6841,6 @@ snapshots: zod: 4.4.3 optional: true - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.901.0 - tslib: 2.8.1 - optional: true - - '@aws-crypto/util@5.2.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/types@3.901.0': - dependencies: - '@smithy/types': 4.6.0 - tslib: 2.8.1 - optional: true - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -7135,6 +7219,16 @@ snapshots: ai: 6.0.204(zod@4.4.3) zod: 4.4.3 + '@cloudflare/codemode@0.4.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(zod@4.4.3)': + dependencies: + '@types/json-schema': 7.0.15 + acorn: 8.17.0 + optionalDependencies: + '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + '@tanstack/ai': 0.38.0(@opentelemetry/api@1.9.0) + ai: 7.0.11(zod@4.4.3) + zod: 4.4.3 + '@cloudflare/kv-asset-handler@0.5.0': {} '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260625.1)': @@ -7944,9 +8038,9 @@ snapshots: '@open-draft/until@2.1.0': {} - '@openrouter/ai-sdk-provider@2.10.0(ai@6.0.204(zod@4.4.3))(zod@4.4.3)': + '@openrouter/ai-sdk-provider@2.10.0(ai@7.0.11(zod@4.4.3))(zod@4.4.3)': dependencies: - ai: 6.0.204(zod@4.4.3) + ai: 7.0.11(zod@4.4.3) zod: 4.4.3 optional: true @@ -7960,7 +8054,8 @@ snapshots: zod: 4.4.3 optional: true - '@opentelemetry/api@1.9.0': {} + '@opentelemetry/api@1.9.0': + optional: true '@oxc-project/types@0.122.0': optional: true @@ -8325,55 +8420,26 @@ snapshots: - debug - supports-color - '@smithy/eventstream-codec@4.2.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.6.0 - '@smithy/util-hex-encoding': 4.2.0 - tslib: 2.8.1 - optional: true - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@smithy/is-array-buffer@4.2.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@smithy/types@4.6.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - optional: true - - '@smithy/util-buffer-from@4.2.0': + '@smithy/core@3.28.0': dependencies: - '@smithy/is-array-buffer': 4.2.0 + '@smithy/types': 4.15.0 tslib: 2.8.1 optional: true - '@smithy/util-hex-encoding@4.2.0': + '@smithy/eventstream-codec@4.4.4': dependencies: + '@smithy/core': 3.28.0 tslib: 2.8.1 optional: true - '@smithy/util-utf8@2.3.0': + '@smithy/types@4.15.0': dependencies: - '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 optional: true - '@smithy/util-utf8@4.2.0': + '@smithy/util-utf8@4.4.4': dependencies: - '@smithy/util-buffer-from': 4.2.0 + '@smithy/core': 3.28.0 tslib: 2.8.1 optional: true @@ -8704,6 +8770,8 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@workflow/serde@4.1.0': {} + '@workos-inc/node@10.7.0': {} '@yarnpkg/lockfile@1.1.0': {} @@ -8759,6 +8827,37 @@ snapshots: - rolldown - supports-color + agents@0.17.1(@ai-sdk/react@3.0.206(react@19.2.7)(zod@4.4.3))(@babel/core@7.29.0)(@babel/runtime@7.27.0)(@cloudflare/workers-types@4.20260628.1)(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(just-bash@3.0.1)(react@19.2.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0))(zod@4.4.3): + dependencies: + '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@7.29.0) + '@cfworker/json-schema': 4.1.1 + '@cloudflare/codemode': 0.4.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(@tanstack/ai@0.38.0(@opentelemetry/api@1.9.0))(ai@7.0.11(zod@4.4.3))(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.27.0)(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0)) + cron-schedule: 6.0.0 + esbuild: 0.28.1 + mimetext: 3.0.28 + nanoid: 5.1.16 + partyserver: 0.5.8(@cloudflare/workers-types@4.20260628.1) + partysocket: 1.3.0(react@19.2.7) + react: 19.2.7 + yaml: 2.9.0 + yargs: 18.0.0 + zod: 4.4.3 + optionalDependencies: + '@ai-sdk/react': 3.0.206(react@19.2.7)(zod@4.4.3) + '@tanstack/ai': 0.38.0(@opentelemetry/api@1.9.0) + ai: 7.0.11(zod@4.4.3) + just-bash: 3.0.1 + vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(sugarss@5.0.0(postcss@8.5.16))(tsx@4.22.4)(yaml@2.9.0) + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@cloudflare/workers-types' + - rolldown + - supports-color + ai@6.0.204(zod@4.4.3): dependencies: '@ai-sdk/gateway': 3.0.130(zod@4.4.3) @@ -8766,6 +8865,14 @@ snapshots: '@ai-sdk/provider-utils': 4.0.29(zod@4.4.3) '@opentelemetry/api': 1.9.0 zod: 4.4.3 + optional: true + + ai@7.0.11(zod@4.4.3): + dependencies: + '@ai-sdk/gateway': 4.0.8(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + '@ai-sdk/provider-utils': 5.0.3(zod@4.4.3) + zod: 4.4.3 ajv-draft-04@1.0.0(ajv@8.18.0): optionalDependencies: @@ -9455,6 +9562,15 @@ snapshots: - supports-color optional: true + gaxios@7.1.5: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + optional: true + gcp-metadata@8.1.2: dependencies: gaxios: 7.1.3 @@ -9535,6 +9651,18 @@ snapshots: - supports-color optional: true + google-auth-library@10.9.0: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.5 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + optional: true + google-logging-utils@1.1.3: optional: true @@ -10348,6 +10476,8 @@ snapshots: pkce-challenge@5.0.0: {} + pkce-challenge@5.0.1: {} + postcss-js@4.0.1(postcss@8.5.16): dependencies: camelcase-css: 2.0.1 @@ -10955,11 +11085,11 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swr@2.3.3(react@19.2.7): + swr@2.4.2(react@19.2.7): dependencies: dequal: 2.0.3 react: 19.2.7 - use-sync-external-store: 1.5.0(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) tabbable@6.2.0: {} @@ -11168,6 +11298,10 @@ snapshots: dependencies: react: 19.2.7 + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.4 @@ -11284,15 +11418,24 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260625.1 '@cloudflare/workerd-windows-64': 1.20260625.1 - workers-ai-provider@3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@3.0.10)(ai@6.0.204(zod@4.4.3)): + workers-ai-provider@3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@3.0.71(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)): dependencies: - '@ai-sdk/provider': 3.0.10 - ai: 6.0.204(zod@4.4.3) + '@ai-sdk/provider': 4.0.1 + ai: 7.0.11(zod@4.4.3) optionalDependencies: '@ai-sdk/anthropic': 3.0.84(zod@4.4.3) '@ai-sdk/google': 3.0.82(zod@4.4.3) '@ai-sdk/openai': 3.0.71(zod@4.4.3) + workers-ai-provider@3.2.1(@ai-sdk/anthropic@3.0.84(zod@4.4.3))(@ai-sdk/google@3.0.82(zod@4.4.3))(@ai-sdk/openai@4.0.5(zod@4.4.3))(@ai-sdk/provider@4.0.1)(ai@7.0.11(zod@4.4.3)): + dependencies: + '@ai-sdk/provider': 4.0.1 + ai: 7.0.11(zod@4.4.3) + optionalDependencies: + '@ai-sdk/anthropic': 3.0.84(zod@4.4.3) + '@ai-sdk/google': 3.0.82(zod@4.4.3) + '@ai-sdk/openai': 4.0.5(zod@4.4.3) + wrangler@4.105.0(@cloudflare/workers-types@4.20260628.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2f6e4d8061..bd3b90d66f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,42 +1,63 @@ packages: - - ./demos/* - - ./demos/remote-mcp-auth0/* - - ./examples/* - - ./packages/* - - "!./demos/remote-mcp-auth0" - - "!./demos/remote-mcp-auth0/docs" + - ./demos/* + - ./demos/remote-mcp-auth0/* + - ./examples/* + - ./packages/* + - "!./demos/remote-mcp-auth0" + - "!./demos/remote-mcp-auth0/docs" allowBuilds: - "@google/genai": true - "@mongodb-js/zstd": true - "@openrouter/sdk": true - "@tailwindcss/oxide": true - bufferutil: true - core-js-pure: true - esbuild: true - msw: true - node-liblzma: true - nx: true - protobufjs: true - sharp: true - utf-8-validate: true - workerd: true + "@google/genai": true + "@mongodb-js/zstd": true + "@openrouter/sdk": true + "@tailwindcss/oxide": true + bufferutil: true + core-js-pure: true + esbuild: true + msw: true + node-liblzma: true + nx: true + protobufjs: true + sharp: true + utf-8-validate: true + workerd: true minimumReleaseAgeExclude: - - "@ai-sdk/fireworks@2.0.56" - - "@cloudflare/workers-types@4.20260628.1" - - "@microsoft/api-extractor@7.58.9" - - "@rushstack/ts-command-line@5.3.10" - - "@mantine/charts@9.4.1" - - "@mantine/code-highlight@9.4.1" - - "@mantine/core@9.4.1" - - "@mantine/dates@9.4.1" - - "@mantine/form@9.4.1" - - "@mantine/hooks@9.4.1" - - "@mantine/modals@9.4.1" - - "@mantine/notifications@9.4.1" - - "@mantine/store@9.4.1" - - "@openrouter/sdk@0.13.21" - - agents@0.17.1 - - lucide-react@1.22.0 - - postcss@8.5.16 + - '@ai-sdk/fireworks@2.0.56 || 3.0.4' + - "@cloudflare/workers-types@4.20260628.1" + - "@microsoft/api-extractor@7.58.9" + - "@rushstack/ts-command-line@5.3.10" + - "@mantine/charts@9.4.1" + - "@mantine/code-highlight@9.4.1" + - "@mantine/core@9.4.1" + - "@mantine/dates@9.4.1" + - "@mantine/form@9.4.1" + - "@mantine/hooks@9.4.1" + - "@mantine/modals@9.4.1" + - "@mantine/notifications@9.4.1" + - "@mantine/store@9.4.1" + - "@openrouter/sdk@0.13.21" + - agents@0.17.1 + - lucide-react@1.22.0 + - postcss@8.5.16 + - '@ai-sdk/anthropic@4.0.5' + - '@ai-sdk/gateway@4.0.8' + - '@ai-sdk/google@4.0.6' + - '@ai-sdk/openai@4.0.5' + - '@ai-sdk/provider-utils@5.0.3' + - ai@7.0.11 + - '@ai-sdk/mcp@2.0.5' + - '@ai-sdk/react@4.0.12' + - '@ai-sdk/amazon-bedrock@5.0.8' + - '@ai-sdk/azure@4.0.5' + - '@ai-sdk/cerebras@3.0.3' + - '@ai-sdk/cohere@4.0.3' + - '@ai-sdk/deepgram@3.0.3' + - '@ai-sdk/deepseek@3.0.3' + - '@ai-sdk/elevenlabs@3.0.4' + - '@ai-sdk/google-vertex@5.0.8' + - '@ai-sdk/groq@4.0.3' + - '@ai-sdk/mistral@4.0.3' + - '@ai-sdk/openai-compatible@3.0.3' + - '@ai-sdk/perplexity@4.0.4' + - '@ai-sdk/xai@4.0.4' patchedDependencies: - "@ai-sdk/google-vertex": patches/@ai-sdk__google-vertex.patch + '@ai-sdk/google-vertex@^5': patches/@ai-sdk__google-vertex.patch