From 9cb6fb65290764677ee0c2eb68cb84c55fd08abc Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 21 Aug 2026 16:58:24 -0400 Subject: [PATCH 1/8] fix(console): cache desktop downloads --- .../routes/download/[channel]/[platform].ts | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/console/app/src/routes/download/[channel]/[platform].ts b/packages/console/app/src/routes/download/[channel]/[platform].ts index 7a4b5ef65e0f..4a4be13f4bd3 100644 --- a/packages/console/app/src/routes/download/[channel]/[platform].ts +++ b/packages/console/app/src/routes/download/[channel]/[platform].ts @@ -1,4 +1,5 @@ import type { APIEvent } from "@solidjs/start" +import { waitUntil } from "@opencode-ai/console-resource" import type { DownloadPlatform } from "../types" const prodAssetNames: Record = { @@ -30,14 +31,34 @@ export async function GET({ params: { platform, channel } }: APIEvent) { const assetName = channel === "stable" ? prodAssetNames[platform] : betaAssetNames[platform] if (!assetName) return new Response(null, { status: 404 }) - const resp = await fetch( + const latest = await fetch( `https://github.com/anomalyco/${channel === "stable" ? "opencode" : "opencode-beta"}/releases/latest/download/${assetName}`, + { redirect: "manual" }, ) + const location = latest.headers.get("location") + if (!location) return new Response(null, { status: 502 }) - const downloadName = downloadNames[platform] + const key = new Request(location) + const cache = (caches as CacheStorage & { default: Cache }).default + const cached = await cache.match(key) + if (cached) return download(cached, platform, "HIT") + + const resp = await fetch(location) + if (!resp.ok) return resp + + const headers = new Headers(resp.headers) + headers.set("cache-control", "public, max-age=31536000, immutable") + headers.delete("set-cookie") + const result = new Response(resp.body, { status: resp.status, statusText: resp.statusText, headers }) + waitUntil(cache.put(key, result.clone())) + return download(result, platform, "MISS") +} +function download(resp: Response, platform: string, cache: "HIT" | "MISS") { + const downloadName = downloadNames[platform] const headers = new Headers(resp.headers) if (downloadName) headers.set("content-disposition", `attachment; filename="${downloadName}"`) + headers.set("x-opencode-cache", cache) return new Response(resp.body, { status: resp.status, statusText: resp.statusText, headers }) } From bcf1103a8c8653acd7afdd5fc2ebd9f6e5486b3c Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 17:00:03 -0400 Subject: [PATCH 2/8] docs(zen): update GPT 5.6 Sol pricing (#43986) Co-authored-by: Slickstef11 <98915060+Slickstef11@users.noreply.github.com> --- packages/web/src/content/docs/ar/zen.mdx | 4 ++-- packages/web/src/content/docs/bs/zen.mdx | 4 ++-- packages/web/src/content/docs/da/zen.mdx | 4 ++-- packages/web/src/content/docs/de/zen.mdx | 4 ++-- packages/web/src/content/docs/es/zen.mdx | 4 ++-- packages/web/src/content/docs/fr/zen.mdx | 4 ++-- packages/web/src/content/docs/it/zen.mdx | 6 +++--- packages/web/src/content/docs/ja/zen.mdx | 4 ++-- packages/web/src/content/docs/ko/zen.mdx | 4 ++-- packages/web/src/content/docs/nb/zen.mdx | 4 ++-- packages/web/src/content/docs/pl/zen.mdx | 4 ++-- packages/web/src/content/docs/pt-br/zen.mdx | 4 ++-- packages/web/src/content/docs/ru/zen.mdx | 4 ++-- packages/web/src/content/docs/th/zen.mdx | 4 ++-- packages/web/src/content/docs/tr/zen.mdx | 4 ++-- packages/web/src/content/docs/zen.mdx | 4 ++-- packages/web/src/content/docs/zh-cn/zen.mdx | 4 ++-- packages/web/src/content/docs/zh-tw/zen.mdx | 4 ++-- 18 files changed, 37 insertions(+), 37 deletions(-) diff --git a/packages/web/src/content/docs/ar/zen.mdx b/packages/web/src/content/docs/ar/zen.mdx index 45b59015dcce..c4e7e8dd92a4 100644 --- a/packages/web/src/content/docs/ar/zen.mdx +++ b/packages/web/src/content/docs/ar/zen.mdx @@ -188,8 +188,8 @@ https://opencode.ai/zen/v1/models | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/bs/zen.mdx b/packages/web/src/content/docs/bs/zen.mdx index 0ad34d116922..0b99b4a1c650 100644 --- a/packages/web/src/content/docs/bs/zen.mdx +++ b/packages/web/src/content/docs/bs/zen.mdx @@ -195,8 +195,8 @@ Podržavamo pay-as-you-go model. Ispod su cijene **po 1M tokena**. | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/da/zen.mdx b/packages/web/src/content/docs/da/zen.mdx index a5403b9cf99f..7ff136aaadf0 100644 --- a/packages/web/src/content/docs/da/zen.mdx +++ b/packages/web/src/content/docs/da/zen.mdx @@ -195,8 +195,8 @@ Vi understøtter en pay-as-you-go-model. Nedenfor er priserne **pr. 1M tokens**. | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/de/zen.mdx b/packages/web/src/content/docs/de/zen.mdx index 59e6d4e77421..4084fa9cec6b 100644 --- a/packages/web/src/content/docs/de/zen.mdx +++ b/packages/web/src/content/docs/de/zen.mdx @@ -184,8 +184,8 @@ Wir unterstützen ein Pay-as-you-go-Modell. Unten findest du die Preise **pro 1M | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/es/zen.mdx b/packages/web/src/content/docs/es/zen.mdx index bcc62c0f48b0..4fbd7048a411 100644 --- a/packages/web/src/content/docs/es/zen.mdx +++ b/packages/web/src/content/docs/es/zen.mdx @@ -195,8 +195,8 @@ Admitimos un modelo de pago por uso. A continuación se muestran los precios **p | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/fr/zen.mdx b/packages/web/src/content/docs/fr/zen.mdx index 77458714d337..f16a748c1d3d 100644 --- a/packages/web/src/content/docs/fr/zen.mdx +++ b/packages/web/src/content/docs/fr/zen.mdx @@ -184,8 +184,8 @@ Nous prenons en charge un modèle de paiement à l'utilisation. Vous trouverez c | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/it/zen.mdx b/packages/web/src/content/docs/it/zen.mdx index 12d9d83ccba2..917bf3a3075f 100644 --- a/packages/web/src/content/docs/it/zen.mdx +++ b/packages/web/src/content/docs/it/zen.mdx @@ -195,8 +195,8 @@ Supportiamo un modello pay-as-you-go. Qui sotto trovi i prezzi **per 1M token**. | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | @@ -221,7 +221,7 @@ Supportiamo un modello pay-as-you-go. Qui sotto trovi i prezzi **per 1M token**. | GPT 5 Codex | $1.07 | $8.50 | $0.107 | - | | GPT 5 Nano | $0.05 | $0.40 | $0.005 | - | -**GPT 5.6 Sol:** I prezzi mostrati includono uno sconto del 50% fino al 18 settembre 2026. +**GPT 5.6 Sol:** I prezzi mostrati includono uno sconto del 50% fino al 18 septembre 2026. **DeepSeek V4 Flash / Pro:** Gli orari Peak sono 01:00-04:00 e 06:00-10:00 UTC; tutti gli altri orari sono Off-Peak. [Scopri di più](https://api-docs.deepseek.com/quick_start/pricing/). diff --git a/packages/web/src/content/docs/ja/zen.mdx b/packages/web/src/content/docs/ja/zen.mdx index 4dac2ad5cd3d..601509dcd367 100644 --- a/packages/web/src/content/docs/ja/zen.mdx +++ b/packages/web/src/content/docs/ja/zen.mdx @@ -184,8 +184,8 @@ https://opencode.ai/zen/v1/models | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/ko/zen.mdx b/packages/web/src/content/docs/ko/zen.mdx index c6bdf77fbcfe..58a646f01247 100644 --- a/packages/web/src/content/docs/ko/zen.mdx +++ b/packages/web/src/content/docs/ko/zen.mdx @@ -184,8 +184,8 @@ https://opencode.ai/zen/v1/models | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/nb/zen.mdx b/packages/web/src/content/docs/nb/zen.mdx index 0af4b1f656d8..0c98f3dc5fbf 100644 --- a/packages/web/src/content/docs/nb/zen.mdx +++ b/packages/web/src/content/docs/nb/zen.mdx @@ -195,8 +195,8 @@ Vi støtter en pay-as-you-go-modell. Nedenfor er prisene **per 1M tokens**. | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/pl/zen.mdx b/packages/web/src/content/docs/pl/zen.mdx index 6df0a85829d4..b73fe5bd5bd2 100644 --- a/packages/web/src/content/docs/pl/zen.mdx +++ b/packages/web/src/content/docs/pl/zen.mdx @@ -195,8 +195,8 @@ Obsługujemy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów* | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/pt-br/zen.mdx b/packages/web/src/content/docs/pt-br/zen.mdx index 855d07725247..6fb7331b5398 100644 --- a/packages/web/src/content/docs/pt-br/zen.mdx +++ b/packages/web/src/content/docs/pt-br/zen.mdx @@ -184,8 +184,8 @@ Oferecemos um modelo pay-as-you-go. Abaixo estão os preços **por 1M tokens**. | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/ru/zen.mdx b/packages/web/src/content/docs/ru/zen.mdx index 07c06be9c1cf..cd3c646d111b 100644 --- a/packages/web/src/content/docs/ru/zen.mdx +++ b/packages/web/src/content/docs/ru/zen.mdx @@ -195,8 +195,8 @@ https://opencode.ai/zen/v1/models | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/th/zen.mdx b/packages/web/src/content/docs/th/zen.mdx index 88e940582bd4..33d19cdd7d81 100644 --- a/packages/web/src/content/docs/th/zen.mdx +++ b/packages/web/src/content/docs/th/zen.mdx @@ -186,8 +186,8 @@ https://opencode.ai/zen/v1/models | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/tr/zen.mdx b/packages/web/src/content/docs/tr/zen.mdx index 2bdd7809ae74..15d592d5c9c7 100644 --- a/packages/web/src/content/docs/tr/zen.mdx +++ b/packages/web/src/content/docs/tr/zen.mdx @@ -184,8 +184,8 @@ Kullandıkça öde modelini destekliyoruz. Aşağıda **1M token başına** fiya | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx index 1b202bfe3322..83ae9160385a 100644 --- a/packages/web/src/content/docs/zen.mdx +++ b/packages/web/src/content/docs/zen.mdx @@ -195,8 +195,8 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**. | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/zh-cn/zen.mdx b/packages/web/src/content/docs/zh-cn/zen.mdx index f811b7f0e190..7aa69ff3e865 100644 --- a/packages/web/src/content/docs/zh-cn/zen.mdx +++ b/packages/web/src/content/docs/zh-cn/zen.mdx @@ -184,8 +184,8 @@ https://opencode.ai/zen/v1/models | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | diff --git a/packages/web/src/content/docs/zh-tw/zen.mdx b/packages/web/src/content/docs/zh-tw/zen.mdx index 174260632d69..7e50d05cfd87 100644 --- a/packages/web/src/content/docs/zh-tw/zen.mdx +++ b/packages/web/src/content/docs/zh-tw/zen.mdx @@ -189,8 +189,8 @@ https://opencode.ai/zen/v1/models | Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $0.60 | - | | Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | | Muse Spark 1.2 | $1.25 | $4.25 | $0.15 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Sol (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | +| GPT 5.6 Sol (≤ 272K tokens) | $2.00 | $10.00 | $0.20 | $2.50 | +| GPT 5.6 Sol (> 272K tokens) | $4.00 | $15.00 | $0.40 | $5.00 | | GPT 5.6 Terra (≤ 272K tokens) | $2.00 | $12.00 | $0.20 | $2.50 | | GPT 5.6 Terra (> 272K tokens) | $4.00 | $18.00 | $0.40 | $5.00 | | GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | From e2ec62d07327ba0632ece00f6dde705f6f77dead Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 23:39:17 +0200 Subject: [PATCH 3/8] fix: bump Amazon Bedrock provider (#43909) Co-authored-by: neriousy <34747899+neriousy@users.noreply.github.com> --- bun.lock | 16 +++++++++------- packages/core/package.json | 2 +- packages/opencode/package.json | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/bun.lock b/bun.lock index d73961bfd1e6..edc7eb6d7f34 100644 --- a/bun.lock +++ b/bun.lock @@ -293,7 +293,7 @@ }, "dependencies": { "@ai-sdk/alibaba": "1.0.17", - "@ai-sdk/amazon-bedrock": "4.0.112", + "@ai-sdk/amazon-bedrock": "4.0.158", "@ai-sdk/anthropic": "3.0.82", "@ai-sdk/azure": "3.0.88", "@ai-sdk/cerebras": "2.0.41", @@ -568,7 +568,7 @@ "@actions/github": "6.0.1", "@agentclientprotocol/sdk": "0.21.0", "@ai-sdk/alibaba": "1.0.17", - "@ai-sdk/amazon-bedrock": "4.0.112", + "@ai-sdk/amazon-bedrock": "4.0.158", "@ai-sdk/anthropic": "3.0.82", "@ai-sdk/azure": "3.0.88", "@ai-sdk/cerebras": "2.0.60", @@ -1173,7 +1173,7 @@ "@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.112", "", { "dependencies": { "@ai-sdk/anthropic": "3.0.81", "@ai-sdk/openai": "3.0.67", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@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-PsSh7a6qW+3kQXPs1kD4wDwuZby0t1PIaB6j/1aMKmPFJ5LxcIcULLMF/bjITLt5o/8lc0t6TXIwG0zlhH7uZw=="], + "@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/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=="], @@ -5641,13 +5641,13 @@ "@ai-sdk/alibaba/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="], - "@ai-sdk/amazon-bedrock/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.81", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-B1JDd9Ugq9R5AgIaW3674lhGCMMYJcPUxnrZh8fzbGojgg4QvHFRv6eZahGQAUsmGHbcf74G9bdSBDLWQGY2GA=="], + "@ai-sdk/amazon-bedrock/@ai-sdk/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.67", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oAiGC9eWG7IgtdsdS74bOCnAAHarAfTJhWN9x5INwnWPekL802AvF+0I5DvLzIF1MIRmNw4N8mPSL/GUVbX9Mw=="], + "@ai-sdk/amazon-bedrock/@ai-sdk/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/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="], + "@ai-sdk/amazon-bedrock/@ai-sdk/provider": ["@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.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/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/@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=="], @@ -6589,6 +6589,8 @@ "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils/undici": ["undici@6.28.0", "", {}, "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA=="], + "@ai-sdk/anthropic/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@ai-sdk/azure/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], diff --git a/packages/core/package.json b/packages/core/package.json index 941da7574d72..019f4b52a0f5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -62,7 +62,7 @@ }, "dependencies": { "@ai-sdk/alibaba": "1.0.17", - "@ai-sdk/amazon-bedrock": "4.0.112", + "@ai-sdk/amazon-bedrock": "4.0.158", "@ai-sdk/anthropic": "3.0.82", "@ai-sdk/azure": "3.0.88", "@ai-sdk/cerebras": "2.0.41", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index cd7f2a591117..be6f25f89ac8 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -56,7 +56,7 @@ "@actions/github": "6.0.1", "@agentclientprotocol/sdk": "0.21.0", "@ai-sdk/alibaba": "1.0.17", - "@ai-sdk/amazon-bedrock": "4.0.112", + "@ai-sdk/amazon-bedrock": "4.0.158", "@ai-sdk/anthropic": "3.0.82", "@ai-sdk/azure": "3.0.88", "@ai-sdk/cerebras": "2.0.60", From ff3ef6e3e60da475ba2d6605baa3956d40a390ca Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Fri, 21 Aug 2026 21:54:44 +0000 Subject: [PATCH 4/8] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index 60a76de0a592..acc1a09e0aaa 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-yQ8EIxxYkzlEWIMY/UiIR+7lbGBuizsoehMPZzFA65Y=", - "aarch64-linux": "sha256-JF9VVgnl5QUZ430fqb5Qu8y0kchYJ00LO3FbYcd0lBM=", - "aarch64-darwin": "sha256-f3Tu6eu463NWcHgr7dupfD/zUTh26bJ6N2vVXuEyi6c=", - "x86_64-darwin": "sha256-miv9Sv4KdhD0UIi2O5LVS1wQOfq29IV+9S+BvIzAvgo=" + "x86_64-linux": "sha256-Be1I6OG6UitofhcGu2BeNzevmoQXc4Or5r/NPzwtft4=", + "aarch64-linux": "sha256-O+d+26CQIjZ08Rn8Qm3IytdDqIMbPdhzaGOZeUKAvIU=", + "aarch64-darwin": "sha256-ObS50y/oy6fM9wSGUL/wx6O0+fTWHC04mXJNd7w/2Z0=", + "x86_64-darwin": "sha256-eoR7ZSyH62Fq2ZaW2b2QqU2FC97rYxTMeEe+djT0nto=" } } From 34a83b27c3f858412ca75ffd5c42f3c3dd22cb40 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 21 Aug 2026 17:13:13 -0500 Subject: [PATCH 5/8] fix(stats): improve chart tooltip truncation --- packages/stats/app/src/routes/[lab]/[model].tsx | 3 ++- packages/stats/app/src/routes/[lab]/index.tsx | 6 ++++-- packages/stats/app/src/routes/index.css | 11 +++++++++-- packages/stats/app/src/routes/index.tsx | 4 ++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/stats/app/src/routes/[lab]/[model].tsx b/packages/stats/app/src/routes/[lab]/[model].tsx index d7c0e3042167..ad931aab1c23 100644 --- a/packages/stats/app/src/routes/[lab]/[model].tsx +++ b/packages/stats/app/src/routes/[lab]/[model].tsx @@ -812,7 +812,8 @@ function ModelTrendSection(props: {

- {props.rowLabel} + + {props.rowLabel} {props.formatValue(props.value(active.point))}

diff --git a/packages/stats/app/src/routes/[lab]/index.tsx b/packages/stats/app/src/routes/[lab]/index.tsx index 4eddf75ef90f..f79f5c21f41f 100644 --- a/packages/stats/app/src/routes/[lab]/index.tsx +++ b/packages/stats/app/src/routes/[lab]/index.tsx @@ -473,13 +473,15 @@ function LabUsageSection(props: { lab: ModelCatalogLab; data: StatsLabData | nul

- {i18n.t("lab.dailyTokens")} + + {i18n.t("lab.dailyTokens")} {formatTokens(active.point.tokens)}

- {i18n.t("model.uniqueUsers")} + + {i18n.t("model.uniqueUsers")} {formatUsers(active.point.users)}

diff --git a/packages/stats/app/src/routes/index.css b/packages/stats/app/src/routes/index.css index b3f25eff01dc..edbdd048311a 100644 --- a/packages/stats/app/src/routes/index.css +++ b/packages/stats/app/src/routes/index.css @@ -1590,6 +1590,13 @@ body { white-space: nowrap; } +[data-page="stats"] [data-component="chart-tooltip"] [data-slot="tooltip-name"] { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + [data-page="stats"] [data-component="chart-tooltip"] [data-slot="tooltip-divider"] { height: 1px; margin: 4px -16px 2px; @@ -1677,7 +1684,7 @@ body { [data-page="stats"] :is([data-section="top-models"], [data-section="unique-users"]) [data-component="chart-tooltip"] p { grid-template-columns: minmax(0, 1fr) auto; - gap: 4px; + gap: 1ch; height: 16px; margin: 4px 0 0; padding: 0 8px; @@ -4723,7 +4730,7 @@ body { [data-page="stats"] [data-component="model-usage-chart"] [data-component="chart-tooltip"] p { grid-template-columns: minmax(0, 1fr) auto; - gap: 4px; + gap: 1ch; height: 20px; margin: 8px 0; padding: 0 8px; diff --git a/packages/stats/app/src/routes/index.tsx b/packages/stats/app/src/routes/index.tsx index 398f53f71861..f984cb7397ce 100644 --- a/packages/stats/app/src/routes/index.tsx +++ b/packages/stats/app/src/routes/index.tsx @@ -568,8 +568,8 @@ function TopModelsChart(props: { style={{ background: getRankColor(item.segment.model, item.index, segmentOrder(), usageColors), }} - />{" "} - {item.segment.model} + /> + {item.segment.model} {formatUsageChartValue(item.segment.value, metric())}

From 3a4c253969870e42d166fe6754133e848acbd81b Mon Sep 17 00:00:00 2001 From: joelstucki-taulia Date: Fri, 21 Aug 2026 16:19:33 -0600 Subject: [PATCH 6/8] fix(provider): guard textVerbosity injection for @ai-sdk/openai-compatible providers (#43915) Co-authored-by: Joel Stucki --- packages/opencode/src/provider/transform.ts | 6 +++--- packages/opencode/test/provider/transform.test.ts | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index b388297aee80..0667fc2eb098 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -1303,13 +1303,13 @@ export function options(input: { } } - // Only set textVerbosity for non-chat gpt-5.x models - // Chat models (e.g. gpt-5.2-chat-latest) only support "medium" verbosity + // Generic OpenAI-compatible APIs do not necessarily support OpenAI's verbosity parameter. + // Only enable the default for integrations known to implement it. if ( input.model.api.id.includes("gpt-5.") && !input.model.api.id.includes("codex") && !input.model.api.id.includes("-chat") && - input.model.providerID !== "azure" + (input.model.api.npm === "@ai-sdk/openai" || input.model.api.npm === "@ai-sdk/amazon-bedrock/mantle") ) { result["textVerbosity"] = "low" } diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 77aa38ad73a7..97f0de281483 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -523,6 +523,7 @@ describe("ProviderTransform.options - gpt-5 textVerbosity", () => { expect(result.reasoningEffort).toBe("medium") expect(result.reasoningSummary).toBeUndefined() expect(result.include).toBeUndefined() + expect(result.textVerbosity).toBeUndefined() }) test("azure chat completions omit Responses-only reasoning options after variants merge", async () => { From e00890c67261a435cee6409366a68999a93393fd Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Fri, 21 Aug 2026 20:25:56 -0400 Subject: [PATCH 7/8] fix: resolve console device URLs (#44029) --- packages/core/src/plugin/provider/opencode.ts | 11 +++- .../test/plugin/provider-opencode.test.ts | 62 ++++++++++++++++++- packages/opencode/src/account/account.ts | 10 ++- .../opencode/test/account/service.test.ts | 35 ++++++++--- 4 files changed, 108 insertions(+), 10 deletions(-) diff --git a/packages/core/src/plugin/provider/opencode.ts b/packages/core/src/plugin/provider/opencode.ts index 8e1cc1a0a071..7bd78cae415d 100644 --- a/packages/core/src/plugin/provider/opencode.ts +++ b/packages/core/src/plugin/provider/opencode.ts @@ -45,9 +45,18 @@ function oauth(http: HttpClient.HttpClient) { authorize: () => Effect.gen(function* () { const device = yield* post(http, `${defaultServer}/auth/device/code`, { client_id: clientID }, Device) + const verification = yield* Effect.try({ + try: () => { + const url = new URL(device.verification_uri_complete, `${defaultServer}/`) + if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error("expected HTTP(S)") + return url + }, + catch: (cause) => + new Error(`Invalid device verification URL: ${cause instanceof Error ? cause.message : String(cause)}`), + }) return { mode: "auto" as const, - url: `${defaultServer}${device.verification_uri_complete}`, + url: verification.href, instructions: `Enter code: ${device.user_code}`, callback: poll(http, defaultServer, device.device_code, Duration.seconds(device.interval)), } diff --git a/packages/core/test/plugin/provider-opencode.test.ts b/packages/core/test/plugin/provider-opencode.test.ts index 20af84d02f5c..e1f8bdd6ec11 100644 --- a/packages/core/test/plugin/provider-opencode.test.ts +++ b/packages/core/test/plugin/provider-opencode.test.ts @@ -1,5 +1,6 @@ import { describe, expect } from "bun:test" import { Effect } from "effect" +import { HttpClient, HttpClientResponse } from "effect/unstable/http" import { Catalog } from "@opencode-ai/core/catalog" import { Credential } from "@opencode-ai/core/credential" import { EventV2 } from "@opencode-ai/core/event" @@ -14,14 +15,16 @@ import { PluginTestLayer } from "./fixture" const it = testEffect(PluginTestLayer) -const addPlugin = Effect.fn(function* () { +const addPlugin = Effect.fn(function* (http?: HttpClient.HttpClient) { const plugin = yield* PluginV2.Service const host = yield* PluginHost.make(plugin) const events = yield* EventV2.Service const integration = yield* Integration.Service + const client = yield* HttpClient.HttpClient yield* OpencodePlugin.effect(host).pipe( Effect.provideService(EventV2.Service, events), Effect.provideService(Integration.Service, integration), + Effect.provideService(HttpClient.HttpClient, http ?? client), ) }) @@ -82,6 +85,63 @@ describe("OpencodePlugin", () => { }), ) + it.effect("resolves origin-rooted device verification URLs", () => + Effect.gen(function* () { + const http = HttpClient.make((request) => + Effect.succeed( + HttpClientResponse.fromWeb( + request, + Response.json({ + device_code: "device", + user_code: "user", + verification_uri_complete: "/console/device?user_code=user&client_id=opencode-cli", + expires_in: 60, + interval: 60, + }), + ), + ), + ) + yield* addPlugin(http) + const integration = yield* Integration.Service + const attempt = yield* integration.connection.oauth({ + integrationID: Integration.ID.make("opencode"), + methodID: Integration.MethodID.make("device"), + inputs: {}, + }) + expect(attempt.url).toBe("https://opencode.ai/console/device?user_code=user&client_id=opencode-cli") + }), + ) + + it.effect("rejects malformed device verification URLs", () => + Effect.gen(function* () { + const http = HttpClient.make((request) => + Effect.succeed( + HttpClientResponse.fromWeb( + request, + Response.json({ + device_code: "device", + user_code: "user", + verification_uri_complete: "http://[::1", + expires_in: 60, + interval: 60, + }), + ), + ), + ) + yield* addPlugin(http) + const integration = yield* Integration.Service + const error = yield* integration.connection + .oauth({ + integrationID: Integration.ID.make("opencode"), + methodID: Integration.MethodID.make("device"), + inputs: {}, + }) + .pipe(Effect.flip) + expect(error).toBeInstanceOf(Integration.AuthorizationError) + expect(String(error.cause)).toContain("Invalid device verification URL") + }), + ) + it.live("loads providers and models from the connected OpenCode server", () => Effect.acquireUseRelease( Effect.sync(() => { diff --git a/packages/opencode/src/account/account.ts b/packages/opencode/src/account/account.ts index 4b49d2a74890..fb21f878f84b 100644 --- a/packages/opencode/src/account/account.ts +++ b/packages/opencode/src/account/account.ts @@ -396,10 +396,18 @@ const layer: Layer.Layer { + const url = new URL(parsed.verification_uri_complete, `${normalizedServer}/`) + if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error("expected HTTP(S)") + return url.href + }, + catch: (cause) => new AccountServiceError({ message: "Invalid device verification URL", cause }), + }) return new Login({ code: parsed.device_code, user: parsed.user_code, - url: `${normalizedServer}${parsed.verification_uri_complete}`, + url: verification, server: normalizedServer, expiry: parsed.expires_in, interval: parsed.interval, diff --git a/packages/opencode/test/account/service.test.ts b/packages/opencode/test/account/service.test.ts index 672d54971623..802e91233a0f 100644 --- a/packages/opencode/test/account/service.test.ts +++ b/packages/opencode/test/account/service.test.ts @@ -10,6 +10,7 @@ import { Account } from "../../src/account/account" import { AccessToken, AccountID, + AccountServiceError, AccountTransportError, DeviceCode, Login, @@ -71,18 +72,18 @@ const deviceTokenClient = (body: unknown, status = 400) => const poll = (body: unknown, status = 400) => Account.Service.use((s) => s.poll(login())).pipe(Effect.provide(live(deviceTokenClient(body, status)))) -it.live("login normalizes trailing slashes in the provided server URL", () => +it.live("login resolves origin-rooted verification URLs from servers with base paths", () => Effect.gen(function* () { const seen: Array = [] const client = HttpClient.make((req) => Effect.gen(function* () { seen.push(`${req.method} ${req.url}`) - if (req.url === "https://one.example.com/auth/device/code") { + if (req.url === "https://one.example.com/console/auth/device/code") { return json(req, { device_code: "device-code", user_code: "user-code", - verification_uri_complete: "/device?user_code=user-code", + verification_uri_complete: "/console/device?user_code=user-code", expires_in: 600, interval: 5, }) @@ -92,11 +93,31 @@ it.live("login normalizes trailing slashes in the provided server URL", () => }), ) - const result = yield* Account.use.login("https://one.example.com/").pipe(Effect.provide(live(client))) + const result = yield* Account.use.login("https://one.example.com/console/").pipe(Effect.provide(live(client))) - expect(seen).toEqual(["POST https://one.example.com/auth/device/code"]) - expect(result.server).toBe("https://one.example.com") - expect(result.url).toBe("https://one.example.com/device?user_code=user-code") + expect(seen).toEqual(["POST https://one.example.com/console/auth/device/code"]) + expect(result.server).toBe("https://one.example.com/console") + expect(result.url).toBe("https://one.example.com/console/device?user_code=user-code") + }), +) + +it.live("login rejects malformed device verification URLs", () => + Effect.gen(function* () { + const client = HttpClient.make((req) => + Effect.succeed( + json(req, { + device_code: "device-code", + user_code: "user-code", + verification_uri_complete: "http://[::1", + expires_in: 600, + interval: 5, + }), + ), + ) + + const error = yield* Effect.flip(Account.use.login("https://one.example.com").pipe(Effect.provide(live(client)))) + expect(error).toBeInstanceOf(AccountServiceError) + if (error instanceof AccountServiceError) expect(error.message).toBe("Invalid device verification URL") }), ) From 3a31c4ea801915c0b050df4b3842997ea62b6e93 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 22 Aug 2026 20:50:02 +0800 Subject: [PATCH 8/8] fix(app): keep model provider headers visible (#44115) --- packages/app/src/components/dialog-select-model.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/dialog-select-model.tsx b/packages/app/src/components/dialog-select-model.tsx index 9066f72434e5..587a36a66601 100644 --- a/packages/app/src/components/dialog-select-model.tsx +++ b/packages/app/src/components/dialog-select-model.tsx @@ -450,7 +450,7 @@ function ModelSelectorPopoverV2View(props: { {(group) => ( - + {group.items[0].provider.name}