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}