diff --git a/packages/agent/package.json b/packages/agent/package.json index aca9fe2..cf5e2c5 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -57,14 +57,14 @@ "example:structured": "tsx examples/06-structured-output.ts" }, "dependencies": { - "@ai-sdk/provider": "4.0.33", + "@ai-sdk/provider": "4.0.34", "ws": "^8.22.0" }, "devDependencies": { - "@ai-sdk/react": "4.0.156", + "@ai-sdk/react": "4.0.157", "@types/node": "^26.6.5", "@types/ws": "^8.18.2", - "ai": "^7.0.152", + "ai": "^7.0.153", "tsup": "^9.0.0", "tsx": "^4.23.15", "typescript": "npm:@typescript/typescript6@^6.0.2", diff --git a/packages/effect/package.json b/packages/effect/package.json index 1a291ba..6c482bd 100644 --- a/packages/effect/package.json +++ b/packages/effect/package.json @@ -56,18 +56,18 @@ "example:sandbox": "tsx examples/03-sandbox.ts" }, "dependencies": { - "@ai-sdk/provider": "4.0.33", + "@ai-sdk/provider": "4.0.34", "@coder/ai-sdk-agent": "workspace:^", "@coder/ai-sdk-provider": "workspace:^", "@coder/ai-sdk-sandbox": "workspace:^" }, "devDependencies": { - "@ai-sdk/harness": "^1.0.163", - "@ai-sdk/provider-utils": "^5.0.67", + "@ai-sdk/harness": "^1.0.164", + "@ai-sdk/provider-utils": "^5.0.68", "@arethetypeswrong/cli": "^0.18.5", "@types/node": "^26.6.3", "@vitest/coverage-v8": "^5.0.5", - "ai": "^7.0.152", + "ai": "^7.0.153", "effect": "4.0.6", "publint": "^0.3.25", "tsup": "^9.0.0", diff --git a/packages/effect/src/language-model.ts b/packages/effect/src/language-model.ts index 6814a59..c133129 100644 --- a/packages/effect/src/language-model.ts +++ b/packages/effect/src/language-model.ts @@ -13,6 +13,8 @@ * equivalent (custom parts, reasoning files, tool approval requests, * URL/reference/text file payloads) are dropped, and so are tool approval * parts in the prompt (`effect/ai` resolves and strips them before the call). + * In JSON mode, a `generateText` result's `structuredOutputText` replaces its + * text parts, because `effect/ai` parses the joined text parts as the answer. * * Provider-executed tool calls and results for tools that are not in the * call's toolkit (e.g. Coder Agents' server-side tools) cannot be decoded by @@ -238,10 +240,20 @@ const generateText = ( if (result.response !== undefined) { parts.push(responseMetadataPart(result.response)); } + // `effect/ai` parses the joined text parts as the JSON answer. A + // provider's `structuredOutputText` (e.g. OpenAI Responses drafts + // followed by a final answer) replaces them. An empty string is an + // explicit selection and must not fall back to the text parts. + const structured = + options.responseFormat.type === "json" ? result.structuredOutputText : undefined; for (const content of result.content) { if (serverTools.absorb(content)) continue; + if (structured !== undefined && content.type === "text") continue; parts.push(...contentToParts(content)); } + if (structured !== undefined) { + parts.push({ type: "text", text: structured }); + } parts.push(finishPart(result.finishReason, result.usage, serverTools)); return parts; }, diff --git a/packages/effect/test/language-model.test.ts b/packages/effect/test/language-model.test.ts index 040c28e..357ee31 100644 --- a/packages/effect/test/language-model.test.ts +++ b/packages/effect/test/language-model.test.ts @@ -549,6 +549,37 @@ describe("generateObject", () => { expect(first.content).toContain(`"city"`); } }); + + it("decodes structuredOutputText instead of the joined text parts", async () => { + // @ai-sdk/provider 4.0.34: OpenAI Responses can return a JSON draft and + // a final answer; `structuredOutputText` selects the final one. + const model = fakeModel({ + doGenerate: async () => ({ + content: [ + { type: "text", text: `{"city":"Bonn","temperature":9}` }, + { type: "text", text: `{"city":"Berlin","temperature":21}` }, + ], + structuredOutputText: `{"city":"Berlin","temperature":21}`, + finishReason: { unified: "stop", raw: undefined }, + usage: USAGE, + warnings: [], + }), + }); + + const Weather = Schema.Struct({ city: Schema.String, temperature: Schema.Finite }); + const [object, text] = await Effect.runPromise( + Effect.flatMap(service(model), (m) => + Effect.all([ + m.generateObject({ prompt: "weather in berlin", schema: Weather }), + m.generateText({ prompt: "weather in berlin" }), + ]), + ), + ); + + expect(object.value).toEqual({ city: "Berlin", temperature: 21 }); + // Plain text calls keep every text part. + expect(text.text).toBe(`{"city":"Bonn","temperature":9}{"city":"Berlin","temperature":21}`); + }); }); describe("streamText", () => { diff --git a/packages/provider/package.json b/packages/provider/package.json index 2647703..77e1c03 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -59,15 +59,15 @@ "example:anthropic": "tsx examples/03-anthropic.ts" }, "dependencies": { - "@ai-sdk/anthropic": "^4.0.87", - "@ai-sdk/openai-compatible": "^3.0.77", - "@ai-sdk/provider": "4.0.33" + "@ai-sdk/anthropic": "^4.0.88", + "@ai-sdk/openai-compatible": "^3.0.78", + "@ai-sdk/provider": "4.0.34" }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", "@types/node": "^26.6.5", "@vitest/coverage-v8": "^5.0.5", - "ai": "^7.0.152", + "ai": "^7.0.153", "publint": "^0.3.25", "tsup": "^9.0.0", "tsx": "^4.23.15", diff --git a/packages/release-please-ai/package.json b/packages/release-please-ai/package.json index 2aee489..b4ed91a 100644 --- a/packages/release-please-ai/package.json +++ b/packages/release-please-ai/package.json @@ -14,8 +14,8 @@ "release": "tsx src/cli.ts" }, "dependencies": { - "@ai-sdk/anthropic": "^4.0.87", - "ai": "^7.0.152", + "@ai-sdk/anthropic": "^4.0.88", + "ai": "^7.0.153", "release-please": "~17.11.2", "zod": "4.6.7" }, diff --git a/packages/sandbox/package.json b/packages/sandbox/package.json index 5230961..9b73c66 100644 --- a/packages/sandbox/package.json +++ b/packages/sandbox/package.json @@ -58,10 +58,10 @@ "yaml": "^2.9.1" }, "devDependencies": { - "@ai-sdk/harness": "^1.0.163", - "@ai-sdk/harness-claude-code": "^1.0.167", - "@ai-sdk/provider-utils": "^5.0.67", - "@ai-sdk/tui": "^1.0.153", + "@ai-sdk/harness": "^1.0.164", + "@ai-sdk/harness-claude-code": "^1.0.168", + "@ai-sdk/provider-utils": "^5.0.68", + "@ai-sdk/tui": "^1.0.154", "@arethetypeswrong/cli": "^0.18.5", "@types/node": "^26.6.5", "@types/ws": "^8.18.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0011bcb..1920aa0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,15 +26,15 @@ importers: packages/agent: dependencies: '@ai-sdk/provider': - specifier: 4.0.33 - version: 4.0.33 + specifier: 4.0.34 + version: 4.0.34 ws: specifier: ^8.22.0 version: 8.22.0 devDependencies: '@ai-sdk/react': - specifier: 4.0.156 - version: 4.0.156(react@19.2.8)(zod@4.6.7) + specifier: 4.0.157 + version: 4.0.157(react@19.2.8)(zod@4.6.7) '@types/node': specifier: ^26.6.5 version: 26.6.5 @@ -42,8 +42,8 @@ importers: specifier: ^8.18.2 version: 8.18.2 ai: - specifier: ^7.0.152 - version: 7.0.152(zod@4.6.7) + specifier: ^7.0.153 + version: 7.0.153(zod@4.6.7) tsup: specifier: ^9.0.0 version: 9.0.0(@typescript/typescript6@6.0.2)(postcss@8.5.31)(tsx@4.23.15)(yaml@2.9.1) @@ -66,8 +66,8 @@ importers: packages/effect: dependencies: '@ai-sdk/provider': - specifier: 4.0.33 - version: 4.0.33 + specifier: 4.0.34 + version: 4.0.34 '@coder/ai-sdk-agent': specifier: workspace:^ version: link:../agent @@ -79,11 +79,11 @@ importers: version: link:../sandbox devDependencies: '@ai-sdk/harness': - specifier: ^1.0.163 - version: 1.0.163(ws@8.22.0)(zod@4.6.7) + specifier: ^1.0.164 + version: 1.0.164(ws@8.22.0)(zod@4.6.7) '@ai-sdk/provider-utils': - specifier: ^5.0.67 - version: 5.0.67(zod@4.6.7) + specifier: ^5.0.68 + version: 5.0.68(zod@4.6.7) '@arethetypeswrong/cli': specifier: ^0.18.5 version: 0.18.5 @@ -94,8 +94,8 @@ importers: specifier: ^5.0.5 version: 5.0.5(vitest@5.0.5) ai: - specifier: ^7.0.152 - version: 7.0.152(zod@4.6.7) + specifier: ^7.0.153 + version: 7.0.153(zod@4.6.7) effect: specifier: 4.0.6 version: 4.0.6 @@ -124,14 +124,14 @@ importers: packages/provider: dependencies: '@ai-sdk/anthropic': - specifier: ^4.0.87 - version: 4.0.87(zod@4.6.7) + specifier: ^4.0.88 + version: 4.0.88(zod@4.6.7) '@ai-sdk/openai-compatible': - specifier: ^3.0.77 - version: 3.0.77(zod@4.6.7) + specifier: ^3.0.78 + version: 3.0.78(zod@4.6.7) '@ai-sdk/provider': - specifier: 4.0.33 - version: 4.0.33 + specifier: 4.0.34 + version: 4.0.34 devDependencies: '@arethetypeswrong/cli': specifier: ^0.18.5 @@ -143,8 +143,8 @@ importers: specifier: ^5.0.5 version: 5.0.5(vitest@5.0.5) ai: - specifier: ^7.0.152 - version: 7.0.152(zod@4.6.7) + specifier: ^7.0.153 + version: 7.0.153(zod@4.6.7) publint: specifier: ^0.3.25 version: 0.3.25 @@ -170,11 +170,11 @@ importers: packages/release-please-ai: dependencies: '@ai-sdk/anthropic': - specifier: ^4.0.87 - version: 4.0.87(zod@4.6.7) + specifier: ^4.0.88 + version: 4.0.88(zod@4.6.7) ai: - specifier: ^7.0.152 - version: 7.0.152(zod@4.6.7) + specifier: ^7.0.153 + version: 7.0.153(zod@4.6.7) release-please: specifier: ~17.11.2 version: 17.11.2(supports-color@7.2.0) @@ -205,17 +205,17 @@ importers: version: 2.9.1 devDependencies: '@ai-sdk/harness': - specifier: ^1.0.163 - version: 1.0.163(ws@8.22.0)(zod@4.6.7) + specifier: ^1.0.164 + version: 1.0.164(ws@8.22.0)(zod@4.6.7) '@ai-sdk/harness-claude-code': - specifier: ^1.0.167 - version: 1.0.167(zod@4.6.7) + specifier: ^1.0.168 + version: 1.0.168(zod@4.6.7) '@ai-sdk/provider-utils': - specifier: ^5.0.67 - version: 5.0.67(zod@4.6.7) + specifier: ^5.0.68 + version: 5.0.68(zod@4.6.7) '@ai-sdk/tui': - specifier: ^1.0.153 - version: 1.0.153(zod@4.6.7) + specifier: ^1.0.154 + version: 1.0.154(zod@4.6.7) '@arethetypeswrong/cli': specifier: ^0.18.5 version: 0.18.5 @@ -252,26 +252,26 @@ importers: packages: - '@ai-sdk/anthropic@4.0.87': - resolution: {integrity: sha512-x55N7G47mh9p38C2a6qMAzmUxlgKDCXoE9ohRaF4D3hcOGQrYIOZZ/9Iv4Uf9/OxlNDog9Yz4YPX2GL1+otGlg==} + '@ai-sdk/anthropic@4.0.88': + resolution: {integrity: sha512-7h/rI3jLCfLbQsjVt37Q5PCEGOHrpVgrO2zl+y///UpUcWfiRDcqk8DL7br//OFxiEhyxgeIoU/5ulsN1llOyg==} engines: {node: '>=22'} peerDependencies: zod: 4.6.7 - '@ai-sdk/gateway@4.0.125': - resolution: {integrity: sha512-9raNdkENebDxVl4piGntpQgOBHB62K1rC87KceV8kkGOc/g7s6lwbxN7C6QTqXYJaM+h1Lnm64MDgnHAmzUApg==} + '@ai-sdk/gateway@4.0.126': + resolution: {integrity: sha512-gOrvnfrWxslTws5puMe+CvEDjZ0rxbpQYLZgdngQl1g/z3mRc5sllcflVAhy2xJSZacrWtsXwua+NJoc/IKZDw==} engines: {node: '>=22'} peerDependencies: zod: 4.6.7 - '@ai-sdk/harness-claude-code@1.0.167': - resolution: {integrity: sha512-zLeCLTHo0gQzCFGOirmNJJhhJ2y9yjPvG5Yx/pJBobRJ0yIpDsWWSwlx5zbTrXmSFfItElcpovm8i7E2ehu5Hw==} + '@ai-sdk/harness-claude-code@1.0.168': + resolution: {integrity: sha512-18bclnwhUE4fC8LCWzjPSUCjdA2gKZbS0H+y1DFDPXMV11WxOyHNk/4SW6GvtWjdGWOZSN2cX/FpQei5CQNaFQ==} engines: {node: '>=22'} peerDependencies: zod: 4.6.7 - '@ai-sdk/harness@1.0.163': - resolution: {integrity: sha512-RHIVrr+GAWp009oe2KGEqHkQELVCnrWd09fL497JevpzttpUfoEphMZGYNOkqOicxBVcEHDvLU/ufzWj8bm2cQ==} + '@ai-sdk/harness@1.0.164': + resolution: {integrity: sha512-/cDUop0dQWyfc2fCXPRjS59BLyYHixvSEgHd0RKl87qSodBdXy1GQG4O1COfOlUR4PIkvQTDqXhw8L4JuCdr+w==} engines: {node: '>=22'} peerDependencies: ws: ^8.21.0 @@ -280,36 +280,36 @@ packages: ws: optional: true - '@ai-sdk/mcp@2.0.83': - resolution: {integrity: sha512-XcDGqrMvbJHZOE5GS/RFLCYGMgH+4CDqQMWtpu9ddzdujbCJU3dDLCT5h573ba4tJedv9K9UiAggawbayT+4IA==} + '@ai-sdk/mcp@2.0.84': + resolution: {integrity: sha512-yVhkdm1cpN1L65Vfg8TjyNMFI+P20NsZ/WcYSI6kyv1MbbHWtOn7lBUSuXJ6H/+wGQaH410q1Um1h4PqoWxocA==} engines: {node: '>=22'} peerDependencies: zod: 4.6.7 - '@ai-sdk/openai-compatible@3.0.77': - resolution: {integrity: sha512-RzFe7uaMo6Yww9SdeGwHjNiERQvT79unzMlvQva7QEpjUDjzWE/OK04wTLFBRlJrxYMOSSLjUCJKGJGU9os9zQ==} + '@ai-sdk/openai-compatible@3.0.78': + resolution: {integrity: sha512-8r+qmbIf2YzPbkzlQibbetOmR4GdA/jAHtSJPhUbp6ZMG3PT6cBKwf/85TDyStyPTKtkFZ1qe1ytml3zu69EZQ==} engines: {node: '>=22'} peerDependencies: zod: 4.6.7 - '@ai-sdk/provider-utils@5.0.67': - resolution: {integrity: sha512-EUzV6GXutGcesWKOY8tRKgijfuv1LUBpqAquMh5k0n74NCjDbca5d5ZG12qhVtM2X5UwM4B2ZMP2XpnAwZlA8Q==} + '@ai-sdk/provider-utils@5.0.68': + resolution: {integrity: sha512-SASuC1DqSdWoYyYfpxbgPKm9VCnMP1VTahWY7WEYzi2QDmFdbw4runqmH7NKC33iB/INo+XbaN2hH3dXHSNQZw==} engines: {node: '>=22'} peerDependencies: zod: 4.6.7 - '@ai-sdk/provider@4.0.33': - resolution: {integrity: sha512-C6ylMuAXjgqKJllp6ODIJwUltK/tm3ZmIj4V2fqENP3Y8gif2DyeJSsTcDwFrXppgEKcrBisi/BWx2tYeoeCAw==} + '@ai-sdk/provider@4.0.34': + resolution: {integrity: sha512-Ip7ZQBq/FiGpM1mmOVseTtX9PBjnzo0bLC41WTgBSBBRUBz6LhNFGbYaNUzI6hPm6ll1oNSPOAZc/q/z+3QZEQ==} engines: {node: '>=22'} - '@ai-sdk/react@4.0.156': - resolution: {integrity: sha512-1FrmQmW3VM4ftf6GhfEiqUoAVJueji/IWktfturFvmwxDN8qenzNQVSj8SJBu4ddyTBOImoJMllHOFUifRlk9g==} + '@ai-sdk/react@4.0.157': + resolution: {integrity: sha512-5ImK0xWjYSL0iOy6WexMJigvvjJZLCEX2wKdlQ8AmC/gveSeoEc5s1VZY1UAfR75BbAJggE4zNtaAA/IRDzT2w==} engines: {node: '>=22'} peerDependencies: react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 - '@ai-sdk/tui@1.0.153': - resolution: {integrity: sha512-i87SiyL/D8+DRAzlvNXYvRCpaX/wjdxjjl7Hrlfp0plDwjWJmxn8S6TpfRIZXJGOH3X27SrIhjCNQY3NtgI8Kw==} + '@ai-sdk/tui@1.0.154': + resolution: {integrity: sha512-CteI6cGmZXdw3w2eliN1Hj34VnM2UsBVwjwi8VL39QjMjKFT4MrqCGJPxiQcC6mIAl3TtnHfJyBp+zqJGYbytg==} engines: {node: '>=22'} '@andrewbranch/untar.js@1.0.4': @@ -1310,8 +1310,8 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@7.0.152: - resolution: {integrity: sha512-cxQaE/17qhgqJcLCespbnyaN3c4IkGuNUtBXKSX1yTvlSsQ7ERV2ygFADMG7d+IWCUuvi7R8DrqAy9DGj0cgkg==} + ai@7.0.153: + resolution: {integrity: sha512-Ib8v374jWn9FXsjADXodRaP7fsMutlmPsbTLT5gYBDyadFcF9XxfYX1CSSxgSvE1r06MmOeYVwvQjFb3CcBi1Q==} engines: {node: '>=22'} peerDependencies: zod: 4.6.7 @@ -2479,81 +2479,81 @@ packages: snapshots: - '@ai-sdk/anthropic@4.0.87(zod@4.6.7)': + '@ai-sdk/anthropic@4.0.88(zod@4.6.7)': dependencies: - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) zod: 4.6.7 - '@ai-sdk/gateway@4.0.125(zod@4.6.7)': + '@ai-sdk/gateway@4.0.126(zod@4.6.7)': dependencies: - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) '@vercel/oidc': 3.2.0 zod: 4.6.7 - '@ai-sdk/harness-claude-code@1.0.167(zod@4.6.7)': + '@ai-sdk/harness-claude-code@1.0.168(zod@4.6.7)': dependencies: - '@ai-sdk/harness': 1.0.163(ws@8.22.0)(zod@4.6.7) - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) + '@ai-sdk/harness': 1.0.164(ws@8.22.0)(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) ws: 8.22.0 zod: 4.6.7 transitivePeerDependencies: - bufferutil - utf-8-validate - '@ai-sdk/harness@1.0.163(ws@8.22.0)(zod@4.6.7)': + '@ai-sdk/harness@1.0.164(ws@8.22.0)(zod@4.6.7)': dependencies: - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) - ai: 7.0.152(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) + ai: 7.0.153(zod@4.6.7) zod: 4.6.7 optionalDependencies: ws: 8.22.0 - '@ai-sdk/mcp@2.0.83(zod@4.6.7)': + '@ai-sdk/mcp@2.0.84(zod@4.6.7)': dependencies: - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) cross-spawn: 7.0.6 pkce-challenge: 5.0.1 zod: 4.6.7 - '@ai-sdk/openai-compatible@3.0.77(zod@4.6.7)': + '@ai-sdk/openai-compatible@3.0.78(zod@4.6.7)': dependencies: - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) zod: 4.6.7 - '@ai-sdk/provider-utils@5.0.67(zod@4.6.7)': + '@ai-sdk/provider-utils@5.0.68(zod@4.6.7)': dependencies: - '@ai-sdk/provider': 4.0.33 + '@ai-sdk/provider': 4.0.34 '@standard-schema/spec': 1.1.0 '@workflow/serde': 4.1.0 eventsource-parser: 3.1.1 undici: 7.30.1 zod: 4.6.7 - '@ai-sdk/provider@4.0.33': + '@ai-sdk/provider@4.0.34': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@4.0.156(react@19.2.8)(zod@4.6.7)': + '@ai-sdk/react@4.0.157(react@19.2.8)(zod@4.6.7)': dependencies: - '@ai-sdk/mcp': 2.0.83(zod@4.6.7) - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) - ai: 7.0.152(zod@4.6.7) + '@ai-sdk/mcp': 2.0.84(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) + ai: 7.0.153(zod@4.6.7) react: 19.2.8 swr: 2.5.1(react@19.2.8) throttleit: 2.1.0 transitivePeerDependencies: - zod - '@ai-sdk/tui@1.0.153(zod@4.6.7)': + '@ai-sdk/tui@1.0.154(zod@4.6.7)': dependencies: - ai: 7.0.152(zod@4.6.7) + ai: 7.0.153(zod@4.6.7) transitivePeerDependencies: - zod @@ -3164,11 +3164,11 @@ snapshots: agent-base@7.1.4: {} - ai@7.0.152(zod@4.6.7): + ai@7.0.153(zod@4.6.7): dependencies: - '@ai-sdk/gateway': 4.0.125(zod@4.6.7) - '@ai-sdk/provider': 4.0.33 - '@ai-sdk/provider-utils': 5.0.67(zod@4.6.7) + '@ai-sdk/gateway': 4.0.126(zod@4.6.7) + '@ai-sdk/provider': 4.0.34 + '@ai-sdk/provider-utils': 5.0.68(zod@4.6.7) zod: 4.6.7 ansi-escapes@7.3.0: