From 5c008791355de499df77167c55ca12242cb06b3a Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Sun, 25 Oct 2026 18:10:20 +0000 Subject: [PATCH 1/2] chore: bump ai sdk family to ai 7.0.153 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dependency batch. Each bump is the newest version with at least 24 hours of publish age at bump time (2026-10-25T18:06Z): - ai ^7.0.152 -> ^7.0.153 (devDeps: agent, effect, provider; deps: private release-please-ai) - @ai-sdk/provider 4.0.33 -> 4.0.34 (deps: agent, effect, provider; exact pin, required by ai 7.0.153) - @ai-sdk/anthropic ^4.0.87 -> ^4.0.88 (deps: provider, private release-please-ai) - @ai-sdk/openai-compatible ^3.0.77 -> ^3.0.78 (deps: provider) - @ai-sdk/provider-utils ^5.0.67 -> ^5.0.68 (devDeps: effect, sandbox) - @ai-sdk/harness ^1.0.163 -> ^1.0.164 (devDeps: effect, sandbox) - @ai-sdk/harness-claude-code ^1.0.167 -> ^1.0.168 (devDeps: sandbox) - @ai-sdk/react 4.0.156 -> 4.0.157 (devDeps: agent, exact pin) - @ai-sdk/tui ^1.0.153 -> ^1.0.154 (devDeps: sandbox) - @ai-sdk/gateway 4.0.125 -> 4.0.126 (transitive, exact dep of ai) - @ai-sdk/mcp 2.0.83 -> 2.0.84 (transitive, exact dep of react) @ai-sdk/provider 4.0.34 adds no union member. Its only type change is an optional `structuredOutputText` field on the doGenerate result, which only OpenAI/Azure Responses models set. No code change is needed. Published runtime range changes: @coder/ai-sdk-provider (@ai-sdk/anthropic ^4.0.88, @ai-sdk/openai-compatible ^3.0.78, @ai-sdk/provider 4.0.34), @coder/ai-sdk-agent (@ai-sdk/provider 4.0.34), @coder/ai-sdk-effect (@ai-sdk/provider 4.0.34). Sandbox has no runtime range change. zod stays 4.6.7 and effect 4.0.6, one copy each in the lockfile. No peerDependencies change. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: Iec84c5cac2582f206e8cae3d125d1f7dd504d0a2 Signed-off-by: Thomas Kosiewski --- packages/agent/package.json | 6 +- packages/effect/package.json | 8 +- packages/provider/package.json | 8 +- packages/release-please-ai/package.json | 4 +- packages/sandbox/package.json | 8 +- pnpm-lock.yaml | 180 ++++++++++++------------ 6 files changed, 107 insertions(+), 107 deletions(-) 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/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: From 35a96886820f90012b7e9c9d7ae564e9271a7add Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Sun, 25 Oct 2026 18:18:12 +0000 Subject: [PATCH 2/2] fix(effect): decode structuredOutputText in JSON generateText MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ai-sdk/provider 4.0.34 adds an optional `structuredOutputText` to the doGenerate result: the text to parse as the JSON answer when it differs from the joined text parts (OpenAI Responses drafts followed by a final answer). effect/ai's generateObject parses the joined text parts, so the bridge now passes that text instead of the text parts when the call asks for JSON. An empty string stays an explicit selection. Plain text calls keep every text part. A new unit test covers both. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: I544505875eb7eecaba9bf78773c6ca243c9586e9 Signed-off-by: Thomas Kosiewski --- packages/effect/src/language-model.ts | 12 ++++++++ packages/effect/test/language-model.test.ts | 31 +++++++++++++++++++++ 2 files changed, 43 insertions(+) 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", () => {