From b9c118e0fe7fb02c8ac19accc0abeb85655b343e Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:37:56 -0500 Subject: [PATCH] chore(core): drop unreachable AI SDK provider packages (#40504) --- bun.lock | 53 ++---- package.json | 1 - packages/console/function/package.json | 5 - packages/core/package.json | 4 - packages/core/src/plugin/provider.ts | 2 - packages/core/src/plugin/provider/google.ts | 16 -- .../core/src/plugin/provider/openrouter.ts | 8 - packages/core/src/plugin/provider/xai.ts | 16 -- .../core/test/plugin/provider-google.test.ts | 103 ----------- .../test/plugin/provider-openrouter.test.ts | 32 ---- .../core/test/plugin/provider-xai.test.ts | 108 ----------- .../core/test/provider-xai-responses.test.ts | 32 ---- packages/web/package.json | 1 - patches/@ai-sdk%2Fxai@3.0.102.patch | 174 ------------------ 14 files changed, 20 insertions(+), 535 deletions(-) delete mode 100644 packages/core/src/plugin/provider/google.ts delete mode 100644 packages/core/test/plugin/provider-google.test.ts delete mode 100644 packages/core/test/provider-xai-responses.test.ts delete mode 100644 patches/@ai-sdk%2Fxai@3.0.102.patch diff --git a/bun.lock b/bun.lock index 215c55c66c7..d53e65877ed 100644 --- a/bun.lock +++ b/bun.lock @@ -88,6 +88,7 @@ "@tanstack/solid-query": "5.91.4", "@tanstack/solid-virtual": "catalog:", "@thisbeyond/solid-dnd": "0.7.5", + "diff": "catalog:", "effect": "catalog:", "fuzzysort": "catalog:", "ghostty-web": "github:anomalyco/ghostty-web#83c0a07b8628b748aed073b232cb4b52a6ca11c1", @@ -284,13 +285,9 @@ "name": "@opencode-ai/console-function", "version": "1.18.8", "dependencies": { - "@ai-sdk/anthropic": "3.0.82", - "@ai-sdk/openai": "3.0.48", - "@ai-sdk/openai-compatible": "2.0.37", "@openauthjs/openauth": "0.0.0-20250322224806", "@opencode-ai/console-core": "workspace:*", "@opencode-ai/console-resource": "workspace:*", - "ai": "catalog:", "zod": "catalog:", }, "devDependencies": { @@ -298,7 +295,6 @@ "@tsconfig/node22": "22.0.2", "@types/node": "catalog:", "@typescript/native-preview": "catalog:", - "openai": "5.11.0", "typescript": "catalog:", }, }, @@ -361,18 +357,15 @@ "@ai-sdk/cohere": "3.0.27", "@ai-sdk/deepinfra": "2.0.41", "@ai-sdk/gateway": "3.0.104", - "@ai-sdk/google": "3.0.73", "@ai-sdk/google-vertex": "4.0.128", "@ai-sdk/groq": "3.0.31", "@ai-sdk/mistral": "3.0.51", - "@ai-sdk/openai": "3.0.84", "@ai-sdk/openai-compatible": "2.0.41", "@ai-sdk/perplexity": "3.0.26", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@ai-sdk/togetherai": "2.0.41", "@ai-sdk/vercel": "2.0.39", - "@ai-sdk/xai": "3.0.102", "@aws-sdk/credential-providers": "3.1057.0", "@effect/platform-node": "catalog:", "@effect/sql-sqlite-bun": "catalog:", @@ -386,7 +379,6 @@ "@opencode-ai/plugin": "workspace:*", "@opencode-ai/schema": "workspace:*", "@opencode-ai/util": "workspace:*", - "@openrouter/ai-sdk-provider": "2.9.0", "@parcel/watcher": "2.5.1", "@silvia-odwyer/photon-node": "0.3.4", "@standard-schema/spec": "catalog:", @@ -911,7 +903,6 @@ "@opentui/solid": "catalog:", "@solid-primitives/event-bus": "1.1.2", "clipboardy": "4.0.0", - "diff": "catalog:", "effect": "catalog:", "fuzzysort": "catalog:", "get-east-asian-width": "catalog:", @@ -1038,7 +1029,6 @@ "@shikijs/transformers": "3.20.0", "@solid-primitives/resize-observer": "2.1.5", "@types/luxon": "catalog:", - "ai": "catalog:", "astro": "5.7.13", "diff": "catalog:", "js-base64": "3.7.7", @@ -1084,17 +1074,16 @@ "tree-sitter-bash", ], "patchedDependencies": { + "solid-js@1.9.10": "patches/solid-js@1.9.10.patch", "@pierre/trees@1.0.0-beta.4": "patches/@pierre%2Ftrees@1.0.0-beta.4.patch", "effect@4.0.0-beta.101": "patches/effect@4.0.0-beta.101.patch", - "@ai-sdk/xai@3.0.102": "patches/@ai-sdk%2Fxai@3.0.102.patch", "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", "@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch", + "@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch", "@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch", "@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch", "@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch", "@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch", - "solid-js@1.9.10": "patches/solid-js@1.9.10.patch", - "@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch", }, "overrides": { "@opentui/core": "catalog:", @@ -1220,9 +1209,9 @@ "@ai-sdk/mistral": ["@ai-sdk/mistral@3.0.51", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.40" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-83eXY6p0lUFhSuMvNDmTKDuMciK5XDAWDlNh5c0L80tKjmtCFRItA1MZHp4IKe1r7eK8Rb5nN7qtxqMLUFRIRw=="], - "@ai-sdk/openai": ["@ai-sdk/openai@3.0.48", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ALmj/53EXpcRqMbGpPJPP4UOSWw0q4VGpnDo7YctvsynjkrKDmoneDG/1a7VQnSPYHnJp6tTRMf5ZdxZ5whulg=="], + "@ai-sdk/openai": ["@ai-sdk/openai@3.0.67", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oAiGC9eWG7IgtdsdS74bOCnAAHarAfTJhWN9x5INwnWPekL802AvF+0I5DvLzIF1MIRmNw4N8mPSL/GUVbX9Mw=="], - "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], + "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="], "@ai-sdk/perplexity": ["@ai-sdk/perplexity@3.0.26", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-dXzrVsLR5f6tr+U04jq4AXoRroGFBTvODnLgss0SWbzNjGGQg3XqtQ9j7rCLo6o8qbYGuAHvqUrIpUCuiscuFg=="], @@ -4944,7 +4933,7 @@ "open": ["open@10.1.2", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw=="], - "openai": ["openai@5.11.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-+AuTc5pVjlnTuA9zvn8rA/k+1RluPIx9AD4eDcnutv6JNwHHZxIhkFy+tmMKCvmMFDQzfA/r1ujvPWB19DQkYg=="], + "openai": ["openai@6.49.0", "", { "peerDependencies": { "@aws-sdk/credential-provider-node": ">=3.972.0 <4", "@smithy/hash-node": ">=4.3.0 <5", "@smithy/signature-v4": ">=5.4.0 <6", "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["@aws-sdk/credential-provider-node", "@smithy/hash-node", "@smithy/signature-v4", "ws", "zod"] }, "sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg=="], "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], @@ -5962,12 +5951,8 @@ "@actions/http-client/undici": ["undici@6.28.0", "", {}, "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA=="], - "@ai-sdk/alibaba/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="], - "@ai-sdk/amazon-bedrock/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.81", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-B1JDd9Ugq9R5AgIaW3674lhGCMMYJcPUxnrZh8fzbGojgg4QvHFRv6eZahGQAUsmGHbcf74G9bdSBDLWQGY2GA=="], - "@ai-sdk/amazon-bedrock/@ai-sdk/openai": ["@ai-sdk/openai@3.0.67", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oAiGC9eWG7IgtdsdS74bOCnAAHarAfTJhWN9x5INwnWPekL802AvF+0I5DvLzIF1MIRmNw4N8mPSL/GUVbX9Mw=="], - "@ai-sdk/amazon-bedrock/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="], "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="], @@ -5982,6 +5967,8 @@ "@ai-sdk/azure/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.38", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/HHGmtKllqjg1OLc023v9w9kK3laW7Z6TzfZukYQWCsGBbzB9p60zTvvpXFVcs44NZBVXL3viOa1HRKUbeee8g=="], + "@ai-sdk/cerebras/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], + "@ai-sdk/cerebras/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], "@ai-sdk/cohere/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], @@ -5990,6 +5977,8 @@ "@ai-sdk/deepgram/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.40", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw=="], + "@ai-sdk/deepinfra/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], + "@ai-sdk/deepinfra/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], "@ai-sdk/deepseek/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], @@ -6024,14 +6013,18 @@ "@ai-sdk/mistral/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.40", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw=="], - "@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], + "@ai-sdk/openai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="], - "@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], + "@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="], "@ai-sdk/perplexity/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], + "@ai-sdk/togetherai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], + "@ai-sdk/togetherai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], + "@ai-sdk/vercel/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], + "@ai-sdk/vercel/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], "@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.56", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@ai-sdk/provider-utils": "4.0.35" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cQrN6OUn/jvsY3OdsU6Wn+ss7vp1iwIcakZKSlSRMnYqShBfyT7Qht+eqmgxs7w9ttrw6FAG6o11AiBs+iEsTA=="], @@ -6350,10 +6343,6 @@ "@opencode-ai/console-mail/@types/react": ["@types/react@18.0.25", "", { "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g=="], - "@opencode-ai/core/@ai-sdk/openai": ["@ai-sdk/openai@3.0.84", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.38" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cmgbeJL0bbY0yTJH4/AdmP5E7MjWRL9G8UdhIi0JlV/So03o82ORJofW8OzwCZPTORVQblFbpZXYGDcUd9NdUQ=="], - - "@opencode-ai/core/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="], - "@opencode-ai/desktop/@actions/artifact": ["@actions/artifact@4.0.0", "", { "dependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.1", "@actions/http-client": "^2.1.0", "@azure/core-http": "^3.0.5", "@azure/storage-blob": "^12.15.0", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-HCc2jMJRAfviGFAh0FsOR/jNfWhirxl7W6z8zDtttt0GltwxBLdEIjLiweOPFl9WbyJRW1VWnPUSAixJqcWUMQ=="], "@opencode-ai/desktop/marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="], @@ -6578,6 +6567,8 @@ "babel-plugin-module-resolver/glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], + "blume/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="], + "blume/@astrojs/mdx": ["@astrojs/mdx@7.0.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/markdown-remark": "7.2.1", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.16.0", "es-module-lexer": "^2.0.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@astrojs/markdown-satteri": "^0.3.1", "astro": "^7.0.0" }, "optionalPeers": ["@astrojs/markdown-satteri"] }, "sha512-RxyIwU0uFam5ftwqKOjpIdhnFxZ/kEikeimLyQy3eGXbHT8WgRGzzesOIHVU8+m9TY8ag5WVOyvV24/GyqPdPQ=="], "blume/@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], @@ -6714,8 +6705,6 @@ "gcp-metadata/google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="], - "gitlab-ai-provider/openai": ["openai@6.49.0", "", { "peerDependencies": { "@aws-sdk/credential-provider-node": ">=3.972.0 <4", "@smithy/hash-node": ">=4.3.0 <5", "@smithy/signature-v4": ">=5.4.0 <6", "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["@aws-sdk/credential-provider-node", "@smithy/hash-node", "@smithy/signature-v4", "ws", "zod"] }, "sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg=="], - "gitlab-ai-provider/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -7380,10 +7369,6 @@ "@octokit/rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], - "@opencode-ai/core/@ai-sdk/openai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.14", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA=="], - - "@opencode-ai/core/@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.38", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/HHGmtKllqjg1OLc023v9w9kK3laW7Z6TzfZukYQWCsGBbzB9p60zTvvpXFVcs44NZBVXL3viOa1HRKUbeee8g=="], - "@opencode-ai/desktop/@actions/artifact/@actions/core": ["@actions/core@1.11.1", "", { "dependencies": { "@actions/exec": "^1.1.1", "@actions/http-client": "^2.0.1" } }, "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A=="], "@opencode-ai/desktop/@actions/artifact/@actions/http-client": ["@actions/http-client@2.2.3", "", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="], @@ -7620,6 +7605,8 @@ "babel-plugin-module-resolver/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "blume/@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], + "blume/@astrojs/mdx/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], "blume/@astrojs/mdx/@astrojs/markdown-remark": ["@astrojs/markdown-remark@7.2.1", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-jPVNIqTvk+yKviikszv/Y1U4jGUSKpp/Nw48QZV4qjWgp70j4Lkq3lhSDRbWwCfgKvEyO9GHuVbV1dM2WYXy1w=="], diff --git a/package.json b/package.json index 857db661052..b2dcdf14bfc 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,6 @@ "@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch", "@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch", "solid-js@1.9.10": "patches/solid-js@1.9.10.patch", - "@ai-sdk/xai@3.0.102": "patches/@ai-sdk%2Fxai@3.0.102.patch", "@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch", "gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch", "pacote@21.5.0": "patches/pacote@21.5.0.patch", diff --git a/packages/console/function/package.json b/packages/console/function/package.json index 937c0cf5386..bfc2d6d770b 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -12,18 +12,13 @@ "@cloudflare/workers-types": "catalog:", "@tsconfig/node22": "22.0.2", "@types/node": "catalog:", - "openai": "5.11.0", "typescript": "catalog:", "@typescript/native-preview": "catalog:" }, "dependencies": { - "@ai-sdk/anthropic": "3.0.82", - "@ai-sdk/openai": "3.0.48", - "@ai-sdk/openai-compatible": "2.0.37", "@opencode-ai/console-core": "workspace:*", "@opencode-ai/console-resource": "workspace:*", "@openauthjs/openauth": "0.0.0-20250322224806", - "ai": "catalog:", "zod": "catalog:" } } diff --git a/packages/core/package.json b/packages/core/package.json index 79ed89c7ebc..d417d9dfa84 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -78,18 +78,15 @@ "@ai-sdk/cohere": "3.0.27", "@ai-sdk/deepinfra": "2.0.41", "@ai-sdk/gateway": "3.0.104", - "@ai-sdk/google": "3.0.73", "@ai-sdk/google-vertex": "4.0.128", "@ai-sdk/groq": "3.0.31", "@ai-sdk/mistral": "3.0.51", - "@ai-sdk/openai": "3.0.84", "@ai-sdk/openai-compatible": "2.0.41", "@ai-sdk/perplexity": "3.0.26", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@ai-sdk/togetherai": "2.0.41", "@ai-sdk/vercel": "2.0.39", - "@ai-sdk/xai": "3.0.102", "@aws-sdk/credential-providers": "3.1057.0", "@effect/platform-node": "catalog:", "@effect/sql-sqlite-bun": "catalog:", @@ -106,7 +103,6 @@ "@standard-schema/spec": "catalog:", "@parcel/watcher": "2.5.1", "@silvia-odwyer/photon-node": "0.3.4", - "@openrouter/ai-sdk-provider": "2.9.0", "ai-gateway-provider": "3.1.2", "bun-pty": "0.4.8", "diff": "catalog:", diff --git a/packages/core/src/plugin/provider.ts b/packages/core/src/plugin/provider.ts index 7c17bcc4c74..876976059a9 100644 --- a/packages/core/src/plugin/provider.ts +++ b/packages/core/src/plugin/provider.ts @@ -11,7 +11,6 @@ import { DynamicProviderPlugin } from "./provider/dynamic" import { GatewayPlugin } from "./provider/gateway" import { GithubCopilotPlugin } from "./provider/github-copilot" import { GitLabPlugin } from "./provider/gitlab" -import { GooglePlugin } from "./provider/google" import { GoogleVertexAnthropicPlugin, GoogleVertexPlugin } from "./provider/google-vertex" import { GroqPlugin } from "./provider/groq" import { KiloPlugin } from "./provider/kilo" @@ -46,7 +45,6 @@ export const ProviderPlugins: PluginInternal.InternalPlugin[] = [ GatewayPlugin, GithubCopilotPlugin, GitLabPlugin, - GooglePlugin, GoogleVertexAnthropicPlugin, GoogleVertexPlugin, GroqPlugin, diff --git a/packages/core/src/plugin/provider/google.ts b/packages/core/src/plugin/provider/google.ts deleted file mode 100644 index f30be656f7f..00000000000 --- a/packages/core/src/plugin/provider/google.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" - -export const GooglePlugin = define({ - id: "opencode.provider.google", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/google") return - const mod = yield* Effect.promise(() => import("@ai-sdk/google")) - evt.sdk = mod.createGoogleGenerativeAI(evt.options) - }), - ) - }), -}) diff --git a/packages/core/src/plugin/provider/openrouter.ts b/packages/core/src/plugin/provider/openrouter.ts index a9ace9f91ad..3ec143db5cb 100644 --- a/packages/core/src/plugin/provider/openrouter.ts +++ b/packages/core/src/plugin/provider/openrouter.ts @@ -23,13 +23,5 @@ export const OpenRouterPlugin = define({ } } }) - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@openrouter/ai-sdk-provider") return - const mod = yield* Effect.promise(() => import("@openrouter/ai-sdk-provider")) - evt.sdk = mod.createOpenRouter(evt.options) - }), - ) }), }) diff --git a/packages/core/src/plugin/provider/xai.ts b/packages/core/src/plugin/provider/xai.ts index f4d6307ddc9..5d03bb6bad7 100644 --- a/packages/core/src/plugin/provider/xai.ts +++ b/packages/core/src/plugin/provider/xai.ts @@ -6,7 +6,6 @@ import { App } from "../../app" import { Credential } from "../../credential" import { Integration } from "../../integration" import { OauthCallbackPage } from "../../oauth/page" -import { Provider } from "../../provider" const clientID = "b1a00492-073a-47ea-816f-4c329264a828" const issuer = "https://auth.x.ai/oauth2" @@ -162,21 +161,6 @@ export const XAIPlugin = define({ draft.method.update(device(ctx.app)) draft.method.update({ integrationID: "xai", method: { type: "key", label: "Manually enter API Key" } }) }) - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/xai") return - const mod = yield* Effect.promise(() => import("@ai-sdk/xai")) - evt.sdk = mod.createXai(evt.options) - }), - ) - yield* ctx.aisdk.hook( - "language", - Effect.fn(function* (evt) { - if (evt.model.providerID !== Provider.ID.make("xai")) return - evt.language = evt.sdk.responses(evt.model.modelID ?? evt.model.id) - }), - ) }), }) diff --git a/packages/core/test/plugin/provider-google.test.ts b/packages/core/test/plugin/provider-google.test.ts deleted file mode 100644 index 655c525ea02..00000000000 --- a/packages/core/test/plugin/provider-google.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect } from "bun:test" -import { Effect } from "effect" -import { Model } from "@opencode-ai/core/model" -import { Plugin } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { GooglePlugin } from "@opencode-ai/core/plugin/provider/google" -import { Provider } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* Plugin.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* GooglePlugin.effect(host) -}) - -describe("GooglePlugin", () => { - it.effect("creates a Google Generative AI SDK for @ai-sdk/google using the provider ID as SDK name", () => - Effect.gen(function* () { - const plugin = yield* Plugin.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("custom-google"), Model.ID.make("gemini")), - modelID: Model.ID.make("gemini"), - package: "aisdk:@ai-sdk/google", - }), - package: "@ai-sdk/google", - options: { name: "custom-google", apiKey: "test" }, - }) - expect(result.sdk).toBeDefined() - expect(result.sdk?.languageModel("gemini").provider).toBe("custom-google") - }), - ) - - it.effect("ignores non-Google SDK packages", () => - Effect.gen(function* () { - const plugin = yield* Plugin.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("google"), Model.ID.make("gemini")), - modelID: Model.ID.make("gemini"), - package: "aisdk:@ai-sdk/google", - }), - package: "@ai-sdk/google-vertex", - options: { name: "google" }, - }) - expect(result.sdk).toBeUndefined() - }), - ) - - it.effect("uses default languageModel loading with provider ID parity", () => - Effect.gen(function* () { - const plugin = yield* Plugin.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const sdkEvent = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("custom-google"), Model.ID.make("alias")), - modelID: Model.ID.make("gemini-api"), - package: "aisdk:@ai-sdk/google", - }), - package: "@ai-sdk/google", - options: { name: "custom-google", apiKey: "test" }, - }) - const result = yield* aisdk.runLanguage({ - model: sdkEvent.model, - sdk: sdkEvent.sdk, - options: sdkEvent.options, - }) - const language = result.language ?? result.sdk.languageModel(result.model.modelID ?? result.model.id) - expect(language.modelId).toBe("gemini-api") - expect(language.provider).toBe("custom-google") - }), - ) - - it.effect("wraps AI SDK language models for the native runner", () => - Effect.gen(function* () { - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const resolved = yield* aisdk.model( - Model.Info.make({ - ...Model.Info.default(Provider.ID.make("custom-google"), Model.ID.make("alias")), - modelID: Model.ID.make("gemini-api"), - package: "aisdk:@ai-sdk/google", - settings: { apiKey: "test" }, - }), - ) - - expect(String(resolved.id)).toBe("gemini-api") - expect(String(resolved.provider)).toBe("custom-google") - expect(resolved.route.id).toBe("ai-sdk:@ai-sdk/google") - }), - ) -}) diff --git a/packages/core/test/plugin/provider-openrouter.test.ts b/packages/core/test/plugin/provider-openrouter.test.ts index c2e3109f16f..7d9cae924ec 100644 --- a/packages/core/test/plugin/provider-openrouter.test.ts +++ b/packages/core/test/plugin/provider-openrouter.test.ts @@ -1,4 +1,3 @@ -import { AISDK } from "@opencode-ai/core/aisdk" import { describe, expect } from "bun:test" import { Effect } from "effect" import { Catalog } from "@opencode-ai/core/catalog" @@ -15,7 +14,6 @@ const it = testEffect(PluginTestLayer) const addPlugin = Effect.fn(function* () { const plugin = yield* Plugin.Service - const aisdk = yield* AISDK.Service const host = yield* PluginHost.make(plugin) yield* OpenRouterPlugin.effect(host) }) @@ -46,36 +44,6 @@ describe("OpenRouterPlugin", () => { }), ) - it.effect("creates an SDK only for the OpenRouter package", () => - Effect.gen(function* () { - const plugin = yield* Plugin.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const ignored = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.openrouter, Model.ID.make("openai/gpt-5")), - modelID: Model.ID.make("openai/gpt-5"), - package: Provider.aisdk("test-provider"), - }), - package: "@ai-sdk/openai-compatible", - options: { name: "openrouter" }, - }) - expect(ignored.sdk).toBeUndefined() - - const result = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("custom"), Model.ID.make("openai/gpt-5")), - modelID: Model.ID.make("openai/gpt-5"), - package: Provider.aisdk("test-provider"), - }), - package: "@openrouter/ai-sdk-provider", - options: { name: "custom" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - it.effect("filters OpenRouter's gpt-5 chat alias", () => Effect.gen(function* () { const catalog = yield* Catalog.Service diff --git a/packages/core/test/plugin/provider-xai.test.ts b/packages/core/test/plugin/provider-xai.test.ts index 429ccdba194..d9227bd5aa2 100644 --- a/packages/core/test/plugin/provider-xai.test.ts +++ b/packages/core/test/plugin/provider-xai.test.ts @@ -1,13 +1,9 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import type { LanguageModelV3 } from "@ai-sdk/provider" import { describe, expect } from "bun:test" import { Effect } from "effect" import { Integration } from "@opencode-ai/core/integration" -import { Model } from "@opencode-ai/core/model" import { Plugin } from "@opencode-ai/core/plugin" import { PluginHost } from "@opencode-ai/core/plugin/host" import { XAIPlugin } from "@opencode-ai/core/plugin/provider/xai" -import { Provider } from "@opencode-ai/core/provider" import { testEffect } from "../lib/effect" import { PluginTestLayer } from "./fixture" @@ -19,19 +15,6 @@ const addPlugin = Effect.fn(function* () { yield* XAIPlugin.effect(host) }) -function fakeSelectorSdk(calls: string[]) { - const make = (method: string) => (id: string) => { - calls.push(`${method}:${id}`) - return { modelId: id, provider: method, specificationVersion: "v3" } as unknown as LanguageModelV3 - } - return { - responses: make("responses"), - messages: make("messages"), - chat: make("chat"), - languageModel: make("languageModel"), - } -} - describe("XAIPlugin", () => { it.effect("registers browser OAuth, device OAuth, and API key methods", () => Effect.gen(function* () { @@ -54,95 +37,4 @@ describe("XAIPlugin", () => { ]) }), ) - - it.effect("creates an xAI SDK only for @ai-sdk/xai", () => - Effect.gen(function* () { - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const ignored = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("xai"), Model.ID.make("grok-4")), - modelID: Model.ID.make("grok-4"), - package: "aisdk:@ai-sdk/xai", - }), - package: "@ai-sdk/openai-compatible", - options: {}, - }) - - const result = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("xai"), Model.ID.make("grok-4")), - modelID: Model.ID.make("grok-4"), - package: "aisdk:@ai-sdk/xai", - }), - package: "@ai-sdk/xai", - options: {}, - }) - - expect(ignored.sdk).toBeUndefined() - expect(typeof result.sdk?.responses).toBe("function") - }), - ) - - it.effect("creates xAI SDKs for custom provider IDs", () => - Effect.gen(function* () { - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const result = yield* aisdk.runSDK({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("custom-xai"), Model.ID.make("grok-4")), - modelID: Model.ID.make("grok-4"), - package: "aisdk:@ai-sdk/xai", - }), - package: "@ai-sdk/xai", - options: {}, - }) - - expect(result.sdk.responses("grok-4").provider).toBe("xai.responses") - }), - ) - - it.effect("uses responses with the model modelID for xAI language models", () => - Effect.gen(function* () { - const aisdk = yield* AISDK.Service - const calls: string[] = [] - - yield* addPlugin() - const result = yield* aisdk.runLanguage({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.make("xai"), Model.ID.make("alias")), - modelID: Model.ID.make("grok-4"), - package: "aisdk:@ai-sdk/xai", - }), - sdk: fakeSelectorSdk(calls), - options: {}, - }) - - expect(calls).toEqual(["responses:grok-4"]) - expect(result.language).toBeDefined() - }), - ) - - it.effect("ignores non-xAI providers", () => - Effect.gen(function* () { - const aisdk = yield* AISDK.Service - const calls: string[] = [] - - yield* addPlugin() - const result = yield* aisdk.runLanguage({ - model: Model.Info.make({ - ...Model.Info.default(Provider.ID.openai, Model.ID.make("grok-4")), - modelID: Model.ID.make("grok-4"), - package: "aisdk:@ai-sdk/xai", - }), - sdk: fakeSelectorSdk(calls), - options: {}, - }) - - expect(calls).toEqual([]) - expect(result.language).toBeUndefined() - }), - ) }) diff --git a/packages/core/test/provider-xai-responses.test.ts b/packages/core/test/provider-xai-responses.test.ts deleted file mode 100644 index d9d674fe169..00000000000 --- a/packages/core/test/provider-xai-responses.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { createXai } from "@ai-sdk/xai" -import { expect, test } from "bun:test" - -test("xAI Responses sends promptCacheKey as prompt_cache_key", async () => { - let body: Record | undefined - const mockFetch = Object.assign( - async (_input: Parameters[0], init?: RequestInit) => { - body = JSON.parse(String(init?.body)) - return Response.json({ - id: "response-1", - created_at: 0, - model: "grok-4", - object: "response", - output: [], - usage: { input_tokens: 1, output_tokens: 0 }, - status: "completed", - }) - }, - { preconnect: fetch.preconnect }, - ) - const model = createXai({ - apiKey: "test", - fetch: mockFetch, - }).responses("grok-4") - - await model.doGenerate({ - prompt: [{ role: "user", content: [{ type: "text", text: "Hello" }] }], - providerOptions: { xai: { promptCacheKey: "session-123" } }, - }) - - expect(body?.prompt_cache_key).toBe("session-123") -}) diff --git a/packages/web/package.json b/packages/web/package.json index b863be57c03..920ee57740e 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -20,7 +20,6 @@ "@shikijs/transformers": "3.20.0", "@solid-primitives/resize-observer": "2.1.5", "@types/luxon": "catalog:", - "ai": "catalog:", "astro": "5.7.13", "diff": "catalog:", "js-base64": "3.7.7", diff --git a/patches/@ai-sdk%2Fxai@3.0.102.patch b/patches/@ai-sdk%2Fxai@3.0.102.patch deleted file mode 100644 index 27a46014fca..00000000000 --- a/patches/@ai-sdk%2Fxai@3.0.102.patch +++ /dev/null @@ -1,174 +0,0 @@ -diff --git a/dist/index.d.mts b/dist/index.d.mts -index 266c5ffdd9ee74ff95908ce90858ee4369d4e4ae..990ef4195bc67b6d25f249e1c81cf51710390f9a 100644 ---- a/dist/index.d.mts -+++ b/dist/index.d.mts -@@ -78,6 +78,7 @@ declare const xaiLanguageModelResponsesOptions: z.ZodObject<{ - topLogprobs: z.ZodOptional; - store: z.ZodOptional; - previousResponseId: z.ZodOptional; -+ promptCacheKey: z.ZodOptional; - include: z.ZodOptional>>>; -diff --git a/dist/index.d.ts b/dist/index.d.ts -index 266c5ffdd9ee74ff95908ce90858ee4369d4e4ae..990ef4195bc67b6d25f249e1c81cf51710390f9a 100644 ---- a/dist/index.d.ts -+++ b/dist/index.d.ts -@@ -78,6 +78,7 @@ declare const xaiLanguageModelResponsesOptions: z.ZodObject<{ - topLogprobs: z.ZodOptional; - store: z.ZodOptional; - previousResponseId: z.ZodOptional; -+ promptCacheKey: z.ZodOptional; - include: z.ZodOptional>>>; -diff --git a/dist/index.js b/dist/index.js -index 717b74538f5c8f0d6ab1475ebb2a84a47ccd3950..dd7dbeb3bc307e0d355f4bb4939d06cc8eae7528 100644 ---- a/dist/index.js -+++ b/dist/index.js -@@ -1119,6 +1119,14 @@ async function convertToXaiResponsesInput({ - type: "input_file", - file_url: block.data.toString() - }); -+ } else if (block.mediaType === "application/pdf") { -+ contentParts.push({ -+ type: "input_file", -+ ...typeof block.data === "string" && block.data.startsWith("file-") ? { file_id: block.data } : { -+ filename: block.filename ?? "file", -+ file_data: `data:application/pdf;base64,${(0, import_provider_utils5.convertToBase64)(block.data)}` -+ } -+ }); - } else { - throw new import_provider4.UnsupportedFunctionalityError({ - functionality: `file part media type ${block.mediaType} as inline data (xAI Responses requires a URL or a Files API reference for non-image files)` -@@ -1760,6 +1768,10 @@ var xaiLanguageModelResponsesOptions = import_v47.z.object({ - * The ID of the previous response from the model. - */ - previousResponseId: import_v47.z.string().optional(), -+ /** -+ * A stable key used by xAI to improve prompt cache routing. -+ */ -+ promptCacheKey: import_v47.z.string().optional(), - /** - * Specify additional output data to include in the model response. - * Example values: 'file_search_call.results'. -@@ -2165,6 +2177,9 @@ var XaiResponsesLanguageModel = class { - }, - ...options.previousResponseId != null && { - previous_response_id: options.previousResponseId -+ }, -+ ...options.promptCacheKey != null && { -+ prompt_cache_key: options.promptCacheKey - } - }; - if (xaiTools2 && xaiTools2.length > 0) { -diff --git a/dist/index.mjs b/dist/index.mjs -index a26af109585fc2bd3053b320142aa869c06d36f4..774adaf971b648544317a4fc65d0c56e488d4fc7 100644 ---- a/dist/index.mjs -+++ b/dist/index.mjs -@@ -1122,6 +1122,14 @@ async function convertToXaiResponsesInput({ - type: "input_file", - file_url: block.data.toString() - }); -+ } else if (block.mediaType === "application/pdf") { -+ contentParts.push({ -+ type: "input_file", -+ ...typeof block.data === "string" && block.data.startsWith("file-") ? { file_id: block.data } : { -+ filename: block.filename ?? "file", -+ file_data: `data:application/pdf;base64,${convertToBase642(block.data)}` -+ } -+ }); - } else { - throw new UnsupportedFunctionalityError3({ - functionality: `file part media type ${block.mediaType} as inline data (xAI Responses requires a URL or a Files API reference for non-image files)` -@@ -1763,6 +1771,10 @@ var xaiLanguageModelResponsesOptions = z7.object({ - * The ID of the previous response from the model. - */ - previousResponseId: z7.string().optional(), -+ /** -+ * A stable key used by xAI to improve prompt cache routing. -+ */ -+ promptCacheKey: z7.string().optional(), - /** - * Specify additional output data to include in the model response. - * Example values: 'file_search_call.results'. -@@ -2186,6 +2198,9 @@ var XaiResponsesLanguageModel = class { - }, - ...options.previousResponseId != null && { - previous_response_id: options.previousResponseId -+ }, -+ ...options.promptCacheKey != null && { -+ prompt_cache_key: options.promptCacheKey - } - }; - if (xaiTools2 && xaiTools2.length > 0) { -diff --git a/src/responses/convert-to-xai-responses-input.ts b/src/responses/convert-to-xai-responses-input.ts -index 9a3712990cf646a6f7ba757d3f2893a3c37c6ef9..b018a9b95eb21e6c12794e6bddb3d953f40441e5 100644 ---- a/src/responses/convert-to-xai-responses-input.ts -+++ b/src/responses/convert-to-xai-responses-input.ts -@@ -64,6 +64,17 @@ export async function convertToXaiResponsesInput({ - type: 'input_file', - file_url: block.data.toString(), - }); -+ } else if (block.mediaType === 'application/pdf') { -+ contentParts.push({ -+ type: 'input_file', -+ ...(typeof block.data === 'string' && -+ block.data.startsWith('file-') -+ ? { file_id: block.data } -+ : { -+ filename: block.filename ?? 'file', -+ file_data: `data:application/pdf;base64,${convertToBase64(block.data)}`, -+ }), -+ }); - } else { - throw new UnsupportedFunctionalityError({ - functionality: `file part media type ${block.mediaType} as inline data (xAI Responses requires a URL or a Files API reference for non-image files)`, -diff --git a/src/responses/xai-responses-api.ts b/src/responses/xai-responses-api.ts -index 70483ea4f7c340b84c23766ac1d1df21e052842b..4b4d052860caa019556151e9e46dbfda8dfb18a9 100644 ---- a/src/responses/xai-responses-api.ts -+++ b/src/responses/xai-responses-api.ts -@@ -27,7 +27,13 @@ export type XaiResponsesSystemMessage = { - export type XaiResponsesUserMessageContentPart = - | { type: 'input_text'; text: string } - | { type: 'input_image'; image_url: string } -- | { type: 'input_file'; file_url: string }; -+ | { -+ type: 'input_file'; -+ file_url?: string; -+ file_id?: string; -+ file_data?: string; -+ filename?: string; -+ }; - - export type XaiResponsesUserMessage = { - role: 'user'; -diff --git a/src/responses/xai-responses-language-model.ts b/src/responses/xai-responses-language-model.ts -index f90df62eb9a30154388b1390e9f3acc3ccc022bf..00e61cba6cf048ae0045be692f33cb7e1e6a1188 100644 ---- a/src/responses/xai-responses-language-model.ts -+++ b/src/responses/xai-responses-language-model.ts -@@ -182,6 +182,9 @@ export class XaiResponsesLanguageModel implements LanguageModelV3 { - ...(options.previousResponseId != null && { - previous_response_id: options.previousResponseId, - }), -+ ...(options.promptCacheKey != null && { -+ prompt_cache_key: options.promptCacheKey, -+ }), - }; - - if (xaiTools && xaiTools.length > 0) { -diff --git a/src/responses/xai-responses-options.ts b/src/responses/xai-responses-options.ts -index f8e96c061bf8793a402ababb8cad65bb2ad6aead..15c168892c1e8755453c61d3061e958cfd51ac71 100644 ---- a/src/responses/xai-responses-options.ts -+++ b/src/responses/xai-responses-options.ts -@@ -32,6 +32,10 @@ export const xaiLanguageModelResponsesOptions = z.object({ - * The ID of the previous response from the model. - */ - previousResponseId: z.string().optional(), -+ /** -+ * A stable key used by xAI to improve prompt cache routing. -+ */ -+ promptCacheKey: z.string().optional(), - /** - * Specify additional output data to include in the model response. - * Example values: 'file_search_call.results'.