diff --git a/.termux-release-automation b/.termux-release-automation
index e85e24430261..514ee91b1d59 160000
--- a/.termux-release-automation
+++ b/.termux-release-automation
@@ -1 +1 @@
-Subproject commit e85e2443026137806f5365bf44184c945c6b036e
+Subproject commit 514ee91b1d593f3460d0d66f0f28a15a1825400b
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1ab14a7b628a..a9c545efb896 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -157,7 +157,7 @@ Caveats:
- If `spawn` does not work for you, you can debug the server separately:
- Debug server: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode ./src/index.ts serve --port 4096`,
then attach TUI with `opencode attach http://localhost:4096`
- - Debug TUI: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode --conditions=browser ./src/index.ts`
+ - Debug TUI: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode ./src/index.ts`
Other tips and tricks:
diff --git a/bun.lock b/bun.lock
index 343343e556d1..21df3194e091 100644
--- a/bun.lock
+++ b/bun.lock
@@ -29,7 +29,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@corvu/drawer": "catalog:",
"@dnd-kit/abstract": "0.5.0",
@@ -78,7 +78,7 @@
"tailwindcss": "catalog:",
},
"devDependencies": {
- "@happy-dom/global-registrator": "20.0.11",
+ "@happy-dom/global-registrator": "20.12.0",
"@playwright/test": "catalog:",
"@sentry/vite-plugin": "catalog:",
"@tailwindcss/vite": "catalog:",
@@ -96,7 +96,7 @@
},
"packages/cli": {
"name": "@opencode-ai/cli",
- "version": "1.18.25",
+ "version": "1.18.26",
"bin": {
"lildax": "./bin/lildax.cjs",
},
@@ -144,7 +144,7 @@
},
"packages/codemode": {
"name": "@opencode-ai/codemode",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"acorn": "8.15.0",
"effect": "catalog:",
@@ -158,7 +158,7 @@
},
"packages/console/app": {
"name": "@opencode-ai/console-app",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
@@ -178,6 +178,7 @@
"@upstash/redis": "1.38.0",
"chart.js": "4.5.1",
"nitro": "3.0.1-alpha.1",
+ "number-flow": "0.6.2",
"solid-js": "catalog:",
"solid-list": "0.3.0",
"solid-stripe": "0.8.1",
@@ -194,7 +195,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
@@ -221,7 +222,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@ai-sdk/anthropic": "3.0.82",
"@ai-sdk/openai": "3.0.48",
@@ -244,7 +245,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
@@ -268,7 +269,7 @@
},
"packages/console/support": {
"name": "@opencode-ai/console-support",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@opencode-ai/console-core": "workspace:*",
@@ -288,14 +289,14 @@
},
"packages/core": {
"name": "@opencode-ai/core",
- "version": "1.18.25",
+ "version": "1.18.26",
"bin": {
"opencode": "./bin/opencode",
},
"dependencies": {
"@ai-sdk/alibaba": "1.0.17",
- "@ai-sdk/amazon-bedrock": "4.0.158",
- "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/amazon-bedrock": "4.0.166",
+ "@ai-sdk/anthropic": "3.0.111",
"@ai-sdk/azure": "3.0.88",
"@ai-sdk/cerebras": "2.0.41",
"@ai-sdk/cohere": "3.0.27",
@@ -383,7 +384,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@zip.js/zip.js": "2.7.62",
"drizzle-orm": "catalog:",
@@ -437,7 +438,7 @@
},
"packages/effect-drizzle-sqlite": {
"name": "@opencode-ai/effect-drizzle-sqlite",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"drizzle-orm": "catalog:",
"effect": "catalog:",
@@ -451,7 +452,7 @@
},
"packages/effect-sqlite-node": {
"name": "@opencode-ai/effect-sqlite-node",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"effect": "catalog:",
},
@@ -463,7 +464,7 @@
},
"packages/enterprise": {
"name": "@opencode-ai/enterprise",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@hono/standard-validator": "catalog:",
"@opencode-ai/core": "workspace:*",
@@ -495,7 +496,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "catalog:",
@@ -511,7 +512,7 @@
},
"packages/http-recorder": {
"name": "@opencode-ai/http-recorder",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@effect/platform-node": "4.0.0-beta.83",
"@effect/platform-node-shared": "4.0.0-beta.83",
@@ -542,7 +543,7 @@
},
"packages/llm": {
"name": "@opencode-ai/llm",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@opencode-ai/schema": "workspace:*",
"@smithy/eventstream-codec": "4.2.14",
@@ -561,7 +562,7 @@
},
"packages/opencode": {
"name": "opencode",
- "version": "1.18.25",
+ "version": "1.18.26",
"bin": {
"opencode": "./bin/opencode",
},
@@ -570,8 +571,8 @@
"@actions/github": "6.0.1",
"@agentclientprotocol/sdk": "0.21.0",
"@ai-sdk/alibaba": "1.0.17",
- "@ai-sdk/amazon-bedrock": "4.0.158",
- "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/amazon-bedrock": "4.0.166",
+ "@ai-sdk/anthropic": "3.0.111",
"@ai-sdk/azure": "3.0.88",
"@ai-sdk/cerebras": "2.0.60",
"@ai-sdk/cohere": "3.0.27",
@@ -692,7 +693,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@ai-sdk/provider": "3.0.8",
"@opencode-ai/sdk": "workspace:*",
@@ -768,7 +769,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"cross-spawn": "catalog:",
},
@@ -783,7 +784,7 @@
},
"packages/server": {
"name": "@opencode-ai/server",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@opencode-ai/core": "workspace:*",
"@opencode-ai/protocol": "workspace:*",
@@ -798,7 +799,7 @@
},
"packages/session-ui": {
"name": "@opencode-ai/session-ui",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/client": "file:../app/vendor/opencode-ai-client-1.17.13-v2.tgz",
@@ -838,7 +839,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
@@ -851,7 +852,7 @@
},
"packages/stats/app": {
"name": "@opencode-ai/stats-app",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@ibm/plex": "6.4.1",
"@kobalte/core": "catalog:",
@@ -878,7 +879,7 @@
},
"packages/stats/core": {
"name": "@opencode-ai/stats-core",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@aws-sdk/client-athena": "3.933.0",
"@planetscale/database": "1.19.0",
@@ -897,7 +898,7 @@
},
"packages/stats/server": {
"name": "@opencode-ai/stats-server",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@aws-sdk/client-firehose": "3.933.0",
"@effect/platform-node": "catalog:",
@@ -939,7 +940,7 @@
},
"packages/tui": {
"name": "@opencode-ai/tui",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@opencode-ai/core": "workspace:*",
"@opencode-ai/plugin": "workspace:*",
@@ -966,7 +967,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@kobalte/core": "catalog:",
"@pierre/diffs": "catalog:",
@@ -1017,7 +1018,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
@@ -1066,10 +1067,12 @@
"gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch",
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
+ "@ai-sdk/anthropic@3.0.111": "patches/@ai-sdk%2Fanthropic@3.0.111.patch",
"@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch",
"@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
- "@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
"solid-js@1.9.10": "patches/solid-js@1.9.10.patch",
+ "@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
+ "@ai-sdk/amazon-bedrock@4.0.166": "patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch",
"@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch",
"@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
"pacote@21.5.0": "patches/pacote@21.5.0.patch",
@@ -1077,6 +1080,7 @@
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch",
},
"overrides": {
+ "@ai-sdk/anthropic": "3.0.111",
"@opentui/core": "catalog:",
"@opentui/keymap": "catalog:",
"@opentui/solid": "catalog:",
@@ -1168,9 +1172,9 @@
"@ai-sdk/alibaba": ["@ai-sdk/alibaba@1.0.17", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.41", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZbE+U5bWz2JBc5DERLowx5+TKbjGBE93LqKZAWvuEn7HOSQMraxFMZuc0ST335QZJAyfBOzh7m1mPQ+y7EaaoA=="],
- "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@4.0.158", "", { "dependencies": { "@ai-sdk/anthropic": "3.0.111", "@ai-sdk/openai": "3.0.98", "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.46", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-yZebHEszUzPLsK+Rq5sVZJkJj7EYDgY+Lz36IGf/RSkSC5LOMDbVKoQ55S8xNzJqVjUDqlWuZiQzg40HQslmCw=="],
+ "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@4.0.166", "", { "dependencies": { "@ai-sdk/anthropic": "3.0.115", "@ai-sdk/openai": "3.0.105", "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.50", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-HzzQb+ks+WmRcnnT9uBdJAxaqSXz3CWgmLSe9hePAkELPzTl/nAIJh2fb2+UsTD0n9OzZfBb25k68CIxraKkoA=="],
- "@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.82", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-WKKou2wbhGGYV8PSALAPyV2YY4nfCqCPkyBzYtJtDA9yCcIFwsbtkTNgg7bqtLCVzeEsY7wwxRoCWy+EMfrw/A=="],
+ "@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.111", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.46" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-atgBW8jZPr/KuaKX5FvDIHuXBI8VCol6kVeoD4P0657+VXR73QsLogXQVN/Zt5FHtq9WzpdIZseCJiXPqkgwwA=="],
"@ai-sdk/azure": ["@ai-sdk/azure@3.0.88", "", { "dependencies": { "@ai-sdk/deepseek": "2.0.47", "@ai-sdk/openai": "3.0.84", "@ai-sdk/provider": "3.0.14", "@ai-sdk/provider-utils": "4.0.38" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-RRjZkB1lYplh8dpBarnvkl1j7sYLHsyXua7erL3oNcMK7fHcl4bPO5C7iQhD1O/DqD/zCceDifnege1s+8yEvw=="],
@@ -1658,7 +1662,7 @@
"@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="],
- "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.0.11", "", { "dependencies": { "@types/node": "^20.0.0", "happy-dom": "^20.0.11" } }, "sha512-GqNqiShBT/lzkHTMC/slKBrvN0DsD4Di8ssBk4aDaVgEn+2WMzE6DXxq701ndSXj7/0cJ8mNT71pM7Bnrr6JRw=="],
+ "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.12.0", "", { "dependencies": { "@types/node": ">=20.0.0", "happy-dom": "^20.12.0" } }, "sha512-BUE55Rew3oMwBzwCwmUnV+Oxk51V3xolM39Ts6kGiBXNELjujiESwk9qc99JRr6cVrj3OTd9MJ5zQ2fpn+jy6g=="],
"@hey-api/codegen-core": ["@hey-api/codegen-core@0.5.5", "", { "dependencies": { "@hey-api/types": "0.1.2", "ansi-colors": "4.1.3", "c12": "3.3.3", "color-support": "1.1.3" }, "peerDependencies": { "typescript": ">=5.5.3" } }, "sha512-f2ZHucnA2wBGAY8ipB4wn/mrEYW+WUxU2huJmUvfDO6AE2vfILSHeF3wCO39Pz4wUYPoAWZByaauftLrOfC12Q=="],
@@ -3236,6 +3240,8 @@
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
+ "buffer-image-size": ["buffer-image-size@0.6.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ=="],
+
"buffers": ["buffers@0.1.1", "", {}, "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ=="],
"builder-util": ["builder-util@26.15.0", "", { "dependencies": { "@types/debug": "^4.1.6", "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" } }, "sha512-dUx+HxVbiNsNQ4mGe1PyoC/tBmsHwBNDLdBuqWCj+rhHFE9lHgrXiGYKAM1uNlznhAaUSyMlms84VeSSr3gOBA=="],
@@ -3652,6 +3658,8 @@
"escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+ "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
+
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
"estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="],
@@ -3872,7 +3880,7 @@
"h3": ["h3@2.0.1-rc.4", "", { "dependencies": { "rou3": "^0.7.8", "srvx": "^0.9.1" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"] }, "sha512-vZq8pEUp6THsXKXrUXX44eOqfChic2wVQ1GlSzQCBr7DeFBkfIZAo2WyNND4GSv54TAa0E4LYIK73WSPdgKUgw=="],
- "happy-dom": ["happy-dom@20.9.0", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.18.3" } }, "sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ=="],
+ "happy-dom": ["happy-dom@20.12.0", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-7uMYJu2SEwwL8vVcKp0C0lnt6d2LSGGe+T+oY79PiCJNNSgFpbxW8n5KuzpDQvrU4mt+fYiK1+Jy7Z2v39YR6g=="],
"has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
@@ -4566,6 +4574,8 @@
"nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+ "number-flow": ["number-flow@0.6.2", "", { "dependencies": { "esm-env": "^1.1.4" } }, "sha512-MCnImG4Q5vPwhSXnov56nOuyyKn6LC+Qd7II1UiKc+ACRtug5iAtn0+CwXNxM38AC5lSowEY+oYEtZX2qMnUyw=="],
+
"nypm": ["nypm@0.6.6", "", { "dependencies": { "citty": "^0.2.2", "pathe": "^2.0.3", "tinyexec": "^1.1.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q=="],
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
@@ -5624,21 +5634,19 @@
"@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.111", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.46" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-atgBW8jZPr/KuaKX5FvDIHuXBI8VCol6kVeoD4P0657+VXR73QsLogXQVN/Zt5FHtq9WzpdIZseCJiXPqkgwwA=="],
-
- "@ai-sdk/amazon-bedrock/@ai-sdk/openai": ["@ai-sdk/openai@3.0.98", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.46" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-nAvp8pVOUJ3znJHRzZs54Y7CJQSikOW1Ty7LTdtQT+/pgtAwqhuKd8oaXbiW2xQaYBdH2i8o9AcEpcUdXIyF+g=="],
+ "@ai-sdk/amazon-bedrock/@ai-sdk/openai": ["@ai-sdk/openai@3.0.105", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.50" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-umx95F8gqGuhPdoW+4ofq83fuSN6aMHwISxvY6dZU51Iix5ZKId0FNru+0FQeu+xfFUrVNmf3vYQNc2FLN85xA=="],
"@ai-sdk/amazon-bedrock/@ai-sdk/provider": ["@ai-sdk/provider@3.0.15", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-XeZW1CcDF2GMbH4wejW6xBRI2QCOgnkVYUnxoeDadB1mf85riL2bMUeDoh+6gJ/r4mjNfzUPW8OjLjvwTP0u1Q=="],
- "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.46", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^6.28.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-tEtld97plCFiYevsJuOkGkeuhQndeMWFBVrJS4AjnbD5AqrNSXRCe0p+BZ3Cju/sxDeeZ9ym3q9YUV8fASA7aQ=="],
+ "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.50", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^6.28.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YAcB+7M1JhAYsHorTrWyldCyZihjCKr/QRXH2vFrara/+lwqNE7q5KzoucKLZ7ktFiUonhnhFhRoiymsq/2K2Q=="],
"@ai-sdk/amazon-bedrock/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="],
"@ai-sdk/amazon-bedrock/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
- "@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+ "@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@3.0.15", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-XeZW1CcDF2GMbH4wejW6xBRI2QCOgnkVYUnxoeDadB1mf85riL2bMUeDoh+6gJ/r4mjNfzUPW8OjLjvwTP0u1Q=="],
- "@ai-sdk/anthropic/@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/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.46", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^6.28.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-tEtld97plCFiYevsJuOkGkeuhQndeMWFBVrJS4AjnbD5AqrNSXRCe0p+BZ3Cju/sxDeeZ9ym3q9YUV8fASA7aQ=="],
"@ai-sdk/azure/@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=="],
@@ -5674,8 +5682,6 @@
"@ai-sdk/google/@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/google-vertex/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.110", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-rNkamQCeAUOUGr5Npg5pXZyYFH4fS1U6Mbdy3dF/NNBEI3D2Chc/ruRrwNegP0gfpX3cllP3O4jSibGBbWPZ7A=="],
-
"@ai-sdk/google-vertex/@ai-sdk/google": ["@ai-sdk/google@3.0.108", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kwvYpRNghqt0VRKE7Hx1UWZQCUJJFqUITj24baxy+ApS0Hru0PkBJHD75a36Wc+e6e+wHcKR2MconTeJiBZigA=="],
"@ai-sdk/google-vertex/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.67", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-glcEJC2mBXJKj7joFI0fRhcbdDYKTBgXMPcT6Vcnlym67tTzuNG9pFx3zblxVv8TdOxhojJja5zGG19yeGJxuA=="],
@@ -6158,8 +6164,6 @@
"ai-gateway-provider/@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@4.0.153", "", { "dependencies": { "@ai-sdk/anthropic": "3.0.110", "@ai-sdk/openai": "3.0.96", "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.45", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-iEXrLgWylCHJmznqlKLU3CqRh8UWibv+illrwmsk136FVBBvyXiGnpQrI1pGWCScVLQjBQSFQu7GJDkUEomf/A=="],
- "ai-gateway-provider/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.110", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-rNkamQCeAUOUGr5Npg5pXZyYFH4fS1U6Mbdy3dF/NNBEI3D2Chc/ruRrwNegP0gfpX3cllP3O4jSibGBbWPZ7A=="],
-
"ai-gateway-provider/@ai-sdk/cerebras": ["@ai-sdk/cerebras@2.0.60", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.54", "@ai-sdk/provider": "3.0.12", "@ai-sdk/provider-utils": "4.0.33" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Rnok3cThg6awBwaDSyiZpgRpbV7pqxGYrA89LODCo5cuEHeP2h0AM0lLHP7zIkclAdXfOm4wldKi/S2T/DGCOw=="],
"ai-gateway-provider/@ai-sdk/cohere": ["@ai-sdk/cohere@3.0.54", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@ai-sdk/provider-utils": "4.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cXLjIsSzUriPHe704IH6d+ipJ/OvczTB700p9Zma7DPgQzvxG/diyr8q/2LEsbTRiTopiKhky8dn1PJNQcJToQ=="],
@@ -6574,6 +6578,8 @@
"@ai-sdk/anthropic/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+ "@ai-sdk/anthropic/@ai-sdk/provider-utils/undici": ["undici@6.28.0", "", {}, "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA=="],
+
"@ai-sdk/azure/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"@ai-sdk/cerebras/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
@@ -6982,10 +6988,6 @@
"ai-gateway-provider/@ai-sdk/amazon-bedrock/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
- "ai-gateway-provider/@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@3.0.15", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-XeZW1CcDF2GMbH4wejW6xBRI2QCOgnkVYUnxoeDadB1mf85riL2bMUeDoh+6gJ/r4mjNfzUPW8OjLjvwTP0u1Q=="],
-
- "ai-gateway-provider/@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.45", "", { "dependencies": { "@ai-sdk/provider": "3.0.15", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8", "undici": "^5.29.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7u5B/E2uZmU65SlJhhQGFHZwRCN0xOz4HHtFc4sEGV9PHbX3fGiEiZBpc/SABay1dGeJgK3VD60rvLGoWdWPXA=="],
-
"ai-gateway-provider/@ai-sdk/cerebras/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.54", "", { "dependencies": { "@ai-sdk/provider": "3.0.12", "@ai-sdk/provider-utils": "4.0.33" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OyXt0zK8y2/ZIyWlbxTv2r1M7AK227S+Gl4BYOEF42q0wz1n5m4fwR8L4Fy/MQ4Ho6xje47MPsFcRdIqIyP6Rw=="],
"ai-gateway-provider/@ai-sdk/cerebras/@ai-sdk/provider": ["@ai-sdk/provider@3.0.12", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-sj9DWTJ2Ze0WR9qsiOPqoqzNx3OxL6iMxHImbhvoe9qOspekbzxNDMiJ4TIGfYHYh9w4OmBjz3prvqhzTi96+Q=="],
@@ -7432,10 +7434,6 @@
"ai-gateway-provider/@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
- "ai-gateway-provider/@ai-sdk/anthropic/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
-
- "ai-gateway-provider/@ai-sdk/anthropic/@ai-sdk/provider-utils/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
-
"ai-gateway-provider/@ai-sdk/cerebras/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"ai-gateway-provider/@ai-sdk/cohere/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
diff --git a/nix/hashes.json b/nix/hashes.json
index 8279470428b0..94526422c6d4 100644
--- a/nix/hashes.json
+++ b/nix/hashes.json
@@ -1,8 +1,8 @@
{
"nodeModules": {
- "x86_64-linux": "sha256-fJ72uEK9rSoFL6eJk0Lwkc2TIMLZyQ7Iz83WrZE2duA=",
- "aarch64-linux": "sha256-ElEwz5spFa8XFYSBiGjKlTKRFQCju/ZYDlb6h1FaKoI=",
- "aarch64-darwin": "sha256-RmbrAlggOqxNFdhW+qj2tjRCpRf2NDLe68TikbGtCeA=",
- "x86_64-darwin": "sha256-ZgYE0J+Dkz/kALK3kZ1jdFIZ5/BEkEaw0mXCqPon0iY="
+ "x86_64-linux": "sha256-xxfesqajP1GI/XdzCIM8hHHOdhWBrjfKkQxDpC2qRKE=",
+ "aarch64-linux": "sha256-T9HxvCNwt7St6VQsEqLMCSVu7jgTnQjdo824LRzi+t4=",
+ "aarch64-darwin": "sha256-vo0ALiy0tGnp8YVqNwGS8lsXKUmvkRiKPUacbQhZMHs=",
+ "x86_64-darwin": "sha256-cToGEEFCm4HX4xLfVNYEwugoUhCKVXAbH+uSI2cVo4w="
}
}
diff --git a/package.json b/package.json
index bab8c6b94a5d..e0c8fe1a0d97 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"type": "module",
"packageManager": "bun@1.3.14",
"scripts": {
- "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts",
+ "dev": "bun run --cwd packages/opencode src/index.ts",
"dev:desktop": "bun --cwd packages/desktop dev",
"dev:web": "bun --cwd packages/app dev",
"dev:console": "ulimit -n 10240 2>/dev/null; bun run --cwd packages/console/app dev",
@@ -137,6 +137,7 @@
"electron"
],
"overrides": {
+ "@ai-sdk/anthropic": "3.0.111",
"@opentui/core": "catalog:",
"@opentui/keymap": "catalog:",
"@opentui/solid": "catalog:",
@@ -145,7 +146,6 @@
},
"patchedDependencies": {
"@dnd-kit/dom@0.5.0": "patches/@dnd-kit%2Fdom@0.5.0.patch",
- "@ff-labs/fff-bun@0.9.3": "patches/@ff-labs%2Ffff-bun@0.9.3.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",
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
@@ -160,6 +160,8 @@
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
"@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch",
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch",
- "@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch"
+ "@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch",
+ "@ai-sdk/anthropic@3.0.111": "patches/@ai-sdk%2Fanthropic@3.0.111.patch",
+ "@ai-sdk/amazon-bedrock@4.0.166": "patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch"
}
}
diff --git a/packages/app/AGENTS.md b/packages/app/AGENTS.md
index 72a973ebd40c..5638ea8e6d1a 100644
--- a/packages/app/AGENTS.md
+++ b/packages/app/AGENTS.md
@@ -11,7 +11,7 @@
- `opencode dev web` proxies `https://app.opencode.ai`, so local UI/CSS changes will not show there.
- For local UI changes, run the backend and app dev servers separately.
-- Backend (from `packages/opencode`): `bun run --conditions=browser ./src/index.ts serve --port 4096`
+- Backend (from `packages/opencode`): `bun run ./src/index.ts serve --port 4096`
- App (from `packages/app`): `bun dev -- --port 4444`
- Open `http://localhost:4444` to verify UI changes (it targets the backend at `http://localhost:4096`).
diff --git a/packages/app/e2e/regression/session-rename.spec.ts b/packages/app/e2e/regression/session-rename.spec.ts
new file mode 100644
index 000000000000..2cd97c24c1c0
--- /dev/null
+++ b/packages/app/e2e/regression/session-rename.spec.ts
@@ -0,0 +1,141 @@
+import { expect, test } from "@playwright/test"
+import { fixture, pageMessages } from "../smoke/session-timeline.fixture"
+import { mockOpenCodeServer } from "../utils/mock-server"
+
+test.beforeEach(async ({ page }) => {
+ const sessions = fixture.sessions.map((session) => ({ ...session }))
+ await mockOpenCodeServer(page, {
+ protocol: "v1",
+ sessions,
+ provider: fixture.provider,
+ directory: fixture.directory,
+ project: fixture.project,
+ pageMessages,
+ })
+ await page.route(/\/session\/[^/]+(?:\?.*)?$/, async (route) => {
+ if (route.request().method() !== "PATCH") return route.fallback()
+ const id = new URL(route.request().url()).pathname.split("/").at(-1)
+ const session = sessions.find((item) => item.id === id)
+ const payload: unknown = route.request().postDataJSON()
+ if (
+ !session ||
+ !payload ||
+ typeof payload !== "object" ||
+ !("title" in payload) ||
+ typeof payload.title !== "string"
+ )
+ throw new Error("Invalid rename request")
+ session.title = payload.title
+ await route.fulfill({ json: session, headers: { "access-control-allow-origin": "*" } })
+ })
+ await page.addInitScript((directory) => {
+ localStorage.setItem(
+ "opencode.global.dat:server",
+ JSON.stringify({
+ projects: { local: [{ worktree: directory, expanded: true }] },
+ lastProject: { local: directory },
+ }),
+ )
+ }, fixture.directory)
+ await page.goto("/")
+ await page.locator('[data-component="home-session-row"]').filter({ hasText: fixture.expected.targetTitle }).click()
+ await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
+})
+
+for (const commit of ["Enter", "blur", "click outside"]) {
+ test(`saves the session heading on ${commit}`, async ({ page }) => {
+ await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
+ const input = page.locator('input[data-slot="session-title-child"]')
+ await expect(input).toBeFocused()
+ await input.fill("Renamed session")
+ if (commit === "Enter") await input.press("Enter")
+ if (commit === "blur") await input.press("Tab")
+ if (commit === "click outside") await page.getByRole("textbox", { name: "Prompt", exact: true }).click()
+ await expect(page.getByRole("heading", { name: "Renamed session", exact: true })).toBeVisible()
+ await expect(page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: "Renamed session" })).toBeVisible()
+ await page.reload()
+ await expect(page.getByRole("heading", { name: "Renamed session", exact: true })).toBeVisible()
+ })
+}
+
+test("cancels the session heading with Escape", async ({ page }) => {
+ await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
+ const input = page.locator('input[data-slot="session-title-child"]')
+ await input.fill("Discard this title")
+ await input.press("Escape")
+ await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
+ await page.reload()
+ await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
+})
+
+test("keeps the draft when saving the session heading fails", async ({ page }) => {
+ await page.route(/\/session\/[^/]+(?:\?.*)?$/, (route) => {
+ if (route.request().method() !== "PATCH") return route.fallback()
+ return route.fulfill({ status: 500, headers: { "access-control-allow-origin": "*" } })
+ })
+ await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
+ const input = page.locator('input[data-slot="session-title-child"]')
+ await input.fill("Retry this title")
+ await input.press("Tab")
+ await expect(page.getByText("Request failed", { exact: true })).toBeVisible()
+ await expect(input).toBeEnabled()
+ await expect(input).toHaveValue("Retry this title")
+ await expect(
+ page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: fixture.expected.targetTitle }),
+ ).toBeVisible()
+})
+
+test("does not save an empty session heading", async ({ page }) => {
+ await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
+ const input = page.locator('input[data-slot="session-title-child"]')
+ await input.fill(" ")
+ await input.press("Tab")
+ await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
+ await page.reload()
+ await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
+})
+
+test("renames and closes the session tab from its context menu", async ({ page }) => {
+ const tab = page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: fixture.expected.targetTitle })
+ await tab.click({ button: "right" })
+ await expect(page.getByRole("menuitem", { name: "Rename", exact: true })).toBeVisible()
+ await page.keyboard.press("Escape")
+ await expect(page.getByRole("menuitem", { name: "Rename", exact: true })).toBeHidden()
+ await expect(tab).toBeFocused()
+ await tab.press("Shift+F10")
+ await page.getByRole("menuitem", { name: "Rename", exact: true }).click()
+ const input = page.locator('[data-slot="tab-title"][contenteditable="true"]')
+ await expect(input).toBeFocused()
+ await input.fill("Renamed from tab")
+ await input.press("Enter")
+ await expect(page.getByRole("heading", { name: "Renamed from tab", exact: true })).toBeVisible()
+ await page.reload()
+ await expect(page.getByRole("heading", { name: "Renamed from tab", exact: true })).toBeVisible()
+ const renamed = page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: "Renamed from tab" })
+ await renamed.click({ button: "right" })
+ await page.getByRole("menuitem", { name: "Close tab", exact: true }).click()
+ await expect(renamed).toBeHidden()
+ await page.getByRole("button", { name: "Home", exact: true }).click()
+ await expect(
+ page.locator('[data-component="home-session-row"]').filter({ hasText: "Renamed from tab" }),
+ ).toBeVisible()
+})
+
+test("renames an inactive tab without switching sessions", async ({ page }) => {
+ await page.getByRole("button", { name: "Home", exact: true }).click()
+ await page.locator('[data-component="home-session-row"]').filter({ hasText: fixture.expected.sourceTitle }).click()
+ await expect(page.getByRole("heading", { name: fixture.expected.sourceTitle, exact: true })).toBeVisible()
+ const tab = page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: fixture.expected.targetTitle })
+ await tab.click({ button: "right" })
+ await page.getByRole("menuitem", { name: "Rename", exact: true }).click()
+ const input = page.locator('[data-slot="tab-title"][contenteditable="true"]')
+ await expect(input).toBeFocused()
+ await input.fill("Inactive tab renamed")
+ await input.press("Tab")
+ await expect(page.getByRole("heading", { name: fixture.expected.sourceTitle, exact: true })).toBeVisible()
+ await expect(page).toHaveURL(new RegExp(`/session/${fixture.sourceID}$`))
+ await page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: "Inactive tab renamed" }).click()
+ await expect(page.getByRole("heading", { name: "Inactive tab renamed", exact: true })).toBeVisible()
+ await page.reload()
+ await expect(page.getByRole("heading", { name: "Inactive tab renamed", exact: true })).toBeVisible()
+})
diff --git a/packages/app/e2e/regression/subagent-child-navigation.spec.ts b/packages/app/e2e/regression/subagent-child-navigation.spec.ts
index 019cc156eca1..c4ed6a78a040 100644
--- a/packages/app/e2e/regression/subagent-child-navigation.spec.ts
+++ b/packages/app/e2e/regression/subagent-child-navigation.spec.ts
@@ -39,7 +39,7 @@ test("shows the not found fallback when the viewed session is deleted", async ({
})
await expect(page.getByText("This session cannot be found")).toBeVisible()
- await expect(page.getByRole("button", { name: "Close Tab" })).toBeVisible()
+ await expect(page.getByRole("button", { name: "Close Tab", exact: true })).toBeVisible()
await expect(page.getByRole("heading", { name: taskDescription })).toHaveCount(0)
})
diff --git a/packages/app/package.json b/packages/app/package.json
index e0a1d076e73d..26dd36bcb15b 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
- "version": "1.18.25",
+ "version": "1.18.26",
"description": "",
"type": "module",
"exports": {
@@ -32,7 +32,7 @@
},
"license": "MIT",
"devDependencies": {
- "@happy-dom/global-registrator": "20.0.11",
+ "@happy-dom/global-registrator": "20.12.0",
"@playwright/test": "catalog:",
"@sentry/vite-plugin": "catalog:",
"@tailwindcss/vite": "catalog:",
diff --git a/packages/app/src/components/titlebar-tab-nav.tsx b/packages/app/src/components/titlebar-tab-nav.tsx
index 65493c54dff5..b016f286a250 100644
--- a/packages/app/src/components/titlebar-tab-nav.tsx
+++ b/packages/app/src/components/titlebar-tab-nav.tsx
@@ -1,9 +1,11 @@
import { createEffect, createMemo, createSignal, onCleanup, Show, type Ref } from "solid-js"
+import { createStore } from "solid-js/store"
import { makeEventListener } from "@solid-primitives/event-listener"
import { createResizeObserver } from "@solid-primitives/resize-observer"
import { createMutation } from "@tanstack/solid-query"
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
+import { MenuV2 } from "@opencode-ai/ui/v2/menu-v2"
import { useGlobal } from "@/context/global"
import { useLanguage } from "@/context/language"
import { ServerConnection, serverName } from "@/context/server"
@@ -33,6 +35,8 @@ export function TabNavItem(props: {
pressed?: boolean
hidden?: boolean
}) {
+ const language = useLanguage()
+ const [menu, setMenu] = createStore({ open: false, rename: false })
const [editing, setEditing] = createSignal(false)
const [titleOverflowing, setTitleOverflowing] = createSignal(false)
let tabRoot!: HTMLDivElement
@@ -76,7 +80,7 @@ export function TabNavItem(props: {
})
const [popoverOpen, setPopoverOpen] = createSignal(false)
- const previewBlocked = () => !!props.dragging || editing() || !!props.pressed || !props.session()
+ const previewBlocked = () => !!props.dragging || editing() || menu.open || !!props.pressed || !props.session()
const measureTitleOverflow = () => {
if (!titleEl || editing()) {
@@ -138,9 +142,9 @@ export function TabNavItem(props: {
titleEl.textContent = value
})
- const openRename = (event: MouseEvent) => {
- event.preventDefault()
- event.stopPropagation()
+ const openRename = (event?: MouseEvent) => {
+ event?.preventDefault()
+ event?.stopPropagation()
if (!canOpenTabRename(props.dragging, editing(), rename.isPending)) return
const session = props.session()
if (!session) return
@@ -171,7 +175,7 @@ export function TabNavItem(props: {
onCleanup(cleanup)
})
- const tab = (
+ const tab = () => (
{
tabRoot = el
@@ -196,7 +200,11 @@ export function TabNavItem(props: {
closeTab(event)
}}
>
-
-
+
}
+ aria-label={language.t("common.closeTab")}
/>
)
return (
- {
- if (value && previewBlocked()) return
- setPopoverOpen(value)
- }}
- data={{
- projectName: projectName(),
- title: props.session()?.title,
- path: previewPath(),
- serverName: serverLabel(),
+ {
+ setMenu("open", open)
+ if (open) setPopoverOpen(false)
}}
- />
+ >
+ {
+ if (value && previewBlocked()) return
+ setPopoverOpen(value)
+ }}
+ data={{
+ projectName: projectName(),
+ title: props.session()?.title,
+ path: previewPath(),
+ serverName: serverLabel(),
+ }}
+ />
+
+ {
+ if (!menu.rename) return
+ event.preventDefault()
+ setMenu("rename", false)
+ openRename()
+ }}
+ >
+ setMenu("rename", true)}>
+ {language.t("common.rename")}
+
+ {language.t("common.closeTab")}
+
+
+
)
}
diff --git a/packages/app/src/pages/session/timeline/message-timeline.tsx b/packages/app/src/pages/session/timeline/message-timeline.tsx
index 18a153d29971..e0838825570e 100644
--- a/packages/app/src/pages/session/timeline/message-timeline.tsx
+++ b/packages/app/src/pages/session/timeline/message-timeline.tsx
@@ -777,6 +777,7 @@ export function MessageTimeline(props: {
}
const saveTitleEditor = () => {
+ if (!title.editing) return
const id = sessionID()
if (!id) return
if (titleMutation.isPending) return
@@ -1447,6 +1448,7 @@ export function MessageTimeline(props: {
onInput={(event) => setTitle("draft", event.currentTarget.value)}
onKeyDown={(event) => {
event.stopPropagation()
+ if (event.isComposing || event.keyCode === 229) return
if (event.key === "Enter") {
event.preventDefault()
void saveTitleEditor()
@@ -1457,7 +1459,7 @@ export function MessageTimeline(props: {
closeTitleEditor()
}
}}
- onBlur={closeTitleEditor}
+ onBlur={saveTitleEditor}
/>
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 207967c19c01..dcc5b55ab3ba 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/cli",
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"bin": {
diff --git a/packages/codemode/package.json b/packages/codemode/package.json
index 400451efca64..23d9cf8412de 100644
--- a/packages/codemode/package.json
+++ b/packages/codemode/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/codemode",
- "version": "1.18.25",
+ "version": "1.18.26",
"description": "Effect-native confined code execution over schema-described tools",
"private": true,
"type": "module",
diff --git a/packages/console/app/package.json b/packages/console/app/package.json
index e83f568c3be2..19fdec8598cf 100644
--- a/packages/console/app/package.json
+++ b/packages/console/app/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"scripts": {
@@ -29,6 +29,7 @@
"@upstash/redis": "1.38.0",
"chart.js": "4.5.1",
"nitro": "3.0.1-alpha.1",
+ "number-flow": "0.6.2",
"solid-js": "catalog:",
"solid-list": "0.3.0",
"solid-stripe": "0.8.1",
diff --git a/packages/console/app/src/component/limits-graph.tsx b/packages/console/app/src/component/limits-graph.tsx
new file mode 100644
index 000000000000..376e23f9c7ca
--- /dev/null
+++ b/packages/console/app/src/component/limits-graph.tsx
@@ -0,0 +1,267 @@
+import { For, createSignal, onCleanup, onMount } from "solid-js"
+import { useI18n } from "~/context/i18n"
+import { RollingNumber } from "./rolling-number"
+
+export function LimitsGraph(props: { href: string }) {
+ let root!: HTMLElement
+ const [visible, setVisible] = createSignal(false)
+ const [boosted, setBoosted] = createSignal(false)
+ const [promoted, setPromoted] = createSignal([])
+ let timer: ReturnType | undefined
+
+ const i18n = useI18n()
+
+ onMount(() => {
+ const motion = window.matchMedia("(prefers-reduced-motion: reduce)")
+ const finish = () => {
+ if (!motion.matches) return
+ clearTimeout(timer)
+ setVisible(true)
+ setBoosted(true)
+ setPromoted(bonuses.map((model) => model.id))
+ }
+ motion.addEventListener("change", finish)
+ onCleanup(() => {
+ clearTimeout(timer)
+ motion.removeEventListener("change", finish)
+ })
+ if (motion.matches) return finish()
+ if (typeof IntersectionObserver === "undefined") return setVisible(true)
+ const observer = new IntersectionObserver(
+ (entries) => {
+ const entry = entries[0]
+ if (!entry?.isIntersecting || entry.intersectionRatio < 0.35) return
+ setVisible(true)
+ observer.disconnect()
+ },
+ { threshold: 0.35 },
+ )
+ observer.observe(root)
+ onCleanup(() => observer.disconnect())
+ })
+
+ const baseline = 100
+ const graph = [
+ { id: "kimi-k3", name: "Kimi K3", req: 110 },
+ { id: "grok-4.6", name: "Grok 4.6", req: 169 },
+ { id: "hy4-preview", name: "Hy4 preview", req: 1350 },
+ { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", req: 2050 },
+ { id: "glm-5.3-flash", name: "GLM-5.3-Flash", req: 3160, baseReq: 1580, bonus: "2x usage" },
+ { id: "minimax-m3", name: "MiniMax M3", req: 3200 },
+ { id: "qwen3.7-plus", name: "Qwen3.7 Plus", req: 4300 },
+ { id: "hy3", name: "Hy3", req: 4300 },
+ { id: "qwen3.8-flash", name: "Qwen3.8 Flash", req: 5400 },
+ { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", req: 7600 },
+ { id: "longcat-2.0", name: "LongCat-2.0", req: 11400 },
+ { id: "mimo-v2.5", name: "MiMo-V2.5", req: 30100 },
+ { id: "muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", req: 45300, edge: true },
+ ].map((model, index) => ({ ...model, d: `${50 + index * 25}ms` }))
+ const bonuses = graph.filter((model) => model.baseReq)
+
+ const w = 1040
+ const chartW = 720
+ const left = 40
+ const right = 60
+ const top = 18
+ const bottom = 44
+ const plot = chartW - left - right
+ const infiniteX = w - 180
+
+ const ratio = (n: number) => n / baseline
+ const rmax = Math.max(1, ...graph.filter((m) => !("infinite" in m)).map((m) => ratio(m.req)))
+ const log = (n: number) => Math.log10(Math.max(n, 1))
+ const base = 24
+ const p = 2.2
+ const x = (r: number) => left + base + Math.pow(log(r) / log(rmax), p) * (plot - base)
+ const ticks = [1, 5, 10, 25, 50, 100, 250].filter((t) => t <= rmax)
+ const labels = (() => {
+ const set = new Set()
+ let last = -Infinity
+ for (const t of ticks) {
+ if (t === 1) {
+ set.add(t)
+ last = x(t)
+ continue
+ }
+ const pos = x(t)
+ if (pos - last < 44) continue
+ set.add(t)
+ last = pos
+ }
+ return set
+ })()
+ const shown = ticks.filter((t) => labels.has(t))
+ const bh = 8
+ const gap = 20
+ const step = bh + gap
+ const gy = (i: number) => top + 22 + step * i
+ const h = gy(graph.length - 1) + bottom
+ const my = graph.length < 2 ? gy(0) : (gy(0) + gy(graph.length - 1)) / 2
+ const px = (n: number) => `${(n / w) * 100}%`
+ const py = (n: number) => `${(n / h) * 100}%`
+ const lx = px(left - 16)
+ const ty = py(h - 18)
+ const timing = () => {
+ const style = getComputedStyle(root)
+ return {
+ duration: Number.parseFloat(style.getPropertyValue("--bonus-duration")),
+ easing: style.getPropertyValue("--spring-easing").trim(),
+ spinEasing: style.getPropertyValue("--digit-easing").trim(),
+ }
+ }
+
+ return (
+ {
+ if (!(event.target instanceof SVGElement) || event.animationName !== "go-graph-reveal") return
+ if (event.target.hasAttribute("data-stage-end") && !boosted()) {
+ const duration = Number.parseFloat(getComputedStyle(root).getPropertyValue("--reveal-duration"))
+ timer = setTimeout(() => setBoosted(true), duration * 0.6)
+ return
+ }
+ if (event.target.dataset.animate !== "bonus") return
+ const model = event.target.dataset.model
+ if (!model) return
+ setPromoted((current) => [...current, model])
+ }}
+ >
+
+
+
+
+
+ {i18n.t("go.graph.go")}
+
+
+
+
+
+ {(t) => (
+
+ {i18n.t("go.graph.tick", { n: t })}
+
+ )}
+
+
+
+
+
+ {(m, i) => (
+
+
+ {!("infinite" in m) && m.baseReq ? (
+
+ ) : (
+ {"infinite" in m ? "\u221e" : m.req.toLocaleString()}
+ )}
+ {m.name}
+ {m.id === "muse-spark-1.2-contributor" && (
+
+ (
+
+ {i18n.t("go.graph.limitedRegions")}
+
+ )
+
+ )}
+ {"infinite" in m && ({i18n.t("go.graph.limitedTime")})}
+
+ {"bonus" in m && {m.bonus}}
+
+ )}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/component/rolling-number.tsx b/packages/console/app/src/component/rolling-number.tsx
new file mode 100644
index 000000000000..df1af6ca20cf
--- /dev/null
+++ b/packages/console/app/src/component/rolling-number.tsx
@@ -0,0 +1,58 @@
+import NumberFlow from "number-flow"
+import { continuous } from "number-flow/plugins"
+import { createEffect, onCleanup, onMount } from "solid-js"
+
+export function RollingNumber(props: {
+ value: number
+ target: number
+ timing: () => { duration: number; easing: string; spinEasing: string }
+}) {
+ let root!: HTMLSpanElement
+ // Keep the server-rendered text stable while the custom element owns its contents.
+ const initial = props.value.toLocaleString()
+ const growing = props.target.toLocaleString().length > initial.length
+
+ onMount(() => {
+ if (new Intl.NumberFormat().resolvedOptions().numberingSystem !== "latn") {
+ createEffect(() => {
+ root.textContent = props.value.toLocaleString()
+ })
+ return
+ }
+
+ const flow = new NumberFlow()
+ flow.format = { useGrouping: true, maximumFractionDigits: 0 }
+ flow.trend = 1
+ if (growing) flow.plugins = [continuous]
+ flow.opacityTiming = { duration: 180, easing: "ease-out" }
+ const motion = window.matchMedia("(prefers-reduced-motion: reduce)")
+ const updateMotion = () => {
+ flow.animated = !motion.matches
+ }
+ updateMotion()
+ motion.addEventListener("change", updateMotion)
+ onCleanup(() => motion.removeEventListener("change", updateMotion))
+ root.replaceChildren(flow)
+ createEffect(() => {
+ const value = props.value
+ if (flow.value === value) return
+ const timing = props.timing()
+ flow.transformTiming = { duration: timing.duration, easing: timing.easing }
+ flow.spinTiming = {
+ duration: timing.duration,
+ easing: growing ? "cubic-bezier(0.45, 0, 0.55, 1)" : timing.spinEasing,
+ }
+ flow.update(value)
+ })
+ })
+
+ return (
+
+ {initial}
+
+ )
+}
diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts
index a557d4fb0e8e..a479f2642b9a 100644
--- a/packages/console/app/src/i18n/en.ts
+++ b/packages/console/app/src/i18n/en.ts
@@ -267,7 +267,7 @@ export const dict = {
"go.graph.free": "Free",
"go.graph.freePill": "Big Pickle and free models",
"go.graph.go": "Go",
- "go.graph.label": "Requests per 5 hour",
+ "go.graph.label": "Requests / 5 hours",
"go.graph.limitedRegions": "limited regions",
"go.graph.limitedTime": "limited time",
"go.graph.tick": "{{n}}x",
diff --git a/packages/console/app/src/routes/go/index.css b/packages/console/app/src/routes/go/index.css
index b72b01395a14..724fa381e9a7 100644
--- a/packages/console/app/src/routes/go/index.css
+++ b/packages/console/app/src/routes/go/index.css
@@ -21,10 +21,22 @@
}
}
-@keyframes go-graph-bar {
+@keyframes go-graph-reveal {
to {
+ clip-path: inset(0 0 0 0) fill-box;
+ }
+}
+
+@keyframes go-graph-label {
+ to {
+ mask-position: 0 0;
opacity: 1;
- transform: scaleX(1);
+ }
+}
+
+@keyframes go-graph-grid {
+ to {
+ mask-position: 0 100%;
}
}
@@ -477,6 +489,46 @@ body {
}
[data-component="limit-graph"] {
+ --reveal-duration: 950ms;
+ --bonus-duration: 1500ms;
+ --digit-easing: cubic-bezier(0.22, 1, 0.36, 1);
+ --grid-duration: 2000ms;
+ --grid-easing: cubic-bezier(0.22, 1, 0.36, 1);
+ --bar-delay: 240ms;
+ /* Critically damped response, shared by the bars, labels, and rolling digits. */
+ --spring-easing: linear(
+ 0,
+ 0.02991,
+ 0.10078,
+ 0.19179,
+ 0.28962,
+ 0.38611,
+ 0.47651,
+ 0.55839,
+ 0.63079,
+ 0.69365,
+ 0.74748,
+ 0.79306,
+ 0.83131,
+ 0.86315,
+ 0.8895,
+ 0.91117,
+ 0.92892,
+ 0.94339,
+ 0.95515,
+ 0.96467,
+ 0.97236,
+ 0.97855,
+ 0.98352,
+ 0.98751,
+ 0.9907,
+ 0.99324,
+ 0.99527,
+ 0.99689,
+ 0.99817,
+ 0.99919,
+ 1
+ );
margin: 0 auto;
width: calc(100% - 120px);
max-width: calc(100% - 120px);
@@ -491,6 +543,7 @@ body {
}
[data-slot="plot"] {
+ container-type: inline-size;
position: relative;
overflow: visible;
width: 100%;
@@ -515,6 +568,7 @@ body {
}
[data-slot="xlabels"] [data-xlabel] {
+ opacity: 0;
position: absolute;
left: var(--x);
top: var(--y);
@@ -551,11 +605,26 @@ body {
}
}
+ [data-slot="xlabels"] [data-xlabel],
+ [data-slot="pills"] [data-label],
+ [data-bonus] {
+ mask-image: linear-gradient(to right, #000 40%, transparent 60%);
+ mask-size: 250% 100%;
+ mask-position: 100% 0;
+ mask-repeat: no-repeat;
+ }
+
[data-slot="pills"] {
position: absolute;
inset: 0;
pointer-events: none;
+ [data-label] {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ }
+
[data-item] {
position: absolute;
left: var(--x);
@@ -573,7 +642,6 @@ body {
font-size: 13px;
line-height: 20px;
box-sizing: border-box;
- opacity: 0;
}
@media (max-width: 60rem) {
@@ -605,14 +673,20 @@ body {
[data-value] {
color: var(--color-text-strong);
font-weight: 600;
+ font-variant-numeric: tabular-nums;
white-space: nowrap;
+
+ number-flow {
+ line-height: 1;
+ }
}
[data-bonus] {
+ opacity: 0;
color: var(--color-text-weak);
font-size: 12px;
font-weight: 400;
- line-height: 1;
+ line-height: inherit;
white-space: nowrap;
@media (max-width: 40rem) {
@@ -685,11 +759,22 @@ body {
opacity: 0.55;
}
+ [data-grid],
+ [data-stub] {
+ mask-image: linear-gradient(to top, #000 48%, transparent 52%);
+ mask-size: 100% 250%;
+ mask-position: 0 0;
+ mask-repeat: no-repeat;
+ mask-origin: stroke-box;
+ mask-clip: stroke-box;
+ }
+
+ [data-animate="bar"],
+ [data-animate="bonus"] {
+ clip-path: inset(0 100% 0 0) fill-box;
+ }
+
[data-bar] {
- transform-box: fill-box;
- transform-origin: left center;
- opacity: 0;
- transform: scaleX(0.02);
fill: var(--bar-go);
stroke: none;
}
@@ -760,18 +845,65 @@ body {
animation-delay: var(--d, 0ms);
}
- &[data-visible] [data-bar] {
- animation: go-graph-bar 560ms cubic-bezier(0.2, 0.7, 0.2, 1) forwards;
+ &[data-visible] [data-grid],
+ &[data-visible] [data-stub] {
+ animation: go-graph-grid var(--grid-duration) var(--grid-easing) forwards;
animation-delay: var(--d, 0ms);
}
- &[data-visible] [data-slot="pills"] [data-item] {
- opacity: 1;
- transition: opacity 240ms ease;
- transition-delay: var(--d, 0ms);
+ &[data-visible] [data-slot="xlabels"] [data-xlabel] {
+ animation: go-graph-label 300ms ease-out forwards;
+ animation-delay: var(--d, 0ms);
+ }
+
+ &[data-visible] [data-animate="bar"] {
+ animation: go-graph-reveal var(--reveal-duration) var(--spring-easing) forwards;
+ animation-delay: calc(var(--bar-delay) + var(--d, 0ms));
+ }
+
+ &[data-visible] [data-slot="pills"] [data-label] {
+ animation: go-graph-label 400ms ease-out forwards;
+ animation-delay: calc(var(--bar-delay) + var(--d, 0ms) + var(--reveal-duration) * 0.4);
+ }
+
+ &[data-boosted] [data-animate="bonus"] {
+ animation: go-graph-reveal var(--bonus-duration) var(--spring-easing) forwards;
+ animation-delay: var(--bonus-delay);
+ }
+
+ &[data-boosted] [data-slot="pills"] [data-item][data-promo] {
+ translate: var(--travel) 0;
+ transition: translate var(--bonus-duration) var(--spring-easing) var(--bonus-delay);
+
+ @media (max-width: 60rem) {
+ &[data-edge] {
+ translate: none;
+ transition: none;
+ }
+ }
+ }
+
+ &[data-boosted] [data-bonus] {
+ animation: go-graph-label 400ms ease-out forwards;
+ animation-delay: var(--bonus-delay);
}
@media (prefers-reduced-motion: reduce) {
+ [data-grid],
+ [data-stub],
+ &[data-visible] [data-grid],
+ &[data-visible] [data-stub] {
+ mask-image: none;
+ animation: none;
+ }
+
+ [data-slot="xlabels"] [data-xlabel],
+ &[data-visible] [data-slot="xlabels"] [data-xlabel] {
+ opacity: 1;
+ mask-image: none;
+ animation: none;
+ }
+
[data-animate="line"] {
stroke-dashoffset: 0;
animation: none;
@@ -781,9 +913,12 @@ body {
transform: none;
animation: none;
}
- [data-bar] {
+ [data-animate="bar"],
+ &[data-visible] [data-animate="bar"],
+ [data-animate="bonus"],
+ &[data-boosted] [data-animate="bonus"] {
opacity: 1;
- transform: none;
+ clip-path: none;
animation: none;
}
[data-row],
@@ -792,8 +927,16 @@ body {
transition: none;
}
- [data-slot="pills"] [data-item] {
+ [data-slot="pills"] [data-label],
+ &[data-visible] [data-slot="pills"] [data-label],
+ [data-bonus],
+ &[data-boosted] [data-bonus] {
opacity: 1;
+ mask-image: none;
+ animation: none;
+ }
+
+ &[data-boosted] [data-slot="pills"] [data-item][data-promo] {
transition: none;
}
}
@@ -886,6 +1029,12 @@ body {
flex-wrap: wrap;
justify-content: flex-start;
+ [data-label] {
+ max-width: 100%;
+ flex-wrap: wrap;
+ gap: 3px 8px;
+ }
+
&[data-model="muse-spark-1.2-contributor"] {
transform: translateY(11px);
diff --git a/packages/console/app/src/routes/go/index.tsx b/packages/console/app/src/routes/go/index.tsx
index 423f98b955e0..6b356ccafa10 100644
--- a/packages/console/app/src/routes/go/index.tsx
+++ b/packages/console/app/src/routes/go/index.tsx
@@ -1,7 +1,7 @@
import "./index.css"
import { createAsync, query } from "@solidjs/router"
import { Title, Meta } from "@solidjs/meta"
-import { For, createMemo, createSignal, onCleanup, onMount } from "solid-js"
+import { For, createMemo } from "solid-js"
//import { HttpHeader } from "@solidjs/start"
import goLogoLight from "../../asset/go-ornate-light.svg"
import goLogoDark from "../../asset/go-ornate-dark.svg"
@@ -10,6 +10,7 @@ import { Faq } from "~/component/faq"
import { Legal } from "~/component/legal"
import { Footer } from "~/component/footer"
import { Header } from "~/component/header"
+import { LimitsGraph } from "~/component/limits-graph"
import { config } from "~/config"
import { getLastSeenWorkspaceID } from "../workspace/common"
import { IconMiniMax, IconMiMo, IconZai, IconAlibaba, IconDeepSeek } from "~/component/icon"
@@ -45,205 +46,10 @@ const models = [
{ name: "Muse Spark 1.2 Contributor", training: "go.faq.a5.used", retention: "go.faq.a5.notZdr" },
{ name: "DeepSeek V4 Pro", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "DeepSeek V4 Flash", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
+ { name: "Hy4 preview", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Hy3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
] as const
-function LimitsGraph(props: { href: string }) {
- let root!: HTMLElement
- const [visible, setVisible] = createSignal(false)
-
- const i18n = useI18n()
-
- onMount(() => {
- if (typeof IntersectionObserver === "undefined") return setVisible(true)
- const observer = new IntersectionObserver(
- (entries) => {
- const entry = entries[0]
- if (!entry?.isIntersecting) return
- setVisible(true)
- observer.disconnect()
- },
- { threshold: 0.35 },
- )
- observer.observe(root)
- onCleanup(() => observer.disconnect())
- })
-
- const baseline = 100
- const graph = [
- { id: "kimi-k3", name: "Kimi K3", req: 110, d: "50ms" },
- { id: "grok-4.6", name: "Grok 4.6", req: 169, d: "75ms" },
- { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", req: 2050, d: "290ms" },
- { id: "glm-5.3-flash", name: "GLM-5.3-Flash", req: 3160, baseReq: 1580, bonus: "2x usage", d: "100ms" },
- { id: "minimax-m3", name: "MiniMax M3", req: 3200, d: "210ms" },
- { id: "qwen3.7-plus", name: "Qwen3.7 Plus", req: 4300, d: "300ms" },
- { id: "qwen3.8-flash", name: "Qwen3.8 Flash", req: 5400, d: "315ms" },
- { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", req: 7600, d: "330ms" },
- { id: "longcat-2.0", name: "LongCat-2.0", req: 11400, d: "335ms" },
- { id: "mimo-v2.5", name: "MiMo-V2.5", req: 30100, d: "340ms" },
- { id: "hy3", name: "Hy3", req: 34400, baseReq: 4300, bonus: "8x usage", d: "320ms" },
- { id: "muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", req: 45300, edge: true, d: "360ms" },
- ]
-
- const w = 1040
- const chartW = 720
- const left = 40
- const right = 60
- const top = 18
- const bottom = 44
- const plot = chartW - left - right
- const infiniteX = w - 180
-
- const ratio = (n: number) => n / baseline
- const rmax = Math.max(1, ...graph.filter((m) => !("infinite" in m)).map((m) => ratio(m.req)))
- const log = (n: number) => Math.log10(Math.max(n, 1))
- const base = 24
- const p = 2.2
- const x = (r: number) => left + base + Math.pow(log(r) / log(rmax), p) * (plot - base)
- const ticks = [1, 5, 10, 25, 50, 100, 250].filter((t) => t <= rmax)
- const labels = (() => {
- const set = new Set()
- let last = -Infinity
- for (const t of ticks) {
- if (t === 1) {
- set.add(t)
- last = x(t)
- continue
- }
- const pos = x(t)
- if (pos - last < 44) continue
- set.add(t)
- last = pos
- }
- return set
- })()
- const shown = ticks.filter((t) => labels.has(t))
- const bh = 8
- const gap = 20
- const step = bh + gap
- const gy = (i: number) => top + 22 + step * i
- const h = gy(graph.length - 1) + bottom
- const my = graph.length < 2 ? gy(0) : (gy(0) + gy(graph.length - 1)) / 2
- const px = (n: number) => `${(n / w) * 100}%`
- const py = (n: number) => `${(n / h) * 100}%`
- const lx = px(left - 16)
- const ty = py(h - 18)
-
- return (
-
-
-
-
-
-
- {i18n.t("go.graph.go")}
-
-
-
-
-
- {(t) => (
-
- {i18n.t("go.graph.tick", { n: t })}
-
- )}
-
-
-
-
-
- {(m, i) => (
-
- {"infinite" in m ? "∞" : m.req.toLocaleString()}
- {m.name}
- {m.id === "muse-spark-1.2-contributor" && (
-
- (
-
- {i18n.t("go.graph.limitedRegions")}
-
- )
-
- )}
- {"infinite" in m && ({i18n.t("go.graph.limitedTime")})}
- {"bonus" in m && {m.bonus}}
-
- )}
-
-
-
-
-
-
-
-
- )
-}
-
export default function Home() {
const workspaceID = createAsync(() => checkLoggedIn())
const subscribeUrl = createMemo(() => (workspaceID() ? `/workspace/${workspaceID()}/go` : "/auth"))
diff --git a/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx b/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx
index 2c762920d5f1..3a0ebe361aec 100644
--- a/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx
+++ b/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx
@@ -663,6 +663,7 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
DeepSeek V4 Flash Vision Exp
MiMo-V2.5
MiMo-V2.5-Pro
+ Hy4 preview
Hy3
{i18n.t("workspace.lite.promo.footer")}
diff --git a/packages/console/core/migrations/20260901161032_workspace_migrated_at/migration.sql b/packages/console/core/migrations/20260901161032_workspace_migrated_at/migration.sql
new file mode 100644
index 000000000000..87918c7305f5
--- /dev/null
+++ b/packages/console/core/migrations/20260901161032_workspace_migrated_at/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `workspace` ADD `migrated_at` timestamp(3);
diff --git a/packages/console/core/migrations/20260901161032_workspace_migrated_at/snapshot.json b/packages/console/core/migrations/20260901161032_workspace_migrated_at/snapshot.json
new file mode 100644
index 000000000000..e81037d44227
--- /dev/null
+++ b/packages/console/core/migrations/20260901161032_workspace_migrated_at/snapshot.json
@@ -0,0 +1,3195 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "3e952a24-4137-4944-b7fa-e39e71061235",
+ "prevIds": ["e365c1d7-fb02-44ad-b681-87bb51d01964"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_code",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GO1MONTH50','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "code",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "region",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "allow_training",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "is_blocked",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "is_flagged_by_anthropic",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "is_flagged_by_openai",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "migrated_at",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id"],
+ "name": "PRIMARY",
+ "table": "referral_code",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "referral_id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "lite_subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_lite_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "code",
+ "entityType": "indexes",
+ "table": "referral_code"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_id",
+ "entityType": "indexes",
+ "table": "referral_reward"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/package.json b/packages/console/core/package.json
index 0ce0fa748339..b1f79b25ab66 100644
--- a/packages/console/core/package.json
+++ b/packages/console/core/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/console/core/src/schema/workspace.sql.ts b/packages/console/core/src/schema/workspace.sql.ts
index 3497979dc7d8..c71f76bd49de 100644
--- a/packages/console/core/src/schema/workspace.sql.ts
+++ b/packages/console/core/src/schema/workspace.sql.ts
@@ -1,5 +1,5 @@
import { boolean, json, primaryKey, mysqlTable, uniqueIndex, varchar } from "drizzle-orm/mysql-core"
-import { timestamps, ulid } from "../drizzle/types"
+import { timestamps, ulid, utc } from "../drizzle/types"
export const WorkspaceTable = mysqlTable(
"workspace",
@@ -12,6 +12,7 @@ export const WorkspaceTable = mysqlTable(
is_blocked: boolean(),
is_flagged_by_anthropic: boolean(),
is_flagged_by_openai: boolean(),
+ migrated_at: utc("migrated_at"),
...timestamps,
},
(table) => [uniqueIndex("slug").on(table.slug)],
diff --git a/packages/console/function/package.json b/packages/console/function/package.json
index 734a3efe345e..702df201f0b4 100644
--- a/packages/console/function/package.json
+++ b/packages/console/function/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-function",
- "version": "1.18.25",
+ "version": "1.18.26",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json
index a859c292f0f4..a58ea72148a2 100644
--- a/packages/console/mail/package.json
+++ b/packages/console/mail/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-mail",
- "version": "1.18.25",
+ "version": "1.18.26",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
diff --git a/packages/console/support/package.json b/packages/console/support/package.json
index c68e83fcdf37..1fe427465a65 100644
--- a/packages/console/support/package.json
+++ b/packages/console/support/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-support",
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"scripts": {
diff --git a/packages/core/package.json b/packages/core/package.json
index 0ffa9c5d22ef..3f97587a92e0 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "1.18.25",
+ "version": "1.18.26",
"name": "@opencode-ai/core",
"type": "module",
"license": "MIT",
@@ -64,8 +64,8 @@
},
"dependencies": {
"@ai-sdk/alibaba": "1.0.17",
- "@ai-sdk/amazon-bedrock": "4.0.158",
- "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/amazon-bedrock": "4.0.166",
+ "@ai-sdk/anthropic": "3.0.111",
"@ai-sdk/azure": "3.0.88",
"@ai-sdk/cerebras": "2.0.41",
"@ai-sdk/cohere": "3.0.27",
diff --git a/packages/desktop/package.json b/packages/desktop/package.json
index d4d2532c522f..27d16283efb8 100644
--- a/packages/desktop/package.json
+++ b/packages/desktop/package.json
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop",
"private": true,
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"homepage": "https://opencode.ai",
diff --git a/packages/effect-drizzle-sqlite/package.json b/packages/effect-drizzle-sqlite/package.json
index eb8103695c4e..904b305ccc4c 100644
--- a/packages/effect-drizzle-sqlite/package.json
+++ b/packages/effect-drizzle-sqlite/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "1.18.25",
+ "version": "1.18.26",
"name": "@opencode-ai/effect-drizzle-sqlite",
"type": "module",
"license": "MIT",
diff --git a/packages/effect-sqlite-node/package.json b/packages/effect-sqlite-node/package.json
index 829aab45fab8..99e1f172b2a2 100644
--- a/packages/effect-sqlite-node/package.json
+++ b/packages/effect-sqlite-node/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "1.18.25",
+ "version": "1.18.26",
"name": "@opencode-ai/effect-sqlite-node",
"type": "module",
"license": "MIT",
diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json
index 6e70986db787..dde092a8b7bc 100644
--- a/packages/enterprise/package.json
+++ b/packages/enterprise/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/enterprise",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/function/package.json b/packages/function/package.json
index 1c0931b39538..4f3b6332ca55 100644
--- a/packages/function/package.json
+++ b/packages/function/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/function",
- "version": "1.18.25",
+ "version": "1.18.26",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
diff --git a/packages/http-recorder/package.json b/packages/http-recorder/package.json
index b7041f7225d7..f4d119f193d5 100644
--- a/packages/http-recorder/package.json
+++ b/packages/http-recorder/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "1.18.25",
+ "version": "1.18.26",
"name": "@opencode-ai/http-recorder",
"description": "Record and replay Effect HTTP client traffic with deterministic cassettes",
"type": "module",
diff --git a/packages/llm/package.json b/packages/llm/package.json
index e7b93f1fda7a..9826e2a5d519 100644
--- a/packages/llm/package.json
+++ b/packages/llm/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "1.18.25",
+ "version": "1.18.26",
"name": "@opencode-ai/llm",
"type": "module",
"license": "MIT",
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index 45c6110363ec..00edea054927 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "1.18.25",
+ "version": "1.18.26",
"name": "opencode",
"type": "module",
"license": "MIT",
@@ -12,8 +12,8 @@
"bench:test": "bun run script/bench-test-suite.ts",
"profile:test": "bun run script/profile-test-files.ts",
"build": "bun run script/build.ts",
- "dev": "bun run --conditions=browser ./src/index.ts",
- "dev:temporary": "bun run --conditions=browser ./src/temporary.ts"
+ "dev": "bun run ./src/index.ts",
+ "dev:temporary": "bun run ./src/temporary.ts"
},
"bin": {
"opencode": "./bin/opencode"
@@ -56,8 +56,8 @@
"@actions/github": "6.0.1",
"@agentclientprotocol/sdk": "0.21.0",
"@ai-sdk/alibaba": "1.0.17",
- "@ai-sdk/amazon-bedrock": "4.0.158",
- "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/amazon-bedrock": "4.0.166",
+ "@ai-sdk/anthropic": "3.0.111",
"@ai-sdk/azure": "3.0.88",
"@ai-sdk/cerebras": "2.0.60",
"@ai-sdk/cohere": "3.0.27",
diff --git a/packages/opencode/src/plugin/azure.ts b/packages/opencode/src/plugin/azure.ts
index 33a164f372d9..6916aaaf3a65 100644
--- a/packages/opencode/src/plugin/azure.ts
+++ b/packages/opencode/src/plugin/azure.ts
@@ -1,11 +1,7 @@
-import { readFile } from "node:fs/promises"
-import { homedir } from "node:os"
-import { join } from "node:path"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
import { which } from "@opencode-ai/core/util/which"
import type { Hooks } from "@opencode-ai/plugin"
-import type { Provider } from "@opencode-ai/sdk/v2"
-import { Effect, Schema } from "effect"
+import { Schema } from "effect"
import { OAUTH_DUMMY_KEY } from "../auth"
import { Process } from "../util/process"
@@ -19,59 +15,17 @@ const AzureCliToken = Schema.Struct({
expiresOn: Schema.optional(Schema.NonEmptyString),
})
const decodeAzureCliToken = Schema.decodeUnknownPromise(AzureCliToken)
-const decodeAzureProfile = Schema.decodeUnknownPromise(
- Schema.fromJsonString(Schema.Struct({ subscriptions: Schema.Array(Schema.Unknown) })),
-)
-
-const decodeAzureAccounts = Schema.decodeUnknownPromise(
- Schema.Array(
- Schema.Struct({
- name: Schema.NonEmptyString,
- resourceGroup: Schema.NonEmptyString,
- }),
- ),
-)
-
-const decodeAzureDeployments = Schema.decodeUnknownPromise(
- Schema.Array(
- Schema.Struct({
- name: Schema.NonEmptyString,
- properties: Schema.Struct({
- model: Schema.Struct({
- name: Schema.NonEmptyString,
- }),
- provisioningState: Schema.NonEmptyString,
- }),
- }),
- ),
-)
-
type AzureCommand = (args: string[]) => Promise
-type AzureAccount = { readonly name: string; readonly resourceGroup: string }
export async function AzureAuthPlugin(): Promise {
const available = Boolean(which("az"))
- // Avoid launching Azure CLI on unrelated commands just because the executable is installed.
- const signedIn = available
- ? await readFile(join(process.env.AZURE_CONFIG_DIR ?? join(homedir(), ".azure"), "azureProfile.json"), "utf8")
- .then((text) => decodeAzureProfile(text.replace(/^\uFEFF/, "")))
- .then((profile) => profile.subscriptions.length > 0)
- .catch(() => false)
- : false
- const accounts =
- !process.env.AZURE_RESOURCE_NAME && !process.env.AZURE_RESOURCE_GROUP && signedIn
- ? await runAzure(["cognitiveservices", "account", "list", "--output", "json", "--only-show-errors"])
- .then(decodeAzureAccounts)
- .catch(() => [])
- : []
- return createAzureAuthHooks(runAzure, fetch, accounts, available)
+ return createAzureAuthHooks(runAzure, fetch, available)
}
export function createAzureAuthHooks(
run: AzureCommand,
- request: (input: RequestInfo | URL, init?: RequestInit) => Promise = fetch,
- accounts: readonly AzureAccount[] = [],
- available = true,
+ request: (input: RequestInfo | URL, init?: RequestInit) => Promise,
+ available: boolean,
): Hooks {
const tokens = new Map()
async function token(scope: string) {
@@ -97,50 +51,7 @@ export function createAzureAuthHooks(
placeholder: "e.g. my-models",
})
}
- const oauthPrompts =
- accounts.length > 0 && !process.env.AZURE_RESOURCE_NAME
- ? [
- {
- type: "select" as const,
- key: "resourceSelection",
- message: "Select Azure resource",
- options: [
- ...accounts.map((account) => ({
- label: account.name,
- value: account.name,
- hint: account.resourceGroup,
- })),
- { label: "Enter another resource name", value: "__manual__" },
- ],
- },
- {
- type: "text" as const,
- key: "resourceName",
- message: "Enter Azure Resource Name",
- placeholder: "e.g. my-models",
- when: { key: "resourceSelection", op: "eq" as const, value: "__manual__" },
- },
- ]
- : prompts
-
const hooks: Hooks = {
- provider: {
- id: "azure",
- async models(provider, context) {
- if (context.auth?.type !== "oauth") return provider.models
- const resource = context.auth.accountId
- if (!resource) return {}
- return discoverAzureModels(provider.models, resource, run).catch((error: unknown) => {
- Effect.runSync(
- Effect.logWarning("Azure model discovery failed", {
- resource,
- error: error instanceof Error ? error.message : String(error),
- }),
- )
- return provider.models
- })
- },
- },
auth: {
provider: "azure",
async loader(getAuth) {
@@ -168,17 +79,14 @@ export function createAzureAuthHooks(
{
type: "oauth",
label: "Microsoft Entra ID (Azure CLI)",
- prompts: oauthPrompts,
+ prompts,
async authorize(inputs) {
return {
url: "",
instructions: "Sign in with `az login` before continuing.",
method: "auto",
callback: async () => {
- const resourceName =
- inputs?.resourceName ??
- (inputs?.resourceSelection === "__manual__" ? undefined : inputs?.resourceSelection) ??
- process.env.AZURE_RESOURCE_NAME
+ const resourceName = inputs?.resourceName ?? process.env.AZURE_RESOURCE_NAME
if (!resourceName) throw new Error("Azure Resource Name is required")
await token(AZURE_COGNITIVE_SERVICES_SCOPE)
@@ -205,53 +113,6 @@ async function runAzure(args: string[]): Promise {
return JSON.parse(result.stdout.toString())
}
-async function discoverAzureModels(models: Provider["models"], resourceName: string, run: AzureCommand) {
- const resourceGroup = process.env.AZURE_RESOURCE_GROUP
- const account = resourceGroup
- ? { name: resourceName, resourceGroup }
- : (
- await decodeAzureAccounts(
- await run(["cognitiveservices", "account", "list", "--output", "json", "--only-show-errors"]),
- )
- ).find((account) => account.name.toLowerCase() === resourceName.toLowerCase())
- if (!account) throw new Error(`Azure resource "${resourceName}" was not found in the active subscription`)
-
- const deployments = await decodeAzureDeployments(
- await run([
- "cognitiveservices",
- "account",
- "deployment",
- "list",
- "--name",
- account.name,
- "--resource-group",
- account.resourceGroup,
- "--output",
- "json",
- "--only-show-errors",
- ]),
- )
- const found = new Map()
- deployments.forEach((deployment) => {
- if (deployment.properties.provisioningState !== "Succeeded") return
- const modelID = Object.keys(models).find(
- (modelID) => modelID.toLowerCase() === deployment.properties.model.name.toLowerCase(),
- )
- if (!modelID) return
- const id = found.has(modelID) ? deployment.name : modelID
- found.set(id, {
- ...models[modelID],
- id,
- name: id === modelID ? models[modelID].name : `${models[modelID].name} (${deployment.name})`,
- api: {
- ...models[modelID].api,
- id: deployment.name,
- },
- })
- })
- return Object.fromEntries(found)
-}
-
function scopeForRequest(input: RequestInfo | URL) {
const url = new URL(input instanceof Request ? input.url : input)
if (url.hostname.endsWith(".services.ai.azure.com") && !url.pathname.startsWith("/models")) {
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts
index 28a5beb9abac..1244963e846f 100644
--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ -684,6 +684,41 @@ function anthropicOmitsThinking(apiId: string) {
return anthropicUsesModernAdaptiveThinking(apiId)
}
+// Opus 5, Sonnet 5, Fable 5.x, and Mythos 5.x think without a `thinking` parameter.
+function anthropicThinksByDefault(apiId: string) {
+ const version = /claude-(?:[a-z]+-)?(\d+)(?:[.-](\d{1,2}))?(?:[.@-]|$)/i.exec(apiId)
+ if (!version) return false
+ return Number(version[1]) >= 5
+}
+
+// Fable 5.1 binds each thinking signature to the system prompt, tool list, and
+// messages above it, and rejects the request when any of that changes. opencode
+// re-renders parts of that prefix between turns (system prompt, tools, compaction),
+// so ask the API to drop the affected blocks instead of failing the request.
+// Models that do not run the check accept the field, so it is safe on every Claude.
+// The patched AI SDK adds the thinking-binding-controls beta whenever it is set.
+const ANTHROPIC_BLOCK_BINDING = { prefixMismatchBehavior: "drop_block" }
+
+function anthropicBlockBinding(model: Provider.Model, options: { [x: string]: any }) {
+ if (!model.api.id.toLowerCase().includes("claude")) return options
+ const byDefault = anthropicThinksByDefault(model.api.id)
+ switch (model.api.npm) {
+ case "@ai-sdk/anthropic":
+ case "@ai-sdk/google-vertex/anthropic": {
+ const thinking = options.thinking ?? (byDefault ? { type: "adaptive" } : undefined)
+ if (!thinking || (thinking.type !== "adaptive" && thinking.type !== "enabled")) return options
+ return { ...options, thinking: { ...thinking, blockBinding: ANTHROPIC_BLOCK_BINDING } }
+ }
+ case "@ai-sdk/amazon-bedrock": {
+ const reasoningConfig = options.reasoningConfig ?? (byDefault ? { type: "adaptive" } : undefined)
+ if (!reasoningConfig || (reasoningConfig.type !== "adaptive" && reasoningConfig.type !== "enabled"))
+ return options
+ return { ...options, reasoningConfig: { ...reasoningConfig, blockBinding: ANTHROPIC_BLOCK_BINDING } }
+ }
+ }
+ return options
+}
+
function googleThinkingLevelEfforts(apiId: string) {
const id = apiId.toLowerCase()
if (!id.includes("gemini-3")) return ["low", "high"]
@@ -1363,7 +1398,7 @@ export function providerOptions(model: Provider.Model, options: { [x: string]: a
usesOpenAIReasoningGate &&
(model.capabilities.reasoning || options.reasoningEffort !== undefined || options.reasoningSummary !== undefined)
? { ...options, forceReasoning: true }
- : options
+ : anthropicBlockBinding(model, options)
if (model.api.npm === "@ai-sdk/gateway") {
// Gateway providerOptions are split across two namespaces:
diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts
index 20aa8a8404d8..9f8530929c15 100644
--- a/packages/opencode/src/session/processor.ts
+++ b/packages/opencode/src/session/processor.ts
@@ -435,6 +435,20 @@ const layer = Layer.effect(
case "step-finish": {
const completedSnapshot = yield* snapshot.track()
yield* Effect.forEach(Object.keys(ctx.reasoningMap), finishReasoning)
+ // Anthropic reports thinking blocks it removed before the model saw the
+ // prompt. Prefix mismatches mean opencode changed history behind a signed
+ // block; log them so the churn can be tracked down.
+ const dropped = isRecord(value.providerMetadata?.anthropic)
+ ? value.providerMetadata.anthropic.inputTransformations
+ : undefined
+ if (Array.isArray(dropped) && dropped.length > 0) {
+ yield* Effect.logWarning("thinking blocks dropped by provider", {
+ sessionID: ctx.sessionID,
+ messageID: ctx.assistantMessage.id,
+ model: ctx.model.id,
+ transformations: JSON.stringify(dropped),
+ })
+ }
const usage = Session.getUsage({
model: ctx.model,
usage: value.usage ?? new Usage({}),
diff --git a/packages/opencode/src/session/tools.ts b/packages/opencode/src/session/tools.ts
index 0f401c7562fa..99f7aec4fdfd 100644
--- a/packages/opencode/src/session/tools.ts
+++ b/packages/opencode/src/session/tools.ts
@@ -74,7 +74,7 @@ export const resolve = Effect.fn("SessionTools.resolve")(function* (input: {
metadata: val.metadata,
status: "running",
input: args,
- time: { start: Date.now() },
+ time: match.state.status === "running" ? match.state.time : { start: Date.now() },
},
}
}),
diff --git a/packages/opencode/src/tool/apply_patch.ts b/packages/opencode/src/tool/apply_patch.ts
index f9201be8a7db..3f89a63974b0 100644
--- a/packages/opencode/src/tool/apply_patch.ts
+++ b/packages/opencode/src/tool/apply_patch.ts
@@ -198,7 +198,7 @@ export const ApplyPatchTool = Tool.define(
patch: change.diff,
additions: change.additions,
deletions: change.deletions,
- movePath: change.movePath,
+ ...(change.movePath ? { movePath: change.movePath } : {}),
}))
// Check permissions if needed
diff --git a/packages/opencode/test/config/config.test.ts b/packages/opencode/test/config/config.test.ts
index 4eb46ae1e900..8d5baede50fd 100644
--- a/packages/opencode/test/config/config.test.ts
+++ b/packages/opencode/test/config/config.test.ts
@@ -573,7 +573,7 @@ it.effect("rejects native project permissions even with inherited V1 rules", ()
if (Exit.isFailure(exit))
expect(Cause.squash(exit.cause)).toMatchObject({
data: {
- path: expect.stringContaining("project/opencode.json"),
+ path: expect.stringContaining(path.join("project", "opencode.json")),
issues: [
{ path: ["permissions"], message: expect.stringContaining('Use V1 "permission" rules or run opencode2') },
{ path: ["agents", "reviewer", "permissions"], message: expect.stringContaining("not supported") },
diff --git a/packages/opencode/test/lib/cli-process.ts b/packages/opencode/test/lib/cli-process.ts
index 12e8d9c866a5..a4d3b36c1dae 100644
--- a/packages/opencode/test/lib/cli-process.ts
+++ b/packages/opencode/test/lib/cli-process.ts
@@ -211,7 +211,7 @@ export function withCliFixture(
// on `Bun.stdin.text()` (see src/cli/cmd/run.ts — non-TTY stdin is
// consumed as the prompt). The old Process.run wrapper defaulted to
// ignore; ChildProcess.make defaults to pipe, so we set it explicitly.
- const command = ChildProcess.make("bun", ["run", "--conditions=browser", cliEntry, ...args], {
+ const command = ChildProcess.make("bun", ["run", cliEntry, ...args], {
cwd: home,
env: { ...env, ...opts?.env },
extendEnv: true,
@@ -283,7 +283,7 @@ export function withCliFixture(
const options = runOpts(opts)
const proc = yield* Effect.acquireRelease(
Effect.sync(() =>
- Bun.spawn(["bun", "run", "--conditions=browser", cliEntry, ...runArgs(message, opts)], {
+ Bun.spawn(["bun", "run", cliEntry, ...runArgs(message, opts)], {
cwd: home,
env: { ...process.env, ...env, ...options?.env },
stdin: "ignore",
@@ -324,7 +324,7 @@ export function withCliFixture(
// as a finalizer error during test teardown.
const proc = yield* Effect.acquireRelease(
Effect.sync(() =>
- Bun.spawn(["bun", "run", "--conditions=browser", cliEntry, ...argv], {
+ Bun.spawn(["bun", "run", cliEntry, ...argv], {
cwd: home,
env: { ...process.env, ...env, ...opts?.env },
stdout: "pipe",
@@ -395,7 +395,7 @@ export function withCliFixture(
// Either way we await proc.exited so the test scope doesn't leak.
const proc = yield* Effect.acquireRelease(
Effect.sync(() =>
- Bun.spawn(["bun", "run", "--conditions=browser", cliEntry, ...argv], {
+ Bun.spawn(["bun", "run", cliEntry, ...argv], {
cwd: opts?.cwd ?? home,
env: { ...process.env, ...env, ...opts?.env },
stdin: "pipe",
diff --git a/packages/opencode/test/patched-dependencies.test.ts b/packages/opencode/test/patched-dependencies.test.ts
new file mode 100644
index 000000000000..5405401bbe64
--- /dev/null
+++ b/packages/opencode/test/patched-dependencies.test.ts
@@ -0,0 +1,29 @@
+import { describe, expect, test } from "bun:test"
+import path from "path"
+
+// Bun applies a patch only to the exact `name@version` named in
+// `patchedDependencies`. Bumping the dependency without regenerating the patch
+// does not fail `bun install`; the patch just stops applying and the runtime
+// silently loses whatever the patch fixed. This pins the two together for the
+// packages that ship in the CLI.
+const root = path.resolve(import.meta.dir, "../../..")
+const workspaces = ["packages/opencode", "packages/core"]
+const patched = (await Bun.file(path.join(root, "package.json")).json()).patchedDependencies as Record
+
+describe("patched dependencies", () => {
+ for (const key of Object.keys(patched)) {
+ const at = key.lastIndexOf("@")
+ const name = key.slice(0, at)
+ const version = key.slice(at + 1)
+
+ test(`${key} matches the installed version`, async () => {
+ expect(await Bun.file(path.join(root, patched[key])).exists()).toBe(true)
+ for (const workspace of workspaces) {
+ const file = Bun.file(path.join(root, workspace, "node_modules", name, "package.json"))
+ if (!(await file.exists())) continue
+ const installed = (await file.json()).version as string
+ expect(installed, `${workspace} resolves ${name}@${installed}; patch is for ${version}`).toBe(version)
+ }
+ })
+ }
+})
diff --git a/packages/opencode/test/plugin/azure.test.ts b/packages/opencode/test/plugin/azure.test.ts
index 11e7f3a2c3e0..2dcdfb0399e9 100644
--- a/packages/opencode/test/plugin/azure.test.ts
+++ b/packages/opencode/test/plugin/azure.test.ts
@@ -11,17 +11,11 @@ import { Process } from "../../src/util/process"
import { which } from "@opencode-ai/core/util/which"
const resourceName = process.env.AZURE_RESOURCE_NAME
-const resourceGroup = process.env.AZURE_RESOURCE_GROUP
-const azureConfig = process.env.AZURE_CONFIG_DIR
const originalPath = process.env.PATH
afterEach(() => {
if (resourceName === undefined) delete process.env.AZURE_RESOURCE_NAME
else process.env.AZURE_RESOURCE_NAME = resourceName
- if (resourceGroup === undefined) delete process.env.AZURE_RESOURCE_GROUP
- else process.env.AZURE_RESOURCE_GROUP = resourceGroup
- if (azureConfig === undefined) delete process.env.AZURE_CONFIG_DIR
- else process.env.AZURE_CONFIG_DIR = azureConfig
if (originalPath === undefined) delete process.env.PATH
else process.env.PATH = originalPath
})
@@ -64,37 +58,6 @@ function customFetch(options: Record) {
}
}
-function models(...ids: string[]): Provider["models"] {
- return Object.fromEntries(
- ids.map((id) => [
- id,
- {
- id,
- providerID: "azure",
- name: id,
- family: "",
- api: { id, url: "", npm: "@ai-sdk/azure" },
- status: "active",
- headers: {},
- options: {},
- cost: { input: 0, output: 0, cache: { read: 0, write: 0 } },
- limit: { context: 0, output: 0 },
- capabilities: {
- temperature: true,
- reasoning: false,
- attachment: false,
- toolcall: true,
- input: { text: true, audio: false, image: false, video: false, pdf: false },
- output: { text: true, audio: false, image: false, video: false, pdf: false },
- interleaved: false,
- },
- release_date: "",
- variants: {},
- },
- ]),
- )
-}
-
function azureShell(scopes: string[]) {
return async (args: string[]) => {
const scope = args[args.indexOf("--scope") + 1]
@@ -106,14 +69,6 @@ function azureShell(scopes: string[]) {
}
}
-function discoveryShell(accounts: unknown, deployments: unknown, commands: string[]) {
- return async (args: string[]) => {
- const command = ["az", ...args].join(" ")
- commands.push(command)
- return command.includes("deployment list") ? deployments : accounts
- }
-}
-
async function azureCli(dir: string) {
const bin = path.join(dir, "azure cli")
const calls = path.join(dir, "calls.jsonl")
@@ -127,7 +82,7 @@ async function azureCli(dir: string) {
fs.appendFileSync(${JSON.stringify(calls)}, JSON.stringify(args) + "\\n")
console.log(JSON.stringify(args.includes("get-access-token")
? { accessToken: "test-token", expires_on: Math.floor(Date.now() / 1000) + 3600 }
- : args.includes("deployment") ? [] : [{ name: "test-resource", resourceGroup: "test group & value" }]))
+ : []))
`,
)
const executable = path.join(bin, process.platform === "win32" ? "az.cmd" : "az")
@@ -162,7 +117,6 @@ describe("plugin.azure", () => {
const entry = path.join(tmp.path, "azure.mjs")
await Bun.write(entry, bundle.outputs[0])
const cli = await azureCli(tmp.path)
- await Bun.write(path.join(tmp.path, "azureProfile.json"), '\uFEFF{"subscriptions":[{}]}')
for (const installed of [false, true]) {
const result = await Process.run(
[
@@ -174,23 +128,21 @@ describe("plugin.azure", () => {
import { AzureAuthPlugin } from ${JSON.stringify(pathToFileURL(entry).href)}
assert.equal(typeof Bun, "undefined")
delete process.env.AZURE_RESOURCE_NAME
- delete process.env.AZURE_RESOURCE_GROUP
const hooks = await AzureAuthPlugin({ $: undefined })
assert.equal(hooks.auth.provider, "azure")
assert.deepEqual(hooks.auth.methods.map((method) => method.type), ${JSON.stringify(installed ? ["api", "oauth"] : ["api"])})
if (${installed}) {
const method = hooks.auth.methods.find((method) => method.type === "oauth")
- assert.equal(method.prompts[0].type, "select")
- const authorization = await method.authorize({ resourceSelection: "test-resource" })
+ assert.equal(method.prompts[0].type, "text")
+ const authorization = await method.authorize({ resourceName: "test-resource" })
const auth = await authorization.callback()
assert.equal(auth.type, "success")
assert.equal(auth.accountId, "test-resource")
- assert.deepEqual(await hooks.provider.models({ models: {} }, { auth: { ...auth, type: "oauth" } }), {})
}
`,
],
{
- env: { PATH: installed ? cli.bin : tmp.path, XDG_DATA_HOME: tmp.path, AZURE_CONFIG_DIR: tmp.path },
+ env: { PATH: installed ? cli.bin : tmp.path, XDG_DATA_HOME: tmp.path },
nothrow: true,
},
)
@@ -198,53 +150,27 @@ describe("plugin.azure", () => {
expect(result.code).toBe(0)
}
expect(await cli.calls()).toEqual([
- ["cognitiveservices", "account", "list", "--output", "json", "--only-show-errors"],
["account", "get-access-token", "--scope", "https://cognitiveservices.azure.com/.default", "--output", "json"],
- ["cognitiveservices", "account", "list", "--output", "json", "--only-show-errors"],
- [
- "cognitiveservices",
- "account",
- "deployment",
- "list",
- "--name",
- "test-resource",
- "--resource-group",
- "test group & value",
- "--output",
- "json",
- "--only-show-errors",
- ],
])
})
- for (const profile of [
- { name: "missing", content: undefined, signedIn: false },
- { name: "logged out", content: '{"subscriptions":[]}', signedIn: false },
- { name: "signed in with BOM", content: '\uFEFF{"subscriptions":[{}]}', signedIn: true },
- ]) {
- test(`only lists resources for a cached Azure login (${profile.name})`, async () => {
- await using tmp = await tmpdir()
- const cli = await azureCli(tmp.path)
- process.env.PATH = cli.bin
- process.env.AZURE_CONFIG_DIR = path.join(tmp.path, "azure-cli")
- if (profile.content)
- await Bun.write(path.join(process.env.AZURE_CONFIG_DIR, "azureProfile.json"), profile.content)
- delete process.env.AZURE_RESOURCE_NAME
- delete process.env.AZURE_RESOURCE_GROUP
- const hooks = await AzureAuthPlugin()
+ test("does not invoke Azure CLI during initialization", async () => {
+ await using tmp = await tmpdir()
+ const cli = await azureCli(tmp.path)
+ process.env.PATH = cli.bin
+ delete process.env.AZURE_RESOURCE_NAME
- expect(await cli.calls()).toHaveLength(profile.signedIn ? 1 : 0)
- expect(hooks.auth?.methods.some((method) => method.type === "oauth")).toBe(true)
- if (profile.signedIn) expect(oauthMethod(hooks).prompts?.[0].type).toBe("select")
- })
- }
+ const hooks = await AzureAuthPlugin()
+
+ expect(await cli.calls()).toEqual([])
+ expect(oauthMethod(hooks).prompts?.[0].type).toBe("text")
+ })
test("keeps the existing API-key method and adds Entra ID", () => {
delete process.env.AZURE_RESOURCE_NAME
- const hooks = createAzureAuthHooks(azureShell([]))
+ const hooks = createAzureAuthHooks(azureShell([]), fetch, true)
expect(hooks.auth?.provider).toBe("azure")
- expect(hooks.provider?.id).toBe("azure")
expect(hooks.auth?.methods.map((method) => [method.type, method.label])).toEqual([
["api", "API key"],
["oauth", "Microsoft Entra ID (Azure CLI)"],
@@ -265,63 +191,14 @@ describe("plugin.azure", () => {
})
test("hides Azure CLI authentication when the Azure CLI is not installed", () => {
- const hooks = createAzureAuthHooks(azureShell([]), fetch, [], false)
+ const hooks = createAzureAuthHooks(azureShell([]), fetch, false)
expect(hooks.auth?.methods.map((method) => method.type)).toEqual(["api"])
})
- test("lists Azure CLI resources and allows entering another resource", () => {
- delete process.env.AZURE_RESOURCE_NAME
- const hooks = createAzureAuthHooks(azureShell([]), fetch, [
- { name: "first-resource", resourceGroup: "first-group" },
- { name: "second-resource", resourceGroup: "second-group" },
- ])
-
- expect(oauthMethod(hooks).prompts).toEqual([
- {
- type: "select",
- key: "resourceSelection",
- message: "Select Azure resource",
- options: [
- { label: "first-resource", value: "first-resource", hint: "first-group" },
- { label: "second-resource", value: "second-resource", hint: "second-group" },
- { label: "Enter another resource name", value: "__manual__" },
- ],
- },
- {
- type: "text",
- key: "resourceName",
- message: "Enter Azure Resource Name",
- placeholder: "e.g. my-models",
- when: { key: "resourceSelection", op: "eq", value: "__manual__" },
- },
- ])
- })
-
- test("uses the selected Azure CLI resource", async () => {
- const hooks = createAzureAuthHooks(azureShell([]), fetch, [
- { name: "selected-resource", resourceGroup: "selected-group" },
- ])
- const authorization = await oauthMethod(hooks).authorize({ resourceSelection: "selected-resource" })
- if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
-
- expect(await authorization.callback()).toMatchObject({ type: "success", accountId: "selected-resource" })
- })
-
- test("uses a manually entered Azure resource that was not listed", async () => {
- const hooks = createAzureAuthHooks(azureShell([]), fetch, [{ name: "listed-resource", resourceGroup: "group" }])
- const authorization = await oauthMethod(hooks).authorize({
- resourceSelection: "__manual__",
- resourceName: "unlisted-resource",
- })
- if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
-
- expect(await authorization.callback()).toMatchObject({ type: "success", accountId: "unlisted-resource" })
- })
-
test("checks Azure CLI and stores the resource name", async () => {
const scopes: string[] = []
- const hooks = createAzureAuthHooks(azureShell(scopes))
+ const hooks = createAzureAuthHooks(azureShell(scopes), fetch, true)
const authorization = await oauthMethod(hooks).authorize({ resourceName: "test-resource" })
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
@@ -335,10 +212,14 @@ describe("plugin.azure", () => {
})
test("supports Azure CLI versions that only provide expiresOn", async () => {
- const hooks = createAzureAuthHooks(async () => ({
- accessToken: "legacy-token",
- expiresOn: new Date(Date.now() + 60 * 60 * 1000).toISOString(),
- }))
+ const hooks = createAzureAuthHooks(
+ async () => ({
+ accessToken: "legacy-token",
+ expiresOn: new Date(Date.now() + 60 * 60 * 1000).toISOString(),
+ }),
+ fetch,
+ true,
+ )
const authorization = await oauthMethod(hooks).authorize({ resourceName: "test-resource" })
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
@@ -346,135 +227,32 @@ describe("plugin.azure", () => {
})
test("rejects Azure CLI tokens without a usable expiration", async () => {
- const hooks = createAzureAuthHooks(async () => ({ accessToken: "invalid-token" }))
+ const hooks = createAzureAuthHooks(async () => ({ accessToken: "invalid-token" }), fetch, true)
const authorization = await oauthMethod(hooks).authorize({ resourceName: "test-resource" })
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
await expect(authorization.callback()).rejects.toThrow("Azure CLI returned an invalid token expiration")
})
- test("discovers deployed models through Azure CLI", async () => {
- delete process.env.AZURE_RESOURCE_GROUP
- const commands: string[] = []
- const hooks = createAzureAuthHooks(
- discoveryShell(
- [{ name: "test-resource", resourceGroup: "test-group" }],
- [
- {
- name: "gpt-production",
- properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" },
- },
- {
- name: "DeepSeek-V4-Flash",
- properties: { model: { name: "DeepSeek-V4-Flash" }, provisioningState: "Succeeded" },
- },
- {
- name: "phi-production",
- properties: { model: { name: "Phi-4-mini-instruct" }, provisioningState: "Succeeded" },
- },
- {
- name: "gpt-5-nano",
- properties: { model: { name: "gpt-5-nano" }, provisioningState: "Creating" },
- },
- ],
- commands,
- ),
- )
- const list = hooks.provider?.models
- if (!list) throw new Error("Azure provider model hook is missing")
-
- const result = await list(
- {
- ...provider,
- models: models("gpt-5-mini", "deepseek-v4-flash", "phi-4-mini", "phi-4-mini-instruct", "gpt-5-nano"),
- },
- { auth: oauth },
- )
-
- expect(Object.keys(result)).toEqual(["gpt-5-mini", "deepseek-v4-flash", "phi-4-mini-instruct"])
- expect(result["gpt-5-mini"].api.id).toBe("gpt-production")
- expect(result["deepseek-v4-flash"].api.id).toBe("DeepSeek-V4-Flash")
- expect(result["phi-4-mini-instruct"].api.id).toBe("phi-production")
- expect(commands).toEqual([
- "az cognitiveservices account list --output json --only-show-errors",
- "az cognitiveservices account deployment list --name test-resource --resource-group test-group --output json --only-show-errors",
- ])
- })
-
- test("discovers models directly when the resource group is configured", async () => {
- process.env.AZURE_RESOURCE_GROUP = "restricted-group"
- const commands: string[] = []
- const hooks = createAzureAuthHooks(
- discoveryShell(
- [],
- [{ name: "gpt-production", properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" } }],
- commands,
- ),
- )
- const list = hooks.provider?.models
- if (!list) throw new Error("Azure provider model hook is missing")
-
- const result = await list({ ...provider, models: models("gpt-5-mini") }, { auth: oauth })
-
- expect(result["gpt-5-mini"].api.id).toBe("gpt-production")
- expect(commands).toEqual([
- "az cognitiveservices account deployment list --name test-resource --resource-group restricted-group --output json --only-show-errors",
- ])
- })
-
- test("preserves multiple deployments of the same model", async () => {
- delete process.env.AZURE_RESOURCE_GROUP
- const hooks = createAzureAuthHooks(
- discoveryShell(
- [{ name: "test-resource", resourceGroup: "test-group" }],
- [
- { name: "gpt-production", properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" } },
- { name: "gpt-staging", properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" } },
- ],
- [],
- ),
- )
- const list = hooks.provider?.models
- if (!list) throw new Error("Azure provider model hook is missing")
-
- const result = await list({ ...provider, models: models("gpt-5-mini") }, { auth: oauth })
-
- expect(Object.keys(result)).toEqual(["gpt-5-mini", "gpt-staging"])
- expect(result["gpt-5-mini"].api.id).toBe("gpt-production")
- expect(result["gpt-staging"].api.id).toBe("gpt-staging")
- expect(result["gpt-staging"].name).toBe("gpt-5-mini (gpt-staging)")
- })
-
- test("keeps configured models available when Azure discovery fails", async () => {
- const hooks = createAzureAuthHooks(async () => {
- throw new Error("Azure CLI failed")
- })
- const list = hooks.provider?.models
- if (!list) throw new Error("Azure provider model hook is missing")
-
- const catalog = models("gpt-5-mini")
- expect(await list({ ...provider, models: catalog }, { auth: oauth })).toBe(catalog)
- })
-
test("does not change API-key loading", async () => {
const scopes: string[] = []
- const hooks = createAzureAuthHooks(azureShell(scopes))
- const catalog = models("gpt-5-mini")
- const list = hooks.provider?.models
- if (!list) throw new Error("Azure provider model hook is missing")
+ const hooks = createAzureAuthHooks(azureShell(scopes), fetch, true)
expect(await loader(hooks)(async () => ({ type: "api", key: "test-key" }), provider)).toEqual({})
- expect(await list({ ...provider, models: catalog }, { auth: { type: "api", key: "test-key" } })).toBe(catalog)
expect(scopes).toEqual([])
})
test("uses Azure CLI bearer tokens for Azure inference endpoints", async () => {
const scopes: string[] = []
const requests: Headers[] = []
- const hooks = createAzureAuthHooks(azureShell(scopes), async (_input, init) => {
- requests.push(new Headers(init?.headers))
- return new Response(null, { status: 200 })
- })
+ const hooks = createAzureAuthHooks(
+ azureShell(scopes),
+ async (_input, init) => {
+ requests.push(new Headers(init?.headers))
+ return new Response(null, { status: 200 })
+ },
+ true,
+ )
const options = await loader(hooks)(async () => oauth, provider)
const request = customFetch(options)
diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts
index 9245e3a57d2c..4d346d8871a2 100644
--- a/packages/opencode/test/provider/transform.test.ts
+++ b/packages/opencode/test/provider/transform.test.ts
@@ -6,7 +6,9 @@ import { ProviderV2 } from "@opencode-ai/core/provider"
import { ModelV2 } from "@opencode-ai/core/model"
import { ModelsDev } from "@opencode-ai/core/models-dev"
import { generateText, jsonSchema, type ModelMessage } from "ai"
-import { createAmazonBedrock } from "@ai-sdk/amazon-bedrock"
+import { createAmazonBedrock, type AmazonBedrockLanguageModelOptions } from "@ai-sdk/amazon-bedrock"
+import { createAnthropic } from "@ai-sdk/anthropic"
+import { createVertexAnthropic } from "@ai-sdk/google-vertex/anthropic"
describe("ProviderTransform.options - setCacheKey", () => {
const sessionID = "test-session-123"
@@ -845,6 +847,199 @@ describe("ProviderTransform.providerOptions", () => {
})
})
+ describe("anthropic thinking block binding", () => {
+ const binding = { prefixMismatchBehavior: "drop_block" }
+ const claude = (npm: string, id: string) =>
+ createModel({ providerID: "custom", api: { id, url: "https://example.com", npm } })
+
+ test("adds blockBinding to explicit adaptive thinking on @ai-sdk/anthropic", () => {
+ const model = claude("@ai-sdk/anthropic", "claude-opus-4-7")
+ expect(ProviderTransform.providerOptions(model, { thinking: { type: "adaptive" }, effort: "high" })).toEqual({
+ anthropic: { thinking: { type: "adaptive", blockBinding: binding }, effort: "high" },
+ })
+ })
+
+ test("adds blockBinding to explicit enabled thinking", () => {
+ const model = claude("@ai-sdk/anthropic", "claude-sonnet-4-5")
+ expect(ProviderTransform.providerOptions(model, { thinking: { type: "enabled", budgetTokens: 4000 } })).toEqual({
+ anthropic: { thinking: { type: "enabled", budgetTokens: 4000, blockBinding: binding } },
+ })
+ })
+
+ test("injects adaptive thinking for models that think by default when no variant is set", () => {
+ for (const id of ["claude-fable-5-1", "claude-mythos-5-1", "claude-opus-5", "claude-sonnet-5"]) {
+ const model = claude("@ai-sdk/anthropic", id)
+ expect(ProviderTransform.providerOptions(model, {})).toEqual({
+ anthropic: { thinking: { type: "adaptive", blockBinding: binding } },
+ })
+ }
+ })
+
+ test("does not inject thinking for models that are off by default", () => {
+ for (const id of ["claude-opus-4-7", "claude-opus-4-5", "claude-sonnet-4-6", "claude-haiku-4-5"]) {
+ const model = claude("@ai-sdk/anthropic", id)
+ expect(ProviderTransform.providerOptions(model, {})).toEqual({ anthropic: {} })
+ }
+ })
+
+ test("leaves disabled thinking alone", () => {
+ const model = claude("@ai-sdk/anthropic", "claude-sonnet-5")
+ expect(ProviderTransform.providerOptions(model, { thinking: { type: "disabled" } })).toEqual({
+ anthropic: { thinking: { type: "disabled" } },
+ })
+ })
+
+ test("applies to vertex anthropic", () => {
+ const model = claude("@ai-sdk/google-vertex/anthropic", "claude-fable-5-1")
+ expect(ProviderTransform.providerOptions(model, { thinking: { type: "adaptive" }, effort: "max" })).toEqual({
+ anthropic: { thinking: { type: "adaptive", blockBinding: binding }, effort: "max" },
+ })
+ })
+
+ test("applies to bedrock reasoningConfig", () => {
+ const model = claude("@ai-sdk/amazon-bedrock", "us.anthropic.claude-fable-5-1-v1:0")
+ expect(
+ ProviderTransform.providerOptions(model, { reasoningConfig: { type: "adaptive", maxReasoningEffort: "high" } }),
+ ).toEqual({
+ bedrock: { reasoningConfig: { type: "adaptive", maxReasoningEffort: "high", blockBinding: binding } },
+ })
+ expect(ProviderTransform.providerOptions(model, {})).toEqual({
+ bedrock: { reasoningConfig: { type: "adaptive", blockBinding: binding } },
+ })
+ })
+
+ test("does not touch bedrock non-anthropic models", () => {
+ const model = claude("@ai-sdk/amazon-bedrock", "amazon.nova-pro-v1:0")
+ expect(ProviderTransform.providerOptions(model, { reasoningConfig: { type: "enabled" } })).toEqual({
+ bedrock: { reasoningConfig: { type: "enabled" } },
+ })
+ })
+
+ test("does not touch non-claude models on anthropic-compatible transports", () => {
+ const model = claude("@ai-sdk/anthropic", "kimi-k2-thinking")
+ expect(ProviderTransform.providerOptions(model, { thinking: { type: "adaptive" } })).toEqual({
+ anthropic: { thinking: { type: "adaptive" } },
+ })
+ })
+
+ test("reaches the anthropic wire as block_binding plus beta header", async () => {
+ const model = claude("@ai-sdk/anthropic", "claude-fable-5-1")
+ let sent: { headers: Headers; body: any } | undefined
+ const provider = createAnthropic({
+ apiKey: "test-key",
+ fetch: Object.assign(
+ async (...args: Parameters) => {
+ sent = { headers: new Headers(args[1]?.headers), body: JSON.parse(String(args[1]?.body)) }
+ return Response.json({
+ type: "message",
+ id: "msg_1",
+ model: "claude-fable-5-1",
+ role: "assistant",
+ content: [{ type: "text", text: "ok" }],
+ stop_reason: "end_turn",
+ usage: { input_tokens: 1, output_tokens: 1 },
+ input_transformations: [
+ { type: "thinking_dropped", path: "messages.1.content.0", reason: "prefix_binding_mismatch" },
+ ],
+ })
+ },
+ { preconnect: () => undefined },
+ ),
+ })
+ const result = await generateText({
+ model: provider("claude-fable-5-1"),
+ prompt: "hi",
+ providerOptions: ProviderTransform.providerOptions(model, {}),
+ })
+ expect(sent?.body.thinking).toEqual({
+ type: "adaptive",
+ block_binding: { prefix_mismatch_behavior: "drop_block" },
+ })
+ expect(sent?.headers.get("anthropic-beta")?.split(",")).toContain("thinking-binding-controls-2026-08-01")
+ expect(result.providerMetadata?.anthropic?.inputTransformations).toEqual([
+ { type: "thinking_dropped", path: "messages.1.content.0", reason: "prefix_binding_mismatch" },
+ ])
+ })
+
+ test("reaches the vertex anthropic wire as block_binding plus beta header", async () => {
+ const model = claude("@ai-sdk/google-vertex/anthropic", "claude-fable-5-1")
+ let sent: { url: string; headers: Headers; body: any } | undefined
+ const provider = createVertexAnthropic({
+ project: "test-project",
+ location: "global",
+ generateAuthToken: async () => "test-token",
+ fetch: Object.assign(
+ async (...args: Parameters) => {
+ sent = {
+ url: String(args[0]),
+ headers: new Headers(args[1]?.headers),
+ body: JSON.parse(String(args[1]?.body)),
+ }
+ return Response.json({
+ type: "message",
+ id: "msg_1",
+ model: "claude-fable-5-1",
+ role: "assistant",
+ content: [{ type: "text", text: "ok" }],
+ stop_reason: "end_turn",
+ usage: { input_tokens: 1, output_tokens: 1 },
+ })
+ },
+ { preconnect: () => undefined },
+ ),
+ })
+ await generateText({
+ model: provider("claude-fable-5-1"),
+ prompt: "hi",
+ providerOptions: ProviderTransform.providerOptions(model, {}),
+ })
+ // Same wire shape Anthropic's own Vertex SDK produces: rawPredict URL, model moved
+ // out of the body, anthropic_version added, betas carried in the anthropic-beta header.
+ expect(sent?.url).toBe(
+ "https://aiplatform.googleapis.com/v1/projects/test-project/locations/global/publishers/anthropic/models/claude-fable-5-1:rawPredict",
+ )
+ expect(sent?.body.model).toBeUndefined()
+ expect(sent?.body.anthropic_version).toBe("vertex-2023-10-16")
+ expect(sent?.body.thinking).toEqual({
+ type: "adaptive",
+ block_binding: { prefix_mismatch_behavior: "drop_block" },
+ })
+ expect(sent?.headers.get("anthropic-beta")?.split(",")).toContain("thinking-binding-controls-2026-08-01")
+ })
+
+ test("reaches the bedrock wire as additionalModelRequestFields", async () => {
+ const model = claude("@ai-sdk/amazon-bedrock", "us.anthropic.claude-fable-5-1-v1:0")
+ let body: any
+ const provider = createAmazonBedrock({
+ apiKey: "test-key",
+ region: "us-east-1",
+ fetch: Object.assign(
+ async (...args: Parameters) => {
+ body = JSON.parse(String(args[1]?.body))
+ return Response.json({
+ output: { message: { role: "assistant", content: [{ text: "ok" }] } },
+ stopReason: "end_turn",
+ usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
+ })
+ },
+ { preconnect: () => undefined },
+ ),
+ })
+ await generateText({
+ model: provider("us.anthropic.claude-fable-5-1-v1:0"),
+ prompt: "hi",
+ providerOptions: ProviderTransform.providerOptions(model, {
+ reasoningConfig: { type: "adaptive", maxReasoningEffort: "high" },
+ }),
+ })
+ expect(body.additionalModelRequestFields.thinking).toEqual({
+ type: "adaptive",
+ block_binding: { prefix_mismatch_behavior: "drop_block" },
+ })
+ expect(body.additionalModelRequestFields.anthropic_beta).toContain("thinking-binding-controls-2026-08-01")
+ })
+ })
+
test("forces reasoning for explicit effort even when model is not marked reasoning-capable", () => {
const model = createModel({
capabilities: {
@@ -3522,6 +3717,42 @@ describe("ProviderTransform.reasoningVariants", () => {
)
})
+ test.each(["luna", "sol", "terra"])("serializes Bedrock GPT-5.6 %s none effort", async (name) => {
+ const item = target("@ai-sdk/amazon-bedrock", `global.openai.gpt-5.6-${name}`)
+ const variants = ProviderTransform.reasoningVariants(
+ model([{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }]),
+ item,
+ )
+ for (const effort of ["low", "medium", "high", "xhigh", "max"]) {
+ expect(variants?.[effort]).toEqual({ reasoningConfig: { type: "enabled", maxReasoningEffort: effort } })
+ }
+ expect(variants?.none).toEqual({
+ reasoningConfig: { type: "enabled", maxReasoningEffort: "none" },
+ } satisfies AmazonBedrockLanguageModelOptions)
+ const sent: unknown[] = []
+ const provider = createAmazonBedrock({
+ apiKey: "test-key",
+ region: "us-east-1",
+ fetch: Object.assign(
+ async (...args: Parameters) => {
+ sent.push(JSON.parse(String(args[1]?.body)))
+ return Response.json({
+ output: { message: { role: "assistant", content: [{ text: "ok" }] } },
+ stopReason: "end_turn",
+ usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
+ })
+ },
+ { preconnect: () => undefined },
+ ),
+ })
+ await generateText({
+ model: provider(item.api.id),
+ prompt: "hi",
+ providerOptions: ProviderTransform.providerOptions(item, variants?.none ?? {}),
+ })
+ expect(sent).toEqual([expect.objectContaining({ additionalModelRequestFields: { reasoning: { effort: "none" } } })])
+ })
+
test("combines effort with extended thinking for Claude Opus 4.5", () => {
expect(
ProviderTransform.reasoningVariants(
diff --git a/packages/opencode/test/session/tools.test.ts b/packages/opencode/test/session/tools.test.ts
new file mode 100644
index 000000000000..f365f684e6c3
--- /dev/null
+++ b/packages/opencode/test/session/tools.test.ts
@@ -0,0 +1,167 @@
+import { expect } from "bun:test"
+import { ModelV2 } from "@opencode-ai/core/model"
+import { ProviderV2 } from "@opencode-ai/core/provider"
+import { SessionV1 } from "@opencode-ai/core/v1/session"
+import { Agent } from "@/agent/agent"
+import { MCP } from "@/mcp"
+import { Permission } from "@/permission"
+import { Provider } from "@/provider/provider"
+import { Session } from "@/session/session"
+import { MessageID, PartID, SessionID } from "@/session/schema"
+import { SessionProcessor } from "@/session/processor"
+import { SessionTools } from "@/session/tools"
+import { Tool } from "@/tool/tool"
+import { ToolRegistry } from "@/tool/registry"
+import { Truncate } from "@/tool/truncate"
+import { Plugin } from "@/plugin"
+import { RuntimeFlags } from "@/effect/runtime-flags"
+import { Effect, Layer, Schema } from "effect"
+import { testEffect } from "../lib/effect"
+
+const callID = "call-test"
+const sessionID = SessionID.make("ses_test")
+const messageID = MessageID.ascending()
+const partID = PartID.ascending()
+
+const agent: Agent.Info = {
+ name: "build",
+ mode: "primary",
+ options: {},
+ permission: [{ permission: "*", pattern: "*", action: "allow" }],
+}
+
+const model = {
+ providerID: ProviderV2.ID.make("test"),
+ api: { id: "test-model" },
+} as Provider.Model
+
+function fakeMcp() {
+ return MCP.Service.of({
+ tools: () => Effect.succeed({}),
+ clients: () => Effect.succeed({}),
+ } as Partial as MCP.Interface)
+}
+
+const fakePlugin = Plugin.Service.of({
+ init: () => Effect.void,
+ list: () => Effect.succeed([]),
+ trigger: (_name, _input, output) => Effect.succeed(output),
+} satisfies Plugin.Interface)
+
+const fakePermission = Permission.Service.of({
+ ask: () => Effect.void,
+ reply: () => Effect.void,
+ list: () => Effect.succeed([]),
+} satisfies Permission.Interface)
+
+const fakeTruncate = Truncate.Service.of({
+ cleanup: () => Effect.void,
+ write: () => Effect.succeed("output.txt"),
+ output: (text: string) => Effect.succeed({ content: text, truncated: false }),
+ limits: () => Effect.succeed({ maxLines: 2000, maxBytes: 50 * 1024 }),
+} satisfies Truncate.Interface)
+
+const layer = Layer.mergeAll(
+ Layer.succeed(Plugin.Service, fakePlugin),
+ Layer.succeed(Permission.Service, fakePermission),
+ Layer.succeed(MCP.Service, fakeMcp()),
+ Layer.succeed(Truncate.Service, fakeTruncate),
+ RuntimeFlags.layer(),
+ Layer.succeed(
+ ToolRegistry.Service,
+ ToolRegistry.Service.of({
+ ids: () => Effect.succeed(["timing"]),
+ all: () => Effect.succeed([]),
+ named: () => Effect.die("unused"),
+ tools: () =>
+ Effect.succeed([
+ {
+ id: "timing",
+ description: "updates metadata more than once",
+ parameters: Schema.Struct({}),
+ jsonSchema: { type: "object", properties: {} },
+ execute: (_args, ctx) =>
+ Effect.gen(function* () {
+ yield* ctx.metadata({ metadata: { output: "first" } })
+ yield* ctx.metadata({ metadata: { output: "second" } })
+ return { title: "timing", metadata: {}, output: "done" }
+ }),
+ } satisfies Tool.Def,
+ ]),
+ }),
+ ),
+)
+
+const it = testEffect(layer)
+
+it.effect("preserves running tool start time across metadata updates", () =>
+ Effect.gen(function* () {
+ const state: SessionV1.ToolPart = {
+ id: partID,
+ sessionID,
+ messageID,
+ type: "tool",
+ tool: "timing",
+ callID,
+ state: {
+ status: "running",
+ input: {},
+ time: { start: 100 },
+ },
+ }
+ const updates: number[] = []
+ const processor = {
+ message: {
+ id: messageID,
+ sessionID,
+ role: "assistant",
+ parentID: MessageID.ascending(),
+ agent: "build",
+ mode: "build",
+ path: { cwd: "/tmp", root: "/tmp" },
+ cost: 0,
+ tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
+ modelID: ModelV2.ID.make("test-model"),
+ providerID: ProviderV2.ID.make("test"),
+ time: { created: 1 },
+ } satisfies SessionV1.Assistant,
+ updateToolCall: (_toolCallID, update) =>
+ Effect.sync(() => {
+ const next = update(state)
+ state.state = next.state
+ if (state.state.status === "running") updates.push(state.state.time.start)
+ return state
+ }),
+ completeToolCall: () => Effect.void,
+ } satisfies Pick
+
+ const tools = yield* SessionTools.resolve({
+ agent,
+ model,
+ session: { id: sessionID, permission: [] } as unknown as Session.Info,
+ processor,
+ bypassAgentCheck: false,
+ messages: [],
+ promptOps: {} as never,
+ })
+ const execute = tools.timing.execute
+ if (!execute) throw new Error("timing tool is missing execute")
+
+ yield* Effect.promise(() =>
+ execute(
+ {},
+ {
+ toolCallId: callID,
+ abortSignal: new AbortController().signal,
+ messages: [],
+ },
+ ),
+ )
+
+ expect(updates).toEqual([100, 100])
+ expect(state.state.status).toBe("running")
+ if (state.state.status === "running") {
+ expect(state.state.time.start).toBe(100)
+ }
+ }),
+)
diff --git a/packages/opencode/test/tool/apply_patch.test.ts b/packages/opencode/test/tool/apply_patch.test.ts
index e394d8084f9a..742036154b5f 100644
--- a/packages/opencode/test/tool/apply_patch.test.ts
+++ b/packages/opencode/test/tool/apply_patch.test.ts
@@ -1,8 +1,9 @@
import { describe, expect } from "bun:test"
import path from "path"
import * as fs from "fs/promises"
+import { PermissionV1 } from "@opencode-ai/core/v1/permission"
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
-import { Cause, Effect, Exit, Layer } from "effect"
+import { Cause, Effect, Exit, Layer, Schema } from "effect"
import { ApplyPatchTool } from "../../src/tool/apply_patch"
import { LSP } from "@/lsp/lsp"
import { FSUtil } from "@opencode-ai/core/fs-util"
@@ -107,6 +108,25 @@ describe("tool.apply_patch freeform", () => {
}),
)
+ it.instance(
+ "produces JSON-encodable permission metadata",
+ () =>
+ Effect.gen(function* () {
+ const { ctx, calls } = makeCtx()
+ yield* execute({ patchText: "*** Begin Patch\n*** Add File: new.txt\n+created\n*** End Patch" }, ctx)
+
+ expect(() => {
+ const request = Schema.encodeUnknownSync(PermissionV1.Request)({
+ id: PermissionV1.ID.ascending(),
+ sessionID: baseCtx.sessionID,
+ ...calls[0],
+ })
+ Schema.encodeUnknownSync(Schema.Json)(request)
+ }).not.toThrow()
+ }),
+ { git: true },
+ )
+
it.instance(
"applies add/update/delete in one patch",
() =>
diff --git a/packages/plugin/package.json b/packages/plugin/package.json
index 9034c72137c4..1ba93f34dbf4 100644
--- a/packages/plugin/package.json
+++ b/packages/plugin/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/plugin",
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"scripts": {
diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json
index 66b07a349f6a..e808bcae5a0d 100644
--- a/packages/sdk/js/package.json
+++ b/packages/sdk/js/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/sdk",
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"scripts": {
diff --git a/packages/server/package.json b/packages/server/package.json
index 7c65eedadade..0ed32b1dd480 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/server",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/session-ui/package.json b/packages/session-ui/package.json
index 16a2d88151e0..80f4cc5bc512 100644
--- a/packages/session-ui/package.json
+++ b/packages/session-ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/session-ui",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/slack/package.json b/packages/slack/package.json
index ecaa750fd542..c7c7a3455c66 100644
--- a/packages/slack/package.json
+++ b/packages/slack/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/slack",
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"scripts": {
diff --git a/packages/stats/app/package.json b/packages/stats/app/package.json
index a53fca609a3e..5ed324bf5a92 100644
--- a/packages/stats/app/package.json
+++ b/packages/stats/app/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/stats-app",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/stats/app/src/routes/index.css b/packages/stats/app/src/routes/index.css
index 3b6fa273f72a..2b8acb39029e 100644
--- a/packages/stats/app/src/routes/index.css
+++ b/packages/stats/app/src/routes/index.css
@@ -6126,6 +6126,7 @@ body {
grid-template-columns: 6px minmax(0, 1fr);
gap: 12px;
align-items: start;
+ align-self: stretch;
min-width: 0;
}
@@ -6145,7 +6146,8 @@ body {
[data-page="stats"] [data-slot="compare-radar-legend"] small {
font-size: 13px;
line-height: 18px;
- overflow-wrap: anywhere;
+ overflow-wrap: break-word;
+ word-break: normal;
}
[data-page="stats"] [data-slot="compare-radar-legend"] strong {
diff --git a/packages/stats/core/package.json b/packages/stats/core/package.json
index 5d333cfce322..c21dc5b74f4a 100644
--- a/packages/stats/core/package.json
+++ b/packages/stats/core/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/stats-core",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/stats/core/src/domain/inference.test.ts b/packages/stats/core/src/domain/inference.test.ts
index 5f7e0266bf60..20dbe8620558 100644
--- a/packages/stats/core/src/domain/inference.test.ts
+++ b/packages/stats/core/src/domain/inference.test.ts
@@ -50,6 +50,10 @@ describe("inference stat normalization", () => {
})
test("merges renamed models under their current name", () => {
+ expect(statModel("deepseek-v4-flash-0731", "")).toBe("deepseek-v4-flash")
+ expect(statModel("deepseek-v4-flash-0731-free", "")).toBe("deepseek-v4-flash")
+ expect(statModel("deepseek-v4-flash-dsv4-flash-final-rnaovd", "")).toBe("deepseek-v4-flash")
+ expect(statModel("deepseek-v4-flash-vision-exp", "")).toBe("deepseek-v4-flash-vision-exp")
expect(statModel("x-preview-f", "")).toBe("glm-5.3-flash")
expect(statModel("ox-alpha", "")).toBe("glm-5.3-flash")
expect(statModel("ox-alpha-free", "")).toBe("glm-5.3-flash")
@@ -130,6 +134,9 @@ describe("inference stat normalization", () => {
expect(queries[0]).toContain("COALESCE(NULLIF(lower(model_tier), ''), '') AS raw_tier")
expect(queries[0]).toContain("WHEN lower(COALESCE(raw_tier, '')) = 'free'")
expect(queries[0]).toContain("regexp_replace(NULLIF(route_model, ''), '^.*/', '')")
+ expect(queries[0]).toContain("= 'deepseek-v4-flash-0731' THEN 'deepseek-v4-flash'")
+ expect(queries[0]).toContain("= 'deepseek-v4-flash-dsv4-flash-final-rnaovd' THEN 'deepseek-v4-flash'")
+ expect(queries[0]).not.toContain("= 'deepseek-v4-flash-vision-exp' THEN 'deepseek-v4-flash'")
expect(queries[0]).toContain("= 'ox-alpha' THEN 'glm-5.3-flash'")
expect(queries[0]).toContain("= 'x-preview-f' THEN 'glm-5.3-flash'")
expect(queries[0]).toContain("OR lower(raw_model) IN ('gpt-5-nano', 'grok-code', 'big-pickle')")
diff --git a/packages/stats/core/src/domain/model-normalization.ts b/packages/stats/core/src/domain/model-normalization.ts
index 744d761d9039..6f2edb117d0f 100644
--- a/packages/stats/core/src/domain/model-normalization.ts
+++ b/packages/stats/core/src/domain/model-normalization.ts
@@ -16,6 +16,8 @@ export const MODEL_AUTHOR_RULES = [
export const EXCLUDED_MODELS = new Set(["alpha-gpt-next"])
export const FREE_MODELS = new Set(["gpt-5-nano", "grok-code", "big-pickle"])
export const MODEL_NAME_ALIASES: Record = {
+ "deepseek-v4-flash-0731": "deepseek-v4-flash",
+ "deepseek-v4-flash-dsv4-flash-final-rnaovd": "deepseek-v4-flash",
"ox-alpha": "glm-5.3-flash",
"x-preview-f": "glm-5.3-flash",
"xiaomi/mimo-v2.5": "mimo-v2.5",
diff --git a/packages/stats/server/package.json b/packages/stats/server/package.json
index 0681be86c3e7..ab9b7d140bd5 100644
--- a/packages/stats/server/package.json
+++ b/packages/stats/server/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/stats-server",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/tui/package.json b/packages/tui/package.json
index d208dfa62655..2bfdaf4d3111 100644
--- a/packages/tui/package.json
+++ b/packages/tui/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/tui",
- "version": "1.18.25",
+ "version": "1.18.26",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/tui/src/component/prompt/index.tsx b/packages/tui/src/component/prompt/index.tsx
index fe7f4a22f75f..0a3935ab24bd 100644
--- a/packages/tui/src/component/prompt/index.tsx
+++ b/packages/tui/src/component/prompt/index.tsx
@@ -1644,7 +1644,7 @@ export function Prompt(props: PromptProps) {
{props.hint ?? (
-
+ }>
{location()?.directory ?? paths.cwd}
diff --git a/packages/tui/src/parsers-config.ts b/packages/tui/src/parsers-config.ts
index 0450c4d2eab2..fcb064e0bf07 100644
--- a/packages/tui/src/parsers-config.ts
+++ b/packages/tui/src/parsers-config.ts
@@ -302,7 +302,7 @@ export default {
wasm: "https://github.com/tree-sitter-grammars/tree-sitter-diff/releases/download/v0.1.0/tree-sitter-diff.wasm",
queries: {
highlights: [
- "https://raw.githubusercontent.com/tree-sitter-grammars/tree-sitter-diff/master/queries/highlights.scm",
+ "https://raw.githubusercontent.com/tree-sitter-grammars/tree-sitter-diff/2520c3f934b3179bb540d23e0ef45f75304b5fed/queries/highlights.scm",
],
},
},
diff --git a/packages/tui/src/routes/session/index.tsx b/packages/tui/src/routes/session/index.tsx
index cbdaf0cfa0c7..866a381f0698 100644
--- a/packages/tui/src/routes/session/index.tsx
+++ b/packages/tui/src/routes/session/index.tsx
@@ -14,7 +14,6 @@ import {
untrack,
useContext,
} from "solid-js"
-import { Dynamic } from "solid-js/web"
import path from "node:path"
import { mkdir, writeFile } from "node:fs/promises"
import { useRoute, useRouteData } from "../../context/route"
@@ -40,7 +39,7 @@ import type {
import { useLocal } from "../../context/local"
import { Locale } from "../../util/locale"
import { webSearchProviderLabel } from "../../util/tool-display"
-import { useRenderer, useTerminalDimensions, type JSX } from "@opentui/solid"
+import { Dynamic, useRenderer, useTerminalDimensions, type JSX } from "@opentui/solid"
import { useSDK } from "../../context/sdk"
import { useEditorContext } from "../../context/editor"
import { openEditor } from "../../editor"
diff --git a/packages/ui/package.json b/packages/ui/package.json
index dc3052a6cd0d..995e8be52d1d 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/ui",
- "version": "1.18.25",
+ "version": "1.18.26",
"type": "module",
"license": "MIT",
"repository": {
diff --git a/packages/web/package.json b/packages/web/package.json
index 5552d1fffeb1..135e663abfbc 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -2,7 +2,7 @@
"name": "@opencode-ai/web",
"type": "module",
"license": "MIT",
- "version": "1.18.25",
+ "version": "1.18.26",
"scripts": {
"dev": "astro dev",
"dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev",
diff --git a/packages/web/src/content/docs/ar/go.mdx b/packages/web/src/content/docs/ar/go.mdx
index b2094f5c1f83..f927fce25cd5 100644
--- a/packages/web/src/content/docs/ar/go.mdx
+++ b/packages/web/src/content/docs/ar/go.mdx
@@ -72,6 +72,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
قد تتغير قائمة النماذج مع استمرارنا في اختبار نماذج جديدة وإضافتها.
@@ -109,12 +110,13 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
تستند التقديرات إلى أنماط الطلبات المرصودة:
@@ -137,6 +139,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
- Qwen3.7 Max — 420 input، و66,000 cached، و200 output tokens لكل طلب
- Qwen3.7 Plus — 500 input، و57,000 cached، و190 output tokens لكل طلب
- Qwen3.6 Plus — 500 input، و57,000 cached، و190 output tokens لكل طلب
+- Hy4 preview — 830 input، و71,500 cached، و295 output tokens لكل طلب
- Hy3 — 830 input، و71,500 cached، و295 output tokens لكل طلب
- MiMo-V2.5 — 830 input، و71,500 cached، و295 output tokens لكل طلب
- MiMo-V2.5-Pro — 790 input، و86,000 cached، و305 output tokens لكل طلب
@@ -165,7 +168,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** ساعات Peak هي 01:00-04:00 و06:00-10:00 UTC من الاثنين إلى الجمعة؛ وجميع الساعات الأخرى، بما في ذلك عطلات نهاية الأسبوع، Off-Peak. [اعرف المزيد](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -240,6 +244,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
يستخدم [model id](/docs/config/#models) في إعدادات OpenCode لديك التنسيق `opencode-go/`. على سبيل المثال، بالنسبة إلى Kimi K3، ستستخدم `opencode-go/kimi-k3` في إعداداتك.
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | غير مستخدَمة | 0 أيام |
| DeepSeek V4 Flash | غير مستخدَمة | 0 أيام |
| DeepSeek V4 Flash Vision Exp | غير مستخدَمة | 0 أيام |
+| Hy4 preview | غير مستخدَمة | 0 أيام |
| Hy3 | غير مستخدَمة | 0 أيام |
- **Grok 4.6:** تعطّل ZDR ميزات API مهمة تعتمد على البيانات المخزنة، بما في ذلك Responses API ذات الحالة، وFiles and Collections، وBatch API. [اعرف المزيد](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/ar/zen.mdx b/packages/web/src/content/docs/ar/zen.mdx
index 7609c0b6f8fb..ff8c3d2157f7 100644
--- a/packages/web/src/content/docs/ar/zen.mdx
+++ b/packages/web/src/content/docs/ar/zen.mdx
@@ -113,7 +113,7 @@ OpenCode Zen هي بوابة AI تتيح لك الوصول إلى هذه الن
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -140,7 +140,7 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------- | ------- | --------------- | --------------- |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -225,7 +225,7 @@ https://opencode.ai/zen/v1/models
النماذج المجانية:
- MiMo-V2.5 Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
-- Hy3 Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
+- Ling 3.0 Flash Fin Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
- Nemotron 3 Ultra Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
- Nemotron 3.5 Lightning Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
- Big Pickle نموذج خفي ومتاح مجانا على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
@@ -282,7 +282,7 @@ https://opencode.ai/zen/v1/models
- Big Pickle: خلال فترته المجانية، قد تُستخدم البيانات المجمعة لتحسين النموذج.
- MiMo-V2.5 Free: خلال فترته المجانية، قد تُستخدم البيانات المجمعة لتحسين النموذج.
-- Hy3 Free: خلال فترته المجانية، قد تُستخدم البيانات المجمعة لتحسين النموذج.
+- Ling 3.0 Flash Fin Free: خلال فترته المجانية، قد تُستخدم البيانات المجمعة لتحسين النموذج.
- Nemotron 3 Ultra Free (نقاط نهاية NVIDIA المجانية): للاستخدام التجريبي فقط — لا ترسل بيانات شخصية أو سرية. يُسجَّل استخدامك لأغراض أمنية ولتحسين منتجات وخدمات NVIDIA. بيانات الجلسة المُسجَّلة لأغراض التحسين غير مرتبطة بهويتك أو بأي مُعرِّف دائم. لمزيد من المعلومات حول ممارسات معالجة البيانات لدينا، راجع [سياسة الخصوصية](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). بتفاعلك مع نقطة النهاية هذه، فإنك توافق على جمعنا لهذه المعلومات وتسجيلها واستخدامها وعلى [شروط خدمة النسخة التجريبية من واجهة NVIDIA API](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (نقاط نهاية NVIDIA المجانية): للاستخدام التجريبي فقط — لا ترسل بيانات شخصية أو سرية. يُسجَّل استخدامك لأغراض أمنية ولتحسين منتجات وخدمات NVIDIA. بيانات الجلسة المُسجَّلة لأغراض التحسين غير مرتبطة بهويتك أو بأي مُعرِّف دائم. لمزيد من المعلومات حول ممارسات معالجة البيانات لدينا، راجع [سياسة الخصوصية](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). بتفاعلك مع نقطة النهاية هذه، فإنك توافق على جمعنا لهذه المعلومات وتسجيلها واستخدامها وعلى [شروط خدمة النسخة التجريبية من واجهة NVIDIA API](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: يتم الاحتفاظ بالطلبات لمدة 30 يوما وفقا لـ [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/bs/go.mdx b/packages/web/src/content/docs/bs/go.mdx
index cf7dbfad6eca..08792e787d76 100644
--- a/packages/web/src/content/docs/bs/go.mdx
+++ b/packages/web/src/content/docs/bs/go.mdx
@@ -82,6 +82,7 @@ Trenutna lista modela uključuje:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
Lista modela se može mijenjati dok testiramo i dodajemo nove.
@@ -119,12 +120,13 @@ Tabela ispod pruža procijenjeni broj zahtjeva na osnovu tipičnih obrazaca kori
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Procjene se zasnivaju na zapaženim obrascima zahtjeva:
@@ -147,6 +149,7 @@ Procjene se zasnivaju na zapaženim obrascima zahtjeva:
- Qwen3.7 Max — 420 ulaznih, 66,000 keširanih, 200 izlaznih tokena po zahtjevu
- Qwen3.7 Plus — 500 ulaznih, 57,000 keširanih, 190 izlaznih tokena po zahtjevu
- Qwen3.6 Plus — 500 ulaznih, 57,000 keširanih, 190 izlaznih tokena po zahtjevu
+- Hy4 preview — 830 ulaznih, 71,500 keširanih, 295 izlaznih tokena po zahtjevu
- Hy3 — 830 ulaznih, 71,500 keširanih, 295 izlaznih tokena po zahtjevu
- MiMo-V2.5 — 830 ulaznih, 71,500 keširanih, 295 izlaznih tokena po zahtjevu
- MiMo-V2.5-Pro — 790 ulaznih, 86,000 keširanih, 305 izlaznih tokena po zahtjevu
@@ -175,7 +178,7 @@ Procjene se također zasnivaju na sljedećim cijenama po 1M tokena i mjesečnoj
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -186,6 +189,7 @@ Procjene se također zasnivaju na sljedećim cijenama po 1M tokena i mjesečnoj
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak sati su 01:00-04:00 i 06:00-10:00 UTC od ponedjeljka do petka; svi ostali sati, uključujući vikende, su Off-Peak. [Saznajte više](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -252,6 +256,7 @@ Također možete pristupiti Go modelima putem sljedećih API endpointa.
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
[Model id](/docs/config/#models) u vašoj OpenCode konfiguraciji
@@ -297,6 +302,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Ne koristi se | 0 dana |
| DeepSeek V4 Flash | Ne koristi se | 0 dana |
| DeepSeek V4 Flash Vision Exp | Ne koristi se | 0 dana |
+| Hy4 preview | Ne koristi se | 0 dana |
| Hy3 | Ne koristi se | 0 dana |
- **Grok 4.6:** ZDR onemogućava važne API funkcije koje zavise od pohranjenih podataka, uključujući Responses API s očuvanjem stanja, Files and Collections i Batch API. [Saznajte više](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/bs/zen.mdx b/packages/web/src/content/docs/bs/zen.mdx
index 4cb932343d6f..5ed6bb9f8cdf 100644
--- a/packages/web/src/content/docs/bs/zen.mdx
+++ b/packages/web/src/content/docs/bs/zen.mdx
@@ -118,7 +118,7 @@ Našim modelima možete pristupiti i preko sljedećih API endpointa.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ Podržavamo pay-as-you-go model. Ispod su cijene **po 1M tokena**.
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ Naknade za kreditne kartice prosljeđujemo po stvarnom trošku (4.4% + $0.30 po
Besplatni modeli:
- MiMo-V2.5 Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
-- Hy3 Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
+- Ling 3.0 Flash Fin Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
- Nemotron 3 Ultra Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
- Nemotron 3.5 Lightning Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
- Big Pickle je stealth model koji je besplatan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
@@ -294,7 +294,7 @@ i ne koriste vaše podatke za treniranje modela, uz sljedeće izuzetke:
- Big Pickle: Tokom besplatnog perioda, prikupljeni podaci mogu se koristiti za poboljšanje modela.
- MiMo-V2.5 Free: Tokom besplatnog perioda, prikupljeni podaci mogu se koristiti za poboljšanje modela.
-- Hy3 Free: Tokom besplatnog perioda, prikupljeni podaci mogu se koristiti za poboljšanje modela.
+- Ling 3.0 Flash Fin Free: Tokom besplatnog perioda, prikupljeni podaci mogu se koristiti za poboljšanje modela.
- Nemotron 3 Ultra Free (besplatni NVIDIA endpointi): Samo za probnu upotrebu — nemojte slati lične ili povjerljive podatke. Vaše korištenje se bilježi radi sigurnosti i poboljšanja NVIDIA proizvoda i usluga. Zabilježeni podaci sesije koji se koriste u svrhu poboljšanja nisu povezani s vašim identitetom niti bilo kojim trajnim identifikatorom. Za više informacija o našim praksama obrade podataka pogledajte našu [Politiku privatnosti](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Interakcijom s ovim endpointom pristajete na naše prikupljanje, bilježenje i korištenje takvih informacija te na [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (besplatni NVIDIA endpointi): Samo za probnu upotrebu — nemojte slati lične ili povjerljive podatke. Vaše korištenje se bilježi radi sigurnosti i poboljšanja NVIDIA proizvoda i usluga. Zabilježeni podaci sesije koji se koriste u svrhu poboljšanja nisu povezani s vašim identitetom niti bilo kojim trajnim identifikatorom. Za više informacija o našim praksama obrade podataka pogledajte našu [Politiku privatnosti](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Interakcijom s ovim endpointom pristajete na naše prikupljanje, bilježenje i korištenje takvih informacija te na [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: Requests are retained for 30 days in accordance with [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/da/go.mdx b/packages/web/src/content/docs/da/go.mdx
index e962d4e4acf1..efcddab1198a 100644
--- a/packages/web/src/content/docs/da/go.mdx
+++ b/packages/web/src/content/docs/da/go.mdx
@@ -82,6 +82,7 @@ Den nuværende liste over modeller inkluderer:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
Listen over modeller kan ændre sig, efterhånden som vi tester og tilføjer nye.
@@ -119,12 +120,13 @@ Tabellen nedenfor giver et estimeret antal anmodninger baseret på typiske Go-fo
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Estimaterne er baseret på observerede anmodningsmønstre:
@@ -147,6 +149,7 @@ Estimaterne er baseret på observerede anmodningsmønstre:
- Qwen3.7 Max — 420 input, 66.000 cachelagrede, 200 output-tokens pr. anmodning
- Qwen3.7 Plus — 500 input, 57.000 cachelagrede, 190 output-tokens pr. anmodning
- Qwen3.6 Plus — 500 input, 57.000 cachelagrede, 190 output-tokens pr. anmodning
+- Hy4 preview — 830 input, 71.500 cachelagrede, 295 output-tokens pr. anmodning
- Hy3 — 830 input, 71.500 cachelagrede, 295 output-tokens pr. anmodning
- MiMo-V2.5 — 830 input, 71.500 cachelagrede, 295 output-tokens pr. anmodning
- MiMo-V2.5-Pro — 790 input, 86.000 cachelagrede, 305 output-tokens pr. anmodning
@@ -175,7 +178,7 @@ Estimaterne er også baseret på følgende priser pr. 1M tokens og det månedlig
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -186,6 +189,7 @@ Estimaterne er også baseret på følgende priser pr. 1M tokens og det månedlig
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak-tiderne er 01:00-04:00 og 06:00-10:00 UTC fra mandag til fredag; alle andre tider, herunder weekender, er Off-Peak. [Læs mere](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -252,6 +256,7 @@ Du kan også få adgang til Go-modeller gennem følgende API-endpoints.
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
Dit [model id](/docs/config/#models) i din OpenCode config
@@ -297,6 +302,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Ikke brugt | 0 dage |
| DeepSeek V4 Flash | Ikke brugt | 0 dage |
| DeepSeek V4 Flash Vision Exp | Ikke brugt | 0 dage |
+| Hy4 preview | Ikke brugt | 0 dage |
| Hy3 | Ikke brugt | 0 dage |
- **Grok 4.6:** ZDR deaktiverer vigtige API-funktioner, der afhænger af lagrede data, herunder den tilstandsbevarende Responses API, Files and Collections og Batch API. [Læs mere](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/da/zen.mdx b/packages/web/src/content/docs/da/zen.mdx
index 5a8fee3ea87e..3b07f92d3090 100644
--- a/packages/web/src/content/docs/da/zen.mdx
+++ b/packages/web/src/content/docs/da/zen.mdx
@@ -118,7 +118,7 @@ Du kan også få adgang til vores modeller gennem følgende API-endpoints.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ Vi understøtter en pay-as-you-go-model. Nedenfor er priserne **pr. 1M tokens**.
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ Kreditkortgebyrer videregives til kostpris (4.4% + $0.30 pr. transaktion); vi op
De gratis modeller:
- MiMo-V2.5 Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
-- Hy3 Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
+- Ling 3.0 Flash Fin Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
- Nemotron 3 Ultra Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
- Nemotron 3.5 Lightning Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
- Big Pickle er en stealth-model, som er gratis på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
@@ -292,7 +292,7 @@ Alle vores modeller hostes i US. Vores udbydere følger en nul-opbevaringspoliti
- Big Pickle: I den gratis periode kan indsamlede data blive brugt til at forbedre modellen.
- MiMo-V2.5 Free: I den gratis periode kan indsamlede data blive brugt til at forbedre modellen.
-- Hy3 Free: I den gratis periode kan indsamlede data blive brugt til at forbedre modellen.
+- Ling 3.0 Flash Fin Free: I den gratis periode kan indsamlede data blive brugt til at forbedre modellen.
- Nemotron 3 Ultra Free (gratis NVIDIA-endpoints): Kun til prøvebrug — indsend ikke personlige eller fortrolige data. Din brug logges af sikkerhedshensyn og for at forbedre NVIDIAs produkter og tjenester. De loggede sessionsdata, der bruges til forbedringsformål, er ikke knyttet til din identitet eller nogen vedvarende identifikator. For mere information om vores databehandlingspraksis, se vores [privatlivspolitik](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ved at interagere med dette endpoint giver du samtykke til vores indsamling, registrering og brug af sådanne oplysninger samt [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (gratis NVIDIA-endpoints): Kun til prøvebrug — indsend ikke personlige eller fortrolige data. Din brug logges af sikkerhedshensyn og for at forbedre NVIDIAs produkter og tjenester. De loggede sessionsdata, der bruges til forbedringsformål, er ikke knyttet til din identitet eller nogen vedvarende identifikator. For mere information om vores databehandlingspraksis, se vores [privatlivspolitik](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ved at interagere med dette endpoint giver du samtykke til vores indsamling, registrering og brug af sådanne oplysninger samt [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: Anmodninger opbevares i 30 dage i overensstemmelse med [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/de/go.mdx b/packages/web/src/content/docs/de/go.mdx
index 31c5233ddeb2..f15dfd411469 100644
--- a/packages/web/src/content/docs/de/go.mdx
+++ b/packages/web/src/content/docs/de/go.mdx
@@ -74,6 +74,7 @@ Die aktuelle Liste der Modelle umfasst:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
Die Liste der Modelle kann sich ändern, während wir neue testen und hinzufügen.
@@ -111,12 +112,13 @@ Die folgende Tabelle zeigt eine geschätzte Anzahl von Anfragen basierend auf ty
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Die Schätzungen basieren auf beobachteten Anfragemustern:
@@ -139,6 +141,7 @@ Die Schätzungen basieren auf beobachteten Anfragemustern:
- Qwen3.7 Max — 420 Input-, 66.000 Cached-, 200 Output-Tokens pro Anfrage
- Qwen3.7 Plus — 500 Input-, 57.000 Cached-, 190 Output-Tokens pro Anfrage
- Qwen3.6 Plus — 500 Input-, 57.000 Cached-, 190 Output-Tokens pro Anfrage
+- Hy4 preview — 830 Input-, 71.500 Cached-, 295 Output-Tokens pro Anfrage
- Hy3 — 830 Input-, 71.500 Cached-, 295 Output-Tokens pro Anfrage
- MiMo-V2.5 — 830 Input-, 71.500 Cached-, 295 Output-Tokens pro Anfrage
- MiMo-V2.5-Pro — 790 Input-, 86.000 Cached-, 305 Output-Tokens pro Anfrage
@@ -167,7 +170,7 @@ Die Schätzungen basieren außerdem auf den folgenden Preisen pro 1M Tokens und
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -178,6 +181,7 @@ Die Schätzungen basieren außerdem auf den folgenden Preisen pro 1M Tokens und
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Die Peak-Zeiten sind montags bis freitags von 01:00-04:00 und 06:00-10:00 UTC; alle anderen Zeiten, einschließlich der Wochenenden, sind Off-Peak. [Mehr erfahren](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -242,6 +246,7 @@ Du kannst auf die Go-Modelle auch über die folgenden API-Endpunkte zugreifen.
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
Die [Modell-ID](/docs/config/#models) in deiner OpenCode Config verwendet das Format `opencode-go/`. Für Kimi K3 würdest du beispielsweise `opencode-go/kimi-k3` in deiner Config verwenden.
@@ -285,6 +290,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Nicht verwendet | 0 Tage |
| DeepSeek V4 Flash | Nicht verwendet | 0 Tage |
| DeepSeek V4 Flash Vision Exp | Nicht verwendet | 0 Tage |
+| Hy4 preview | Nicht verwendet | 0 Tage |
| Hy3 | Nicht verwendet | 0 Tage |
- **Grok 4.6:** ZDR deaktiviert wichtige API-Funktionen, die von gespeicherten Daten abhängen, einschließlich der zustandsbehafteten Responses API, Files and Collections und der Batch API. [Mehr erfahren](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/de/zen.mdx b/packages/web/src/content/docs/de/zen.mdx
index c1061c2d7e1d..6e4d611ea322 100644
--- a/packages/web/src/content/docs/de/zen.mdx
+++ b/packages/web/src/content/docs/de/zen.mdx
@@ -109,7 +109,7 @@ Du kannst auch über die folgenden API-Endpunkte auf unsere Modelle zugreifen.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,7 +136,7 @@ Wir unterstützen ein Pay-as-you-go-Modell. Unten findest du die Preise **pro 1M
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -221,7 +221,7 @@ Kreditkartengebühren werden zum Selbstkostenpreis weitergegeben (4.4% + $0.30 p
Die kostenlosen Modelle:
- MiMo-V2.5 Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
-- Hy3 Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
+- Ling 3.0 Flash Fin Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
- Nemotron 3 Ultra Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
- Nemotron 3.5 Lightning Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
- Big Pickle ist ein Stealth-Modell, das für begrenzte Zeit kostenlos auf OpenCode verfügbar ist. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
@@ -278,7 +278,7 @@ Alle unsere Modelle werden in den USA gehostet. Unsere Provider folgen einer Zer
- Big Pickle: Während des kostenlosen Zeitraums können gesammelte Daten zur Verbesserung des Modells verwendet werden.
- MiMo-V2.5 Free: Während des kostenlosen Zeitraums können gesammelte Daten zur Verbesserung des Modells verwendet werden.
-- Hy3 Free: Während des kostenlosen Zeitraums können gesammelte Daten zur Verbesserung des Modells verwendet werden.
+- Ling 3.0 Flash Fin Free: Während des kostenlosen Zeitraums können gesammelte Daten zur Verbesserung des Modells verwendet werden.
- Nemotron 3 Ultra Free (kostenlose NVIDIA-Endpunkte): Nur für Testzwecke — übermitteln Sie keine personenbezogenen oder vertraulichen Daten. Ihre Nutzung wird zu Sicherheitszwecken und zur Verbesserung der Produkte und Dienste von NVIDIA protokolliert. Die zu Verbesserungszwecken protokollierten Sitzungsdaten sind nicht mit Ihrer Identität oder einem dauerhaften Identifikator verknüpft. Weitere Informationen zu unseren Datenverarbeitungspraktiken finden Sie in unserer [Datenschutzrichtlinie](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Durch die Interaktion mit diesem Endpunkt stimmen Sie unserer Erhebung, Aufzeichnung und Nutzung solcher Informationen sowie den [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) zu.
- Nemotron 3.5 Lightning Free (kostenlose NVIDIA-Endpunkte): Nur für Testzwecke — übermitteln Sie keine personenbezogenen oder vertraulichen Daten. Ihre Nutzung wird zu Sicherheitszwecken und zur Verbesserung der Produkte und Dienste von NVIDIA protokolliert. Die zu Verbesserungszwecken protokollierten Sitzungsdaten sind nicht mit Ihrer Identität oder einem dauerhaften Identifikator verknüpft. Weitere Informationen zu unseren Datenverarbeitungspraktiken finden Sie in unserer [Datenschutzrichtlinie](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Durch die Interaktion mit diesem Endpunkt stimmen Sie unserer Erhebung, Aufzeichnung und Nutzung solcher Informationen sowie den [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) zu.
- OpenAI APIs: Anfragen werden in Übereinstimmung mit [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) 30 Tage lang gespeichert.
diff --git a/packages/web/src/content/docs/es/go.mdx b/packages/web/src/content/docs/es/go.mdx
index 1585fb230d60..e32c3038d743 100644
--- a/packages/web/src/content/docs/es/go.mdx
+++ b/packages/web/src/content/docs/es/go.mdx
@@ -82,6 +82,7 @@ La lista actual de modelos incluye:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
La lista de modelos puede cambiar a medida que probamos y agregamos otros nuevos.
@@ -119,12 +120,13 @@ La siguiente tabla proporciona una cantidad estimada de peticiones basada en los
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Las estimaciones se basan en los patrones de peticiones observados:
@@ -147,6 +149,7 @@ Las estimaciones se basan en los patrones de peticiones observados:
- Qwen3.7 Max — 420 tokens de entrada, 66,000 en caché, 200 tokens de salida por petición
- Qwen3.7 Plus — 500 tokens de entrada, 57,000 en caché, 190 tokens de salida por petición
- Qwen3.6 Plus — 500 tokens de entrada, 57,000 en caché, 190 tokens de salida por petición
+- Hy4 preview — 830 tokens de entrada, 71,500 en caché, 295 tokens de salida por petición
- Hy3 — 830 tokens de entrada, 71,500 en caché, 295 tokens de salida por petición
- MiMo-V2.5 — 830 tokens de entrada, 71,500 en caché, 295 tokens de salida por petición
- MiMo-V2.5-Pro — 790 tokens de entrada, 86,000 en caché, 305 tokens de salida por petición
@@ -175,7 +178,7 @@ Las estimaciones también se basan en los siguientes precios por 1M tokens y en
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -186,6 +189,7 @@ Las estimaciones también se basan en los siguientes precios por 1M tokens y en
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Las horas Peak son 01:00-04:00 y 06:00-10:00 UTC, de lunes a viernes; todas las demás horas, incluidos los fines de semana, son Off-Peak. [Más información](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -252,6 +256,7 @@ También puedes acceder a los modelos de Go a través de los siguientes endpoint
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
El [ID del modelo](/docs/config/#models) en tu configuración de OpenCode
@@ -297,6 +302,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | No utilizado | 0 días |
| DeepSeek V4 Flash | No utilizado | 0 días |
| DeepSeek V4 Flash Vision Exp | No utilizado | 0 días |
+| Hy4 preview | No utilizado | 0 días |
| Hy3 | No utilizado | 0 días |
- **Grok 4.6:** ZDR deshabilita funciones importantes de la API que dependen de datos almacenados, incluidas la Responses API con estado, Files and Collections y la Batch API. [Más información](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/es/zen.mdx b/packages/web/src/content/docs/es/zen.mdx
index eed117a8d962..046afde6cea0 100644
--- a/packages/web/src/content/docs/es/zen.mdx
+++ b/packages/web/src/content/docs/es/zen.mdx
@@ -118,7 +118,7 @@ También puedes acceder a nuestros modelos a través de los siguientes endpoints
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ Admitimos un modelo de pago por uso. A continuación se muestran los precios **p
| --------------------------------- | ------- | ------- | ---------------- | ------------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ Las comisiones de tarjeta de crédito se trasladan al costo (4.4% + $0.30 por tr
Los modelos gratuitos:
- MiMo-V2.5 Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
-- Hy3 Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
+- Ling 3.0 Flash Fin Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
- Nemotron 3 Ultra Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
- Nemotron 3.5 Lightning Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
- Big Pickle es un modelo stealth que es gratuito en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
@@ -292,7 +292,7 @@ Todos nuestros modelos están alojados en US. Nuestros proveedores siguen una po
- Big Pickle: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo.
- MiMo-V2.5 Free: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo.
-- Hy3 Free: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo.
+- Ling 3.0 Flash Fin Free: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo.
- Nemotron 3 Ultra Free (endpoints gratuitos de NVIDIA): Solo para uso de prueba — no envíes datos personales ni confidenciales. Tu uso se registra con fines de seguridad y para mejorar los productos y servicios de NVIDIA. Los datos de sesión registrados con fines de mejora no están vinculados a tu identidad ni a ningún identificador persistente. Para obtener más información sobre nuestras prácticas de procesamiento de datos, consulta nuestra [Política de privacidad](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Al interactuar con este endpoint, aceptas que recopilemos, registremos y usemos dicha información, así como los [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (endpoints gratuitos de NVIDIA): Solo para uso de prueba — no envíes datos personales ni confidenciales. Tu uso se registra con fines de seguridad y para mejorar los productos y servicios de NVIDIA. Los datos de sesión registrados con fines de mejora no están vinculados a tu identidad ni a ningún identificador persistente. Para obtener más información sobre nuestras prácticas de procesamiento de datos, consulta nuestra [Política de privacidad](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Al interactuar con este endpoint, aceptas que recopilemos, registremos y usemos dicha información, así como los [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: Las solicitudes se conservan durante 30 días de acuerdo con [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/fr/go.mdx b/packages/web/src/content/docs/fr/go.mdx
index a5b13e2fa73d..6f08343c4ae9 100644
--- a/packages/web/src/content/docs/fr/go.mdx
+++ b/packages/web/src/content/docs/fr/go.mdx
@@ -72,6 +72,7 @@ La liste actuelle des modèles comprend :
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
La liste des modèles peut changer au fur et à mesure que nous en testons et en ajoutons de nouveaux.
@@ -109,12 +110,13 @@ Le tableau ci-dessous fournit une estimation du nombre de requêtes basée sur d
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Les estimations sont basées sur les schémas de requêtes observés :
@@ -137,6 +139,7 @@ Les estimations sont basées sur les schémas de requêtes observés :
- Qwen3.7 Max — 420 tokens en entrée, 66,000 en cache, 200 tokens en sortie par requête
- Qwen3.7 Plus — 500 tokens en entrée, 57,000 en cache, 190 tokens en sortie par requête
- Qwen3.6 Plus — 500 tokens en entrée, 57,000 en cache, 190 tokens en sortie par requête
+- Hy4 preview — 830 tokens en entrée, 71,500 en cache, 295 tokens en sortie par requête
- Hy3 — 830 tokens en entrée, 71,500 en cache, 295 tokens en sortie par requête
- MiMo-V2.5 — 830 tokens en entrée, 71,500 en cache, 295 tokens en sortie par requête
- MiMo-V2.5-Pro — 790 tokens en entrée, 86,000 en cache, 305 tokens en sortie par requête
@@ -165,7 +168,7 @@ Les estimations sont également basées sur les prix suivants par 1M tokens et s
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ Les estimations sont également basées sur les prix suivants par 1M tokens et s
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Les heures Peak sont 01:00-04:00 et 06:00-10:00 UTC, du lundi au vendredi ; toutes les autres heures, y compris le week-end, sont Off-Peak. [En savoir plus](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -240,6 +244,7 @@ Vous pouvez également accéder aux modèles Go via les points de terminaison d'
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
L'[ID de modèle](/docs/config/#models) dans votre configuration OpenCode utilise le format `opencode-go/`. Par exemple, pour Kimi K3, vous utiliseriez `opencode-go/kimi-k3` dans votre configuration.
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Non utilisé | 0 jour |
| DeepSeek V4 Flash | Non utilisé | 0 jour |
| DeepSeek V4 Flash Vision Exp | Non utilisé | 0 jour |
+| Hy4 preview | Non utilisé | 0 jour |
| Hy3 | Non utilisé | 0 jour |
- **Grok 4.6:** Le ZDR désactive d’importantes fonctionnalités API qui dépendent des données stockées, notamment Responses API avec état, Files and Collections et Batch API. [En savoir plus](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/fr/zen.mdx b/packages/web/src/content/docs/fr/zen.mdx
index 8061a2ced0d2..2f6924fbeb91 100644
--- a/packages/web/src/content/docs/fr/zen.mdx
+++ b/packages/web/src/content/docs/fr/zen.mdx
@@ -109,7 +109,7 @@ Vous pouvez également accéder à nos modèles via les points de terminaison AP
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,7 +136,7 @@ Nous prenons en charge un modèle de paiement à l'utilisation. Vous trouverez c
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -221,7 +221,7 @@ Les frais de carte de crédit sont répercutés au prix coûtant (4.4% + $0.30 p
Les modèles gratuits :
- MiMo-V2.5 Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
-- Hy3 Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
+- Ling 3.0 Flash Fin Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
- Nemotron 3 Ultra Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
- Nemotron 3.5 Lightning Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
- Big Pickle est un modèle stealth gratuit sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
@@ -278,7 +278,7 @@ Tous nos modèles sont hébergés aux US. Nos fournisseurs suivent une politique
- Big Pickle : Pendant sa période gratuite, les données collectées peuvent être utilisées pour améliorer le modèle.
- MiMo-V2.5 Free : Pendant sa période gratuite, les données collectées peuvent être utilisées pour améliorer le modèle.
-- Hy3 Free : Pendant sa période gratuite, les données collectées peuvent être utilisées pour améliorer le modèle.
+- Ling 3.0 Flash Fin Free : Pendant sa période gratuite, les données collectées peuvent être utilisées pour améliorer le modèle.
- Nemotron 3 Ultra Free (endpoints NVIDIA gratuits) : Réservé à un usage d'essai — n'envoyez pas de données personnelles ou confidentielles. Votre utilisation est journalisée à des fins de sécurité et pour améliorer les produits et services de NVIDIA. Les données de session journalisées à des fins d'amélioration ne sont pas liées à votre identité ni à un quelconque identifiant persistant. Pour plus d'informations sur nos pratiques de traitement des données, consultez notre [Politique de confidentialité](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). En interagissant avec cet endpoint, vous consentez à notre collecte, à notre enregistrement et à notre utilisation de ces informations ainsi qu'aux [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (endpoints NVIDIA gratuits) : Réservé à un usage d'essai — n'envoyez pas de données personnelles ou confidentielles. Votre utilisation est journalisée à des fins de sécurité et pour améliorer les produits et services de NVIDIA. Les données de session journalisées à des fins d'amélioration ne sont pas liées à votre identité ni à un quelconque identifiant persistant. Pour plus d'informations sur nos pratiques de traitement des données, consultez notre [Politique de confidentialité](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). En interagissant avec cet endpoint, vous consentez à notre collecte, à notre enregistrement et à notre utilisation de ces informations ainsi qu'aux [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs : Les requêtes sont conservées pendant 30 jours conformément à [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/go.mdx b/packages/web/src/content/docs/go.mdx
index 96a6b4cbcc39..f6430f0c4610 100644
--- a/packages/web/src/content/docs/go.mdx
+++ b/packages/web/src/content/docs/go.mdx
@@ -82,12 +82,25 @@ The current list of models includes:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
The list of models may change as we test and add new ones.
---
+## Where can I use it?
+
+OpenCode Go is designed to be used with [OpenCode](https://opencode.ai) and other
+popular coding agents that produce a similar types of requests.
+
+Traffic is monitored for abusive traffic that degrades the experience for other users.
+
+To ensure your account does not get flagged, make sure the tool you're using
+
+1\. does not generate abusive traffic
+2\. properly identifies itself (no broad user agents)
+
## Usage limits
OpenCode Go includes the following limits:
@@ -119,12 +132,13 @@ The table below provides an estimated request count based on typical Go usage pa
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
The estimates are based on observed request patterns:
@@ -149,6 +163,7 @@ The estimates are based on observed request patterns:
- Qwen3.7 Max — 420 input, 66,000 cached, 200 output tokens per request
- Qwen3.7 Plus — 500 input, 57,000 cached, 190 output tokens per request
- Qwen3.6 Plus — 500 input, 57,000 cached, 190 output tokens per request
+- Hy4 preview — 830 input, 71,500 cached, 295 output tokens per request
- Hy3 — 830 input, 71,500 cached, 295 output tokens per request
The estimates are also based on the following prices per 1M tokens and the monthly usage included with each model:
@@ -175,7 +190,7 @@ The estimates are also based on the following prices per 1M tokens and the month
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -186,6 +201,7 @@ The estimates are also based on the following prices per 1M tokens and the month
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak hours are 01:00-04:00 and 06:00-10:00 UTC, Monday through Friday; all other hours, including weekends, are Off-Peak. [Learn more](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -252,6 +268,7 @@ You can also access Go models through the following API endpoints.
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
The [model id](/docs/config/#models) in your OpenCode config
@@ -297,6 +314,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Not used | 0 days\* |
| DeepSeek V4 Flash | Not used | 0 days\* |
| DeepSeek V4 Flash Vision Exp | Not used | 0 days\* |
+| Hy4 preview | Not used | 0 days |
| Hy3 | Not used | 0 days |
- **Grok 4.6:** ZDR disables important API features that depend on stored data, including the stateful Responses API, Files and Collections, and the Batch API. [Learn more](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/it/go.mdx b/packages/web/src/content/docs/it/go.mdx
index cd553896bde4..10697cfb944d 100644
--- a/packages/web/src/content/docs/it/go.mdx
+++ b/packages/web/src/content/docs/it/go.mdx
@@ -80,6 +80,7 @@ L'elenco attuale dei modelli include:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
L'elenco dei modelli potrebbe cambiare man mano che ne testiamo e aggiungiamo di nuovi.
@@ -117,12 +118,13 @@ La tabella seguente fornisce una stima del conteggio delle richieste in base a p
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Le stime si basano sui pattern di richieste osservati:
@@ -145,6 +147,7 @@ Le stime si basano sui pattern di richieste osservati:
- Qwen3.7 Max — 420 di input, 66.000 in cache, 200 token di output per richiesta
- Qwen3.7 Plus — 500 di input, 57.000 in cache, 190 token di output per richiesta
- Qwen3.6 Plus — 500 di input, 57.000 in cache, 190 token di output per richiesta
+- Hy4 preview — 830 di input, 71.500 in cache, 295 token di output per richiesta
- Hy3 — 830 di input, 71.500 in cache, 295 token di output per richiesta
- MiMo-V2.5 — 830 di input, 71.500 in cache, 295 token di output per richiesta
- MiMo-V2.5-Pro — 790 di input, 86.000 in cache, 305 token di output per richiesta
@@ -173,7 +176,7 @@ Le stime si basano anche sui seguenti prezzi per 1M token e sull'utilizzo mensil
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -184,6 +187,7 @@ Le stime si basano anche sui seguenti prezzi per 1M token e sull'utilizzo mensil
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Gli orari Peak sono 01:00-04:00 e 06:00-10:00 UTC, dal lunedì al venerdì; tutti gli altri orari, inclusi i fine settimana, sono Off-Peak. [Scopri di più](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -250,6 +254,7 @@ Puoi anche accedere ai modelli Go tramite i seguenti endpoint API.
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
Il [model id](/docs/config/#models) nella tua OpenCode config
@@ -295,6 +300,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Non utilizzato | 0 giorni |
| DeepSeek V4 Flash | Non utilizzato | 0 giorni |
| DeepSeek V4 Flash Vision Exp | Non utilizzato | 0 giorni |
+| Hy4 preview | Non utilizzato | 0 giorni |
| Hy3 | Non utilizzato | 0 giorni |
- **Grok 4.6:** ZDR disabilita importanti funzionalità API che dipendono dai dati archiviati, tra cui la Responses API con stato, Files and Collections e Batch API. [Scopri di più](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/it/zen.mdx b/packages/web/src/content/docs/it/zen.mdx
index ab6c944725f8..a1bf4668d991 100644
--- a/packages/web/src/content/docs/it/zen.mdx
+++ b/packages/web/src/content/docs/it/zen.mdx
@@ -118,7 +118,7 @@ Puoi anche accedere ai nostri modelli tramite i seguenti endpoint API.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ Supportiamo un modello pay-as-you-go. Qui sotto trovi i prezzi **per 1M token**.
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ Le commissioni della carta di credito vengono trasferite al costo (4.4% + $0.30
I modelli gratuiti:
- MiMo-V2.5 Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
-- Hy3 Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
+- Ling 3.0 Flash Fin Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
- Nemotron 3 Ultra Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
- Nemotron 3.5 Lightning Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
- Big Pickle è un modello stealth che è gratuito su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
@@ -292,7 +292,7 @@ Tutti i nostri modelli sono ospitati negli US. I nostri provider seguono una pol
- Big Pickle: durante il periodo gratuito, i dati raccolti possono essere usati per migliorare il modello.
- MiMo-V2.5 Free: durante il periodo gratuito, i dati raccolti possono essere usati per migliorare il modello.
-- Hy3 Free: durante il periodo gratuito, i dati raccolti possono essere usati per migliorare il modello.
+- Ling 3.0 Flash Fin Free: durante il periodo gratuito, i dati raccolti possono essere usati per migliorare il modello.
- Nemotron 3 Ultra Free (endpoint NVIDIA gratuiti): solo per uso di prova — non inviare dati personali o riservati. Il tuo utilizzo viene registrato per finalità di sicurezza e per migliorare i prodotti e i servizi di NVIDIA. I dati di sessione registrati a fini di miglioramento non sono collegati alla tua identità né ad alcun identificatore persistente. Per maggiori informazioni sulle nostre pratiche di trattamento dei dati, consulta la nostra [Informativa sulla privacy](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Interagendo con questo endpoint, acconsenti alla nostra raccolta, registrazione e utilizzo di tali informazioni e ai [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (endpoint NVIDIA gratuiti): solo per uso di prova — non inviare dati personali o riservati. Il tuo utilizzo viene registrato per finalità di sicurezza e per migliorare i prodotti e i servizi di NVIDIA. I dati di sessione registrati a fini di miglioramento non sono collegati alla tua identità né ad alcun identificatore persistente. Per maggiori informazioni sulle nostre pratiche di trattamento dei dati, consulta la nostra [Informativa sulla privacy](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Interagendo con questo endpoint, acconsenti alla nostra raccolta, registrazione e utilizzo di tali informazioni e ai [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: le richieste vengono conservate per 30 giorni in conformità con [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/ja/go.mdx b/packages/web/src/content/docs/ja/go.mdx
index c277ee728dad..e8e83effcc28 100644
--- a/packages/web/src/content/docs/ja/go.mdx
+++ b/packages/web/src/content/docs/ja/go.mdx
@@ -72,6 +72,7 @@ OpenCode Goをサブスクライブできるのは、1つのワークスペー
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
新しいモデルをテストして追加するにつれて、モデルのリストは変更される場合があります。
@@ -109,12 +110,13 @@ OpenCode Goには以下の制限が含まれています:
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
推定値は、観測されたリクエストパターンに基づいています:
@@ -137,6 +139,7 @@ OpenCode Goには以下の制限が含まれています:
- Qwen3.7 Max — リクエストあたり 入力 420トークン、キャッシュ 66,000トークン、出力 200トークン
- Qwen3.7 Plus — リクエストあたり 入力 500トークン、キャッシュ 57,000トークン、出力 190トークン
- Qwen3.6 Plus — リクエストあたり 入力 500トークン、キャッシュ 57,000トークン、出力 190トークン
+- Hy4 preview — リクエストあたり 入力 830トークン、キャッシュ 71,500トークン、出力 295トークン
- Hy3 — リクエストあたり 入力 830トークン、キャッシュ 71,500トークン、出力 295トークン
- MiMo-V2.5 — リクエストあたり 入力 830トークン、キャッシュ 71,500トークン、出力 295トークン
- MiMo-V2.5-Pro — リクエストあたり 入力 790トークン、キャッシュ 86,000トークン、出力 305トークン
@@ -165,7 +168,7 @@ OpenCode Goには以下の制限が含まれています:
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ OpenCode Goには以下の制限が含まれています:
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak時間は月曜日から金曜日の01:00-04:00と06:00-10:00 UTCで、週末を含むそれ以外の時間はすべてOff-Peakです。[詳しく見る](https://api-docs.deepseek.com/quick_start/pricing/)。
@@ -240,6 +244,7 @@ Goでは月額$10を支払い、その6倍の利用枠を提供することを
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
OpenCode設定の[model id](/docs/config/#models)は、`opencode-go/`という形式を使用します。たとえば、Kimi K3の場合は、設定で`opencode-go/kimi-k3`を使用します。
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | 使用なし | 0日 |
| DeepSeek V4 Flash | 使用なし | 0日 |
| DeepSeek V4 Flash Vision Exp | 使用なし | 0日 |
+| Hy4 preview | 使用なし | 0日 |
| Hy3 | 使用なし | 0日 |
- **Grok 4.6:** ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。[詳しく見る](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
diff --git a/packages/web/src/content/docs/ja/zen.mdx b/packages/web/src/content/docs/ja/zen.mdx
index acf316674fdb..1bee367888db 100644
--- a/packages/web/src/content/docs/ja/zen.mdx
+++ b/packages/web/src/content/docs/ja/zen.mdx
@@ -109,7 +109,7 @@ OpenCode Zen は、OpenCode のほかのプロバイダーと同じように動
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,7 +136,7 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -221,7 +221,7 @@ https://opencode.ai/zen/v1/models
無料モデル:
- MiMo-V2.5 Free は期間限定で OpenCode で利用できます。チームはこの期間中にフィードバックを集め、モデルを改善しています。
-- Hy3 Free は期間限定で OpenCode で利用できます。チームはこの期間中にフィードバックを集め、モデルを改善しています。
+- Ling 3.0 Flash Fin Free は期間限定で OpenCode で利用できます。チームはこの期間中にフィードバックを集め、モデルを改善しています。
- Nemotron 3 Ultra Free は期間限定で OpenCode で利用できます。チームはこの期間中にフィードバックを集め、モデルを改善しています。
- Nemotron 3.5 Lightning Free は期間限定で OpenCode で利用できます。チームはこの期間中にフィードバックを集め、モデルを改善しています。
- Big Pickle はステルスモデルで、期間限定で OpenCode で無料提供されています。チームはこの期間中にフィードバックを集め、モデルを改善しています。
@@ -278,7 +278,7 @@ https://opencode.ai/zen/v1/models
- Big Pickle: 無料提供期間中、収集されたデータがモデル改善に使われる場合があります。
- MiMo-V2.5 Free: 無料提供期間中、収集されたデータがモデル改善に使われる場合があります。
-- Hy3 Free: 無料提供期間中、収集されたデータがモデル改善に使われる場合があります。
+- Ling 3.0 Flash Fin Free: 無料提供期間中、収集されたデータがモデル改善に使われる場合があります。
- Nemotron 3 Ultra Free(NVIDIA の無料エンドポイント): 試用専用です — 個人情報や機密データは送信しないでください。お客様の利用は、セキュリティ目的および NVIDIA の製品とサービスの改善のために記録されます。改善目的で記録されたセッションデータは、お客様の身元や永続的な識別子とは関連付けられません。当社のデータ処理慣行の詳細については、[プライバシーポリシー](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)をご覧ください。このエンドポイントを利用することで、お客様はそのような情報の当社による収集、記録、利用、および [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) に同意したものとみなされます。
- Nemotron 3.5 Lightning Free(NVIDIA の無料エンドポイント): 試用専用です — 個人情報や機密データは送信しないでください。お客様の利用は、セキュリティ目的および NVIDIA の製品とサービスの改善のために記録されます。改善目的で記録されたセッションデータは、お客様の身元や永続的な識別子とは関連付けられません。当社のデータ処理慣行の詳細については、[プライバシーポリシー](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)をご覧ください。このエンドポイントを利用することで、お客様はそのような情報の当社による収集、記録、利用、および [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) に同意したものとみなされます。
- OpenAI APIs: リクエストは [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) に従って 30 日間保持されます。
diff --git a/packages/web/src/content/docs/ko/go.mdx b/packages/web/src/content/docs/ko/go.mdx
index d2e5bfc8bb98..5e4857073315 100644
--- a/packages/web/src/content/docs/ko/go.mdx
+++ b/packages/web/src/content/docs/ko/go.mdx
@@ -72,6 +72,7 @@ workspace당 한 명의 멤버만 OpenCode Go를 구독할 수 있습니다.
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
새로운 모델을 테스트하고 추가함에 따라 이 목록은 변경될 수 있습니다.
@@ -109,12 +110,13 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
이 예상치는 관찰된 요청 패턴을 기준으로 합니다.
@@ -137,6 +139,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
- Qwen3.7 Max — 요청당 입력 420, 캐시 66,000, 출력 토큰 200
- Qwen3.7 Plus — 요청당 입력 500, 캐시 57,000, 출력 토큰 190
- Qwen3.6 Plus — 요청당 입력 500, 캐시 57,000, 출력 토큰 190
+- Hy4 preview — 요청당 입력 830, 캐시 71,500, 출력 토큰 295
- Hy3 — 요청당 입력 830, 캐시 71,500, 출력 토큰 295
- MiMo-V2.5 — 요청당 입력 830, 캐시 71,500, 출력 토큰 295
- MiMo-V2.5-Pro — 요청당 입력 790, 캐시 86,000, 출력 토큰 305
@@ -165,7 +168,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak 시간은 월요일부터 금요일까지 01:00-04:00 및 06:00-10:00 UTC이며, 주말을 포함한 그 외 모든 시간은 Off-Peak입니다. [자세히 알아보기](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -240,6 +244,7 @@ Go에서는 월 $10를 지불하며, 저희는 그 6배의 사용량을 제공
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
OpenCode config의 [model id](/docs/config/#models)는 `opencode-go/` 형식을 사용합니다. 예를 들어 Kimi K3의 경우 config에서 `opencode-go/kimi-k3`를 사용하면 됩니다.
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | 사용되지 않음 | 0일 |
| DeepSeek V4 Flash | 사용되지 않음 | 0일 |
| DeepSeek V4 Flash Vision Exp | 사용되지 않음 | 0일 |
+| Hy4 preview | 사용되지 않음 | 0일 |
| Hy3 | 사용되지 않음 | 0일 |
- **Grok 4.6:** ZDR은 저장된 데이터에 의존하는 중요한 API 기능(상태 저장형 Responses API, Files and Collections, Batch API 포함)을 비활성화합니다. [자세히 알아보기](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/ko/zen.mdx b/packages/web/src/content/docs/ko/zen.mdx
index a3965a9eb447..13bbed54aafe 100644
--- a/packages/web/src/content/docs/ko/zen.mdx
+++ b/packages/web/src/content/docs/ko/zen.mdx
@@ -109,7 +109,7 @@ OpenCode Zen은 OpenCode의 다른 provider와 똑같이 작동합니다.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,7 +136,7 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -221,7 +221,7 @@ https://opencode.ai/zen/v1/models
무료 모델:
- MiMo-V2.5 Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
-- Hy3 Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
+- Ling 3.0 Flash Fin Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
- Nemotron 3 Ultra Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
- Nemotron 3.5 Lightning Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
- Big Pickle은 한정된 기간 동안 OpenCode에서 무료로 제공되는 stealth model입니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
@@ -278,7 +278,7 @@ https://opencode.ai/zen/v1/models
- Big Pickle: 무료 제공 기간에는 수집된 데이터가 모델 개선에 사용될 수 있습니다.
- MiMo-V2.5 Free: 무료 제공 기간에는 수집된 데이터가 모델 개선에 사용될 수 있습니다.
-- Hy3 Free: 무료 제공 기간에는 수집된 데이터가 모델 개선에 사용될 수 있습니다.
+- Ling 3.0 Flash Fin Free: 무료 제공 기간에는 수집된 데이터가 모델 개선에 사용될 수 있습니다.
- Nemotron 3 Ultra Free(NVIDIA 무료 엔드포인트): 평가판 전용이며 — 개인 정보나 기밀 데이터는 제출하지 마세요. 사용 내역은 보안 목적과 NVIDIA 제품 및 서비스 개선을 위해 기록됩니다. 개선 목적으로 기록된 세션 데이터는 사용자의 신원이나 영구 식별자와 연결되지 않습니다. 당사의 데이터 처리 관행에 대한 자세한 내용은 [개인정보처리방침](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)을 참조하세요. 이 엔드포인트와 상호 작용함으로써 사용자는 당사가 이러한 정보를 수집, 기록, 사용하는 것과 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)에 동의하게 됩니다.
- Nemotron 3.5 Lightning Free(NVIDIA 무료 엔드포인트): 평가판 전용이며 — 개인 정보나 기밀 데이터는 제출하지 마세요. 사용 내역은 보안 목적과 NVIDIA 제품 및 서비스 개선을 위해 기록됩니다. 개선 목적으로 기록된 세션 데이터는 사용자의 신원이나 영구 식별자와 연결되지 않습니다. 당사의 데이터 처리 관행에 대한 자세한 내용은 [개인정보처리방침](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)을 참조하세요. 이 엔드포인트와 상호 작용함으로써 사용자는 당사가 이러한 정보를 수집, 기록, 사용하는 것과 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)에 동의하게 됩니다.
- OpenAI APIs: 요청은 [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data)에 따라 30일 동안 보관됩니다.
diff --git a/packages/web/src/content/docs/nb/go.mdx b/packages/web/src/content/docs/nb/go.mdx
index 37393d9e45c9..6edf6c24e8cc 100644
--- a/packages/web/src/content/docs/nb/go.mdx
+++ b/packages/web/src/content/docs/nb/go.mdx
@@ -82,6 +82,7 @@ Den nåværende listen over modeller inkluderer:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
Listen over modeller kan endres etter hvert som vi tester og legger til nye.
@@ -119,12 +120,13 @@ Tabellen nedenfor gir et estimert antall forespørsler basert på typiske bruksm
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Estimatene er basert på observerte forespørselsmønstre:
@@ -147,6 +149,7 @@ Estimatene er basert på observerte forespørselsmønstre:
- Qwen3.7 Max — 420 input, 66 000 bufret, 200 output-tokens per forespørsel
- Qwen3.7 Plus — 500 input, 57 000 bufret, 190 output-tokens per forespørsel
- Qwen3.6 Plus — 500 input, 57 000 bufret, 190 output-tokens per forespørsel
+- Hy4 preview — 830 input, 71 500 bufret, 295 output-tokens per forespørsel
- Hy3 — 830 input, 71 500 bufret, 295 output-tokens per forespørsel
- MiMo-V2.5 — 830 input, 71 500 bufret, 295 output-tokens per forespørsel
- MiMo-V2.5-Pro — 790 input, 86 000 bufret, 305 output-tokens per forespørsel
@@ -175,7 +178,7 @@ Estimatene er også basert på følgende priser per 1M tokens og den månedlige
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -186,6 +189,7 @@ Estimatene er også basert på følgende priser per 1M tokens og den månedlige
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak-tidene er 01:00-04:00 og 06:00-10:00 UTC fra mandag til fredag; alle andre tider, inkludert helger, er Off-Peak. [Les mer](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -252,6 +256,7 @@ Du kan også få tilgang til Go-modeller gjennom følgende API-endepunkter.
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
[Modell-ID-en](/docs/config/#models) i din OpenCode-konfigurasjon
@@ -297,6 +302,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Brukes ikke | 0 dager |
| DeepSeek V4 Flash | Brukes ikke | 0 dager |
| DeepSeek V4 Flash Vision Exp | Brukes ikke | 0 dager |
+| Hy4 preview | Brukes ikke | 0 dager |
| Hy3 | Brukes ikke | 0 dager |
- **Grok 4.6:** ZDR deaktiverer viktige API-funksjoner som er avhengige av lagrede data, inkludert den tilstandsbaserte Responses API, Files and Collections og Batch API. [Les mer](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/nb/zen.mdx b/packages/web/src/content/docs/nb/zen.mdx
index 68b7435be2b3..57ee59e75dd3 100644
--- a/packages/web/src/content/docs/nb/zen.mdx
+++ b/packages/web/src/content/docs/nb/zen.mdx
@@ -118,7 +118,7 @@ Du kan også få tilgang til modellene våre gjennom følgende API-endepunkter.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ Vi støtter en pay-as-you-go-modell. Nedenfor er prisene **per 1M tokens**.
| --------------------------------- | ------- | ------- | ------------- | --------------- |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ Kredittkortgebyrer videreføres til kostpris (4.4% + $0.30 per transaction); vi
Gratis-modellene:
- MiMo-V2.5 Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
-- Hy3 Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
+- Ling 3.0 Flash Fin Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
- Nemotron 3 Ultra Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
- Nemotron 3.5 Lightning Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
- Big Pickle er en stealth-modell som er gratis på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
@@ -292,7 +292,7 @@ Alle modellene våre hostes i US. Leverandørene våre følger en policy for zer
- Big Pickle: I gratisperioden kan innsamlede data brukes til å forbedre modellen.
- MiMo-V2.5 Free: I gratisperioden kan innsamlede data brukes til å forbedre modellen.
-- Hy3 Free: I gratisperioden kan innsamlede data brukes til å forbedre modellen.
+- Ling 3.0 Flash Fin Free: I gratisperioden kan innsamlede data brukes til å forbedre modellen.
- Nemotron 3 Ultra Free (gratis NVIDIA-endepunkter): Kun for prøvebruk — ikke send inn personopplysninger eller konfidensielle data. Bruken din logges av sikkerhetshensyn og for å forbedre NVIDIAs produkter og tjenester. Sesjonsdataene som logges for forbedringsformål, er ikke knyttet til identiteten din eller noen vedvarende identifikator. For mer informasjon om vår databehandlingspraksis, se vår [personvernerklæring](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ved å samhandle med dette endepunktet samtykker du til at vi samler inn, registrerer og bruker slik informasjon, samt til [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (gratis NVIDIA-endepunkter): Kun for prøvebruk — ikke send inn personopplysninger eller konfidensielle data. Bruken din logges av sikkerhetshensyn og for å forbedre NVIDIAs produkter og tjenester. Sesjonsdataene som logges for forbedringsformål, er ikke knyttet til identiteten din eller noen vedvarende identifikator. For mer informasjon om vår databehandlingspraksis, se vår [personvernerklæring](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ved å samhandle med dette endepunktet samtykker du til at vi samler inn, registrerer og bruker slik informasjon, samt til [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: Forespørsler lagres i 30 dager i samsvar med [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/pl/go.mdx b/packages/web/src/content/docs/pl/go.mdx
index a43f032f86bb..7cd50ed39cf1 100644
--- a/packages/web/src/content/docs/pl/go.mdx
+++ b/packages/web/src/content/docs/pl/go.mdx
@@ -76,6 +76,7 @@ Obecna lista modeli obejmuje:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
Lista modeli może ulec zmianie w miarę testowania i dodawania nowych.
@@ -113,12 +114,13 @@ Poniższa tabela przedstawia szacunkową liczbę żądań na podstawie typowych
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Szacunki te opierają się na zaobserwowanych wzorcach żądań:
@@ -141,6 +143,7 @@ Szacunki te opierają się na zaobserwowanych wzorcach żądań:
- Qwen3.7 Max — 420 tokenów wejściowych, 66 000 w pamięci podręcznej, 200 tokenów wyjściowych na żądanie
- Qwen3.7 Plus — 500 tokenów wejściowych, 57 000 w pamięci podręcznej, 190 tokenów wyjściowych na żądanie
- Qwen3.6 Plus — 500 tokenów wejściowych, 57 000 w pamięci podręcznej, 190 tokenów wyjściowych na żądanie
+- Hy4 preview — 830 tokenów wejściowych, 71 500 w pamięci podręcznej, 295 tokenów wyjściowych na żądanie
- Hy3 — 830 tokenów wejściowych, 71 500 w pamięci podręcznej, 295 tokenów wyjściowych na żądanie
- MiMo-V2.5 — 830 tokenów wejściowych, 71 500 w pamięci podręcznej, 295 tokenów wyjściowych na żądanie
- MiMo-V2.5-Pro — 790 tokenów wejściowych, 86 000 w pamięci podręcznej, 305 tokenów wyjściowych na żądanie
@@ -169,7 +172,7 @@ Szacunki opierają się również na następujących cenach za 1M tokenów oraz
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -180,6 +183,7 @@ Szacunki opierają się również na następujących cenach za 1M tokenów oraz
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Godziny Peak to 01:00-04:00 i 06:00-10:00 UTC od poniedziałku do piątku; wszystkie pozostałe godziny, w tym weekendy, to Off-Peak. [Dowiedz się więcej](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -244,6 +248,7 @@ Możesz również uzyskać dostęp do modeli Go za pośrednictwem następującyc
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
[ID modelu](/docs/config/#models) w Twojej konfiguracji OpenCode
@@ -289,6 +294,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Niewykorzystywane | 0 dni |
| DeepSeek V4 Flash | Niewykorzystywane | 0 dni |
| DeepSeek V4 Flash Vision Exp | Niewykorzystywane | 0 dni |
+| Hy4 preview | Niewykorzystywane | 0 dni |
| Hy3 | Niewykorzystywane | 0 dni |
- **Grok 4.6:** ZDR wyłącza ważne funkcje API zależne od przechowywanych danych, w tym stanowy Responses API, Files and Collections oraz Batch API. [Dowiedz się więcej](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/pl/zen.mdx b/packages/web/src/content/docs/pl/zen.mdx
index c7db53507c4f..5ea4233d92d9 100644
--- a/packages/web/src/content/docs/pl/zen.mdx
+++ b/packages/web/src/content/docs/pl/zen.mdx
@@ -118,7 +118,7 @@ Możesz też uzyskać dostęp do naszych modeli przez poniższe endpointy API.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ Obsługujemy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów*
| --------------------------------- | ------- | ------- | -------------- | -------------- |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ Opłaty za karty kredytowe są przenoszone po kosztach (4.4% + $0.30 per transac
Darmowe modele:
- MiMo-V2.5 Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
-- Hy3 Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
+- Ling 3.0 Flash Fin Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
- Nemotron 3 Ultra Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
- Nemotron 3.5 Lightning Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
- Big Pickle to stealth model, który jest darmowy w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
@@ -292,7 +292,7 @@ Wszystkie nasze modele są hostowane w US. Nasi dostawcy stosują politykę zero
- Big Pickle: W czasie darmowego okresu zebrane dane mogą być wykorzystywane do ulepszania modelu.
- MiMo-V2.5 Free: W czasie darmowego okresu zebrane dane mogą być wykorzystywane do ulepszania modelu.
-- Hy3 Free: W czasie darmowego okresu zebrane dane mogą być wykorzystywane do ulepszania modelu.
+- Ling 3.0 Flash Fin Free: W czasie darmowego okresu zebrane dane mogą być wykorzystywane do ulepszania modelu.
- Nemotron 3 Ultra Free (darmowe endpointy NVIDIA): Tylko do użytku próbnego — nie przesyłaj danych osobowych ani poufnych. Twoje korzystanie jest rejestrowane w celach bezpieczeństwa oraz w celu ulepszania produktów i usług NVIDIA. Rejestrowane dane sesji wykorzystywane do celów ulepszania nie są powiązane z Twoją tożsamością ani żadnym trwałym identyfikatorem. Aby uzyskać więcej informacji o naszych praktykach przetwarzania danych, zapoznaj się z naszą [Polityką prywatności](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Korzystając z tego endpointu, wyrażasz zgodę na gromadzenie, rejestrowanie i wykorzystywanie przez nas takich informacji oraz na [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (darmowe endpointy NVIDIA): Tylko do użytku próbnego — nie przesyłaj danych osobowych ani poufnych. Twoje korzystanie jest rejestrowane w celach bezpieczeństwa oraz w celu ulepszania produktów i usług NVIDIA. Rejestrowane dane sesji wykorzystywane do celów ulepszania nie są powiązane z Twoją tożsamością ani żadnym trwałym identyfikatorem. Aby uzyskać więcej informacji o naszych praktykach przetwarzania danych, zapoznaj się z naszą [Polityką prywatności](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Korzystając z tego endpointu, wyrażasz zgodę na gromadzenie, rejestrowanie i wykorzystywanie przez nas takich informacji oraz na [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: Żądania są przechowywane przez 30 dni zgodnie z [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/providers.mdx b/packages/web/src/content/docs/providers.mdx
index 877f91c4e245..a1d01079f160 100644
--- a/packages/web/src/content/docs/providers.mdx
+++ b/packages/web/src/content/docs/providers.mdx
@@ -459,7 +459,7 @@ If you encounter "I'm sorry, but I cannot assist with that request" errors, try
#### Microsoft Entra ID (Azure CLI)
-You can use your Azure CLI session instead of an API key. [Install the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli), run `az login`, then run `/connect`, select **Azure**, and choose **Microsoft Entra ID (Azure CLI)**. OpenCode lists the Resources visible to your Azure CLI session and their Resource groups. Select a Resource, or choose **Enter another resource name** to enter one manually. If resource listing is unavailable, OpenCode asks for the name directly. Use `az login --tenant TENANT_ID` if the Resource belongs to a different tenant.
+You can use your Azure CLI session instead of an API key. [Install the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli), run `az login`, then run `/connect`, select **Azure**, and choose **Microsoft Entra ID (Azure CLI)**. Enter the Azure Resource name when prompted. Use `az login --tenant TENANT_ID` if the Resource belongs to a different tenant.
Find the Resource name by opening your Azure OpenAI or Foundry Resource in the [Azure portal](https://portal.azure.com/) or [Microsoft Foundry](https://ai.azure.com/). It is also the first part of the endpoint: `my-models` in `https://my-models.openai.azure.com/` or `https://my-models.services.ai.azure.com/`. If your identity can list Resources, you can also find their names and Resource groups with:
@@ -469,9 +469,7 @@ az cognitiveservices account list \
--output table
```
-OpenCode finds the Resource group and discovers its deployed models from the active Azure CLI subscription. Run `az account set --subscription NAME_OR_ID` first if the Resource is in a different subscription. Set `AZURE_RESOURCE_GROUP` to skip listing the subscription and query a known Resource directly.
-
-Model discovery requires Azure control-plane permissions, which are separate from inference permissions. If your identity cannot list deployments, OpenCode keeps the Azure model catalog available instead. Select a model whose name matches your deployment, or configure its deployment name explicitly:
+OpenCode does not query Azure management APIs or discover deployments. Select a model whose catalog name matches your deployment, or configure its deployment name explicitly:
```json title="opencode.json"
{
diff --git a/packages/web/src/content/docs/pt-br/go.mdx b/packages/web/src/content/docs/pt-br/go.mdx
index 5cc64321277c..cc0bd44cd4b7 100644
--- a/packages/web/src/content/docs/pt-br/go.mdx
+++ b/packages/web/src/content/docs/pt-br/go.mdx
@@ -82,6 +82,7 @@ A lista atual de modelos inclui:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
A lista de modelos pode mudar conforme testamos e adicionamos novos.
@@ -119,12 +120,13 @@ A tabela abaixo fornece uma contagem estimada de requisições com base nos padr
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
As estimativas se baseiam nos padrões de requisições observados:
@@ -147,6 +149,7 @@ As estimativas se baseiam nos padrões de requisições observados:
- Qwen3.7 Max — 420 tokens de entrada, 66.000 em cache, 200 tokens de saída por requisição
- Qwen3.7 Plus — 500 tokens de entrada, 57.000 em cache, 190 tokens de saída por requisição
- Qwen3.6 Plus — 500 tokens de entrada, 57.000 em cache, 190 tokens de saída por requisição
+- Hy4 preview — 830 tokens de entrada, 71.500 em cache, 295 tokens de saída por requisição
- Hy3 — 830 tokens de entrada, 71.500 em cache, 295 tokens de saída por requisição
- MiMo-V2.5 — 830 tokens de entrada, 71.500 em cache, 295 tokens de saída por requisição
- MiMo-V2.5-Pro — 790 tokens de entrada, 86.000 em cache, 305 tokens de saída por requisição
@@ -175,7 +178,7 @@ As estimativas também se baseiam nos seguintes preços por 1M tokens e no uso m
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -186,6 +189,7 @@ As estimativas também se baseiam nos seguintes preços por 1M tokens e no uso m
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Os horários Peak são 01:00-04:00 e 06:00-10:00 UTC, de segunda a sexta-feira; todos os demais horários, incluindo os fins de semana, são Off-Peak. [Saiba mais](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -252,6 +256,7 @@ Você também pode acessar os modelos do Go através dos seguintes endpoints de
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
O [ID do modelo](/docs/config/#models) na sua configuração do OpenCode
@@ -297,6 +302,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Não usado | 0 dias |
| DeepSeek V4 Flash | Não usado | 0 dias |
| DeepSeek V4 Flash Vision Exp | Não usado | 0 dias |
+| Hy4 preview | Não usado | 0 dias |
| Hy3 | Não usado | 0 dias |
- **Grok 4.6:** O ZDR desativa recursos importantes da API que dependem de dados armazenados, incluindo a Responses API com estado, Files and Collections e a Batch API. [Saiba mais](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/pt-br/zen.mdx b/packages/web/src/content/docs/pt-br/zen.mdx
index 5792ca2db7f5..3ff1c7b8e902 100644
--- a/packages/web/src/content/docs/pt-br/zen.mdx
+++ b/packages/web/src/content/docs/pt-br/zen.mdx
@@ -109,7 +109,7 @@ Você também pode acessar nossos modelos pelos seguintes endpoints de API.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,7 +136,7 @@ Oferecemos um modelo pay-as-you-go. Abaixo estão os preços **por 1M tokens**.
| --------------------------------- | ------- | ------- | ---------------- | ---------------- |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -221,7 +221,7 @@ As taxas de cartão de crédito são repassadas a preço de custo (4.4% + $0.30
Os modelos gratuitos:
- MiMo-V2.5 Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
-- Hy3 Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
+- Ling 3.0 Flash Fin Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
- Nemotron 3 Ultra Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
- Nemotron 3.5 Lightning Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
- Big Pickle é um modelo stealth que está gratuito no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
@@ -278,7 +278,7 @@ Todos os nossos modelos são hospedados nos US. Nossos provedores seguem uma pol
- Big Pickle: Durante seu período gratuito, os dados coletados podem ser usados para melhorar o modelo.
- MiMo-V2.5 Free: Durante seu período gratuito, os dados coletados podem ser usados para melhorar o modelo.
-- Hy3 Free: Durante seu período gratuito, os dados coletados podem ser usados para melhorar o modelo.
+- Ling 3.0 Flash Fin Free: Durante seu período gratuito, os dados coletados podem ser usados para melhorar o modelo.
- Nemotron 3 Ultra Free (endpoints gratuitos da NVIDIA): Apenas para uso de avaliação — não envie dados pessoais ou confidenciais. Seu uso é registrado para fins de segurança e para melhorar os produtos e serviços da NVIDIA. Os dados de sessão registrados para fins de melhoria não estão vinculados à sua identidade nem a qualquer identificador persistente. Para mais informações sobre nossas práticas de processamento de dados, consulte nossa [Política de Privacidade](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ao interagir com este endpoint, você consente com a nossa coleta, registro e uso dessas informações e com os [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (endpoints gratuitos da NVIDIA): Apenas para uso de avaliação — não envie dados pessoais ou confidenciais. Seu uso é registrado para fins de segurança e para melhorar os produtos e serviços da NVIDIA. Os dados de sessão registrados para fins de melhoria não estão vinculados à sua identidade nem a qualquer identificador persistente. Para mais informações sobre nossas práticas de processamento de dados, consulte nossa [Política de Privacidade](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ao interagir com este endpoint, você consente com a nossa coleta, registro e uso dessas informações e com os [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: As solicitações são retidas por 30 dias de acordo com [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/ru/go.mdx b/packages/web/src/content/docs/ru/go.mdx
index 91c2936b3826..c8b7e6aba6a5 100644
--- a/packages/web/src/content/docs/ru/go.mdx
+++ b/packages/web/src/content/docs/ru/go.mdx
@@ -82,6 +82,7 @@ OpenCode Go работает так же, как и любой другой пр
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
Список моделей может меняться по мере того, как мы тестируем и добавляем новые.
@@ -119,12 +120,13 @@ OpenCode Go включает следующие лимиты:
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Эти оценки основаны на наблюдаемых показателях запросов:
@@ -147,6 +149,7 @@ OpenCode Go включает следующие лимиты:
- Qwen3.7 Max — 420 входных, 66,000 кешированных, 200 выходных токенов на запрос
- Qwen3.7 Plus — 500 входных, 57,000 кешированных, 190 выходных токенов на запрос
- Qwen3.6 Plus — 500 входных, 57,000 кешированных, 190 выходных токенов на запрос
+- Hy4 preview — 830 входных, 71,500 кешированных, 295 выходных токенов на запрос
- Hy3 — 830 входных, 71,500 кешированных, 295 выходных токенов на запрос
- MiMo-V2.5 — 830 входных, 71,500 кешированных, 295 выходных токенов на запрос
- MiMo-V2.5-Pro — 790 входных, 86,000 кешированных, 305 выходных токенов на запрос
@@ -175,7 +178,7 @@ OpenCode Go включает следующие лимиты:
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -186,6 +189,7 @@ OpenCode Go включает следующие лимиты:
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Часы Peak с понедельника по пятницу: 01:00-04:00 и 06:00-10:00 UTC; все остальные часы, включая выходные, относятся к Off-Peak. [Подробнее](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -252,6 +256,7 @@ OpenCode Go включает следующие лимиты:
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
[ID модели](/docs/config/#models) в вашем конфиге OpenCode
@@ -297,6 +302,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Не используется | 0 дней |
| DeepSeek V4 Flash | Не используется | 0 дней |
| DeepSeek V4 Flash Vision Exp | Не используется | 0 дней |
+| Hy4 preview | Не используется | 0 дней |
| Hy3 | Не используется | 0 дней |
- **Grok 4.6:** ZDR отключает важные функции API, зависящие от сохраненных данных, включая Responses API с сохранением состояния, Files and Collections и Batch API. [Подробнее](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/ru/zen.mdx b/packages/web/src/content/docs/ru/zen.mdx
index f72238c90054..ddd2c29bc8d2 100644
--- a/packages/web/src/content/docs/ru/zen.mdx
+++ b/packages/web/src/content/docs/ru/zen.mdx
@@ -118,7 +118,7 @@ OpenCode Zen работает как любой другой провайдер
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ https://opencode.ai/zen/v1/models
Бесплатные модели:
- MiMo-V2.5 Free доступна в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
-- Hy3 Free доступна в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
+- Ling 3.0 Flash Fin Free доступна в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
- Nemotron 3 Ultra Free доступна в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
- Nemotron 3.5 Lightning Free доступна в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
- Big Pickle — это скрытая модель, которая доступна бесплатно в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
@@ -292,7 +292,7 @@ https://opencode.ai/zen/v1/models
- Big Pickle: во время бесплатного периода собранные данные могут использоваться для улучшения модели.
- MiMo-V2.5 Free: во время бесплатного периода собранные данные могут использоваться для улучшения модели.
-- Hy3 Free: во время бесплатного периода собранные данные могут использоваться для улучшения модели.
+- Ling 3.0 Flash Fin Free: во время бесплатного периода собранные данные могут использоваться для улучшения модели.
- Nemotron 3 Ultra Free (бесплатные эндпоинты NVIDIA): только для пробного использования — не отправляйте персональные или конфиденциальные данные. Использование логируется в целях безопасности и для улучшения продуктов и сервисов NVIDIA. Логируемые данные сессии, используемые в целях улучшения, не связаны с вашей личностью или каким-либо постоянным идентификатором. Подробнее о наших практиках обработки данных см. в нашей [Политике конфиденциальности](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Взаимодействуя с этим эндпоинтом, вы соглашаетесь на сбор, запись и использование нами такой информации, а также с [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (бесплатные эндпоинты NVIDIA): только для пробного использования — не отправляйте персональные или конфиденциальные данные. Использование логируется в целях безопасности и для улучшения продуктов и сервисов NVIDIA. Логируемые данные сессии, используемые в целях улучшения, не связаны с вашей личностью или каким-либо постоянным идентификатором. Подробнее о наших практиках обработки данных см. в нашей [Политике конфиденциальности](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Взаимодействуя с этим эндпоинтом, вы соглашаетесь на сбор, запись и использование нами такой информации, а также с [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: запросы хранятся 30 дней в соответствии с [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/th/go.mdx b/packages/web/src/content/docs/th/go.mdx
index 05c7facde5fd..436c0339fb2c 100644
--- a/packages/web/src/content/docs/th/go.mdx
+++ b/packages/web/src/content/docs/th/go.mdx
@@ -72,6 +72,7 @@ OpenCode Go ทำงานเหมือนกับผู้ให้บร
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
รายชื่อโมเดลอาจมีการเปลี่ยนแปลงเมื่อเราทำการทดสอบและเพิ่มโมเดลใหม่ๆ
@@ -109,12 +110,13 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
การประมาณการนี้อ้างอิงจากรูปแบบการใช้งาน request ที่สังเกตพบ:
@@ -137,6 +139,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
- Qwen3.7 Max — 420 input, 66,000 cached, 200 output tokens ต่อ request
- Qwen3.7 Plus — 500 input, 57,000 cached, 190 output tokens ต่อ request
- Qwen3.6 Plus — 500 input, 57,000 cached, 190 output tokens ต่อ request
+- Hy4 preview — 830 input, 71,500 cached, 295 output tokens ต่อ request
- Hy3 — 830 input, 71,500 cached, 295 output tokens ต่อ request
- MiMo-V2.5 — 830 input, 71,500 cached, 295 output tokens ต่อ request
- MiMo-V2.5-Pro — 790 input, 86,000 cached, 305 output tokens ต่อ request
@@ -165,7 +168,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** ช่วงเวลา Peak คือ 01:00-04:00 และ 06:00-10:00 UTC ตั้งแต่วันจันทร์ถึงวันศุกร์ ส่วนเวลาอื่นทั้งหมด รวมถึงวันหยุดสุดสัปดาห์ เป็น Off-Peak [ดูข้อมูลเพิ่มเติม](https://api-docs.deepseek.com/quick_start/pricing/)
@@ -240,6 +244,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
[model id](/docs/config/#models) ใน OpenCode config ของคุณจะใช้รูปแบบ `opencode-go/` ตัวอย่างเช่น สำหรับ Kimi K3 คุณจะใช้ `opencode-go/kimi-k3` ใน config ของคุณ
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | ไม่นำไปใช้ | 0 วัน |
| DeepSeek V4 Flash | ไม่นำไปใช้ | 0 วัน |
| DeepSeek V4 Flash Vision Exp | ไม่นำไปใช้ | 0 วัน |
+| Hy4 preview | ไม่นำไปใช้ | 0 วัน |
| Hy3 | ไม่นำไปใช้ | 0 วัน |
- **Grok 4.6:** ZDR ปิดใช้งานฟีเจอร์ API สำคัญที่ต้องอาศัยข้อมูลที่จัดเก็บไว้ ซึ่งรวมถึง Responses API แบบมีสถานะ, Files and Collections และ Batch API [ดูข้อมูลเพิ่มเติม](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)
diff --git a/packages/web/src/content/docs/th/zen.mdx b/packages/web/src/content/docs/th/zen.mdx
index 157e906a3ac1..c58ae2db6bfe 100644
--- a/packages/web/src/content/docs/th/zen.mdx
+++ b/packages/web/src/content/docs/th/zen.mdx
@@ -111,7 +111,7 @@ OpenCode Zen ทำงานเหมือน provider อื่น ๆ ใน
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -138,7 +138,7 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -223,7 +223,7 @@ https://opencode.ai/zen/v1/models
โมเดลฟรี:
- MiMo-V2.5 Free เปิดให้ใช้บน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
-- Hy3 Free เปิดให้ใช้บน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
+- Ling 3.0 Flash Fin Free เปิดให้ใช้บน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
- Nemotron 3 Ultra Free เปิดให้ใช้บน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
- Nemotron 3.5 Lightning Free เปิดให้ใช้บน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
- Big Pickle เป็น stealth model ที่ใช้งานฟรีบน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
@@ -280,7 +280,7 @@ https://opencode.ai/zen/v1/models
- Big Pickle: ระหว่างช่วงที่เปิดให้ใช้ฟรี ข้อมูลที่เก็บรวบรวมอาจถูกนำไปใช้เพื่อปรับปรุงโมเดล
- MiMo-V2.5 Free: ระหว่างช่วงที่เปิดให้ใช้ฟรี ข้อมูลที่เก็บรวบรวมอาจถูกนำไปใช้เพื่อปรับปรุงโมเดล
-- Hy3 Free: ระหว่างช่วงที่เปิดให้ใช้ฟรี ข้อมูลที่เก็บรวบรวมอาจถูกนำไปใช้เพื่อปรับปรุงโมเดล
+- Ling 3.0 Flash Fin Free: ระหว่างช่วงที่เปิดให้ใช้ฟรี ข้อมูลที่เก็บรวบรวมอาจถูกนำไปใช้เพื่อปรับปรุงโมเดล
- Nemotron 3 Ultra Free (endpoint ฟรีของ NVIDIA): ใช้สำหรับการทดลองเท่านั้น — โปรดอย่าส่งข้อมูลส่วนบุคคลหรือข้อมูลลับ การใช้งานของคุณจะถูกบันทึกเพื่อวัตถุประสงค์ด้านความปลอดภัยและเพื่อปรับปรุงผลิตภัณฑ์และบริการของ NVIDIA ข้อมูลเซสชันที่บันทึกไว้เพื่อวัตถุประสงค์ในการปรับปรุงจะไม่เชื่อมโยงกับตัวตนของคุณหรือตัวระบุถาวรใด ๆ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแนวปฏิบัติในการประมวลผลข้อมูลของเรา โปรดดู [นโยบายความเป็นส่วนตัว](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) ของเรา การโต้ตอบกับ endpoint นี้ถือว่าคุณยินยอมให้เราเก็บรวบรวม บันทึก และใช้ข้อมูลดังกล่าว รวมถึง [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)
- Nemotron 3.5 Lightning Free (endpoint ฟรีของ NVIDIA): ใช้สำหรับการทดลองเท่านั้น — โปรดอย่าส่งข้อมูลส่วนบุคคลหรือข้อมูลลับ การใช้งานของคุณจะถูกบันทึกเพื่อวัตถุประสงค์ด้านความปลอดภัยและเพื่อปรับปรุงผลิตภัณฑ์และบริการของ NVIDIA ข้อมูลเซสชันที่บันทึกไว้เพื่อวัตถุประสงค์ในการปรับปรุงจะไม่เชื่อมโยงกับตัวตนของคุณหรือตัวระบุถาวรใด ๆ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแนวปฏิบัติในการประมวลผลข้อมูลของเรา โปรดดู [นโยบายความเป็นส่วนตัว](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) ของเรา การโต้ตอบกับ endpoint นี้ถือว่าคุณยินยอมให้เราเก็บรวบรวม บันทึก และใช้ข้อมูลดังกล่าว รวมถึง [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)
- OpenAI APIs: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/tr/go.mdx b/packages/web/src/content/docs/tr/go.mdx
index 5b2222eb4cb8..7f9ae374699a 100644
--- a/packages/web/src/content/docs/tr/go.mdx
+++ b/packages/web/src/content/docs/tr/go.mdx
@@ -72,6 +72,7 @@ Mevcut model listesi şunları içerir:
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
Test edip yenilerini ekledikçe model listesi değişebilir.
@@ -109,12 +110,13 @@ Aşağıdaki tablo, tipik Go kullanım modellerine dayalı tahmini bir istek say
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
Tahminler, gözlemlenen istek modellerine dayanır:
@@ -137,6 +139,7 @@ Tahminler, gözlemlenen istek modellerine dayanır:
- Qwen3.7 Max — İstek başına 420 girdi, 66.000 önbelleğe alınmış, 200 çıktı token'ı
- Qwen3.7 Plus — İstek başına 500 girdi, 57.000 önbelleğe alınmış, 190 çıktı token'ı
- Qwen3.6 Plus — İstek başına 500 girdi, 57.000 önbelleğe alınmış, 190 çıktı token'ı
+- Hy4 preview — İstek başına 830 girdi, 71.500 önbelleğe alınmış, 295 çıktı token'ı
- Hy3 — İstek başına 830 girdi, 71.500 önbelleğe alınmış, 295 çıktı token'ı
- MiMo-V2.5 — İstek başına 830 girdi, 71.500 önbelleğe alınmış, 295 çıktı token'ı
- MiMo-V2.5-Pro — İstek başına 790 girdi, 86.000 önbelleğe alınmış, 305 çıktı token'ı
@@ -165,7 +168,7 @@ Tahminler ayrıca 1M token başına aşağıdaki fiyatlara ve her modelle birlik
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ Tahminler ayrıca 1M token başına aşağıdaki fiyatlara ve her modelle birlik
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak saatleri pazartesiden cumaya 01:00-04:00 ve 06:00-10:00 UTC'dir; hafta sonları dahil diğer tüm saatler Off-Peak'tir. [Daha fazla bilgi](https://api-docs.deepseek.com/quick_start/pricing/).
@@ -240,6 +244,7 @@ Go modellerine aşağıdaki API uç noktaları aracılığıyla da erişebilirsi
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
OpenCode yapılandırmanızdaki [model id](/docs/config/#models) formatı `opencode-go/` şeklindedir. Örneğin, Kimi K3 için yapılandırmanızda `opencode-go/kimi-k3` kullanmalısınız.
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | Kullanılmaz | 0 gün |
| DeepSeek V4 Flash | Kullanılmaz | 0 gün |
| DeepSeek V4 Flash Vision Exp | Kullanılmaz | 0 gün |
+| Hy4 preview | Kullanılmaz | 0 gün |
| Hy3 | Kullanılmaz | 0 gün |
- **Grok 4.6:** ZDR, durum bilgisi tutan Responses API, Files and Collections ve Batch API dahil olmak üzere saklanan verilere bağlı önemli API özelliklerini devre dışı bırakır. [Daha fazla bilgi](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
diff --git a/packages/web/src/content/docs/tr/zen.mdx b/packages/web/src/content/docs/tr/zen.mdx
index d96fdce37edb..13670c0f3286 100644
--- a/packages/web/src/content/docs/tr/zen.mdx
+++ b/packages/web/src/content/docs/tr/zen.mdx
@@ -109,7 +109,7 @@ Modellerimize aşağıdaki API uç noktaları aracılığıyla da erişebilirsin
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,7 +136,7 @@ Kullandıkça öde modelini destekliyoruz. Aşağıda **1M token başına** fiya
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -221,7 +221,7 @@ Kredi kartı ücretleri maliyet üzerinden yansıtılır (%4.4 + işlem başına
Ücretsiz modeller:
- MiMo-V2.5 Free, sınırlı bir süre için OpenCode'da ücretsizdir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
-- Hy3 Free, sınırlı bir süre için OpenCode'da ücretsizdir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
+- Ling 3.0 Flash Fin Free, sınırlı bir süre için OpenCode'da ücretsizdir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
- Nemotron 3 Ultra Free, sınırlı bir süre için OpenCode'da ücretsizdir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
- Nemotron 3.5 Lightning Free, sınırlı bir süre için OpenCode'da ücretsizdir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
- Big Pickle, sınırlı bir süre için OpenCode'da ücretsiz olan gizli bir modeldir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
@@ -278,7 +278,7 @@ Tüm modellerimiz US'de barındırılıyor. Sağlayıcılarımız zero-retention
- Big Pickle: Ücretsiz döneminde toplanan veriler modeli iyileştirmek için kullanılabilir.
- MiMo-V2.5 Free: Ücretsiz döneminde toplanan veriler modeli iyileştirmek için kullanılabilir.
-- Hy3 Free: Ücretsiz döneminde toplanan veriler modeli iyileştirmek için kullanılabilir.
+- Ling 3.0 Flash Fin Free: Ücretsiz döneminde toplanan veriler modeli iyileştirmek için kullanılabilir.
- Nemotron 3 Ultra Free (ücretsiz NVIDIA uç noktaları): Yalnızca deneme amaçlıdır — kişisel veya gizli veri göndermeyin. Kullanımınız güvenlik amacıyla ve NVIDIA ürünlerini ve hizmetlerini geliştirmek için kaydedilir. Geliştirme amacıyla kaydedilen oturum verileri kimliğinizle veya herhangi bir kalıcı tanımlayıcıyla ilişkilendirilmez. Veri işleme uygulamalarımız hakkında daha fazla bilgi için [Gizlilik Politikamıza](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) bakın. Bu uç noktayla etkileşime geçerek, bu tür bilgileri toplamamıza, kaydetmemize ve kullanmamıza ve [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) koşullarına onay vermiş olursunuz.
- Nemotron 3.5 Lightning Free (ücretsiz NVIDIA uç noktaları): Yalnızca deneme amaçlıdır — kişisel veya gizli veri göndermeyin. Kullanımınız güvenlik amacıyla ve NVIDIA ürünlerini ve hizmetlerini geliştirmek için kaydedilir. Geliştirme amacıyla kaydedilen oturum verileri kimliğinizle veya herhangi bir kalıcı tanımlayıcıyla ilişkilendirilmez. Veri işleme uygulamalarımız hakkında daha fazla bilgi için [Gizlilik Politikamıza](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) bakın. Bu uç noktayla etkileşime geçerek, bu tür bilgileri toplamamıza, kaydetmemize ve kullanmamıza ve [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) koşullarına onay vermiş olursunuz.
- OpenAI APIs: İstekler [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) uyarınca 30 gün boyunca saklanır.
diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx
index a5a80dbf611e..cb737893a87f 100644
--- a/packages/web/src/content/docs/zen.mdx
+++ b/packages/web/src/content/docs/zen.mdx
@@ -118,7 +118,7 @@ You can also access our models through the following API endpoints.
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +147,7 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**.
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -232,7 +232,7 @@ Credit card fees are passed along at cost (4.4% + $0.30 per transaction); we don
The free models:
- MiMo-V2.5 Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
-- Hy3 Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
+- Ling 3.0 Flash Fin Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
- Nemotron 3 Ultra Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
- Nemotron 3.5 Lightning Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
- Big Pickle is a stealth model that's free on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
@@ -292,7 +292,7 @@ All our models are hosted in the US. Our providers follow a zero-retention polic
- Big Pickle: During its free period, collected data may be used to improve the model.
- MiMo-V2.5 Free: During its free period, collected data may be used to improve the model.
-- Hy3 Free: During its free period, collected data may be used to improve the model.
+- Ling 3.0 Flash Fin Free: During its free period, collected data may be used to improve the model.
- Nemotron 3 Ultra Free (NVIDIA free endpoints): Trial use only — do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- Nemotron 3.5 Lightning Free (NVIDIA free endpoints): Trial use only — do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).
- OpenAI APIs: Requests are retained for 30 days in accordance with [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data).
diff --git a/packages/web/src/content/docs/zh-cn/go.mdx b/packages/web/src/content/docs/zh-cn/go.mdx
index 2a66074ad9c8..35fe8356af68 100644
--- a/packages/web/src/content/docs/zh-cn/go.mdx
+++ b/packages/web/src/content/docs/zh-cn/go.mdx
@@ -72,6 +72,7 @@ OpenCode Go 的工作方式与 OpenCode 中的其他提供商一样。
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
随着我们进行测试和添加新模型,该列表可能会发生变化。
@@ -109,12 +110,13 @@ OpenCode Go 包含以下限制:
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
预估值基于观察到的请求模式:
@@ -139,6 +141,7 @@ OpenCode Go 包含以下限制:
- Qwen3.7 Max — 每次请求 420 个输入 token,66,000 个缓存 token,200 个输出 token
- Qwen3.7 Plus — 每次请求 500 个输入 token,57,000 个缓存 token,190 个输出 token
- Qwen3.6 Plus — 每次请求 500 个输入 token,57,000 个缓存 token,190 个输出 token
+- Hy4 preview — 每次请求 830 个输入 token,71,500 个缓存 token,295 个输出 token
- Hy3 — 每次请求 830 个输入 token,71,500 个缓存 token,295 个输出 token
预估值还基于以下每 1M tokens 的价格以及每个模型包含的每月使用额度:
@@ -165,7 +168,7 @@ OpenCode Go 包含以下限制:
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ OpenCode Go 包含以下限制:
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak 时段为周一至周五的 01:00-04:00 和 06:00-10:00 UTC;其他所有时段(包括周末)均为 Off-Peak。[了解更多](https://api-docs.deepseek.com/quick_start/pricing/)。
@@ -240,6 +244,7 @@ OpenCode Go 包含以下限制:
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
你的 OpenCode 配置中的 [模型 ID](/docs/config/#models) 使用 `opencode-go/` 格式。例如,对于 Kimi K3,你将在配置中使用 `opencode-go/kimi-k3`。
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | 不使用 | 0 天 |
| DeepSeek V4 Flash | 不使用 | 0 天 |
| DeepSeek V4 Flash Vision Exp | 不使用 | 0 天 |
+| Hy4 preview | 不使用 | 0 天 |
| Hy3 | 不使用 | 0 天 |
- **Grok 4.6:** ZDR 会禁用依赖所存储数据的重要 API 功能,包括有状态的 Responses API、Files and Collections 和 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
diff --git a/packages/web/src/content/docs/zh-cn/zen.mdx b/packages/web/src/content/docs/zh-cn/zen.mdx
index 258905c22063..518badf0f9c4 100644
--- a/packages/web/src/content/docs/zh-cn/zen.mdx
+++ b/packages/web/src/content/docs/zh-cn/zen.mdx
@@ -109,7 +109,7 @@ OpenCode Zen 的工作方式与 OpenCode 中的任何其他提供商相同。
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,7 +136,7 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------- | -------- | -------- |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -221,7 +221,7 @@ https://opencode.ai/zen/v1/models
免费模型:
- MiMo-V2.5 Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
-- Hy3 Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
+- Ling 3.0 Flash Fin Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
- Nemotron 3 Ultra Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
- Nemotron 3.5 Lightning Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
- Big Pickle 是一个隐身模型,目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
@@ -278,7 +278,7 @@ https://opencode.ai/zen/v1/models
- Big Pickle:在免费期间,收集的数据可能会被用于改进模型。
- MiMo-V2.5 Free:在免费期间,收集的数据可能会被用于改进模型。
-- Hy3 Free:在免费期间,收集的数据可能会被用于改进模型。
+- Ling 3.0 Flash Fin Free:在免费期间,收集的数据可能会被用于改进模型。
- Nemotron 3 Ultra Free(NVIDIA 免费端点):仅供试用 — 请勿提交个人或机密数据。出于安全目的以及为改进 NVIDIA 产品和服务,系统会记录你的使用情况。出于改进目的而记录的会话数据不会与你的身份或任何持久标识符相关联。有关我们数据处理实践的更多信息,请参阅我们的[隐私政策](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。与此端点进行交互,即表示你同意我们收集、记录和使用此类信息,并同意 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。
- Nemotron 3.5 Lightning Free(NVIDIA 免费端点):仅供试用 — 请勿提交个人或机密数据。出于安全目的以及为改进 NVIDIA 产品和服务,系统会记录你的使用情况。出于改进目的而记录的会话数据不会与你的身份或任何持久标识符相关联。有关我们数据处理实践的更多信息,请参阅我们的[隐私政策](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。与此端点进行交互,即表示你同意我们收集、记录和使用此类信息,并同意 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。
- OpenAI APIs:请求会根据 [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) 保留 30 天。
diff --git a/packages/web/src/content/docs/zh-tw/go.mdx b/packages/web/src/content/docs/zh-tw/go.mdx
index e006253dfe0e..edf39e593095 100644
--- a/packages/web/src/content/docs/zh-tw/go.mdx
+++ b/packages/web/src/content/docs/zh-tw/go.mdx
@@ -72,6 +72,7 @@ OpenCode Go 的運作方式與 OpenCode 中的任何其他供應商相同。
- **DeepSeek V4 Pro**
- **DeepSeek V4 Flash**
- **DeepSeek V4 Flash Vision Exp**
+- **Hy4 preview**
- **Hy3**
隨著我們測試並加入新模型,模型清單可能會有所變動。
@@ -109,12 +110,13 @@ OpenCode Go 包含以下限制:
| Muse Spark 1.2 Contributor | 45,300 | 113,300 | 226,600 |
| Qwen3.8 Max | 160 | 400 | 810 |
| Qwen3.8 Flash | 5,400 | 13,500 | 27,000 |
-| Qwen3.7 Max | 340 | 840 | 1,690 |
+| Qwen3.7 Max | 170 | 420 | 840 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 1,050 | 2,600 | 5,200 |
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
+| Hy4 preview | 1,350 | 3,380 | 6,770 |
| Hy3 | 4,300 | 10,750 | 21,500 |
這些預估值是基於觀察到的請求模式:
@@ -137,6 +139,7 @@ OpenCode Go 包含以下限制:
- Qwen3.7 Max — 每次請求 420 個輸入 token、66,000 個快取 token、200 個輸出 token
- Qwen3.7 Plus — 每次請求 500 個輸入 token、57,000 個快取 token、190 個輸出 token
- Qwen3.6 Plus — 每次請求 500 個輸入 token、57,000 個快取 token、190 個輸出 token
+- Hy4 preview — 每次請求 830 個輸入 token、71,500 個快取 token、295 個輸出 token
- Hy3 — 每次請求 830 個輸入 token、71,500 個快取 token、295 個輸出 token
- MiMo-V2.5 — 每次請求 830 個輸入 token、71,500 個快取 token、295 個輸出 token
- MiMo-V2.5-Pro — 每次請求 790 個輸入 token、86,000 個快取 token、305 個輸出 token
@@ -165,7 +168,7 @@ OpenCode Go 包含以下限制:
| Muse Spark 1.2 Contributor | $0.10 | $0.20 | $0.002 | - | $60 |
| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.8 Flash | $0.15 | $0.47 | $0.016 | $0.20 | $30 |
-| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
+| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $30 |
| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | $60 |
| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | $60 |
| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | $60 |
@@ -176,6 +179,7 @@ OpenCode Go 包含以下限制:
| DeepSeek V4 Flash (Peak) | $0.44 | $1.32 | $0.014 | - | $30 |
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
+| Hy4 preview | $0.834 | $2.501 | $0.042 | - | $30 |
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak 時段為週一至週五的 01:00-04:00 和 06:00-10:00 UTC;其他所有時段(包括週末)均為 Off-Peak。[了解更多](https://api-docs.deepseek.com/quick_start/pricing/)。
@@ -240,6 +244,7 @@ OpenCode Go 包含以下限制:
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Hy4 preview | hy4-preview | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
您的 OpenCode 設定中的 [model id](/docs/config/#models) 使用 `opencode-go/` 格式。例如,Kimi K3 在設定中應使用 `opencode-go/kimi-k3`。
@@ -283,6 +288,7 @@ https://opencode.ai/zen/go/v1/models
| DeepSeek V4 Pro | 不使用 | 0 天 |
| DeepSeek V4 Flash | 不使用 | 0 天 |
| DeepSeek V4 Flash Vision Exp | 不使用 | 0 天 |
+| Hy4 preview | 不使用 | 0 天 |
| Hy3 | 不使用 | 0 天 |
- **Grok 4.6:** ZDR 會停用依賴儲存資料的重要 API 功能,包括具狀態的 Responses API、Files and Collections 與 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
diff --git a/packages/web/src/content/docs/zh-tw/zen.mdx b/packages/web/src/content/docs/zh-tw/zen.mdx
index 38be595c4b4d..eed177158eab 100644
--- a/packages/web/src/content/docs/zh-tw/zen.mdx
+++ b/packages/web/src/content/docs/zh-tw/zen.mdx
@@ -113,7 +113,7 @@ OpenCode Zen 的運作方式和 OpenCode 中的其他供應商一樣。
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Muse Spark 1.2 Contributor Free | muse-spark-1.2-contributor-free | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -141,7 +141,7 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------- | -------- | -------- |
| Big Pickle | Free | Free | Free | - |
| MiMo-V2.5 Free | Free | Free | Free | - |
-| Hy3 Free | Free | Free | Free | - |
+| Ling 3.0 Flash Fin Free | Free | Free | Free | - |
| Nemotron 3 Ultra Free | Free | Free | Free | - |
| Nemotron 3.5 Lightning Free | Free | Free | Free | - |
| Muse Spark 1.2 Contributor Free | Free | Free | Free | - |
@@ -226,7 +226,7 @@ https://opencode.ai/zen/v1/models
免費模型:
- MiMo-V2.5 Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
-- Hy3 Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
+- Ling 3.0 Flash Fin Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
- Nemotron 3 Ultra Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
- Nemotron 3.5 Lightning Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
- Big Pickle 是一個隱身模型,在 OpenCode 上限時免費提供。團隊正在利用這段時間收集回饋並改進模型。
@@ -284,7 +284,7 @@ https://opencode.ai/zen/v1/models
- Big Pickle: 在免費期間,收集到的資料可能會用於改進模型。
- MiMo-V2.5 Free: 在免費期間,收集到的資料可能會用於改進模型。
-- Hy3 Free: 在免費期間,收集到的資料可能會用於改進模型。
+- Ling 3.0 Flash Fin Free: 在免費期間,收集到的資料可能會用於改進模型。
- Nemotron 3 Ultra Free(NVIDIA 免費端點):僅供試用 — 請勿提交個人或機密資料。基於安全目的以及為了改進 NVIDIA 產品與服務,系統會記錄你的使用情況。基於改進目的而記錄的工作階段資料不會與你的身分或任何持久識別碼相關聯。有關我們資料處理實務的更多資訊,請參閱我們的[隱私政策](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。與此端點進行互動,即表示你同意我們收集、記錄與使用此類資訊,並同意 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。
- Nemotron 3.5 Lightning Free(NVIDIA 免費端點):僅供試用 — 請勿提交個人或機密資料。基於安全目的以及為了改進 NVIDIA 產品與服務,系統會記錄你的使用情況。基於改進目的而記錄的工作階段資料不會與你的身分或任何持久識別碼相關聯。有關我們資料處理實務的更多資訊,請參閱我們的[隱私政策](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。與此端點進行互動,即表示你同意我們收集、記錄與使用此類資訊,並同意 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。
- OpenAI APIs: 請求會依據 [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) 保留 30 天。
diff --git a/patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch b/patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch
new file mode 100644
index 000000000000..388b306daaba
--- /dev/null
+++ b/patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch
@@ -0,0 +1,164 @@
+diff --git a/dist/index.d.mts b/dist/index.d.mts
+index d194ae227fd1223ba44c8c5157b1bb72b1bab273..db7fdb1b6f4e617baa40539ccef718735d2e9e81 100644
+--- a/dist/index.d.mts
++++ b/dist/index.d.mts
+@@ -51,6 +51,7 @@ declare const amazonBedrockLanguageModelOptions: z.ZodObject<{
+ type: z.ZodOptional, z.ZodLiteral<"disabled">, z.ZodLiteral<"adaptive">]>>;
+ budgetTokens: z.ZodOptional;
+ maxReasoningEffort: z.ZodOptional>;
++ blockBinding: z.ZodOptional;
++ }, z.core.$strip>>;
+ }, z.core.$strip>>;
+ anthropicBeta: z.ZodOptional>;
+ serviceTier: z.ZodOptional, z.ZodLiteral<"disabled">, z.ZodLiteral<"adaptive">]>>;
+ budgetTokens: z.ZodOptional;
+ maxReasoningEffort: z.ZodOptional>;
++ blockBinding: z.ZodOptional;
++ }, z.core.$strip>>;
+ }, z.core.$strip>>;
+ anthropicBeta: z.ZodOptional>;
+ serviceTier: z.ZodOptional 0 || bedrockOptions.anthropicBeta) {
+ const existingBetas = (_g = bedrockOptions.anthropicBeta) != null ? _g : [];
+ const mergedBetas = betas.size > 0 ? [...existingBetas, ...Array.from(betas)] : existingBetas;
+@@ -1050,7 +1057,12 @@ var BedrockChatLanguageModel = class {
+ ...bedrockOptions.additionalModelRequestFields,
+ thinking: {
+ type: "enabled",
+- budget_tokens: thinkingBudget
++ budget_tokens: thinkingBudget,
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ };
+ } else if (thinkingType === "adaptive") {
+@@ -1058,7 +1070,12 @@ var BedrockChatLanguageModel = class {
+ ...bedrockOptions.additionalModelRequestFields,
+ thinking: {
+ type: "adaptive",
+- ...thinkingDisplay != null && { display: thinkingDisplay }
++ ...thinkingDisplay != null && { display: thinkingDisplay },
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ };
+ }
+diff --git a/dist/index.mjs b/dist/index.mjs
+index 5a669504cb3b21f20788956bc9c22529c1498c35..bcbcd768759a4e412657795d6db75e21d4e64c09 100644
+--- a/dist/index.mjs
++++ b/dist/index.mjs
+@@ -83,8 +83,11 @@ var amazonBedrockLanguageModelOptions = z.object({
+ z.literal("adaptive")
+ ]).optional(),
+ budgetTokens: z.number().optional(),
+- maxReasoningEffort: z.enum(["low", "medium", "high", "xhigh", "max"]).optional(),
+- display: z.enum(["omitted", "summarized"]).optional()
++ maxReasoningEffort: z.enum(["none", "low", "medium", "high", "xhigh", "max"]).optional(),
++ display: z.enum(["omitted", "summarized"]).optional(),
++ blockBinding: z.object({
++ prefixMismatchBehavior: z.enum(["error", "drop_block"])
++ }).optional()
+ }).optional(),
+ /**
+ * Anthropic beta features to enable
+@@ -1024,6 +1027,10 @@ var BedrockChatLanguageModel = class {
+ ...additionalTools
+ };
+ }
++ const thinkingBlockBinding = isAnthropicModel && isThinkingEnabled ? (bedrockOptions.reasoningConfig == null ? void 0 : bedrockOptions.reasoningConfig.blockBinding) : void 0;
++ if (thinkingBlockBinding != null) {
++ betas.add("thinking-binding-controls-2026-08-01");
++ }
+ if (betas.size > 0 || bedrockOptions.anthropicBeta) {
+ const existingBetas = (_g = bedrockOptions.anthropicBeta) != null ? _g : [];
+ const mergedBetas = betas.size > 0 ? [...existingBetas, ...Array.from(betas)] : existingBetas;
+@@ -1054,7 +1061,12 @@ var BedrockChatLanguageModel = class {
+ ...bedrockOptions.additionalModelRequestFields,
+ thinking: {
+ type: "enabled",
+- budget_tokens: thinkingBudget
++ budget_tokens: thinkingBudget,
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ };
+ } else if (thinkingType === "adaptive") {
+@@ -1062,7 +1074,12 @@ var BedrockChatLanguageModel = class {
+ ...bedrockOptions.additionalModelRequestFields,
+ thinking: {
+ type: "adaptive",
+- ...thinkingDisplay != null && { display: thinkingDisplay }
++ ...thinkingDisplay != null && { display: thinkingDisplay },
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ };
+ }
diff --git a/patches/@ai-sdk%2Fanthropic@3.0.111.patch b/patches/@ai-sdk%2Fanthropic@3.0.111.patch
new file mode 100644
index 000000000000..82003f9c2088
--- /dev/null
+++ b/patches/@ai-sdk%2Fanthropic@3.0.111.patch
@@ -0,0 +1,528 @@
+diff --git a/dist/index.d.mts b/dist/index.d.mts
+index a66d061f466c89a57efec33f37b7daabaaba2892..15f1b2aca0c0b43e5e1f8baddd2669c074912d18 100644
+--- a/dist/index.d.mts
++++ b/dist/index.d.mts
+@@ -211,9 +211,21 @@ declare const anthropicLanguageModelOptions: z.ZodObject<{
+ omitted: "omitted";
+ summarized: "summarized";
+ }>>;
++ blockBinding: z.ZodOptional;
++ }, z.core.$strip>>;
+ }, z.core.$strip>, z.ZodObject<{
+ type: z.ZodLiteral<"enabled">;
+ budgetTokens: z.ZodOptional;
++ blockBinding: z.ZodOptional;
++ }, z.core.$strip>>;
+ }, z.core.$strip>, z.ZodObject<{
+ type: z.ZodLiteral<"disabled">;
+ }, z.core.$strip>]>>;
+diff --git a/dist/index.d.ts b/dist/index.d.ts
+index a66d061f466c89a57efec33f37b7daabaaba2892..15f1b2aca0c0b43e5e1f8baddd2669c074912d18 100644
+--- a/dist/index.d.ts
++++ b/dist/index.d.ts
+@@ -211,9 +211,21 @@ declare const anthropicLanguageModelOptions: z.ZodObject<{
+ omitted: "omitted";
+ summarized: "summarized";
+ }>>;
++ blockBinding: z.ZodOptional;
++ }, z.core.$strip>>;
+ }, z.core.$strip>, z.ZodObject<{
+ type: z.ZodLiteral<"enabled">;
+ budgetTokens: z.ZodOptional;
++ blockBinding: z.ZodOptional;
++ }, z.core.$strip>>;
+ }, z.core.$strip>, z.ZodObject<{
+ type: z.ZodLiteral<"disabled">;
+ }, z.core.$strip>]>>;
+diff --git a/dist/index.js b/dist/index.js
+index 88c1aa865339baa320cf80ec543bed865825bc61..5006e82b0edd9676d1650cc94ecb573a2810acce 100644
+--- a/dist/index.js
++++ b/dist/index.js
+@@ -85,6 +85,13 @@ var anthropicMessagesResponseSchema = (0, import_provider_utils2.lazySchema)(
+ type: import_v42.z.literal("message"),
+ id: import_v42.z.string().nullish(),
+ model: import_v42.z.string().nullish(),
++ input_transformations: import_v42.z.array(
++ import_v42.z.looseObject({
++ type: import_v42.z.string(),
++ path: import_v42.z.string().nullish(),
++ reason: import_v42.z.string().nullish()
++ })
++ ).nullish(),
+ content: import_v42.z.array(
+ import_v42.z.discriminatedUnion("type", [
+ import_v42.z.object({
+@@ -424,6 +431,13 @@ var anthropicMessagesChunkSchema = (0, import_provider_utils2.lazySchema)(
+ id: import_v42.z.string().nullish(),
+ model: import_v42.z.string().nullish(),
+ role: import_v42.z.string().nullish(),
++ input_transformations: import_v42.z.array(
++ import_v42.z.looseObject({
++ type: import_v42.z.string(),
++ path: import_v42.z.string().nullish(),
++ reason: import_v42.z.string().nullish()
++ })
++ ).nullish(),
+ usage: import_v42.z.looseObject({
+ input_tokens: import_v42.z.number(),
+ cache_creation_input_tokens: import_v42.z.number().nullish(),
+@@ -923,12 +937,18 @@ var anthropicLanguageModelOptions = import_v43.z.object({
+ * - `"omitted"`: Thinking blocks are present but text is empty (default for Opus 4.7+).
+ * - `"summarized"`: Thinking content is returned. Required to see reasoning output.
+ */
+- display: import_v43.z.enum(["omitted", "summarized"]).optional()
++ display: import_v43.z.enum(["omitted", "summarized"]).optional(),
++ blockBinding: import_v43.z.object({
++ prefixMismatchBehavior: import_v43.z.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ import_v43.z.object({
+ /** for models before Opus 4.6, except Sonnet 4.6 still supports it */
+ type: import_v43.z.literal("enabled"),
+- budgetTokens: import_v43.z.number().optional()
++ budgetTokens: import_v43.z.number().optional(),
++ blockBinding: import_v43.z.object({
++ prefixMismatchBehavior: import_v43.z.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ import_v43.z.object({
+ type: import_v43.z.literal("disabled")
+@@ -3568,6 +3588,7 @@ var AnthropicMessagesLanguageModel = class {
+ const sendThinking = isThinking || thinkingType === "disabled";
+ let thinkingBudget = thinkingType === "enabled" ? (_g = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _g.budgetTokens : void 0;
+ const thinkingDisplay = thinkingType === "adaptive" ? (_h = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _h.display : void 0;
++ const thinkingBlockBinding = isThinking ? (anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : anthropicOptions.thinking.blockBinding : void 0;
+ const maxTokens = maxOutputTokens != null ? maxOutputTokens : maxOutputTokensForModel;
+ const baseArgs = {
+ // model id:
+@@ -3583,7 +3604,12 @@ var AnthropicMessagesLanguageModel = class {
+ thinking: {
+ type: thinkingType,
+ ...thinkingBudget != null && { budget_tokens: thinkingBudget },
+- ...thinkingDisplay != null && { display: thinkingDisplay }
++ ...thinkingDisplay != null && { display: thinkingDisplay },
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ },
+ ...((anthropicOptions == null ? void 0 : anthropicOptions.effort) || (anthropicOptions == null ? void 0 : anthropicOptions.taskBudget) || useStructuredOutput && (responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null) && {
+@@ -3798,6 +3824,9 @@ var AnthropicMessagesLanguageModel = class {
+ } else if ((anthropicOptions == null ? void 0 : anthropicOptions.fallbacks) && anthropicOptions.fallbacks.length > 0) {
+ betas.add("server-side-fallback-2026-06-01");
+ }
++ if (thinkingBlockBinding != null) {
++ betas.add("thinking-binding-controls-2026-08-01");
++ }
+ const defaultEagerInputStreaming = stream && ((_j = anthropicOptions == null ? void 0 : anthropicOptions.toolStreaming) != null ? _j : true);
+ const {
+ tools: anthropicTools2,
+@@ -4364,6 +4393,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens: (_a2 = response.usage.cache_creation_input_tokens) != null ? _a2 : null,
+ stopSequence: (_b2 = response.stop_sequence) != null ? _b2 : null,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...response.input_transformations != null ? { inputTransformations: response.input_transformations } : {},
+ iterations: response.usage.iterations ? response.usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
+@@ -4453,6 +4483,7 @@ var AnthropicMessagesLanguageModel = class {
+ let cacheCreationInputTokens = null;
+ let stopSequence = null;
+ let stopDetails = void 0;
++ let inputTransformations = void 0;
+ let container = null;
+ let isJsonResponseFromTool = false;
+ let isMessageOpen = false;
+@@ -5111,6 +5142,9 @@ var AnthropicMessagesLanguageModel = class {
+ isMessageOpen = true;
+ activeMessageId = value.message.id;
+ usage.input_tokens = value.message.usage.input_tokens;
++ if (value.message.input_transformations != null) {
++ inputTransformations = value.message.input_transformations;
++ }
+ usage.cache_read_input_tokens = (_e = value.message.usage.cache_read_input_tokens) != null ? _e : 0;
+ usage.cache_creation_input_tokens = (_f = value.message.usage.cache_creation_input_tokens) != null ? _f : 0;
+ rawUsage = {
+@@ -5231,6 +5265,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens,
+ stopSequence,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...inputTransformations != null ? { inputTransformations } : {},
+ iterations: usage.iterations ? usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
+diff --git a/dist/index.mjs b/dist/index.mjs
+index 593b030c7f2adbe0cd38556b7a74f5ede6a5435e..1fa36ccb119715df3cd00976e479c679c66d2261 100644
+--- a/dist/index.mjs
++++ b/dist/index.mjs
+@@ -85,6 +85,13 @@ var anthropicMessagesResponseSchema = lazySchema2(
+ type: z2.literal("message"),
+ id: z2.string().nullish(),
+ model: z2.string().nullish(),
++ input_transformations: z2.array(
++ z2.looseObject({
++ type: z2.string(),
++ path: z2.string().nullish(),
++ reason: z2.string().nullish()
++ })
++ ).nullish(),
+ content: z2.array(
+ z2.discriminatedUnion("type", [
+ z2.object({
+@@ -424,6 +431,13 @@ var anthropicMessagesChunkSchema = lazySchema2(
+ id: z2.string().nullish(),
+ model: z2.string().nullish(),
+ role: z2.string().nullish(),
++ input_transformations: z2.array(
++ z2.looseObject({
++ type: z2.string(),
++ path: z2.string().nullish(),
++ reason: z2.string().nullish()
++ })
++ ).nullish(),
+ usage: z2.looseObject({
+ input_tokens: z2.number(),
+ cache_creation_input_tokens: z2.number().nullish(),
+@@ -923,12 +937,18 @@ var anthropicLanguageModelOptions = z3.object({
+ * - `"omitted"`: Thinking blocks are present but text is empty (default for Opus 4.7+).
+ * - `"summarized"`: Thinking content is returned. Required to see reasoning output.
+ */
+- display: z3.enum(["omitted", "summarized"]).optional()
++ display: z3.enum(["omitted", "summarized"]).optional(),
++ blockBinding: z3.object({
++ prefixMismatchBehavior: z3.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ z3.object({
+ /** for models before Opus 4.6, except Sonnet 4.6 still supports it */
+ type: z3.literal("enabled"),
+- budgetTokens: z3.number().optional()
++ budgetTokens: z3.number().optional(),
++ blockBinding: z3.object({
++ prefixMismatchBehavior: z3.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ z3.object({
+ type: z3.literal("disabled")
+@@ -3620,6 +3640,7 @@ var AnthropicMessagesLanguageModel = class {
+ const sendThinking = isThinking || thinkingType === "disabled";
+ let thinkingBudget = thinkingType === "enabled" ? (_g = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _g.budgetTokens : void 0;
+ const thinkingDisplay = thinkingType === "adaptive" ? (_h = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _h.display : void 0;
++ const thinkingBlockBinding = isThinking ? (anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : anthropicOptions.thinking.blockBinding : void 0;
+ const maxTokens = maxOutputTokens != null ? maxOutputTokens : maxOutputTokensForModel;
+ const baseArgs = {
+ // model id:
+@@ -3635,7 +3656,12 @@ var AnthropicMessagesLanguageModel = class {
+ thinking: {
+ type: thinkingType,
+ ...thinkingBudget != null && { budget_tokens: thinkingBudget },
+- ...thinkingDisplay != null && { display: thinkingDisplay }
++ ...thinkingDisplay != null && { display: thinkingDisplay },
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ },
+ ...((anthropicOptions == null ? void 0 : anthropicOptions.effort) || (anthropicOptions == null ? void 0 : anthropicOptions.taskBudget) || useStructuredOutput && (responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null) && {
+@@ -3850,6 +3876,9 @@ var AnthropicMessagesLanguageModel = class {
+ } else if ((anthropicOptions == null ? void 0 : anthropicOptions.fallbacks) && anthropicOptions.fallbacks.length > 0) {
+ betas.add("server-side-fallback-2026-06-01");
+ }
++ if (thinkingBlockBinding != null) {
++ betas.add("thinking-binding-controls-2026-08-01");
++ }
+ const defaultEagerInputStreaming = stream && ((_j = anthropicOptions == null ? void 0 : anthropicOptions.toolStreaming) != null ? _j : true);
+ const {
+ tools: anthropicTools2,
+@@ -4416,6 +4445,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens: (_a2 = response.usage.cache_creation_input_tokens) != null ? _a2 : null,
+ stopSequence: (_b2 = response.stop_sequence) != null ? _b2 : null,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...response.input_transformations != null ? { inputTransformations: response.input_transformations } : {},
+ iterations: response.usage.iterations ? response.usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
+@@ -4505,6 +4535,7 @@ var AnthropicMessagesLanguageModel = class {
+ let cacheCreationInputTokens = null;
+ let stopSequence = null;
+ let stopDetails = void 0;
++ let inputTransformations = void 0;
+ let container = null;
+ let isJsonResponseFromTool = false;
+ let isMessageOpen = false;
+@@ -5163,6 +5194,9 @@ var AnthropicMessagesLanguageModel = class {
+ isMessageOpen = true;
+ activeMessageId = value.message.id;
+ usage.input_tokens = value.message.usage.input_tokens;
++ if (value.message.input_transformations != null) {
++ inputTransformations = value.message.input_transformations;
++ }
+ usage.cache_read_input_tokens = (_e = value.message.usage.cache_read_input_tokens) != null ? _e : 0;
+ usage.cache_creation_input_tokens = (_f = value.message.usage.cache_creation_input_tokens) != null ? _f : 0;
+ rawUsage = {
+@@ -5283,6 +5317,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens,
+ stopSequence,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...inputTransformations != null ? { inputTransformations } : {},
+ iterations: usage.iterations ? usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
+diff --git a/dist/internal/index.js b/dist/internal/index.js
+index 701ca5a333d83d384f682667b9976b7f72b0de37..ce53d0c9fe5c00a092b0347b45d61d8ce9c3a79a 100644
+--- a/dist/internal/index.js
++++ b/dist/internal/index.js
+@@ -79,6 +79,13 @@ var anthropicMessagesResponseSchema = (0, import_provider_utils2.lazySchema)(
+ type: import_v42.z.literal("message"),
+ id: import_v42.z.string().nullish(),
+ model: import_v42.z.string().nullish(),
++ input_transformations: import_v42.z.array(
++ import_v42.z.looseObject({
++ type: import_v42.z.string(),
++ path: import_v42.z.string().nullish(),
++ reason: import_v42.z.string().nullish()
++ })
++ ).nullish(),
+ content: import_v42.z.array(
+ import_v42.z.discriminatedUnion("type", [
+ import_v42.z.object({
+@@ -418,6 +425,13 @@ var anthropicMessagesChunkSchema = (0, import_provider_utils2.lazySchema)(
+ id: import_v42.z.string().nullish(),
+ model: import_v42.z.string().nullish(),
+ role: import_v42.z.string().nullish(),
++ input_transformations: import_v42.z.array(
++ import_v42.z.looseObject({
++ type: import_v42.z.string(),
++ path: import_v42.z.string().nullish(),
++ reason: import_v42.z.string().nullish()
++ })
++ ).nullish(),
+ usage: import_v42.z.looseObject({
+ input_tokens: import_v42.z.number(),
+ cache_creation_input_tokens: import_v42.z.number().nullish(),
+@@ -917,12 +931,18 @@ var anthropicLanguageModelOptions = import_v43.z.object({
+ * - `"omitted"`: Thinking blocks are present but text is empty (default for Opus 4.7+).
+ * - `"summarized"`: Thinking content is returned. Required to see reasoning output.
+ */
+- display: import_v43.z.enum(["omitted", "summarized"]).optional()
++ display: import_v43.z.enum(["omitted", "summarized"]).optional(),
++ blockBinding: import_v43.z.object({
++ prefixMismatchBehavior: import_v43.z.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ import_v43.z.object({
+ /** for models before Opus 4.6, except Sonnet 4.6 still supports it */
+ type: import_v43.z.literal("enabled"),
+- budgetTokens: import_v43.z.number().optional()
++ budgetTokens: import_v43.z.number().optional(),
++ blockBinding: import_v43.z.object({
++ prefixMismatchBehavior: import_v43.z.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ import_v43.z.object({
+ type: import_v43.z.literal("disabled")
+@@ -3562,6 +3582,7 @@ var AnthropicMessagesLanguageModel = class {
+ const sendThinking = isThinking || thinkingType === "disabled";
+ let thinkingBudget = thinkingType === "enabled" ? (_g = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _g.budgetTokens : void 0;
+ const thinkingDisplay = thinkingType === "adaptive" ? (_h = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _h.display : void 0;
++ const thinkingBlockBinding = isThinking ? (anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : anthropicOptions.thinking.blockBinding : void 0;
+ const maxTokens = maxOutputTokens != null ? maxOutputTokens : maxOutputTokensForModel;
+ const baseArgs = {
+ // model id:
+@@ -3577,7 +3598,12 @@ var AnthropicMessagesLanguageModel = class {
+ thinking: {
+ type: thinkingType,
+ ...thinkingBudget != null && { budget_tokens: thinkingBudget },
+- ...thinkingDisplay != null && { display: thinkingDisplay }
++ ...thinkingDisplay != null && { display: thinkingDisplay },
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ },
+ ...((anthropicOptions == null ? void 0 : anthropicOptions.effort) || (anthropicOptions == null ? void 0 : anthropicOptions.taskBudget) || useStructuredOutput && (responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null) && {
+@@ -3792,6 +3818,9 @@ var AnthropicMessagesLanguageModel = class {
+ } else if ((anthropicOptions == null ? void 0 : anthropicOptions.fallbacks) && anthropicOptions.fallbacks.length > 0) {
+ betas.add("server-side-fallback-2026-06-01");
+ }
++ if (thinkingBlockBinding != null) {
++ betas.add("thinking-binding-controls-2026-08-01");
++ }
+ const defaultEagerInputStreaming = stream && ((_j = anthropicOptions == null ? void 0 : anthropicOptions.toolStreaming) != null ? _j : true);
+ const {
+ tools: anthropicTools2,
+@@ -4358,6 +4387,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens: (_a2 = response.usage.cache_creation_input_tokens) != null ? _a2 : null,
+ stopSequence: (_b2 = response.stop_sequence) != null ? _b2 : null,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...response.input_transformations != null ? { inputTransformations: response.input_transformations } : {},
+ iterations: response.usage.iterations ? response.usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
+@@ -4447,6 +4477,7 @@ var AnthropicMessagesLanguageModel = class {
+ let cacheCreationInputTokens = null;
+ let stopSequence = null;
+ let stopDetails = void 0;
++ let inputTransformations = void 0;
+ let container = null;
+ let isJsonResponseFromTool = false;
+ let isMessageOpen = false;
+@@ -5105,6 +5136,9 @@ var AnthropicMessagesLanguageModel = class {
+ isMessageOpen = true;
+ activeMessageId = value.message.id;
+ usage.input_tokens = value.message.usage.input_tokens;
++ if (value.message.input_transformations != null) {
++ inputTransformations = value.message.input_transformations;
++ }
+ usage.cache_read_input_tokens = (_e = value.message.usage.cache_read_input_tokens) != null ? _e : 0;
+ usage.cache_creation_input_tokens = (_f = value.message.usage.cache_creation_input_tokens) != null ? _f : 0;
+ rawUsage = {
+@@ -5225,6 +5259,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens,
+ stopSequence,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...inputTransformations != null ? { inputTransformations } : {},
+ iterations: usage.iterations ? usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
+diff --git a/dist/internal/index.mjs b/dist/internal/index.mjs
+index c11f29fa42a9ce6a5681d43c609020f1f4a616da..df7f7a01992a56826eb809e6cdfb1e50a87a1b90 100644
+--- a/dist/internal/index.mjs
++++ b/dist/internal/index.mjs
+@@ -69,6 +69,13 @@ var anthropicMessagesResponseSchema = lazySchema2(
+ type: z2.literal("message"),
+ id: z2.string().nullish(),
+ model: z2.string().nullish(),
++ input_transformations: z2.array(
++ z2.looseObject({
++ type: z2.string(),
++ path: z2.string().nullish(),
++ reason: z2.string().nullish()
++ })
++ ).nullish(),
+ content: z2.array(
+ z2.discriminatedUnion("type", [
+ z2.object({
+@@ -408,6 +415,13 @@ var anthropicMessagesChunkSchema = lazySchema2(
+ id: z2.string().nullish(),
+ model: z2.string().nullish(),
+ role: z2.string().nullish(),
++ input_transformations: z2.array(
++ z2.looseObject({
++ type: z2.string(),
++ path: z2.string().nullish(),
++ reason: z2.string().nullish()
++ })
++ ).nullish(),
+ usage: z2.looseObject({
+ input_tokens: z2.number(),
+ cache_creation_input_tokens: z2.number().nullish(),
+@@ -907,12 +921,18 @@ var anthropicLanguageModelOptions = z3.object({
+ * - `"omitted"`: Thinking blocks are present but text is empty (default for Opus 4.7+).
+ * - `"summarized"`: Thinking content is returned. Required to see reasoning output.
+ */
+- display: z3.enum(["omitted", "summarized"]).optional()
++ display: z3.enum(["omitted", "summarized"]).optional(),
++ blockBinding: z3.object({
++ prefixMismatchBehavior: z3.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ z3.object({
+ /** for models before Opus 4.6, except Sonnet 4.6 still supports it */
+ type: z3.literal("enabled"),
+- budgetTokens: z3.number().optional()
++ budgetTokens: z3.number().optional(),
++ blockBinding: z3.object({
++ prefixMismatchBehavior: z3.enum(["error", "drop_block"])
++ }).optional()
+ }),
+ z3.object({
+ type: z3.literal("disabled")
+@@ -3604,6 +3624,7 @@ var AnthropicMessagesLanguageModel = class {
+ const sendThinking = isThinking || thinkingType === "disabled";
+ let thinkingBudget = thinkingType === "enabled" ? (_g = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _g.budgetTokens : void 0;
+ const thinkingDisplay = thinkingType === "adaptive" ? (_h = anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : _h.display : void 0;
++ const thinkingBlockBinding = isThinking ? (anthropicOptions == null ? void 0 : anthropicOptions.thinking) == null ? void 0 : anthropicOptions.thinking.blockBinding : void 0;
+ const maxTokens = maxOutputTokens != null ? maxOutputTokens : maxOutputTokensForModel;
+ const baseArgs = {
+ // model id:
+@@ -3619,7 +3640,12 @@ var AnthropicMessagesLanguageModel = class {
+ thinking: {
+ type: thinkingType,
+ ...thinkingBudget != null && { budget_tokens: thinkingBudget },
+- ...thinkingDisplay != null && { display: thinkingDisplay }
++ ...thinkingDisplay != null && { display: thinkingDisplay },
++ ...thinkingBlockBinding != null && {
++ block_binding: {
++ prefix_mismatch_behavior: thinkingBlockBinding.prefixMismatchBehavior
++ }
++ }
+ }
+ },
+ ...((anthropicOptions == null ? void 0 : anthropicOptions.effort) || (anthropicOptions == null ? void 0 : anthropicOptions.taskBudget) || useStructuredOutput && (responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null) && {
+@@ -3834,6 +3860,9 @@ var AnthropicMessagesLanguageModel = class {
+ } else if ((anthropicOptions == null ? void 0 : anthropicOptions.fallbacks) && anthropicOptions.fallbacks.length > 0) {
+ betas.add("server-side-fallback-2026-06-01");
+ }
++ if (thinkingBlockBinding != null) {
++ betas.add("thinking-binding-controls-2026-08-01");
++ }
+ const defaultEagerInputStreaming = stream && ((_j = anthropicOptions == null ? void 0 : anthropicOptions.toolStreaming) != null ? _j : true);
+ const {
+ tools: anthropicTools2,
+@@ -4400,6 +4429,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens: (_a2 = response.usage.cache_creation_input_tokens) != null ? _a2 : null,
+ stopSequence: (_b2 = response.stop_sequence) != null ? _b2 : null,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...response.input_transformations != null ? { inputTransformations: response.input_transformations } : {},
+ iterations: response.usage.iterations ? response.usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
+@@ -4489,6 +4519,7 @@ var AnthropicMessagesLanguageModel = class {
+ let cacheCreationInputTokens = null;
+ let stopSequence = null;
+ let stopDetails = void 0;
++ let inputTransformations = void 0;
+ let container = null;
+ let isJsonResponseFromTool = false;
+ let isMessageOpen = false;
+@@ -5147,6 +5178,9 @@ var AnthropicMessagesLanguageModel = class {
+ isMessageOpen = true;
+ activeMessageId = value.message.id;
+ usage.input_tokens = value.message.usage.input_tokens;
++ if (value.message.input_transformations != null) {
++ inputTransformations = value.message.input_transformations;
++ }
+ usage.cache_read_input_tokens = (_e = value.message.usage.cache_read_input_tokens) != null ? _e : 0;
+ usage.cache_creation_input_tokens = (_f = value.message.usage.cache_creation_input_tokens) != null ? _f : 0;
+ rawUsage = {
+@@ -5267,6 +5301,7 @@ var AnthropicMessagesLanguageModel = class {
+ cacheCreationInputTokens,
+ stopSequence,
+ ...stopDetails != null ? { stopDetails } : {},
++ ...inputTransformations != null ? { inputTransformations } : {},
+ iterations: usage.iterations ? usage.iterations.map(
+ (iter) => ({
+ type: iter.type,
diff --git a/patches/@ff-labs%2Ffff-bun@0.9.3.patch b/patches/@ff-labs%2Ffff-bun@0.9.3.patch
deleted file mode 100644
index 23a7dd54fb15..000000000000
--- a/patches/@ff-labs%2Ffff-bun@0.9.3.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/src/download.ts b/src/download.ts
-index 3454256..6dca25a 100644
---- a/src/download.ts
-+++ b/src/download.ts
-@@ -7,7 +7,7 @@
- */
-
-+declare const FFF_LIBC: "gnu" | "musl";
- import { existsSync } from "node:fs";
--import { createRequire } from "node:module";
- import { dirname, join } from "node:path";
- import { fileURLToPath } from "node:url";
- import { getLibFilename, getNpmPackageName } from "./platform";
-@@ -54,14 +54,10 @@ export function binaryExists(): boolean {
- * in the same directory.
- */
- function resolveFromNpmPackage(): string | null {
-- const packageName = getNpmPackageName();
--
- try {
-- // Use createRequire to resolve the platform package's location
-- const require = createRequire(join(getPackageDir(), "package.json"));
-- const packageJsonPath = require.resolve(`${packageName}/package.json`);
-- const packageDir = dirname(packageJsonPath);
-- const binaryPath = join(packageDir, getLibFilename());
-+ const binaryPath = require(
-+ `@ff-labs/fff-bin-${process.platform === "linux" ? `linux-${process.arch}-${typeof FFF_LIBC === "string" ? FFF_LIBC : getNpmPackageName().endsWith("musl") ? "musl" : "gnu"}` : `${process.platform}-${process.arch}`}/${process.platform === "win32" ? "fff_c.dll" : process.platform === "darwin" ? "libfff_c.dylib" : "libfff_c.so"}`,
-+ );
-
- if (existsSync(binaryPath)) {
- return binaryPath;
diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json
index de3b012f3ec9..1cd570242976 100644
--- a/sdks/vscode/package.json
+++ b/sdks/vscode/package.json
@@ -2,7 +2,7 @@
"name": "opencode",
"displayName": "opencode",
"description": "opencode for VS Code",
- "version": "1.18.25",
+ "version": "1.18.26",
"publisher": "sst-dev",
"repository": {
"type": "git",