diff --git a/.github/workflows/docs-lint.yml b/.github/workflows/docs-lint.yml
new file mode 100644
index 000000000000..df7f1665edf3
--- /dev/null
+++ b/.github/workflows/docs-lint.yml
@@ -0,0 +1,43 @@
+name: docs-lint
+
+# Pattern J: docs/specs-only changes get a light lint lane instead of full CI.
+on:
+ pull_request:
+ paths:
+ - "specs/**"
+ - "docs/**"
+ - "**/*.md"
+ - "**/*.mdx"
+ - "!packages/guardrails/**"
+ - "!.github/workflows/**"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ docs-lint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - name: Lint markdown / specs presence
+ run: |
+ set -euo pipefail
+ mapfile -t files < <(git ls-files 'specs/**/*.md' 'docs/**/*.md' '*.md' ':!:packages/guardrails/**' ':!:**/node_modules/**' | head -200)
+ if [ "${#files[@]}" -eq 0 ]; then
+ echo "No docs files to lint"
+ exit 0
+ fi
+ empty=0
+ for f in "${files[@]}"; do
+ if [ ! -s "$f" ]; then
+ echo "::error::empty docs file: $f"
+ empty=1
+ fi
+ done
+ if [ "$empty" -ne 0 ]; then
+ exit 1
+ fi
+ echo "docs-lint ok (${#files[@]} files sampled)"
diff --git a/.github/workflows/nix-eval.yml b/.github/workflows/nix-eval.yml
index e0c0f75cfa08..49ef18aeb66c 100644
--- a/.github/workflows/nix-eval.yml
+++ b/.github/workflows/nix-eval.yml
@@ -3,8 +3,20 @@ name: nix-eval
on:
push:
branches: [dev]
+ # Pattern J: docs/specs-only PRs skip nix-eval; guardrails still triggers.
pull_request:
branches: [dev]
+ paths:
+ - "**"
+ - "!specs/**"
+ - "!docs/**"
+ - "!**/*.md"
+ - "!**/*.mdx"
+ - "packages/guardrails/**"
+ - ".github/workflows/**"
+ - "flake.nix"
+ - "flake.lock"
+ - "nix/**"
workflow_dispatch:
concurrency:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 97a20fa26520..6e42b0da3c8d 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -4,7 +4,16 @@ on:
push:
branches:
- dev
+ # Pattern J: skip full unit/e2e for docs-only PRs; guardrails changes still match.
pull_request:
+ paths:
+ - "**"
+ - "!specs/**"
+ - "!docs/**"
+ - "!**/*.md"
+ - "!**/*.mdx"
+ - "packages/guardrails/**"
+ - ".github/workflows/**"
workflow_dispatch:
concurrency:
diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml
index b799323355be..0a92086f05b9 100644
--- a/.github/workflows/typecheck.yml
+++ b/.github/workflows/typecheck.yml
@@ -3,8 +3,17 @@ name: typecheck
on:
push:
branches: [dev]
+ # Pattern J: docs/specs-only PRs skip typecheck; guardrails still triggers.
pull_request:
branches: [dev]
+ paths:
+ - "**"
+ - "!specs/**"
+ - "!docs/**"
+ - "!**/*.md"
+ - "!**/*.mdx"
+ - "packages/guardrails/**"
+ - ".github/workflows/**"
workflow_dispatch:
jobs:
diff --git a/packages/app/e2e/regression/project-picker-recent-search.spec.ts b/packages/app/e2e/regression/project-picker-recent-search.spec.ts
new file mode 100644
index 000000000000..2cdb0b4a03b4
--- /dev/null
+++ b/packages/app/e2e/regression/project-picker-recent-search.spec.ts
@@ -0,0 +1,60 @@
+import { expect, test } from "@playwright/test"
+import type { Page } from "@playwright/test"
+import { fixture, pageMessages } from "../smoke/session-timeline.fixture"
+import { mockOpenCodeServer } from "../utils/mock-server"
+import { expectAppVisible } from "../utils/waits"
+
+const NAMES = ["alpha-service", "bravo-web", "charlie-api", "delta-tools", "echo-infra", "foxtrot-docs"]
+const worktrees = NAMES.map((name) => `/opencode-demo/${name}`)
+
+// The sixth project sits outside the five-item recent cap, so it is only reachable if the
+// dialog hands every recent project to the list filter instead of a pre-truncated slice.
+const OUTSIDE_CAP = "foxtrot-docs"
+
+// Dialog rows carry data-directory-path; the sidebar project list does not, so this
+// scopes assertions to the picker instead of matching the sidebar entry of the same name.
+const rows = (page: Page) => page.locator("[data-directory-path]")
+const row = (page: Page, name: string) => page.locator(`[data-directory-path*="${name}"]`)
+
+async function openProjectDialog(page: Page) {
+ await mockOpenCodeServer(page, {
+ sessions: fixture.sessions,
+ provider: fixture.provider,
+ directory: fixture.directory,
+ project: fixture.project,
+ pageMessages,
+ fileList: () => [],
+ findFiles: () => [],
+ })
+ await page.addInitScript((dirs) => {
+ localStorage.setItem(
+ "opencode.global.dat:server",
+ JSON.stringify({
+ projects: { local: dirs.map((worktree: string) => ({ worktree, expanded: false })) },
+ lastProject: {},
+ }),
+ )
+ }, worktrees)
+ await page.goto("/")
+ const add = page.getByRole("button", { name: "Add project" }).first()
+ await expectAppVisible(add)
+ await add.click()
+ await expect(rows(page)).toHaveCount(5)
+ return page.getByRole("textbox").last()
+}
+
+test("searches every recent project, not just the five most recent", async ({ page }) => {
+ const search = await openProjectDialog(page)
+ await expect(row(page, OUTSIDE_CAP)).toHaveCount(0)
+
+ await search.fill("foxtrot")
+
+ await expect(row(page, OUTSIDE_CAP)).toHaveCount(1)
+})
+
+test("still caps the idle recent list at five projects", async ({ page }) => {
+ await openProjectDialog(page)
+
+ await expect(row(page, NAMES[4])).toHaveCount(1)
+ await expect(row(page, OUTSIDE_CAP)).toHaveCount(0)
+})
diff --git a/packages/app/src/components/dialog-select-directory.tsx b/packages/app/src/components/dialog-select-directory.tsx
index 96bcedb9db59..fc248d821e29 100644
--- a/packages/app/src/components/dialog-select-directory.tsx
+++ b/packages/app/src/components/dialog-select-directory.tsx
@@ -18,6 +18,8 @@ interface DialogSelectDirectoryProps {
server: ServerConnection.Any
}
+const RECENT_PROJECT_LIMIT = 5
+
type Row = {
absolute: string
search: string
@@ -102,7 +104,6 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
return projects
.map((project, index) => ({ project, at: byProject.get(project.worktree) ?? 0, index }))
.sort((a, b) => b.at - a.at || a.index - b.index)
- .slice(0, 5)
.map(({ project }) => {
const row = toRow(project.worktree, home(), "recent")
const name = project.name || getFilename(project.worktree)
@@ -116,7 +117,10 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
const items = async (value: string) => {
const results = await directories(value)
const directoryRows = results.map((absolute) => toRow(absolute, home(), "folders"))
- return uniqueRows([...recentProjects(), ...directoryRows])
+ // Cap the idle list only. Once a query narrows the results, every project stays searchable.
+ const recent = recentProjects()
+ const visible = value ? recent : recent.slice(0, RECENT_PROJECT_LIMIT)
+ return uniqueRows([...visible, ...directoryRows])
}
function resolve(absolute: string) {
diff --git a/packages/app/src/context/global-sync/bootstrap.test.ts b/packages/app/src/context/global-sync/bootstrap.test.ts
index 71986dd3c40d..a95706a3dbe5 100644
--- a/packages/app/src/context/global-sync/bootstrap.test.ts
+++ b/packages/app/src/context/global-sync/bootstrap.test.ts
@@ -8,6 +8,7 @@ import {
bootstrapDirectory,
loadAgentsQuery,
loadCommands,
+ loadGlobalConfigQuery,
loadPathQuery,
loadProjectsQuery,
loadProvidersQuery,
@@ -76,6 +77,7 @@ function directoryState() {
describe("bootstrapDirectory", () => {
test("uses legacy MCP endpoints while refreshing a v1 directory", async () => {
+ const legacyConfigReads: string[] = []
const mcpReads: string[] = []
const [store, setStore] = directoryState()
@@ -91,7 +93,12 @@ describe("bootstrapDirectory", () => {
},
sdk: {
app: { agents: async () => ({ data: [{ name: "build", mode: "primary" }] }) },
- config: { get: async () => ({ data: {} }) },
+ config: {
+ get: async () => {
+ legacyConfigReads.push("directory")
+ return { data: {} }
+ },
+ },
session: { status: async () => ({ data: {} }) },
vcs: { get: async () => ({ data: undefined }) },
command: {
@@ -134,8 +141,88 @@ describe("bootstrapDirectory", () => {
await new Promise((resolve) => setTimeout(resolve, 80))
expect(store.status).toBe("complete")
+ expect(legacyConfigReads).toEqual(["directory"])
expect(mcpReads.sort()).toEqual(["command", "resource", "status"])
})
+
+ test("skips legacy config while refreshing a v2 directory", async () => {
+ const [store, setStore] = directoryState()
+
+ await bootstrapDirectory({
+ directory: "/project",
+ scope: ServerScope.local,
+ mcp: false,
+ global: {
+ config: {} satisfies Config,
+ path: { state: "", config: "", worktree: "/project", directory: "/project", home: "/home" },
+ project: [{ id: "project", worktree: "/project" } as Project],
+ provider,
+ },
+ sdk: {
+ config: {
+ get: async () => {
+ throw new Error("legacy directory config should not be called")
+ },
+ },
+ } as unknown as OpencodeClient,
+ api,
+ store,
+ setStore,
+ vcsCache: { setStore() {} } as unknown as VcsCache,
+ loadSessions() {},
+ translate: (key) => key,
+ queryClient: new QueryClient(),
+ protocol: Promise.resolve("v2"),
+ })
+
+ expect(store.status).toBe("partial")
+
+ await new Promise((resolve) => setTimeout(resolve, 80))
+
+ expect(store.status).toBe("complete")
+ })
+})
+
+describe("config queries", () => {
+ test("skips legacy global config for v2 servers", async () => {
+ const sdk = {
+ global: {
+ config: {
+ get: async () => {
+ throw new Error("legacy global config should not be called")
+ },
+ },
+ },
+ } as unknown as OpencodeClient
+
+ const result = await new QueryClient().fetchQuery(
+ loadGlobalConfigQuery(ServerScope.local, sdk, Promise.resolve("v2")),
+ )
+
+ expect(result).toEqual({})
+ })
+
+ test("loads legacy global config for v1 servers", async () => {
+ const calls: string[] = []
+ const config = { shell: "zsh" } satisfies Config
+ const sdk = {
+ global: {
+ config: {
+ get: async () => {
+ calls.push("global")
+ return { data: config }
+ },
+ },
+ },
+ } as unknown as OpencodeClient
+
+ const result = await new QueryClient().fetchQuery(
+ loadGlobalConfigQuery(ServerScope.local, sdk, Promise.resolve("v1")),
+ )
+
+ expect(result).toEqual(config)
+ expect(calls).toEqual(["global"])
+ })
})
describe("query keys", () => {
diff --git a/packages/app/src/context/global-sync/bootstrap.ts b/packages/app/src/context/global-sync/bootstrap.ts
index 39221d551fa6..0f3e47381649 100644
--- a/packages/app/src/context/global-sync/bootstrap.ts
+++ b/packages/app/src/context/global-sync/bootstrap.ts
@@ -105,10 +105,13 @@ function showErrors(input: {
})
}
-export const loadGlobalConfigQuery = (scope: ServerScope, sdk: OpencodeClient) =>
+export const loadGlobalConfigQuery = (scope: ServerScope, sdk: OpencodeClient, protocol?: Promise) =>
queryOptions({
queryKey: [scope, "config"],
- queryFn: () => retry(() => sdk.global.config.get().then((x) => x.data!)),
+ queryFn: async () => {
+ if ((await protocol) !== "v1") return {}
+ return retry(() => sdk.global.config.get().then((x) => x.data!))
+ },
})
type ProjectApi = {
@@ -149,7 +152,7 @@ export async function bootstrapGlobal(input: {
queryClient: QueryClient
}) {
const slow = [
- () => input.queryClient.fetchQuery(loadGlobalConfigQuery(input.scope, input.serverSDK)),
+ () => input.queryClient.fetchQuery(loadGlobalConfigQuery(input.scope, input.serverSDK, input.protocol)),
() =>
input.queryClient.fetchQuery(
loadProvidersQuery(input.scope, null, input.serverAPI, input.serverSDK, input.protocol),
@@ -376,7 +379,10 @@ export async function bootstrapDirectory(input: {
.ensureQueryData(loadAgentsQuery(input.scope, input.directory, input.api.agent, input.sdk, input.protocol))
.then((data) => input.setStore("agent", data)),
() =>
- retry(() => input.sdk.config.get().then((x) => input.setStore("config", reconcile(x.data!, { merge: false })))),
+ retry(async () => {
+ if ((await input.protocol) !== "v1") return
+ return input.sdk.config.get().then((x) => input.setStore("config", reconcile(x.data!, { merge: false })))
+ }),
() =>
retry(() =>
(async () => {
diff --git a/packages/app/src/context/server-sync.tsx b/packages/app/src/context/server-sync.tsx
index 196cda84794e..13a0b74bc6f3 100644
--- a/packages/app/src/context/server-sync.tsx
+++ b/packages/app/src/context/server-sync.tsx
@@ -184,7 +184,7 @@ function makeQueryOptionsApi(
protocol: Promise<"v1" | "v2">,
) {
return {
- globalConfig: () => loadGlobalConfigQuery(scope, serverSDK()),
+ globalConfig: () => loadGlobalConfigQuery(scope, serverSDK(), protocol),
projects: () => loadProjectsQuery(scope, serverAPI.project),
providers: (directory: PathKey | null) =>
loadProvidersQuery(scope, directory, serverAPI, directory ? sdkFor(directory) : serverSDK(), protocol),
diff --git a/packages/app/src/pages/session/timeline/rows-current.test.ts b/packages/app/src/pages/session/timeline/rows-current.test.ts
index 32a1d5f57c7a..a5952a5e6633 100644
--- a/packages/app/src/pages/session/timeline/rows-current.test.ts
+++ b/packages/app/src/pages/session/timeline/rows-current.test.ts
@@ -167,4 +167,41 @@ describe("current session timeline rows", () => {
"thinking:msg_2",
])
})
+
+ test("removes a failed assistant error when the turn continues streaming", () => {
+ const source = [
+ { id: "msg_user", type: "user", text: "recover", time: { created: 1 } },
+ {
+ id: "msg_failed",
+ type: "assistant",
+ agent: "build",
+ model: { id: "model", providerID: "provider" },
+ content: [],
+ error: { type: "ProviderError", message: "temporary failure" },
+ time: { created: 2, completed: 3 },
+ },
+ {
+ id: "msg_recovery",
+ type: "assistant",
+ agent: "build",
+ model: { id: "model", providerID: "provider" },
+ content: [{ type: "text", text: "streaming again" }],
+ time: { created: 4 },
+ },
+ ] satisfies SessionMessageInfo[]
+ const normalized = normalizeSessionMessages("ses_1", source)
+ const messages = new Map(normalized.messages.map((message) => [message.id, message]))
+
+ const result = Timeline.constructSessionMessageRows(
+ source,
+ (messageID) => messages.get(messageID),
+ (messageID) => normalized.parts.get(messageID) ?? [],
+ true,
+ "busy",
+ true,
+ normalized.messages.filter((message) => message.role === "user"),
+ )
+
+ expect(result.rows.map((row) => row._tag)).toEqual(["UserMessage", "AssistantPart"])
+ })
})
diff --git a/packages/app/src/pages/session/timeline/rows.ts b/packages/app/src/pages/session/timeline/rows.ts
index 25a5113344eb..879646e86a93 100644
--- a/packages/app/src/pages/session/timeline/rows.ts
+++ b/packages/app/src/pages/session/timeline/rows.ts
@@ -116,7 +116,8 @@ export namespace Timeline {
const compaction = userParts.some((p) => p.type === "compaction")
const interruptedMessageIndex = assistantMessages.findIndex((m) => m.error?.name === "MessageAbortedError")
const interrupted = interruptedMessageIndex !== -1
- const error = assistantMessages.find((m) => m.error && m.error.name !== "MessageAbortedError")?.error
+ const latestError = assistantMessages.at(-1)?.error
+ const error = latestError?.name === "MessageAbortedError" ? undefined : latestError
const assistantPartRefs = assistantMessages.flatMap((message, messageIndex) =>
getMessageParts(message.id)
diff --git a/packages/console/app/src/i18n/ar.ts b/packages/console/app/src/i18n/ar.ts
index 6b84df8e0e8d..dd03a553f5e2 100644
--- a/packages/console/app/src/i18n/ar.ts
+++ b/packages/console/app/src/i18n/ar.ts
@@ -347,6 +347,7 @@ export const dict = {
"go.faq.a5.gptRetention":
"تُنشأ سجلات مراقبة إساءة الاستخدام لكل استخدام لميزات API، ويُحتفظ بها لمدة تصل إلى 30 يومًا.",
"go.faq.a5.learnMore": "اعرف المزيد",
+ "go.faq.a5.deepseekRetention": "تُجدَّد اتفاقية ZDR شهريًا. الاتفاقية الحالية سارية حتى 31 أغسطس 2026.",
"go.faq.a5.beforeExceptions":
"تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"go.faq.a5.exceptionsLink": "الاستثناءات التالية",
diff --git a/packages/console/app/src/i18n/br.ts b/packages/console/app/src/i18n/br.ts
index 10c171d0a8c5..dac06753e955 100644
--- a/packages/console/app/src/i18n/br.ts
+++ b/packages/console/app/src/i18n/br.ts
@@ -354,6 +354,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Logs de monitoramento de abuso são gerados para todo uso de recursos da API e retidos por até 30 dias.",
"go.faq.a5.learnMore": "Saiba mais",
+ "go.faq.a5.deepseekRetention":
+ "O acordo de ZDR é renovado mensalmente. O acordo atual é válido até 31 de agosto de 2026.",
"go.faq.a5.beforeExceptions":
"Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
"go.faq.a5.exceptionsLink": "seguintes exceções",
diff --git a/packages/console/app/src/i18n/da.ts b/packages/console/app/src/i18n/da.ts
index ab204d8aac6f..4e3d230f901b 100644
--- a/packages/console/app/src/i18n/da.ts
+++ b/packages/console/app/src/i18n/da.ts
@@ -351,6 +351,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Logfiler til overvågning af misbrug genereres ved al brug af API-funktioner og opbevares i op til 30 dage.",
"go.faq.a5.learnMore": "Læs mere",
+ "go.faq.a5.deepseekRetention":
+ "ZDR-aftalen fornyes månedligt. Den nuværende aftale er gyldig til og med 31. august 2026.",
"go.faq.a5.beforeExceptions":
"Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de",
diff --git a/packages/console/app/src/i18n/de.ts b/packages/console/app/src/i18n/de.ts
index 9a9f4dcbe181..61184358daa8 100644
--- a/packages/console/app/src/i18n/de.ts
+++ b/packages/console/app/src/i18n/de.ts
@@ -353,6 +353,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Für die Nutzung aller API-Funktionen werden Protokolle zur Missbrauchsüberwachung erstellt und bis zu 30 Tage lang aufbewahrt.",
"go.faq.a5.learnMore": "Mehr erfahren",
+ "go.faq.a5.deepseekRetention":
+ "Die ZDR-Vereinbarung wird monatlich erneuert. Die aktuelle Vereinbarung gilt bis einschließlich 31. August 2026.",
"go.faq.a5.beforeExceptions":
"Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den",
"go.faq.a5.exceptionsLink": "folgenden Ausnahmen",
diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts
index dcb2b4431dcf..813473c36766 100644
--- a/packages/console/app/src/i18n/en.ts
+++ b/packages/console/app/src/i18n/en.ts
@@ -348,6 +348,8 @@ export const dict = {
"ZDR disables important API features that depend on stored data, including the stateful Responses API, Files and Collections, and the Batch API.",
"go.faq.a5.gptRetention":
"Abuse monitoring logs are generated for all API feature usage and retained for up to 30 days.",
+ "go.faq.a5.deepseekRetention":
+ "ZDR agreement is renewed monthly. The current agreement is valid through August 31, 2026.",
"go.faq.a5.learnMore": "Learn more",
"go.faq.a5.beforeExceptions":
diff --git a/packages/console/app/src/i18n/es.ts b/packages/console/app/src/i18n/es.ts
index 506aa629509d..be5c24685cb6 100644
--- a/packages/console/app/src/i18n/es.ts
+++ b/packages/console/app/src/i18n/es.ts
@@ -354,6 +354,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Se generan registros de supervisión de abusos para todo el uso de funciones de la API y se conservan durante un máximo de 30 días.",
"go.faq.a5.learnMore": "Más información",
+ "go.faq.a5.deepseekRetention":
+ "El acuerdo de ZDR se renueva mensualmente. El acuerdo actual es válido hasta el 31 de agosto de 2026.",
"go.faq.a5.beforeExceptions":
"Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las",
"go.faq.a5.exceptionsLink": "siguientes excepciones",
diff --git a/packages/console/app/src/i18n/fr.ts b/packages/console/app/src/i18n/fr.ts
index f0238f2d08e9..37bf2d5eb3e7 100644
--- a/packages/console/app/src/i18n/fr.ts
+++ b/packages/console/app/src/i18n/fr.ts
@@ -355,6 +355,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Des journaux de surveillance des abus sont générés pour toute utilisation des fonctionnalités API et conservés pendant un maximum de 30 jours.",
"go.faq.a5.learnMore": "En savoir plus",
+ "go.faq.a5.deepseekRetention":
+ "L’accord ZDR est renouvelé chaque mois. L’accord actuel est valable jusqu’au 31 août 2026.",
"go.faq.a5.beforeExceptions":
"Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
diff --git a/packages/console/app/src/i18n/it.ts b/packages/console/app/src/i18n/it.ts
index 548d4d479f61..501d0123332d 100644
--- a/packages/console/app/src/i18n/it.ts
+++ b/packages/console/app/src/i18n/it.ts
@@ -350,6 +350,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"I log di monitoraggio degli abusi vengono generati per l'utilizzo di tutte le funzionalità API e conservati per un massimo di 30 giorni.",
"go.faq.a5.learnMore": "Scopri di più",
+ "go.faq.a5.deepseekRetention":
+ "L'accordo ZDR viene rinnovato mensilmente. L'accordo attuale è valido fino al 31 agosto 2026.",
"go.faq.a5.beforeExceptions":
"I modelli Go sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le",
"go.faq.a5.exceptionsLink": "seguenti eccezioni",
diff --git a/packages/console/app/src/i18n/ja.ts b/packages/console/app/src/i18n/ja.ts
index fd4224d59802..e8f8fa566192 100644
--- a/packages/console/app/src/i18n/ja.ts
+++ b/packages/console/app/src/i18n/ja.ts
@@ -349,6 +349,7 @@ export const dict = {
"ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。",
"go.faq.a5.gptRetention": "不正使用監視ログはすべてのAPI機能の使用時に生成され、最大30日間保持されます。",
"go.faq.a5.learnMore": "詳しく見る",
+ "go.faq.a5.deepseekRetention": "ZDR契約は毎月更新されます。現在の契約は2026年8月31日まで有効です。",
"go.faq.a5.beforeExceptions":
"Goのモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(",
"go.faq.a5.exceptionsLink": "以下の例外",
diff --git a/packages/console/app/src/i18n/ko.ts b/packages/console/app/src/i18n/ko.ts
index 9b6a0efbd498..ab7695898562 100644
--- a/packages/console/app/src/i18n/ko.ts
+++ b/packages/console/app/src/i18n/ko.ts
@@ -345,6 +345,7 @@ export const dict = {
"ZDR은 저장된 데이터에 의존하는 중요한 API 기능(상태 저장형 Responses API, Files and Collections, Batch API 포함)을 비활성화합니다.",
"go.faq.a5.gptRetention": "모든 API 기능 사용에 대해 악용 모니터링 로그가 생성되며 최대 30일 동안 보존됩니다.",
"go.faq.a5.learnMore": "자세히 알아보기",
+ "go.faq.a5.deepseekRetention": "ZDR 계약은 매월 갱신됩니다. 현재 계약은 2026년 8월 31일까지 유효합니다.",
"go.faq.a5.beforeExceptions":
"Go 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,",
"go.faq.a5.exceptionsLink": "다음 예외",
diff --git a/packages/console/app/src/i18n/no.ts b/packages/console/app/src/i18n/no.ts
index e3ff8db3cf53..5e7e02503207 100644
--- a/packages/console/app/src/i18n/no.ts
+++ b/packages/console/app/src/i18n/no.ts
@@ -351,6 +351,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Logger for overvåking av misbruk genereres for all bruk av API-funksjoner og oppbevares i opptil 30 dager.",
"go.faq.a5.learnMore": "Les mer",
+ "go.faq.a5.deepseekRetention":
+ "ZDR-avtalen fornyes månedlig. Den gjeldende avtalen er gyldig til og med 31. august 2026.",
"go.faq.a5.beforeExceptions":
"Go-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med",
diff --git a/packages/console/app/src/i18n/pl.ts b/packages/console/app/src/i18n/pl.ts
index 874a90e5b089..2aa536cd828e 100644
--- a/packages/console/app/src/i18n/pl.ts
+++ b/packages/console/app/src/i18n/pl.ts
@@ -352,6 +352,7 @@ export const dict = {
"go.faq.a5.gptRetention":
"Dzienniki monitorowania nadużyć są generowane dla każdego użycia funkcji API i przechowywane przez maksymalnie 30 dni.",
"go.faq.a5.learnMore": "Dowiedz się więcej",
+ "go.faq.a5.deepseekRetention": "Umowa ZDR jest odnawiana co miesiąc. Obecna umowa obowiązuje do 31 sierpnia 2026 r.",
"go.faq.a5.beforeExceptions":
"Modele Go są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli, z",
diff --git a/packages/console/app/src/i18n/ru.ts b/packages/console/app/src/i18n/ru.ts
index 7cafbd687dcd..330713cd19e8 100644
--- a/packages/console/app/src/i18n/ru.ts
+++ b/packages/console/app/src/i18n/ru.ts
@@ -356,6 +356,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Журналы мониторинга злоупотреблений создаются при любом использовании функций API и хранятся до 30 дней.",
"go.faq.a5.learnMore": "Подробнее",
+ "go.faq.a5.deepseekRetention":
+ "Соглашение ZDR продлевается ежемесячно. Текущее соглашение действует до 31 августа 2026 года.",
"go.faq.a5.beforeExceptions":
"Модели Go размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за",
diff --git a/packages/console/app/src/i18n/th.ts b/packages/console/app/src/i18n/th.ts
index 81ad9a9f3771..d3ff91e97af9 100644
--- a/packages/console/app/src/i18n/th.ts
+++ b/packages/console/app/src/i18n/th.ts
@@ -348,6 +348,7 @@ export const dict = {
"go.faq.a5.gptRetention":
"ระบบจะสร้างบันทึกการตรวจสอบการใช้งานในทางที่ผิดสำหรับการใช้งานฟีเจอร์ API ทั้งหมด และเก็บรักษาไว้นานสูงสุด 30 วัน",
"go.faq.a5.learnMore": "ดูข้อมูลเพิ่มเติม",
+ "go.faq.a5.deepseekRetention": "ข้อตกลง ZDR จะต่ออายุทุกเดือน ข้อตกลงปัจจุบันมีผลใช้ถึงวันที่ 31 สิงหาคม 2026",
"go.faq.a5.beforeExceptions":
"โมเดล Go โฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี",
diff --git a/packages/console/app/src/i18n/tr.ts b/packages/console/app/src/i18n/tr.ts
index 701be9a5aeae..5d0d2819dd3c 100644
--- a/packages/console/app/src/i18n/tr.ts
+++ b/packages/console/app/src/i18n/tr.ts
@@ -354,6 +354,8 @@ export const dict = {
"go.faq.a5.gptRetention":
"Tüm API özelliklerinin kullanımı için kötüye kullanım izleme günlükleri oluşturulur ve 30 güne kadar saklanır.",
"go.faq.a5.learnMore": "Daha fazla bilgi",
+ "go.faq.a5.deepseekRetention":
+ "ZDR anlaşması aylık olarak yenilenir. Mevcut anlaşma 31 Ağustos 2026 tarihine kadar geçerlidir.",
"go.faq.a5.beforeExceptions":
"Go modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu",
diff --git a/packages/console/app/src/i18n/uk.ts b/packages/console/app/src/i18n/uk.ts
index 0ee26f5f59c8..48a0dbe7872c 100644
--- a/packages/console/app/src/i18n/uk.ts
+++ b/packages/console/app/src/i18n/uk.ts
@@ -352,6 +352,7 @@ export const dict = {
"go.faq.a5.gptRetention":
"Журнали моніторингу зловживань створюються для всіх випадків використання функцій API та зберігаються до 30 днів.",
"go.faq.a5.learnMore": "Докладніше",
+ "go.faq.a5.deepseekRetention": "Угода ZDR поновлюється щомісяця. Поточна угода дійсна до 31 серпня 2026 року.",
"go.faq.a5.beforeExceptions":
"Моделі Go розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
diff --git a/packages/console/app/src/i18n/zh.ts b/packages/console/app/src/i18n/zh.ts
index d4a59900fc72..78f2081aeb81 100644
--- a/packages/console/app/src/i18n/zh.ts
+++ b/packages/console/app/src/i18n/zh.ts
@@ -333,6 +333,7 @@ export const dict = {
"ZDR 会禁用依赖所存储数据的重要 API 功能,包括有状态的 Responses API、Files and Collections 和 Batch API。",
"go.faq.a5.gptRetention": "所有 API 功能的使用都会生成滥用监控日志,并最多保留 30 天。",
"go.faq.a5.learnMore": "了解更多",
+ "go.faq.a5.deepseekRetention": "ZDR 协议每月续签。当前协议有效期至 2026 年 8 月 31 日。",
"go.faq.a5.beforeExceptions": "Go 模型托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,",
"go.faq.a5.exceptionsLink": "以下例外情况除外",
"go.faq.q6": "我可以充值余额吗?",
diff --git a/packages/console/app/src/i18n/zht.ts b/packages/console/app/src/i18n/zht.ts
index 635ad91d2f62..190a927d3f6e 100644
--- a/packages/console/app/src/i18n/zht.ts
+++ b/packages/console/app/src/i18n/zht.ts
@@ -333,6 +333,7 @@ export const dict = {
"ZDR 會停用依賴儲存資料的重要 API 功能,包括具狀態的 Responses API、Files and Collections 與 Batch API。",
"go.faq.a5.gptRetention": "所有 API 功能的使用都會產生濫用監控日誌,並保留最多 30 天。",
"go.faq.a5.learnMore": "了解更多",
+ "go.faq.a5.deepseekRetention": "ZDR 協議每月續簽。目前的協議有效至 2026 年 8 月 31 日。",
"go.faq.a5.beforeExceptions": "Go 模型託管在美國。供應商遵循零留存政策,不會將你的資料用於模型訓練,但有",
"go.faq.a5.exceptionsLink": "以下例外",
"go.faq.q6": "我可以儲值額度嗎?",
diff --git a/packages/console/app/src/routes/go/index.tsx b/packages/console/app/src/routes/go/index.tsx
index 710650d4dc65..17c78f214d4f 100644
--- a/packages/console/app/src/routes/go/index.tsx
+++ b/packages/console/app/src/routes/go/index.tsx
@@ -32,13 +32,14 @@ const models = [
{ name: "Kimi K2.6", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "MiMo-V2.5-Pro", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "MiMo-V2.5", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
+ { name: "Qwen3.8 Max", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Qwen3.7 Max", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Qwen3.7 Plus", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Qwen3.6 Plus", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "MiniMax M3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "MiniMax M2.7", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "DeepSeek V4 Pro", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
- { name: "DeepSeek V4 Flash", training: "go.faq.a5.used", retention: "go.faq.a5.noAgreement" },
+ { name: "DeepSeek V4 Flash", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Hy3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
] as const
@@ -67,6 +68,7 @@ function LimitsGraph(props: { href: string }) {
const graph = [
{ id: "grok-4.5", name: "Grok 4.5", req: 120, d: "50ms" },
{ id: "kimi-k3", name: "Kimi K3", req: 110, d: "75ms" },
+ { id: "qwen3.8-max", name: "Qwen3.8 Max", req: 160, d: "90ms" },
{ id: "glm-5.2", name: "GLM-5.2", req: 880, d: "100ms" },
{ id: "minimax-m3", name: "MiniMax M3", req: 3200, d: "210ms" },
{ id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", req: 3450, d: "270ms" },
@@ -505,6 +507,9 @@ export default function Home() {
.
+
+ DeepSeek V4 Flash: {i18n.t("go.faq.a5.deepseekRetention")}
+
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 331c13e147c1..da1b053a358f 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
@@ -313,6 +313,7 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
Kimi K2.6
MiniMax M3
MiniMax M2.7
+ Qwen3.8 Max
Qwen3.7 Max
Qwen3.7 Plus
Qwen3.6 Plus
diff --git a/packages/console/app/src/routes/zen/util/provider/google.ts b/packages/console/app/src/routes/zen/util/provider/google.ts
index 404657d443ed..1bc2ce1f210b 100644
--- a/packages/console/app/src/routes/zen/util/provider/google.ts
+++ b/packages/console/app/src/routes/zen/util/provider/google.ts
@@ -65,7 +65,7 @@ export const googleHelper: ProviderHelper = ({ providerModel }) => ({
const cacheReadTokens = usage.cachedContentTokenCount ?? 0
return {
inputTokens: inputTokens - cacheReadTokens,
- outputTokens,
+ outputTokens: outputTokens + reasoningTokens,
reasoningTokens,
cacheReadTokens,
cacheWrite5mTokens: undefined,
diff --git a/packages/guardrails/managed/opencode.json b/packages/guardrails/managed/opencode.json
index 7f556fd221e7..038ebe137fcc 100644
--- a/packages/guardrails/managed/opencode.json
+++ b/packages/guardrails/managed/opencode.json
@@ -213,12 +213,19 @@
"pwd": "allow",
"which *": "allow",
"echo *": "allow",
+ "git worktree list*": "allow",
+ "git merge-base *": "allow",
"cat *": "ask",
+ "git worktree add *": "ask",
+ "git branch -D *": "ask",
+ "git branch -d *": "ask",
"rm -rf *": "deny",
"rm -r *": "deny",
"sudo *": "deny",
"curl * | sh*": "deny",
- "wget * | sh*": "deny"
+ "wget * | sh*": "deny",
+ "git push --force*": "deny",
+ "git push * --force*": "deny"
},
"read": {
"*": "allow",
diff --git a/packages/guardrails/profile/AGENTS.md b/packages/guardrails/profile/AGENTS.md
index bd13224c8d31..a1cad462a3e1 100644
--- a/packages/guardrails/profile/AGENTS.md
+++ b/packages/guardrails/profile/AGENTS.md
@@ -62,6 +62,9 @@
| `/ship` | Merge-ready workflow: verifies CI status and pushes. |
| `/handoff` | Generate a handoff document for cross-session continuity. |
| `/plan` | Analyze requirements, assess risks, and produce a phased implementation plan. |
+| `/plan-light` | Declare the minimal verification path before implementing (anti-patterns C/G). |
+| `/env-check` | Confirm an existing environment is insufficient before creating a new one (D). |
+| `/repo-hygiene` | List stale branches/worktrees and dry-run cleanup candidates (E). |
| `/investigate` | Systematic debugging with root cause analysis — spawns an exploration subagent. |
| `/test` | Run the TDD workflow: RED, GREEN, IMPROVE, then verify coverage. |
| `/delegate` | Route work to parallel subagents or Codex CLI based on task shape. |
diff --git a/packages/guardrails/profile/agents/implement.md b/packages/guardrails/profile/agents/implement.md
index abb5eadada65..43da3a65026a 100644
--- a/packages/guardrails/profile/agents/implement.md
+++ b/packages/guardrails/profile/agents/implement.md
@@ -6,6 +6,12 @@ permission:
plan_enter: allow
bash:
"*": allow
+ "git worktree list*": allow
+ "git merge-base *": allow
+ "git status*": allow
+ "git log*": allow
+ "git worktree add *": ask
+ "git branch -D *": ask
"git checkout -- *": deny
"git merge *": deny
"git push --force*": deny
diff --git a/packages/guardrails/profile/commands/env-check.md b/packages/guardrails/profile/commands/env-check.md
new file mode 100644
index 000000000000..998fcd553790
--- /dev/null
+++ b/packages/guardrails/profile/commands/env-check.md
@@ -0,0 +1,22 @@
+---
+description: Confirm an existing environment is insufficient before creating a new one (anti-pattern D).
+agent: investigate
+---
+
+Treat new environment creation as a last resort.
+
+## Checklist (must answer before provisioning)
+
+1. Which existing environment (local / dev / shared staging) could run this change?
+2. What concrete capability is missing there (not preference)?
+3. Can the gap be closed with config, fixtures, or a one-off script instead of a new env?
+4. If a new env is still required: owner, teardown date, and cost ceiling.
+
+## Block rule
+
+If answers 1–3 show the existing environment is sufficient, **do not** create a new environment.
+Propose the reuse path instead.
+
+## Arguments
+
+$ARGUMENTS
diff --git a/packages/guardrails/profile/commands/plan-light.md b/packages/guardrails/profile/commands/plan-light.md
new file mode 100644
index 000000000000..c3a0f4fa15c1
--- /dev/null
+++ b/packages/guardrails/profile/commands/plan-light.md
@@ -0,0 +1,33 @@
+---
+description: Declare the minimal verification path before implementing (anti-patterns C/G).
+agent: planner
+---
+
+Plan with the smallest verification path that still produces learning.
+
+## Required one-line declaration
+
+Before proposing steps, state exactly one minimal path:
+
+`fake/failing test → local unit → CI (scoped) → PR`
+
+Do not expand this path until the minimal path has failed to catch a real defect.
+
+## Reject heavy-by-default pipelines
+
+If the draft plan includes any of the following without prior evidence of need, rewrite to the minimal path first:
+
+- multi-environment promotion (dev + staging + uat + prod) for a single bounded change
+- multi-layer review gates beyond `/review` once
+- new CI orchestration, custom runners, or parallel matrix expansion
+- "comprehensive" end-to-end suites for a docs-only or single-package change
+
+Respond with:
+
+1. Minimal path (one line)
+2. Why heavier steps are deferred
+3. What evidence would justify adding one heavier step later
+
+## Arguments
+
+$ARGUMENTS
diff --git a/packages/guardrails/profile/commands/repo-hygiene.md b/packages/guardrails/profile/commands/repo-hygiene.md
new file mode 100644
index 000000000000..240567a52803
--- /dev/null
+++ b/packages/guardrails/profile/commands/repo-hygiene.md
@@ -0,0 +1,31 @@
+---
+description: List stale branches/worktrees and dry-run cleanup candidates (anti-pattern E).
+agent: investigate
+---
+
+Inspect repository hygiene. Do not delete anything in this command — dry-run only.
+
+## Collect
+
+Run (read-only):
+
+```bash
+git worktree list
+git branch --merged
+git branch -vv
+```
+
+Optionally: `gh issue list --state open --limit 30`
+
+## Report
+
+1. Worktree count and paths that look abandoned (merged branch, old date, agent prefix)
+2. Local branches already merged into the integration branch
+3. Suggested deletions as a **dry-run list** only
+4. Ask the human/agent for explicit confirmation before any `git worktree remove` / `git branch -D`
+
+Never run destructive cleanup from this command.
+
+## Arguments
+
+$ARGUMENTS
diff --git a/packages/guardrails/profile/opencode.json b/packages/guardrails/profile/opencode.json
index 783e4bad783e..f088c119be0d 100644
--- a/packages/guardrails/profile/opencode.json
+++ b/packages/guardrails/profile/opencode.json
@@ -240,6 +240,12 @@
"which *": "allow",
"echo *": "allow",
"cat *": "allow",
+ "gh pr merge *": "allow",
+ "git worktree list*": "allow",
+ "git merge-base *": "allow",
+ "git worktree add *": "ask",
+ "git branch -D *": "ask",
+ "git branch -d *": "ask",
"rm -rf *": "deny",
"rm -r *": "deny",
"sudo *": "deny",
@@ -247,7 +253,6 @@
"git push --force*": "deny",
"git push * --force*": "deny",
"git reset --hard*": "deny",
- "gh pr merge *": "allow",
"curl * | sh*": "deny",
"wget * | sh*": "deny"
},
diff --git a/packages/guardrails/profile/plugins/ci-change-scope.ts b/packages/guardrails/profile/plugins/ci-change-scope.ts
new file mode 100644
index 000000000000..aeb7940b9299
--- /dev/null
+++ b/packages/guardrails/profile/plugins/ci-change-scope.ts
@@ -0,0 +1,35 @@
+/** Pattern J: classify changed paths into CI intensity tiers (structural path rules). */
+
+export type CiTier = "docs" | "code" | "guardrails"
+
+const DOCS_PREFIXES = ["specs/", "docs/"]
+const DOCS_EXT = [".md", ".mdx"]
+const GUARDRAILS_PREFIX = "packages/guardrails/"
+const WORKFLOW_PREFIX = ".github/workflows/"
+
+export function isDocsPath(file: string) {
+ const normalized = file.replaceAll("\\", "/")
+ if (normalized.startsWith(GUARDRAILS_PREFIX)) return false
+ if (normalized.startsWith(WORKFLOW_PREFIX)) return false
+ if (DOCS_PREFIXES.some((prefix) => normalized.startsWith(prefix))) return true
+ return DOCS_EXT.some((ext) => normalized.endsWith(ext))
+}
+
+export function isGuardrailsPath(file: string) {
+ const normalized = file.replaceAll("\\", "/")
+ return normalized.startsWith(GUARDRAILS_PREFIX) || normalized.startsWith(WORKFLOW_PREFIX)
+}
+
+export function classifyCiTier(files: string[]): CiTier {
+ if (files.some(isGuardrailsPath)) return "guardrails"
+ if (files.length > 0 && files.every(isDocsPath)) return "docs"
+ return "code"
+}
+
+export function shouldRunFullCi(files: string[]) {
+ return classifyCiTier(files) !== "docs"
+}
+
+export function shouldRunDocsLint(files: string[]) {
+ return files.some(isDocsPath) || classifyCiTier(files) === "docs"
+}
diff --git a/packages/guardrails/profile/plugins/guardrail.ts b/packages/guardrails/profile/plugins/guardrail.ts
index 2b6176a3a335..0c95969cfe30 100644
--- a/packages/guardrails/profile/plugins/guardrail.ts
+++ b/packages/guardrails/profile/plugins/guardrail.ts
@@ -2,6 +2,8 @@ import path from "path"
import { createAccessHandlers } from "./guardrail-access"
import { createContext, type GuardrailInput } from "./guardrail-context"
import { createGitHandlers } from "./guardrail-git"
+import { createHygieneHandlers } from "./hygiene-warning"
+import { createRemovalHandlers } from "./removal-guard"
import { ciChecksGreen, flag, git, json, list, num, save, stash, str } from "./guardrail-patterns"
const OPENCODE_IGNORE = ".opencode/"
@@ -49,6 +51,8 @@ export default async function guardrail(input: GuardrailInput, opts?: Record }) => {
@@ -138,6 +142,7 @@ export default async function guardrail(input: GuardrailInput, opts?: Record 0) {
await ctx.seen("auto_init.stacks_detected", { stacks })
@@ -150,6 +155,9 @@ export default async function guardrail(input: GuardrailInput, opts?: Record line.trim())
+ .filter((line) => line.startsWith("worktree ")).length
+}
+
+/** Count local branches whose tip is already an ancestor of the integration tip. */
+export function countStaleBranches(mergedNames: string[], currentBranch: string, protectedNames: string[]) {
+ const protectedSet = new Set(["main", "master", "develop", "dev", "HEAD", ...protectedNames])
+ return mergedNames
+ .map((name) => name.replace(/^\*\s+/, "").trim())
+ .filter(Boolean)
+ .filter((name) => name !== currentBranch && !protectedSet.has(name) && !name.startsWith("remotes/")).length
+}
+
+export function hygieneWarningMessage(stats: HygieneStats, thresholds: HygieneThresholds = DEFAULT_HYGIENE_THRESHOLDS) {
+ const parts: string[] = []
+ if (stats.worktrees > thresholds.worktrees) {
+ parts.push(`worktrees=${stats.worktrees} (threshold ${thresholds.worktrees})`)
+ }
+ if (stats.staleBranches > thresholds.staleBranches) {
+ parts.push(`merged-local-branches=${stats.staleBranches} (threshold ${thresholds.staleBranches})`)
+ }
+ if (!parts.length) return
+ return (
+ `⚠️ Repo hygiene: ${parts.join(", ")}. ` +
+ `Run /repo-hygiene to list cleanup candidates (dry-run). Do not delete without confirmation.`
+ )
+}
+
+export async function collectHygieneStats(worktree: string): Promise {
+ const [worktreeList, branchShow, merged] = await Promise.all([
+ git(worktree, ["worktree", "list", "--porcelain"]).catch(() => ({ stdout: "", stderr: "", code: 1 })),
+ git(worktree, ["branch", "--show-current"]).catch(() => ({ stdout: "", stderr: "", code: 1 })),
+ git(worktree, ["branch", "--merged"]).catch(() => ({ stdout: "", stderr: "", code: 1 })),
+ ])
+
+ const current = branchShow.stdout.trim()
+ const mergedNames = merged.stdout.split(/\r?\n/).map((line) => line.trim())
+ return {
+ worktrees: countWorktrees(worktreeList.stdout),
+ staleBranches: countStaleBranches(mergedNames, current, []),
+ }
+}
+
+export function hygieneGuardDisabled(env: NodeJS.ProcessEnv = process.env) {
+ return /^(0|false|off|no)$/i.test(env.OPENCODE_HYGIENE_GUARD ?? "")
+}
+
+export function createHygieneHandlers(ctx: GuardrailContext, thresholds: HygieneThresholds = DEFAULT_HYGIENE_THRESHOLDS) {
+ async function onSessionCreated() {
+ if (hygieneGuardDisabled()) return
+ const stats = await collectHygieneStats(ctx.input.worktree)
+ const warning = hygieneWarningMessage(stats, thresholds)
+ if (!warning) {
+ await ctx.mark({ hygiene_warning: "" })
+ return
+ }
+ await ctx.mark({ hygiene_warning: warning })
+ await ctx.seen("repo_hygiene.warning", stats)
+ }
+
+ return { onSessionCreated }
+}
diff --git a/packages/guardrails/profile/plugins/removal-guard.ts b/packages/guardrails/profile/plugins/removal-guard.ts
new file mode 100644
index 000000000000..4a4a5906e7f8
--- /dev/null
+++ b/packages/guardrails/profile/plugins/removal-guard.ts
@@ -0,0 +1,126 @@
+import path from "path"
+import type { GuardrailContext } from "./guardrail-context"
+import { git, text } from "./guardrail-patterns"
+
+const SHELL_WORD = `(?:"[^"]+"|'[^']+'|\\S+)`
+
+/** Structural: git rm / git add that stages deletions. Not word-match on "delete"/"high". */
+export function isGitRemovalCommand(cmd: string) {
+ if (
+ new RegExp(
+ `\\bgit(?:\\s+-C\\s+${SHELL_WORD}|\\s+-c\\s+${SHELL_WORD}|\\s+--(?:git-dir|work-tree|namespace)=${SHELL_WORD}|\\s+--(?:git-dir|work-tree|namespace)\\s+${SHELL_WORD})*\\s+rm\\b`,
+ "i",
+ ).test(cmd)
+ ) {
+ return true
+ }
+ if (
+ !new RegExp(
+ `\\bgit(?:\\s+-C\\s+${SHELL_WORD}|\\s+-c\\s+${SHELL_WORD}|\\s+--(?:git-dir|work-tree|namespace)=${SHELL_WORD}|\\s+--(?:git-dir|work-tree|namespace)\\s+${SHELL_WORD})*\\s+add\\b`,
+ "i",
+ ).test(cmd)
+ ) {
+ return false
+ }
+ return /(?:^|\s)(-A|--all|-u|--update)(?:\s|$)/.test(cmd)
+}
+
+export function parseGitRmTargets(cmd: string) {
+ const match = cmd.match(/\bgit(?:\s+[^\s]+)*\s+rm\b([\s\S]*)$/i)
+ if (!match) return [] as string[]
+ const args = match[1] ?? ""
+ const targets: string[] = []
+ const re = /"([^"]+)"|'([^']+)'|(\S+)/g
+ for (const part of args.matchAll(re)) {
+ const token = part[1] ?? part[2] ?? part[3] ?? ""
+ if (!token || token.startsWith("-")) continue
+ targets.push(token)
+ }
+ return targets
+}
+
+export function referenceNeedle(file: string) {
+ const base = path.basename(file)
+ const stem = base.includes(".") ? base.slice(0, base.lastIndexOf(".")) : base
+ return stem.length >= 3 ? stem : base
+}
+
+/** Structural import/path needles. Short stems avoid bare 1–2 char greps (over-restriction). */
+export function referenceNeedles(file: string) {
+ const base = path.basename(file)
+ const stem = base.includes(".") ? base.slice(0, base.lastIndexOf(".")) : base
+ if (!stem) return [] as string[]
+ if (stem.length >= 3) return [stem]
+ return [`./${stem}`, `/${stem}`, `${stem}.`, base]
+}
+
+export async function findReverseReferences(worktree: string, targets: string[]) {
+ const hits: { target: string; refs: string[] }[] = []
+ for (const target of targets) {
+ const needles = referenceNeedles(target)
+ if (!needles.length) continue
+ const found = new Set()
+ for (const needle of needles) {
+ const result = await git(worktree, ["grep", "-l", "-F", "--", needle]).catch(() => ({
+ stdout: "",
+ stderr: "",
+ code: 1,
+ }))
+ if (result.code !== 0 && !result.stdout.trim()) continue
+ for (const line of result.stdout.split(/\r?\n/)) {
+ const file = line.trim()
+ if (file) found.add(file)
+ }
+ }
+ const normTarget = path.normalize(target)
+ const refs = [...found].filter((file) => path.normalize(file) !== normTarget && !file.endsWith(`/${normTarget}`))
+ if (refs.length) hits.push({ target, refs: refs.slice(0, 12) })
+ }
+ return hits
+}
+
+export function removalBlockMessage(hits: { target: string; refs: string[] }[]) {
+ if (!hits.length) return
+ const detail = hits
+ .map((hit) => `- ${hit.target} ← ${hit.refs.slice(0, 5).join(", ")}${hit.refs.length > 5 ? ", …" : ""}`)
+ .join("\n")
+ return (
+ "removal blocked: reverse references found. Run impact analysis (/impact-analysis or skill) before deleting.\n" +
+ detail +
+ "\nSet OPENCODE_REMOVAL_GUARD=off only after confirming replacements exist."
+ )
+}
+
+export function removalGuardDisabled(env: NodeJS.ProcessEnv = process.env) {
+ return /^(0|false|off|no)$/i.test(env.OPENCODE_REMOVAL_GUARD ?? "")
+}
+
+export function createRemovalHandlers(ctx: GuardrailContext) {
+ async function bashBeforeRemoval(cmd: string) {
+ if (removalGuardDisabled()) return
+ if (!isGitRemovalCommand(cmd)) return
+
+ const targets =
+ parseGitRmTargets(cmd).length > 0
+ ? parseGitRmTargets(cmd)
+ : (
+ await git(ctx.input.worktree, ["diff", "--name-only", "--diff-filter=D", "HEAD"]).catch(() => ({
+ stdout: "",
+ stderr: "",
+ code: 1,
+ }))
+ ).stdout
+ .split(/\r?\n/)
+ .map((line) => line.trim())
+ .filter(Boolean)
+
+ if (!targets.length) return
+ const hits = await findReverseReferences(ctx.input.worktree, targets)
+ const message = removalBlockMessage(hits)
+ if (!message) return
+ await ctx.mark({ last_block: "bash", last_command: cmd, last_reason: "removal reverse-reference" })
+ throw new Error(text(message))
+ }
+
+ return { bashBeforeRemoval }
+}
diff --git a/packages/guardrails/profile/skills/falsifiable-change/SKILL.md b/packages/guardrails/profile/skills/falsifiable-change/SKILL.md
new file mode 100644
index 000000000000..c822b421f3e2
--- /dev/null
+++ b/packages/guardrails/profile/skills/falsifiable-change/SKILL.md
@@ -0,0 +1,18 @@
+---
+name: falsifiable-change
+description: Require a failing proof before claiming a fix (anti-pattern F). Use when reporting bug fixes or guard changes.
+---
+
+# Falsifiable change
+
+A change is not done until removing it makes a test fail.
+
+## Procedure
+
+1. Write or identify a test that fails on the buggy behavior (RED).
+2. Apply the fix (GREEN).
+3. Temporarily disable or revert the fix and re-run — the test must fail again (falsify).
+4. Restore the fix and confirm green.
+5. Report with the falsify command/output, not narrative alone.
+
+If you cannot falsify, the claim is unverified — say so explicitly.
diff --git a/packages/guardrails/profile/skills/impact-analysis/SKILL.md b/packages/guardrails/profile/skills/impact-analysis/SKILL.md
new file mode 100644
index 000000000000..f1e5b82749d2
--- /dev/null
+++ b/packages/guardrails/profile/skills/impact-analysis/SKILL.md
@@ -0,0 +1,14 @@
+---
+name: impact-analysis
+description: Enumerate reverse references before deleting or renaming symbols/files (anti-pattern A).
+---
+
+# Impact analysis
+
+Before `git rm`, job deletion, or symbol rename:
+
+1. List candidate paths/names.
+2. Reverse-search references (`git grep`, workflow `needs:`, import graphs).
+3. Record callers and name-based wiring (CI job IDs, plugin arrays, package names).
+4. Only proceed when each reference has a replacement or an explicit waiver.
+5. Prefer the removal-guard plugin proof: with the guard on, referenced deletions block; with `OPENCODE_REMOVAL_GUARD=off`, they pass.
diff --git a/packages/guardrails/profile/skills/lean-pipeline/SKILL.md b/packages/guardrails/profile/skills/lean-pipeline/SKILL.md
new file mode 100644
index 000000000000..ed3ccd593cd8
--- /dev/null
+++ b/packages/guardrails/profile/skills/lean-pipeline/SKILL.md
@@ -0,0 +1,12 @@
+---
+name: lean-pipeline
+description: Default to the minimal verification path; add heavy CI/review only after evidence (anti-patterns C/G).
+---
+
+# Lean pipeline
+
+Prefer `/plan-light` defaults:
+
+`fake/failing test → local unit → scoped CI → PR`
+
+Add staging, multi-reviewer gates, or matrix expansion only after the minimal path missed a real defect. Docs/specs-only changes should not pull full e2e/nix suites when CI layering is available.
diff --git a/packages/guardrails/profile/skills/self-check/SKILL.md b/packages/guardrails/profile/skills/self-check/SKILL.md
new file mode 100644
index 000000000000..57b304fc0fce
--- /dev/null
+++ b/packages/guardrails/profile/skills/self-check/SKILL.md
@@ -0,0 +1,16 @@
+---
+name: self-check
+description: Prove objectivity with local wiring/falsify tests instead of another agent (anti-pattern H).
+---
+
+# Self-check (no external agent required)
+
+Do not treat "ask Codex/Claude for a second opinion" as the objectivity proof.
+
+Prefer:
+
+1. Wiring tests that fail when a declaration and implementation diverge
+2. Falsify toggles (`OPENCODE_*_GUARD=off`) that prove a guard catches the danger
+3. Negative tests that prove safe operations still pass
+
+External agents are optional review, never the sole evidence.
diff --git a/packages/opencode/test/plugin/anti-pattern-guards.test.ts b/packages/opencode/test/plugin/anti-pattern-guards.test.ts
new file mode 100644
index 000000000000..86f1b76e3955
--- /dev/null
+++ b/packages/opencode/test/plugin/anti-pattern-guards.test.ts
@@ -0,0 +1,416 @@
+import { afterEach, describe, expect, test } from "bun:test"
+import fs from "fs/promises"
+import path from "path"
+import { Permission } from "../../src/permission"
+import { tmpdir } from "../fixture/fixture"
+import {
+ classifyCiTier,
+ isDocsPath,
+ shouldRunFullCi,
+} from "../../../../packages/guardrails/profile/plugins/ci-change-scope"
+import {
+ countStaleBranches,
+ countWorktrees,
+ createHygieneHandlers,
+ hygieneWarningMessage,
+} from "../../../../packages/guardrails/profile/plugins/hygiene-warning"
+import {
+ createRemovalHandlers,
+ findReverseReferences,
+ isGitRemovalCommand,
+ parseGitRmTargets,
+ referenceNeedle,
+ removalBlockMessage,
+ removalGuardDisabled,
+} from "../../../../packages/guardrails/profile/plugins/removal-guard"
+import type { GuardrailContext } from "../../../../packages/guardrails/profile/plugins/guardrail-context"
+import guardrail from "../../../../packages/guardrails/profile/plugins/guardrail"
+
+const profileRoot = path.resolve(import.meta.dir, "../../../../packages/guardrails/profile")
+
+async function context(worktree?: string) {
+ const tmp = worktree ? { path: worktree, [Symbol.asyncDispose]: async () => {} } : await tmpdir()
+ const state = path.join(tmp.path, ".opencode", "guardrails", "state.json")
+ const marks: Record[] = []
+ const ctx: GuardrailContext = {
+ input: {
+ client: {} as GuardrailContext["input"]["client"],
+ directory: tmp.path,
+ worktree: tmp.path,
+ },
+ mode: "enforced",
+ root: path.join(tmp.path, ".opencode", "guardrails"),
+ log: path.join(tmp.path, ".opencode", "guardrails", "events.jsonl"),
+ state,
+ allow: {},
+ hasCodexMcp: false,
+ maxParallelTasks: 5,
+ maxSessionCost: 10,
+ agentModelTier: {},
+ tierModels: {},
+ domainDirs: {},
+ async mark(data) {
+ marks.push(data)
+ await fs.mkdir(path.dirname(state), { recursive: true })
+ await Bun.write(
+ state,
+ JSON.stringify(
+ {
+ ...(await Bun.file(state)
+ .json()
+ .catch(() => ({}))),
+ ...data,
+ },
+ null,
+ 2,
+ ),
+ )
+ },
+ async seen() {},
+ note() {
+ return { sessionID: undefined, permission: undefined, patterns: undefined }
+ },
+ hidden() {
+ return false
+ },
+ code() {
+ return false
+ },
+ fact() {
+ return false
+ },
+ stale() {
+ return false
+ },
+ factLine() {
+ return ""
+ },
+ reviewLine() {
+ return ""
+ },
+ compact() {
+ return ""
+ },
+ deny() {
+ return undefined
+ },
+ baseline() {
+ return undefined
+ },
+ async version() {
+ return undefined
+ },
+ async budget() {
+ return 0
+ },
+ gate() {
+ return undefined
+ },
+ }
+ return {
+ ctx,
+ marks,
+ path: tmp.path,
+ [Symbol.asyncDispose]: async () => {
+ await tmp[Symbol.asyncDispose]()
+ },
+ }
+}
+
+function profileBashRuleset() {
+ const config = Bun.file(path.join(profileRoot, "opencode.json")).json() as Promise<{
+ permission: { bash: Record }
+ }>
+ return config.then((json) => Permission.fromConfig({ bash: json.permission.bash }))
+}
+
+function implementBashRuleset() {
+ // Mirrors agents/implement.md bash block (pattern I symmetry fixture).
+ return Permission.fromConfig({
+ bash: {
+ "*": "allow",
+ "git worktree list*": "allow",
+ "git merge-base *": "allow",
+ "git status*": "allow",
+ "git log*": "allow",
+ "git worktree add *": "ask",
+ "git branch -D *": "ask",
+ "git checkout -- *": "deny",
+ "git merge *": "deny",
+ "git push --force*": "deny",
+ "git push * --force*": "deny",
+ "git reset --hard*": "deny",
+ "gh pr merge *": "deny",
+ "rm -rf *": "deny",
+ "rm -r *": "deny",
+ "sudo *": "deny",
+ "curl * | sh*": "deny",
+ "wget * | sh*": "deny",
+ },
+ })
+}
+
+const previousRemoval = process.env.OPENCODE_REMOVAL_GUARD
+const previousHygiene = process.env.OPENCODE_HYGIENE_GUARD
+
+afterEach(() => {
+ if (previousRemoval === undefined) delete process.env.OPENCODE_REMOVAL_GUARD
+ else process.env.OPENCODE_REMOVAL_GUARD = previousRemoval
+ if (previousHygiene === undefined) delete process.env.OPENCODE_HYGIENE_GUARD
+ else process.env.OPENCODE_HYGIENE_GUARD = previousHygiene
+})
+
+describe("anti-pattern A — removal guard", () => {
+ test("detects structural git rm / add -A, not unrelated words like high", () => {
+ expect(isGitRemovalCommand("git rm src/foo.ts")).toBe(true)
+ expect(isGitRemovalCommand("git add -A")).toBe(true)
+ expect(isGitRemovalCommand("git status --short")).toBe(false)
+ expect(isGitRemovalCommand("gh pr comment 1 --body 'severity severity note'")).toBe(false)
+ expect(isGitRemovalCommand("echo delete high impact")).toBe(false)
+ })
+
+ test("blocks removal when reverse references exist (positive)", async () => {
+ await using fixture = await context()
+ await Bun.$`git init`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.email "test@opencode.test"`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.name "Test"`.cwd(fixture.path).quiet()
+ await Bun.write(path.join(fixture.path, "policy-ci.ts"), "export const policyCi = true\n")
+ await Bun.write(path.join(fixture.path, "workflow.ts"), "import { policyCi } from './policy-ci'\n")
+ await Bun.$`git add .`.cwd(fixture.path).quiet()
+ await Bun.$`git commit -m init`.cwd(fixture.path).quiet()
+
+ delete process.env.OPENCODE_REMOVAL_GUARD
+ const removal = createRemovalHandlers(fixture.ctx)
+ await expect(removal.bashBeforeRemoval("git rm policy-ci.ts")).rejects.toThrow("reverse references found")
+ })
+
+ test("falsify: disabling the guard lets referenced removal through", async () => {
+ await using fixture = await context()
+ await Bun.$`git init`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.email "test@opencode.test"`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.name "Test"`.cwd(fixture.path).quiet()
+ await Bun.write(path.join(fixture.path, "policy-ci.ts"), "export const policyCi = true\n")
+ await Bun.write(path.join(fixture.path, "workflow.ts"), "import { policyCi } from './policy-ci'\n")
+ await Bun.$`git add .`.cwd(fixture.path).quiet()
+ await Bun.$`git commit -m init`.cwd(fixture.path).quiet()
+
+ process.env.OPENCODE_REMOVAL_GUARD = "off"
+ expect(removalGuardDisabled()).toBe(true)
+ const removal = createRemovalHandlers(fixture.ctx)
+ await expect(removal.bashBeforeRemoval("git rm policy-ci.ts")).resolves.toBeUndefined()
+ })
+
+ test("negative: safe git reads and high-word comments are not blocked", async () => {
+ await using fixture = await context()
+ await Bun.$`git init`.cwd(fixture.path).quiet()
+ const removal = createRemovalHandlers(fixture.ctx)
+ await expect(removal.bashBeforeRemoval("git status --short")).resolves.toBeUndefined()
+ await expect(removal.bashBeforeRemoval("git log -1")).resolves.toBeUndefined()
+ await expect(removal.bashBeforeRemoval("gh pr comment 1 --body high priority")).resolves.toBeUndefined()
+ })
+
+ test("negative: unreferenced deletion is allowed", async () => {
+ await using fixture = await context()
+ await Bun.$`git init`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.email "test@opencode.test"`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.name "Test"`.cwd(fixture.path).quiet()
+ await Bun.write(path.join(fixture.path, "orphan-only.ts"), "export const orphanOnly = 1\n")
+ await Bun.write(path.join(fixture.path, "other.ts"), "export const other = 2\n")
+ await Bun.$`git add .`.cwd(fixture.path).quiet()
+ await Bun.$`git commit -m init`.cwd(fixture.path).quiet()
+
+ const hits = await findReverseReferences(fixture.path, ["orphan-only.ts"])
+ expect(removalBlockMessage(hits)).toBeUndefined()
+ const removal = createRemovalHandlers(fixture.ctx)
+ await expect(removal.bashBeforeRemoval("git rm orphan-only.ts")).resolves.toBeUndefined()
+ })
+
+ test("parseGitRmTargets and referenceNeedle are path/structure based", () => {
+ expect(parseGitRmTargets(`git rm "src/a.ts" 'src/b.ts' -f`)).toEqual(["src/a.ts", "src/b.ts"])
+ expect(referenceNeedle("packages/foo/policy-ci.yml")).toBe("policy-ci")
+ })
+
+ test("short filenames still catch ./stem imports without bare-letter overmatch", async () => {
+ await using fixture = await context()
+ await Bun.$`git init`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.email "test@opencode.test"`.cwd(fixture.path).quiet()
+ await Bun.$`git config user.name "Test"`.cwd(fixture.path).quiet()
+ await Bun.write(path.join(fixture.path, "a.ts"), "export const aMarker = 1\n")
+ await Bun.write(path.join(fixture.path, "b.ts"), 'import { aMarker } from "./a"\n')
+ await Bun.write(path.join(fixture.path, "note.ts"), 'export const high = "unrelated word"\n')
+ await Bun.$`git add .`.cwd(fixture.path).quiet()
+ await Bun.$`git commit -m init`.cwd(fixture.path).quiet()
+
+ const hits = await findReverseReferences(fixture.path, ["a.ts"])
+ expect(hits.some((hit) => hit.target === "a.ts" && hit.refs.includes("b.ts"))).toBe(true)
+ const removal = createRemovalHandlers(fixture.ctx)
+ await expect(removal.bashBeforeRemoval("git rm a.ts")).rejects.toThrow("reverse references found")
+ // note.ts mentioning "high" must not create a false removal block by itself
+ await expect(removal.bashBeforeRemoval("git rm note.ts")).resolves.toBeUndefined()
+ })
+})
+
+describe("anti-pattern B/I — permission symmetry and over-restriction proofs", () => {
+ test("profile allows read git and denies force-push", async () => {
+ const rules = await profileBashRuleset()
+ expect(Permission.evaluate("bash", "git worktree list", rules).action).toBe("allow")
+ expect(Permission.evaluate("bash", "git merge-base HEAD origin/dev", rules).action).toBe("allow")
+ expect(Permission.evaluate("bash", "git status --short", rules).action).toBe("allow")
+ expect(Permission.evaluate("bash", "git log -1", rules).action).toBe("allow")
+ expect(Permission.evaluate("bash", "git push --force origin feature", rules).action).toBe("deny")
+ expect(Permission.evaluate("bash", "git worktree add ../tmp feature", rules).action).toBe("ask")
+ expect(Permission.evaluate("bash", "git branch -D stale", rules).action).toBe("ask")
+ })
+
+ test("implement agent matches the same read/deny outcomes (symmetry)", async () => {
+ const profile = await profileBashRuleset()
+ const implement = implementBashRuleset()
+ for (const cmd of ["git worktree list", "git merge-base a b", "git status", "git log -1"]) {
+ expect(Permission.evaluate("bash", cmd, profile).action).toBe(Permission.evaluate("bash", cmd, implement).action)
+ expect(Permission.evaluate("bash", cmd, implement).action).toBe("allow")
+ }
+ expect(Permission.evaluate("bash", "git push --force origin x", profile).action).toBe("deny")
+ expect(Permission.evaluate("bash", "git push --force origin x", implement).action).toBe("deny")
+ })
+
+ test("word 'high' is not a permission pattern and does not deny", async () => {
+ const rules = await profileBashRuleset()
+ expect(Permission.evaluate("bash", "echo high severity review", rules).action).not.toBe("deny")
+ })
+})
+
+describe("anti-pattern E — hygiene warning", () => {
+ test("warns only above thresholds; below threshold is silent (negative)", () => {
+ expect(countWorktrees("worktree /a\nHEAD abc\n\nworktree /b\nHEAD def\n")).toBe(2)
+ expect(countStaleBranches(["* main", " feat/a", " feat/b"], "main", [])).toBe(2)
+ expect(hygieneWarningMessage({ worktrees: 3, staleBranches: 2 })).toBeUndefined()
+ expect(hygieneWarningMessage({ worktrees: 9, staleBranches: 0 })).toContain("worktrees=9")
+ expect(hygieneWarningMessage({ worktrees: 1, staleBranches: 11 })).toContain("merged-local-branches=11")
+ expect(hygieneWarningMessage({ worktrees: 9, staleBranches: 11 }, undefined)?.includes("high")).toBe(false)
+ })
+
+ test("falsify: disabling hygiene guard skips session warning mark", async () => {
+ await using fixture = await context()
+ await Bun.$`git init`.cwd(fixture.path).quiet()
+ process.env.OPENCODE_HYGIENE_GUARD = "off"
+ const hygiene = createHygieneHandlers(fixture.ctx, { worktrees: 0, staleBranches: 0 })
+ await hygiene.onSessionCreated()
+ expect(fixture.marks.some((mark) => typeof mark.hygiene_warning === "string" && mark.hygiene_warning.length > 0)).toBe(
+ false,
+ )
+ })
+
+ test("positive: low thresholds mark a hygiene warning on session create", async () => {
+ await using fixture = await context()
+ await Bun.$`git init`.cwd(fixture.path).quiet()
+ await Bun.$`git commit --allow-empty -m root`.cwd(fixture.path).quiet()
+ delete process.env.OPENCODE_HYGIENE_GUARD
+ const hygiene = createHygieneHandlers(fixture.ctx, { worktrees: 0, staleBranches: 0 })
+ await hygiene.onSessionCreated()
+ const warning = fixture.marks.map((mark) => mark.hygiene_warning).find((value) => typeof value === "string" && value)
+ expect(String(warning)).toContain("Repo hygiene")
+ })
+})
+
+describe("anti-pattern J — CI change scope", () => {
+ test("docs-only specs PR does not require full CI", () => {
+ const files = ["specs/ai-guardrails-anti-patterns.md"]
+ expect(files.every(isDocsPath)).toBe(true)
+ expect(classifyCiTier(files)).toBe("docs")
+ expect(shouldRunFullCi(files)).toBe(false)
+ })
+
+ test("guardrails changes stay on full CI even when markdown", () => {
+ const files = ["packages/guardrails/profile/commands/plan-light.md"]
+ expect(classifyCiTier(files)).toBe("guardrails")
+ expect(shouldRunFullCi(files)).toBe(true)
+ })
+
+ test("code changes require full CI", () => {
+ expect(classifyCiTier(["packages/opencode/src/index.ts"])).toBe("code")
+ expect(shouldRunFullCi(["packages/opencode/src/index.ts"])).toBe(true)
+ })
+
+ test("workflow path filters encode the same docs skip policy", async () => {
+ const testYml = await Bun.file(path.resolve(import.meta.dir, "../../../../.github/workflows/test.yml")).text()
+ expect(testYml).toContain("!specs/**")
+ expect(testYml).toContain("packages/guardrails/**")
+ const docsYml = await Bun.file(path.resolve(import.meta.dir, "../../../../.github/workflows/docs-lint.yml")).text()
+ expect(docsYml).toContain("docs-lint")
+ expect(docsYml).toContain("specs/**")
+ })
+})
+
+describe("anti-pattern C/D/E/F/G/H — command and skill assets", () => {
+ test("commands and skills exist with required guidance (wiring)", async () => {
+ const commands = ["plan-light.md", "env-check.md", "repo-hygiene.md"]
+ for (const name of commands) {
+ const body = await Bun.file(path.join(profileRoot, "commands", name)).text()
+ expect(body.length).toBeGreaterThan(40)
+ expect(body).toContain("---")
+ }
+ const plan = await Bun.file(path.join(profileRoot, "commands", "plan-light.md")).text()
+ expect(plan).toContain("fake/failing test")
+ expect(plan.toLowerCase()).toContain("minimal")
+
+ const env = await Bun.file(path.join(profileRoot, "commands", "env-check.md")).text()
+ expect(env.toLowerCase()).toContain("last resort")
+
+ const hygiene = await Bun.file(path.join(profileRoot, "commands", "repo-hygiene.md")).text()
+ expect(hygiene.toLowerCase()).toContain("dry-run")
+
+ for (const skill of ["falsifiable-change", "lean-pipeline", "self-check", "impact-analysis"]) {
+ const body = await Bun.file(path.join(profileRoot, "skills", skill, "SKILL.md")).text()
+ expect(body).toContain(`name: ${skill}`)
+ expect(body).toContain("description:")
+ }
+ })
+})
+
+describe("aggregate guardrail wiring", () => {
+ test("removal guard runs through aggregate tool.execute.before", async () => {
+ await using tmp = await tmpdir({ git: true })
+ await Bun.write(path.join(tmp.path, "policy-ci.ts"), "export const policyCi = true\n")
+ await Bun.write(path.join(tmp.path, "workflow.ts"), "import { policyCi } from './policy-ci'\n")
+ await Bun.$`git add .`.cwd(tmp.path).quiet()
+ await Bun.$`git commit -m init`.cwd(tmp.path).quiet()
+
+ delete process.env.OPENCODE_REMOVAL_GUARD
+ const plugin = await guardrail(
+ {
+ client: {
+ session: {
+ async create() {
+ return { data: { id: "unused" } }
+ },
+ async promptAsync() {
+ return {}
+ },
+ async prompt() {
+ return {}
+ },
+ async status() {
+ return { data: {} }
+ },
+ async messages() {
+ return { data: [] }
+ },
+ async abort() {
+ return {}
+ },
+ },
+ },
+ directory: tmp.path,
+ worktree: tmp.path,
+ },
+ {},
+ )
+ await plugin.event({ event: { type: "session.created", properties: { sessionID: "ses_rm" } } })
+ await expect(
+ plugin["tool.execute.before"](
+ { tool: "bash", args: { command: "git rm policy-ci.ts" } },
+ { args: { command: "git rm policy-ci.ts" } },
+ ),
+ ).rejects.toThrow("reverse references found")
+ })
+})
diff --git a/packages/web/src/content/docs/ar/go.mdx b/packages/web/src/content/docs/ar/go.mdx
index f885517639de..b0be0b61570e 100644
--- a/packages/web/src/content/docs/ar/go.mdx
+++ b/packages/web/src/content/docs/ar/go.mdx
@@ -60,6 +60,7 @@ OpenCode Go هو اشتراك منخفض التكلفة — **$5 للشهر ال
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ OpenCode Go هو اشتراك منخفض التكلفة — **$5 للشهر ال
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -114,6 +116,7 @@ OpenCode Go هو اشتراك منخفض التكلفة — **$5 للشهر ال
- DeepSeek V4 Flash — 790 input، و68,000 cached، و280 output tokens لكل طلب
- MiniMax M3 — 510 input، و56,000 cached، و190 output tokens لكل طلب
- MiniMax M2.7 — 300 input، و55,000 cached، و125 output tokens لكل طلب
+- Qwen3.8 Max — 420 input، و66,000 cached، و200 output tokens لكل طلب
- 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 لكل طلب
@@ -138,6 +141,7 @@ OpenCode Go هو اشتراك منخفض التكلفة — **$5 للشهر ال
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ OpenCode Go هو اشتراك منخفض التكلفة — **$5 للشهر ال
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | غير مستخدَمة | 0 أيام |
| MiMo-V2.5-Pro | غير مستخدَمة | 0 أيام |
| MiMo-V2.5 | غير مستخدَمة | 0 أيام |
+| Qwen3.8 Max | غير مستخدَمة | 0 أيام |
| Qwen3.7 Max | غير مستخدَمة | 0 أيام |
| Qwen3.7 Plus | غير مستخدَمة | 0 أيام |
| Qwen3.6 Plus | غير مستخدَمة | 0 أيام |
| MiniMax M3 | غير مستخدَمة | 0 أيام |
| MiniMax M2.7 | غير مستخدَمة | 0 أيام |
| DeepSeek V4 Pro | غير مستخدَمة | 0 أيام |
-| DeepSeek V4 Flash | مستخدَمة | لا توجد اتفاقية |
+| DeepSeek V4 Flash | غير مستخدَمة | 0 أيام |
| Hy3 | غير مستخدَمة | 0 أيام |
- **Grok 4.5:** تعطّل ZDR ميزات API مهمة تعتمد على البيانات المخزنة، بما في ذلك Responses API ذات الحالة، وFiles and Collections، وBatch API. [اعرف المزيد](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
- **GPT 5.6 Luna:** تُنشأ سجلات مراقبة إساءة الاستخدام لكل استخدام لميزات API، ويُحتفظ بها لمدة تصل إلى 30 يومًا. [اعرف المزيد](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** تُجدَّد اتفاقية ZDR شهريًا. الاتفاقية الحالية سارية حتى 31 أغسطس 2026.
---
diff --git a/packages/web/src/content/docs/ar/zen.mdx b/packages/web/src/content/docs/ar/zen.mdx
index 83aeb104c591..0cc94de6efa2 100644
--- a/packages/web/src/content/docs/ar/zen.mdx
+++ b/packages/web/src/content/docs/ar/zen.mdx
@@ -90,8 +90,8 @@ OpenCode Zen هي بوابة AI تتيح لك الوصول إلى هذه الن
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/bs/go.mdx b/packages/web/src/content/docs/bs/go.mdx
index a5166f7528e5..634b3a86854d 100644
--- a/packages/web/src/content/docs/bs/go.mdx
+++ b/packages/web/src/content/docs/bs/go.mdx
@@ -70,6 +70,7 @@ Trenutna lista modela uključuje:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -106,7 +107,8 @@ Tabela ispod pruža procijenjeni broj zahtjeva na osnovu tipičnih obrazaca kori
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -124,6 +126,7 @@ Procjene se zasnivaju na zapaženim obrascima zahtjeva:
- DeepSeek V4 Flash — 790 ulaznih, 68,000 keširanih, 280 izlaznih tokena po zahtjevu
- MiniMax M3 — 510 ulaznih, 56,000 keširanih, 190 izlaznih tokena po zahtjevu
- MiniMax M2.7 — 300 ulaznih, 55,000 keširanih, 125 izlaznih tokena po zahtjevu
+- Qwen3.8 Max — 420 ulaznih, 66,000 keširanih, 200 izlaznih tokena po zahtjevu
- 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
@@ -148,6 +151,7 @@ Procjene se također zasnivaju na sljedećim cijenama po 1M tokena i mjesečnoj
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -207,6 +211,7 @@ Također možete pristupiti Go modelima putem sljedećih API endpointa.
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -241,17 +246,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Ne koristi se | 0 dana |
| MiMo-V2.5-Pro | Ne koristi se | 0 dana |
| MiMo-V2.5 | Ne koristi se | 0 dana |
+| Qwen3.8 Max | Ne koristi se | 0 dana |
| Qwen3.7 Max | Ne koristi se | 0 dana |
| Qwen3.7 Plus | Ne koristi se | 0 dana |
| Qwen3.6 Plus | Ne koristi se | 0 dana |
| MiniMax M3 | Ne koristi se | 0 dana |
| MiniMax M2.7 | Ne koristi se | 0 dana |
| DeepSeek V4 Pro | Ne koristi se | 0 dana |
-| DeepSeek V4 Flash | Koristi se | Nema sporazuma |
+| DeepSeek V4 Flash | Ne koristi se | 0 dana |
| Hy3 | Ne koristi se | 0 dana |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Zapisi o nadzoru zloupotrebe generišu se za svako korištenje API funkcija i čuvaju do 30 dana. [Saznajte više](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** ZDR sporazum obnavlja se mjesečno. Trenutni sporazum važi do 31. augusta 2026.
---
diff --git a/packages/web/src/content/docs/bs/zen.mdx b/packages/web/src/content/docs/bs/zen.mdx
index 82f85e91988d..17cf73581b6e 100644
--- a/packages/web/src/content/docs/bs/zen.mdx
+++ b/packages/web/src/content/docs/bs/zen.mdx
@@ -95,8 +95,8 @@ Našim modelima možete pristupiti i preko sljedećih API endpointa.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/da/go.mdx b/packages/web/src/content/docs/da/go.mdx
index 3ea1bacc190e..5aabcc7c436c 100644
--- a/packages/web/src/content/docs/da/go.mdx
+++ b/packages/web/src/content/docs/da/go.mdx
@@ -70,6 +70,7 @@ Den nuværende liste over modeller inkluderer:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -106,7 +107,8 @@ Tabellen nedenfor giver et estimeret antal anmodninger baseret på typiske Go-fo
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -124,6 +126,7 @@ Estimaterne er baseret på observerede anmodningsmønstre:
- DeepSeek V4 Flash — 790 input, 68.000 cachelagrede, 280 output-tokens pr. anmodning
- MiniMax M3 — 510 input, 56.000 cachelagrede, 190 output-tokens pr. anmodning
- MiniMax M2.7 — 300 input, 55.000 cachelagrede, 125 output-tokens pr. anmodning
+- Qwen3.8 Max — 420 input, 66.000 cachelagrede, 200 output-tokens pr. anmodning
- 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
@@ -148,6 +151,7 @@ Estimaterne er også baseret på følgende priser pr. 1M tokens og det månedlig
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -207,6 +211,7 @@ Du kan også få adgang til Go-modeller gennem følgende API-endpoints.
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -241,17 +246,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Ikke brugt | 0 dage |
| MiMo-V2.5-Pro | Ikke brugt | 0 dage |
| MiMo-V2.5 | Ikke brugt | 0 dage |
+| Qwen3.8 Max | Ikke brugt | 0 dage |
| Qwen3.7 Max | Ikke brugt | 0 dage |
| Qwen3.7 Plus | Ikke brugt | 0 dage |
| Qwen3.6 Plus | Ikke brugt | 0 dage |
| MiniMax M3 | Ikke brugt | 0 dage |
| MiniMax M2.7 | Ikke brugt | 0 dage |
| DeepSeek V4 Pro | Ikke brugt | 0 dage |
-| DeepSeek V4 Flash | Brugt | Ingen aftale |
+| DeepSeek V4 Flash | Ikke brugt | 0 dage |
| Hy3 | Ikke brugt | 0 dage |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Logfiler til overvågning af misbrug genereres ved al brug af API-funktioner og opbevares i op til 30 dage. [Læs mere](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** ZDR-aftalen fornyes månedligt. Den nuværende aftale er gyldig til og med 31. august 2026.
---
diff --git a/packages/web/src/content/docs/da/zen.mdx b/packages/web/src/content/docs/da/zen.mdx
index c7545e170bda..e200e14e60da 100644
--- a/packages/web/src/content/docs/da/zen.mdx
+++ b/packages/web/src/content/docs/da/zen.mdx
@@ -95,8 +95,8 @@ Du kan også få adgang til vores modeller gennem følgende API-endpoints.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/de/go.mdx b/packages/web/src/content/docs/de/go.mdx
index 061b3840eb2a..73a11d454f06 100644
--- a/packages/web/src/content/docs/de/go.mdx
+++ b/packages/web/src/content/docs/de/go.mdx
@@ -62,6 +62,7 @@ Die aktuelle Liste der Modelle umfasst:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -98,7 +99,8 @@ Die folgende Tabelle zeigt eine geschätzte Anzahl von Anfragen basierend auf ty
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -116,6 +118,7 @@ Die Schätzungen basieren auf beobachteten Anfragemustern:
- DeepSeek V4 Flash — 790 Input-, 68.000 Cached-, 280 Output-Tokens pro Anfrage
- MiniMax M3 — 510 Input-, 56.000 Cached-, 190 Output-Tokens pro Anfrage
- MiniMax M2.7 — 300 Input-, 55.000 Cached-, 125 Output-Tokens pro Anfrage
+- Qwen3.8 Max — 420 Input-, 66.000 Cached-, 200 Output-Tokens pro Anfrage
- 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
@@ -140,6 +143,7 @@ Die Schätzungen basieren außerdem auf den folgenden Preisen pro 1M Tokens und
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -197,6 +201,7 @@ Du kannst auf die Go-Modelle auch über die folgenden API-Endpunkte zugreifen.
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -218,28 +223,30 @@ https://opencode.ai/zen/go/v1/models
## Datenschutz
-| Modell | Modelltraining | Datenaufbewahrung |
-| ----------------- | --------------- | ------------------ |
-| Grok 4.5 | Nicht verwendet | 30 Tage |
-| GPT 5.6 Luna | Nicht verwendet | 30 Tage |
-| GLM-5.2 | Nicht verwendet | 0 Tage |
-| GLM-5.1 | Nicht verwendet | 0 Tage |
-| Kimi K3 | Nicht verwendet | 0 Tage |
-| Kimi K2.7 Code | Nicht verwendet | 0 Tage |
-| Kimi K2.6 | Nicht verwendet | 0 Tage |
-| MiMo-V2.5-Pro | Nicht verwendet | 0 Tage |
-| MiMo-V2.5 | Nicht verwendet | 0 Tage |
-| Qwen3.7 Max | Nicht verwendet | 0 Tage |
-| Qwen3.7 Plus | Nicht verwendet | 0 Tage |
-| Qwen3.6 Plus | Nicht verwendet | 0 Tage |
-| MiniMax M3 | Nicht verwendet | 0 Tage |
-| MiniMax M2.7 | Nicht verwendet | 0 Tage |
-| DeepSeek V4 Pro | Nicht verwendet | 0 Tage |
-| DeepSeek V4 Flash | Verwendet | Keine Vereinbarung |
-| Hy3 | Nicht verwendet | 0 Tage |
+| Modell | Modelltraining | Datenaufbewahrung |
+| ----------------- | --------------- | ----------------- |
+| Grok 4.5 | Nicht verwendet | 30 Tage |
+| GPT 5.6 Luna | Nicht verwendet | 30 Tage |
+| GLM-5.2 | Nicht verwendet | 0 Tage |
+| GLM-5.1 | Nicht verwendet | 0 Tage |
+| Kimi K3 | Nicht verwendet | 0 Tage |
+| Kimi K2.7 Code | Nicht verwendet | 0 Tage |
+| Kimi K2.6 | Nicht verwendet | 0 Tage |
+| MiMo-V2.5-Pro | Nicht verwendet | 0 Tage |
+| MiMo-V2.5 | Nicht verwendet | 0 Tage |
+| Qwen3.8 Max | Nicht verwendet | 0 Tage |
+| Qwen3.7 Max | Nicht verwendet | 0 Tage |
+| Qwen3.7 Plus | Nicht verwendet | 0 Tage |
+| Qwen3.6 Plus | Nicht verwendet | 0 Tage |
+| MiniMax M3 | Nicht verwendet | 0 Tage |
+| MiniMax M2.7 | Nicht verwendet | 0 Tage |
+| DeepSeek V4 Pro | Nicht verwendet | 0 Tage |
+| DeepSeek V4 Flash | Nicht verwendet | 0 Tage |
+| Hy3 | Nicht verwendet | 0 Tage |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Für die Nutzung aller API-Funktionen werden Protokolle zur Missbrauchsüberwachung erstellt und bis zu 30 Tage lang aufbewahrt. [Mehr erfahren](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** Die ZDR-Vereinbarung wird monatlich erneuert. Die aktuelle Vereinbarung gilt bis einschließlich 31. August 2026.
---
diff --git a/packages/web/src/content/docs/de/zen.mdx b/packages/web/src/content/docs/de/zen.mdx
index a5ac30e0606a..1fa6cbc7eb47 100644
--- a/packages/web/src/content/docs/de/zen.mdx
+++ b/packages/web/src/content/docs/de/zen.mdx
@@ -86,8 +86,8 @@ Du kannst auch über die folgenden API-Endpunkte auf unsere Modelle zugreifen.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/es/go.mdx b/packages/web/src/content/docs/es/go.mdx
index c0908c7dcb1b..7182d716fced 100644
--- a/packages/web/src/content/docs/es/go.mdx
+++ b/packages/web/src/content/docs/es/go.mdx
@@ -70,6 +70,7 @@ La lista actual de modelos incluye:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -106,7 +107,8 @@ La siguiente tabla proporciona una cantidad estimada de peticiones basada en los
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -124,6 +126,7 @@ Las estimaciones se basan en los patrones de peticiones observados:
- DeepSeek V4 Flash — 790 tokens de entrada, 68,000 en caché, 280 tokens de salida por petición
- MiniMax M3 — 510 tokens de entrada, 56,000 en caché, 190 tokens de salida por petición
- MiniMax M2.7 — 300 tokens de entrada, 55,000 en caché, 125 tokens de salida por petición
+- Qwen3.8 Max — 420 tokens de entrada, 66,000 en caché, 200 tokens de salida por petición
- 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
@@ -148,6 +151,7 @@ Las estimaciones también se basan en los siguientes precios por 1M tokens y en
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -207,6 +211,7 @@ También puedes acceder a los modelos de Go a través de los siguientes endpoint
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -241,17 +246,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | No utilizado | 0 días |
| MiMo-V2.5-Pro | No utilizado | 0 días |
| MiMo-V2.5 | No utilizado | 0 días |
+| Qwen3.8 Max | No utilizado | 0 días |
| Qwen3.7 Max | No utilizado | 0 días |
| Qwen3.7 Plus | No utilizado | 0 días |
| Qwen3.6 Plus | No utilizado | 0 días |
| MiniMax M3 | No utilizado | 0 días |
| MiniMax M2.7 | No utilizado | 0 días |
| DeepSeek V4 Pro | No utilizado | 0 días |
-| DeepSeek V4 Flash | Utilizado | Sin acuerdo |
+| DeepSeek V4 Flash | No utilizado | 0 días |
| Hy3 | No utilizado | 0 días |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Se generan registros de supervisión de abusos para todo el uso de funciones de la API y se conservan durante un máximo de 30 días. [Más información](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** El acuerdo de ZDR se renueva mensualmente. El acuerdo actual es válido hasta el 31 de agosto de 2026.
---
diff --git a/packages/web/src/content/docs/es/zen.mdx b/packages/web/src/content/docs/es/zen.mdx
index e37a0592c99b..539d5999f600 100644
--- a/packages/web/src/content/docs/es/zen.mdx
+++ b/packages/web/src/content/docs/es/zen.mdx
@@ -95,8 +95,8 @@ También puedes acceder a nuestros modelos a través de los siguientes endpoints
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/fr/go.mdx b/packages/web/src/content/docs/fr/go.mdx
index 2dc0b75d2f44..c858645e447b 100644
--- a/packages/web/src/content/docs/fr/go.mdx
+++ b/packages/web/src/content/docs/fr/go.mdx
@@ -60,6 +60,7 @@ La liste actuelle des modèles comprend :
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ Le tableau ci-dessous fournit une estimation du nombre de requêtes basée sur d
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -114,6 +116,7 @@ Les estimations sont basées sur les schémas de requêtes observés :
- DeepSeek V4 Flash — 790 tokens en entrée, 68,000 en cache, 280 tokens en sortie par requête
- MiniMax M3 — 510 tokens en entrée, 56,000 en cache, 190 tokens en sortie par requête
- MiniMax M2.7 — 300 tokens en entrée, 55,000 en cache, 125 tokens en sortie par requête
+- Qwen3.8 Max — 420 tokens en entrée, 66,000 en cache, 200 tokens en sortie par requête
- 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
@@ -138,6 +141,7 @@ Les estimations sont également basées sur les prix suivants par 1M tokens et s
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ Vous pouvez également accéder aux modèles Go via les points de terminaison d'
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Non utilisé | 0 jour |
| MiMo-V2.5-Pro | Non utilisé | 0 jour |
| MiMo-V2.5 | Non utilisé | 0 jour |
+| Qwen3.8 Max | Non utilisé | 0 jour |
| Qwen3.7 Max | Non utilisé | 0 jour |
| Qwen3.7 Plus | Non utilisé | 0 jour |
| Qwen3.6 Plus | Non utilisé | 0 jour |
| MiniMax M3 | Non utilisé | 0 jour |
| MiniMax M2.7 | Non utilisé | 0 jour |
| DeepSeek V4 Pro | Non utilisé | 0 jour |
-| DeepSeek V4 Flash | Utilisé | Aucun accord |
+| DeepSeek V4 Flash | Non utilisé | 0 jour |
| Hy3 | Non utilisé | 0 jour |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Des journaux de surveillance des abus sont générés pour toute utilisation des fonctionnalités API et conservés pendant un maximum de 30 jours. [En savoir plus](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** L’accord ZDR est renouvelé chaque mois. L’accord actuel est valable jusqu’au 31 août 2026.
---
diff --git a/packages/web/src/content/docs/fr/zen.mdx b/packages/web/src/content/docs/fr/zen.mdx
index 24fa7341d905..7a5d5bcf7b25 100644
--- a/packages/web/src/content/docs/fr/zen.mdx
+++ b/packages/web/src/content/docs/fr/zen.mdx
@@ -86,8 +86,8 @@ Vous pouvez également accéder à nos modèles via les points de terminaison AP
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/go.mdx b/packages/web/src/content/docs/go.mdx
index 29413ac11205..507c901a76e4 100644
--- a/packages/web/src/content/docs/go.mdx
+++ b/packages/web/src/content/docs/go.mdx
@@ -70,6 +70,7 @@ The current list of models includes:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -106,7 +107,8 @@ The table below provides an estimated request count based on typical Go usage pa
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -126,6 +128,7 @@ The estimates are based on observed request patterns:
- MiniMax M2.7 — 300 input, 55,000 cached, 125 output tokens per request
- MiMo-V2.5 — 830 input, 71,500 cached, 295 output tokens per request
- MiMo-V2.5-Pro — 790 input, 86,000 cached, 305 output tokens per request
+- Qwen3.8 Max — 420 input, 66,000 cached, 200 output tokens per request
- 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
@@ -148,6 +151,7 @@ The estimates are also based on the following prices per 1M tokens and the month
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -207,6 +211,7 @@ You can also access Go models through the following API endpoints.
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -241,17 +246,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Not used | 0 days |
| MiMo-V2.5-Pro | Not used | 0 days |
| MiMo-V2.5 | Not used | 0 days |
+| Qwen3.8 Max | Not used | 0 days |
| Qwen3.7 Max | Not used | 0 days |
| Qwen3.7 Plus | Not used | 0 days |
| Qwen3.6 Plus | Not used | 0 days |
| MiniMax M3 | Not used | 0 days |
| MiniMax M2.7 | Not used | 0 days |
| DeepSeek V4 Pro | Not used | 0 days |
-| DeepSeek V4 Flash | Used | No agreement |
+| DeepSeek V4 Flash | Not used | 0 days |
| Hy3 | Not used | 0 days |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Abuse monitoring logs are generated for all API feature usage and retained for up to 30 days. [Learn more](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** ZDR agreement is renewed monthly. The current agreement is valid through August 31, 2026.
---
diff --git a/packages/web/src/content/docs/it/go.mdx b/packages/web/src/content/docs/it/go.mdx
index 92726425c85f..a724041640c4 100644
--- a/packages/web/src/content/docs/it/go.mdx
+++ b/packages/web/src/content/docs/it/go.mdx
@@ -68,6 +68,7 @@ L'elenco attuale dei modelli include:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -104,7 +105,8 @@ La tabella seguente fornisce una stima del conteggio delle richieste in base a p
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -122,6 +124,7 @@ Le stime si basano sui pattern di richieste osservati:
- DeepSeek V4 Flash — 790 di input, 68.000 in cache, 280 token di output per richiesta
- MiniMax M3 — 510 di input, 56.000 in cache, 190 token di output per richiesta
- MiniMax M2.7 — 300 di input, 55.000 in cache, 125 token di output per richiesta
+- Qwen3.8 Max — 420 di input, 66.000 in cache, 200 token di output per richiesta
- 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
@@ -146,6 +149,7 @@ Le stime si basano anche sui seguenti prezzi per 1M token e sull'utilizzo mensil
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -205,6 +209,7 @@ Puoi anche accedere ai modelli Go tramite i seguenti endpoint API.
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -239,17 +244,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Non utilizzato | 0 giorni |
| MiMo-V2.5-Pro | Non utilizzato | 0 giorni |
| MiMo-V2.5 | Non utilizzato | 0 giorni |
+| Qwen3.8 Max | Non utilizzato | 0 giorni |
| Qwen3.7 Max | Non utilizzato | 0 giorni |
| Qwen3.7 Plus | Non utilizzato | 0 giorni |
| Qwen3.6 Plus | Non utilizzato | 0 giorni |
| MiniMax M3 | Non utilizzato | 0 giorni |
| MiniMax M2.7 | Non utilizzato | 0 giorni |
| DeepSeek V4 Pro | Non utilizzato | 0 giorni |
-| DeepSeek V4 Flash | Utilizzato | Nessun accordo |
+| DeepSeek V4 Flash | Non utilizzato | 0 giorni |
| Hy3 | Non utilizzato | 0 giorni |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** I log di monitoraggio degli abusi vengono generati per l'utilizzo di tutte le funzionalità API e conservati per un massimo di 30 giorni. [Scopri di più](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** L'accordo ZDR viene rinnovato mensilmente. L'accordo attuale è valido fino al 31 agosto 2026.
---
diff --git a/packages/web/src/content/docs/it/zen.mdx b/packages/web/src/content/docs/it/zen.mdx
index 3e3891b79d8b..941db5be9465 100644
--- a/packages/web/src/content/docs/it/zen.mdx
+++ b/packages/web/src/content/docs/it/zen.mdx
@@ -95,8 +95,8 @@ Puoi anche accedere ai nostri modelli tramite i seguenti endpoint API.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/ja/go.mdx b/packages/web/src/content/docs/ja/go.mdx
index 84393416561b..963a36b1cc04 100644
--- a/packages/web/src/content/docs/ja/go.mdx
+++ b/packages/web/src/content/docs/ja/go.mdx
@@ -60,6 +60,7 @@ OpenCode Goをサブスクライブできるのは、1つのワークスペー
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ OpenCode Goには以下の制限が含まれています:
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -114,6 +116,7 @@ OpenCode Goには以下の制限が含まれています:
- DeepSeek V4 Flash — リクエストあたり 入力 790トークン、キャッシュ 68,000トークン、出力 280トークン
- MiniMax M3 — リクエストあたり 入力 510トークン、キャッシュ 56,000トークン、出力 190トークン
- MiniMax M2.7 — リクエストあたり 入力 300トークン、キャッシュ 55,000トークン、出力 125トークン
+- Qwen3.8 Max — リクエストあたり 入力 420トークン、キャッシュ 66,000トークン、出力 200トークン
- Qwen3.7 Max — リクエストあたり 入力 420トークン、キャッシュ 66,000トークン、出力 200トークン
- Qwen3.7 Plus — リクエストあたり 入力 500トークン、キャッシュ 57,000トークン、出力 190トークン
- Qwen3.6 Plus — リクエストあたり 入力 500トークン、キャッシュ 57,000トークン、出力 190トークン
@@ -138,6 +141,7 @@ OpenCode Goには以下の制限が含まれています:
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ Goでは月額$10を支払い、その6倍の利用枠を提供することを
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | 使用なし | 0日 |
| MiMo-V2.5-Pro | 使用なし | 0日 |
| MiMo-V2.5 | 使用なし | 0日 |
+| Qwen3.8 Max | 使用なし | 0日 |
| Qwen3.7 Max | 使用なし | 0日 |
| Qwen3.7 Plus | 使用なし | 0日 |
| Qwen3.6 Plus | 使用なし | 0日 |
| MiniMax M3 | 使用なし | 0日 |
| MiniMax M2.7 | 使用なし | 0日 |
| DeepSeek V4 Pro | 使用なし | 0日 |
-| DeepSeek V4 Flash | 使用あり | 契約なし |
+| DeepSeek V4 Flash | 使用なし | 0日 |
| Hy3 | 使用なし | 0日 |
- **Grok 4.5:** ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。[詳しく見る](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
- **GPT 5.6 Luna:** 不正使用監視ログはすべてのAPI機能の使用時に生成され、最大30日間保持されます。[詳しく見る](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
+- **DeepSeek V4 Flash:** ZDR契約は毎月更新されます。現在の契約は2026年8月31日まで有効です。
---
diff --git a/packages/web/src/content/docs/ja/zen.mdx b/packages/web/src/content/docs/ja/zen.mdx
index f61f826f63c1..73b8d5a18733 100644
--- a/packages/web/src/content/docs/ja/zen.mdx
+++ b/packages/web/src/content/docs/ja/zen.mdx
@@ -86,8 +86,8 @@ OpenCode Zen は、OpenCode のほかのプロバイダーと同じように動
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/ko/go.mdx b/packages/web/src/content/docs/ko/go.mdx
index 30e06f9cc4f5..29693cdb6aa1 100644
--- a/packages/web/src/content/docs/ko/go.mdx
+++ b/packages/web/src/content/docs/ko/go.mdx
@@ -60,6 +60,7 @@ workspace당 한 명의 멤버만 OpenCode Go를 구독할 수 있습니다.
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -114,6 +116,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
- DeepSeek V4 Flash — 요청당 입력 790, 캐시 68,000, 출력 토큰 280
- MiniMax M3 — 요청당 입력 510, 캐시 56,000, 출력 토큰 190
- MiniMax M2.7 — 요청당 입력 300, 캐시 55,000, 출력 토큰 125
+- Qwen3.8 Max — 요청당 입력 420, 캐시 66,000, 출력 토큰 200
- Qwen3.7 Max — 요청당 입력 420, 캐시 66,000, 출력 토큰 200
- Qwen3.7 Plus — 요청당 입력 500, 캐시 57,000, 출력 토큰 190
- Qwen3.6 Plus — 요청당 입력 500, 캐시 57,000, 출력 토큰 190
@@ -138,6 +141,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ Go에서는 월 $10를 지불하며, 저희는 그 6배의 사용량을 제공
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | 사용되지 않음 | 0일 |
| MiMo-V2.5-Pro | 사용되지 않음 | 0일 |
| MiMo-V2.5 | 사용되지 않음 | 0일 |
+| Qwen3.8 Max | 사용되지 않음 | 0일 |
| Qwen3.7 Max | 사용되지 않음 | 0일 |
| Qwen3.7 Plus | 사용되지 않음 | 0일 |
| Qwen3.6 Plus | 사용되지 않음 | 0일 |
| MiniMax M3 | 사용되지 않음 | 0일 |
| MiniMax M2.7 | 사용되지 않음 | 0일 |
| DeepSeek V4 Pro | 사용되지 않음 | 0일 |
-| DeepSeek V4 Flash | 사용됨 | 합의 없음 |
+| DeepSeek V4 Flash | 사용되지 않음 | 0일 |
| Hy3 | 사용되지 않음 | 0일 |
- **Grok 4.5:** ZDR은 저장된 데이터에 의존하는 중요한 API 기능(상태 저장형 Responses API, Files and Collections, Batch API 포함)을 비활성화합니다. [자세히 알아보기](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
- **GPT 5.6 Luna:** 모든 API 기능 사용에 대해 악용 모니터링 로그가 생성되며 최대 30일 동안 보존됩니다. [자세히 알아보기](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** ZDR 계약은 매월 갱신됩니다. 현재 계약은 2026년 8월 31일까지 유효합니다.
---
diff --git a/packages/web/src/content/docs/ko/zen.mdx b/packages/web/src/content/docs/ko/zen.mdx
index b112aa742d85..474bd38ff4c4 100644
--- a/packages/web/src/content/docs/ko/zen.mdx
+++ b/packages/web/src/content/docs/ko/zen.mdx
@@ -86,8 +86,8 @@ OpenCode Zen은 OpenCode의 다른 provider와 똑같이 작동합니다.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/nb/go.mdx b/packages/web/src/content/docs/nb/go.mdx
index bc13cc094688..afcc39e19b68 100644
--- a/packages/web/src/content/docs/nb/go.mdx
+++ b/packages/web/src/content/docs/nb/go.mdx
@@ -70,6 +70,7 @@ Den nåværende listen over modeller inkluderer:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -106,7 +107,8 @@ Tabellen nedenfor gir et estimert antall forespørsler basert på typiske bruksm
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -124,6 +126,7 @@ Estimatene er basert på observerte forespørselsmønstre:
- DeepSeek V4 Flash — 790 input, 68 000 bufret, 280 output-tokens per forespørsel
- MiniMax M3 — 510 input, 56 000 bufret, 190 output-tokens per forespørsel
- MiniMax M2.7 — 300 input, 55 000 bufret, 125 output-tokens per forespørsel
+- Qwen3.8 Max — 420 input, 66 000 bufret, 200 output-tokens per forespørsel
- 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
@@ -148,6 +151,7 @@ Estimatene er også basert på følgende priser per 1M tokens og den månedlige
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -207,6 +211,7 @@ Du kan også få tilgang til Go-modeller gjennom følgende API-endepunkter.
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -241,17 +246,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Brukes ikke | 0 dager |
| MiMo-V2.5-Pro | Brukes ikke | 0 dager |
| MiMo-V2.5 | Brukes ikke | 0 dager |
+| Qwen3.8 Max | Brukes ikke | 0 dager |
| Qwen3.7 Max | Brukes ikke | 0 dager |
| Qwen3.7 Plus | Brukes ikke | 0 dager |
| Qwen3.6 Plus | Brukes ikke | 0 dager |
| MiniMax M3 | Brukes ikke | 0 dager |
| MiniMax M2.7 | Brukes ikke | 0 dager |
| DeepSeek V4 Pro | Brukes ikke | 0 dager |
-| DeepSeek V4 Flash | Brukes | Ingen avtale |
+| DeepSeek V4 Flash | Brukes ikke | 0 dager |
| Hy3 | Brukes ikke | 0 dager |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Logger for overvåking av misbruk genereres for all bruk av API-funksjoner og oppbevares i opptil 30 dager. [Les mer](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** ZDR-avtalen fornyes månedlig. Den gjeldende avtalen er gyldig til og med 31. august 2026.
---
diff --git a/packages/web/src/content/docs/nb/zen.mdx b/packages/web/src/content/docs/nb/zen.mdx
index 379535eb7ca3..74cc45b3a979 100644
--- a/packages/web/src/content/docs/nb/zen.mdx
+++ b/packages/web/src/content/docs/nb/zen.mdx
@@ -95,8 +95,8 @@ Du kan også få tilgang til modellene våre gjennom følgende API-endepunkter.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/pl/go.mdx b/packages/web/src/content/docs/pl/go.mdx
index c15a2c11e53f..f21573696499 100644
--- a/packages/web/src/content/docs/pl/go.mdx
+++ b/packages/web/src/content/docs/pl/go.mdx
@@ -64,6 +64,7 @@ Obecna lista modeli obejmuje:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -100,7 +101,8 @@ Poniższa tabela przedstawia szacunkową liczbę żądań na podstawie typowych
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -118,6 +120,7 @@ Szacunki te opierają się na zaobserwowanych wzorcach żądań:
- DeepSeek V4 Flash — 790 tokenów wejściowych, 68 000 w pamięci podręcznej, 280 tokenów wyjściowych na żądanie
- MiniMax M3 — 510 tokenów wejściowych, 56 000 w pamięci podręcznej, 190 tokenów wyjściowych na żądanie
- MiniMax M2.7 — 300 tokenów wejściowych, 55 000 w pamięci podręcznej, 125 tokenów wyjściowych na żądanie
+- Qwen3.8 Max — 420 tokenów wejściowych, 66 000 w pamięci podręcznej, 200 tokenów wyjściowych na żądanie
- 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
@@ -142,6 +145,7 @@ Szacunki opierają się również na następujących cenach za 1M tokenów oraz
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -199,6 +203,7 @@ Możesz również uzyskać dostęp do modeli Go za pośrednictwem następującyc
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -233,17 +238,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Niewykorzystywane | 0 dni |
| MiMo-V2.5-Pro | Niewykorzystywane | 0 dni |
| MiMo-V2.5 | Niewykorzystywane | 0 dni |
+| Qwen3.8 Max | Niewykorzystywane | 0 dni |
| Qwen3.7 Max | Niewykorzystywane | 0 dni |
| Qwen3.7 Plus | Niewykorzystywane | 0 dni |
| Qwen3.6 Plus | Niewykorzystywane | 0 dni |
| MiniMax M3 | Niewykorzystywane | 0 dni |
| MiniMax M2.7 | Niewykorzystywane | 0 dni |
| DeepSeek V4 Pro | Niewykorzystywane | 0 dni |
-| DeepSeek V4 Flash | Wykorzystywane | Brak umowy |
+| DeepSeek V4 Flash | Niewykorzystywane | 0 dni |
| Hy3 | Niewykorzystywane | 0 dni |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Dzienniki monitorowania nadużyć są generowane dla każdego użycia funkcji API i przechowywane przez maksymalnie 30 dni. [Dowiedz się więcej](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** Umowa ZDR jest odnawiana co miesiąc. Obecna umowa obowiązuje do 31 sierpnia 2026 r.
---
diff --git a/packages/web/src/content/docs/pl/zen.mdx b/packages/web/src/content/docs/pl/zen.mdx
index a2df69cadf09..c6c8ba7fb4f2 100644
--- a/packages/web/src/content/docs/pl/zen.mdx
+++ b/packages/web/src/content/docs/pl/zen.mdx
@@ -95,8 +95,8 @@ Możesz też uzyskać dostęp do naszych modeli przez poniższe endpointy API.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/pt-br/go.mdx b/packages/web/src/content/docs/pt-br/go.mdx
index 20f4b08b849b..fcfc8ed608d4 100644
--- a/packages/web/src/content/docs/pt-br/go.mdx
+++ b/packages/web/src/content/docs/pt-br/go.mdx
@@ -70,6 +70,7 @@ A lista atual de modelos inclui:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -106,7 +107,8 @@ A tabela abaixo fornece uma contagem estimada de requisições com base nos padr
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -124,6 +126,7 @@ As estimativas se baseiam nos padrões de requisições observados:
- DeepSeek V4 Flash — 790 tokens de entrada, 68.000 em cache, 280 tokens de saída por requisição
- MiniMax M3 — 510 tokens de entrada, 56.000 em cache, 190 tokens de saída por requisição
- MiniMax M2.7 — 300 tokens de entrada, 55.000 em cache, 125 tokens de saída por requisição
+- Qwen3.8 Max — 420 tokens de entrada, 66.000 em cache, 200 tokens de saída por requisição
- 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
@@ -148,6 +151,7 @@ As estimativas também se baseiam nos seguintes preços por 1M tokens e no uso m
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -207,6 +211,7 @@ Você também pode acessar os modelos do Go através dos seguintes endpoints de
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -241,17 +246,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Não usado | 0 dias |
| MiMo-V2.5-Pro | Não usado | 0 dias |
| MiMo-V2.5 | Não usado | 0 dias |
+| Qwen3.8 Max | Não usado | 0 dias |
| Qwen3.7 Max | Não usado | 0 dias |
| Qwen3.7 Plus | Não usado | 0 dias |
| Qwen3.6 Plus | Não usado | 0 dias |
| MiniMax M3 | Não usado | 0 dias |
| MiniMax M2.7 | Não usado | 0 dias |
| DeepSeek V4 Pro | Não usado | 0 dias |
-| DeepSeek V4 Flash | Usado | Sem acordo |
+| DeepSeek V4 Flash | Não usado | 0 dias |
| Hy3 | Não usado | 0 dias |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Logs de monitoramento de abuso são gerados para todo uso de recursos da API e retidos por até 30 dias. [Saiba mais](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** O acordo de ZDR é renovado mensalmente. O acordo atual é válido até 31 de agosto de 2026.
---
diff --git a/packages/web/src/content/docs/pt-br/zen.mdx b/packages/web/src/content/docs/pt-br/zen.mdx
index a657b88bd1d1..fa19e0e7d2ac 100644
--- a/packages/web/src/content/docs/pt-br/zen.mdx
+++ b/packages/web/src/content/docs/pt-br/zen.mdx
@@ -86,8 +86,8 @@ Você também pode acessar nossos modelos pelos seguintes endpoints de API.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/ru/go.mdx b/packages/web/src/content/docs/ru/go.mdx
index dd3a272f0a27..4df18953ef64 100644
--- a/packages/web/src/content/docs/ru/go.mdx
+++ b/packages/web/src/content/docs/ru/go.mdx
@@ -70,6 +70,7 @@ OpenCode Go работает так же, как и любой другой пр
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -106,7 +107,8 @@ OpenCode Go включает следующие лимиты:
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -124,6 +126,7 @@ OpenCode Go включает следующие лимиты:
- DeepSeek V4 Flash — 790 входных, 68,000 кешированных, 280 выходных токенов на запрос
- MiniMax M3 — 510 входных, 56,000 кешированных, 190 выходных токенов на запрос
- MiniMax M2.7 — 300 входных, 55,000 кешированных, 125 выходных токенов на запрос
+- Qwen3.8 Max — 420 входных, 66,000 кешированных, 200 выходных токенов на запрос
- Qwen3.7 Max — 420 входных, 66,000 кешированных, 200 выходных токенов на запрос
- Qwen3.7 Plus — 500 входных, 57,000 кешированных, 190 выходных токенов на запрос
- Qwen3.6 Plus — 500 входных, 57,000 кешированных, 190 выходных токенов на запрос
@@ -148,6 +151,7 @@ OpenCode Go включает следующие лимиты:
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -207,6 +211,7 @@ OpenCode Go включает следующие лимиты:
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -241,17 +246,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Не используется | 0 дней |
| MiMo-V2.5-Pro | Не используется | 0 дней |
| MiMo-V2.5 | Не используется | 0 дней |
+| Qwen3.8 Max | Не используется | 0 дней |
| Qwen3.7 Max | Не используется | 0 дней |
| Qwen3.7 Plus | Не используется | 0 дней |
| Qwen3.6 Plus | Не используется | 0 дней |
| MiniMax M3 | Не используется | 0 дней |
| MiniMax M2.7 | Не используется | 0 дней |
| DeepSeek V4 Pro | Не используется | 0 дней |
-| DeepSeek V4 Flash | Используется | Нет соглашения |
+| DeepSeek V4 Flash | Не используется | 0 дней |
| Hy3 | Не используется | 0 дней |
- **Grok 4.5:** ZDR отключает важные функции API, зависящие от сохраненных данных, включая Responses API с сохранением состояния, Files and Collections и Batch API. [Подробнее](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
- **GPT 5.6 Luna:** Журналы мониторинга злоупотреблений создаются при любом использовании функций API и хранятся до 30 дней. [Подробнее](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** Соглашение ZDR продлевается ежемесячно. Текущее соглашение действует до 31 августа 2026 года.
---
diff --git a/packages/web/src/content/docs/ru/zen.mdx b/packages/web/src/content/docs/ru/zen.mdx
index 4333abf0e5fe..f9633ac32302 100644
--- a/packages/web/src/content/docs/ru/zen.mdx
+++ b/packages/web/src/content/docs/ru/zen.mdx
@@ -95,8 +95,8 @@ OpenCode Zen работает как любой другой провайдер
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/th/go.mdx b/packages/web/src/content/docs/th/go.mdx
index 38c0d9ebaac0..f241b77ee0b0 100644
--- a/packages/web/src/content/docs/th/go.mdx
+++ b/packages/web/src/content/docs/th/go.mdx
@@ -60,6 +60,7 @@ OpenCode Go ทำงานเหมือนกับผู้ให้บร
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -114,6 +116,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
- DeepSeek V4 Flash — 790 input, 68,000 cached, 280 output tokens ต่อ request
- MiniMax M3 — 510 input, 56,000 cached, 190 output tokens ต่อ request
- MiniMax M2.7 — 300 input, 55,000 cached, 125 output tokens ต่อ request
+- Qwen3.8 Max — 420 input, 66,000 cached, 200 output tokens ต่อ request
- 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
@@ -138,6 +141,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | ไม่นำไปใช้ | 0 วัน |
| MiMo-V2.5-Pro | ไม่นำไปใช้ | 0 วัน |
| MiMo-V2.5 | ไม่นำไปใช้ | 0 วัน |
+| Qwen3.8 Max | ไม่นำไปใช้ | 0 วัน |
| Qwen3.7 Max | ไม่นำไปใช้ | 0 วัน |
| Qwen3.7 Plus | ไม่นำไปใช้ | 0 วัน |
| Qwen3.6 Plus | ไม่นำไปใช้ | 0 วัน |
| MiniMax M3 | ไม่นำไปใช้ | 0 วัน |
| MiniMax M2.7 | ไม่นำไปใช้ | 0 วัน |
| DeepSeek V4 Pro | ไม่นำไปใช้ | 0 วัน |
-| DeepSeek V4 Flash | นำไปใช้ | ไม่มีข้อตกลง |
+| DeepSeek V4 Flash | ไม่นำไปใช้ | 0 วัน |
| Hy3 | ไม่นำไปใช้ | 0 วัน |
- **Grok 4.5:** ZDR ปิดใช้งานฟีเจอร์ API สำคัญที่ต้องอาศัยข้อมูลที่จัดเก็บไว้ ซึ่งรวมถึง Responses API แบบมีสถานะ, Files and Collections และ Batch API [ดูข้อมูลเพิ่มเติม](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)
- **GPT 5.6 Luna:** ระบบจะสร้างบันทึกการตรวจสอบการใช้งานในทางที่ผิดสำหรับการใช้งานฟีเจอร์ API ทั้งหมด และเก็บรักษาไว้นานสูงสุด 30 วัน [ดูข้อมูลเพิ่มเติม](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)
+- **DeepSeek V4 Flash:** ข้อตกลง ZDR จะต่ออายุทุกเดือน ข้อตกลงปัจจุบันมีผลใช้ถึงวันที่ 31 สิงหาคม 2026
---
diff --git a/packages/web/src/content/docs/th/zen.mdx b/packages/web/src/content/docs/th/zen.mdx
index 99ba106a3cff..2c256704ae99 100644
--- a/packages/web/src/content/docs/th/zen.mdx
+++ b/packages/web/src/content/docs/th/zen.mdx
@@ -88,8 +88,8 @@ OpenCode Zen ทำงานเหมือน provider อื่น ๆ ใน
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/tr/go.mdx b/packages/web/src/content/docs/tr/go.mdx
index a8861dde2425..b480e0b2e5ce 100644
--- a/packages/web/src/content/docs/tr/go.mdx
+++ b/packages/web/src/content/docs/tr/go.mdx
@@ -60,6 +60,7 @@ Mevcut model listesi şunları içerir:
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ Aşağıdaki tablo, tipik Go kullanım modellerine dayalı tahmini bir istek say
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -114,6 +116,7 @@ Tahminler, gözlemlenen istek modellerine dayanır:
- DeepSeek V4 Flash — İstek başına 790 girdi, 68.000 önbelleğe alınmış, 280 çıktı token'ı
- MiniMax M3 — İstek başına 510 girdi, 56.000 önbelleğe alınmış, 190 çıktı token'ı
- MiniMax M2.7 — İstek başına 300 girdi, 55.000 önbelleğe alınmış, 125 çıktı token'ı
+- Qwen3.8 Max — İstek başına 420 girdi, 66.000 önbelleğe alınmış, 200 çıktı token'ı
- 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'ı
@@ -138,6 +141,7 @@ Tahminler ayrıca 1M token başına aşağıdaki fiyatlara ve her modelle birlik
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ Go modellerine aşağıdaki API uç noktaları aracılığıyla da erişebilirsi
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | Kullanılmaz | 0 gün |
| MiMo-V2.5-Pro | Kullanılmaz | 0 gün |
| MiMo-V2.5 | Kullanılmaz | 0 gün |
+| Qwen3.8 Max | Kullanılmaz | 0 gün |
| Qwen3.7 Max | Kullanılmaz | 0 gün |
| Qwen3.7 Plus | Kullanılmaz | 0 gün |
| Qwen3.6 Plus | Kullanılmaz | 0 gün |
| MiniMax M3 | Kullanılmaz | 0 gün |
| MiniMax M2.7 | Kullanılmaz | 0 gün |
| DeepSeek V4 Pro | Kullanılmaz | 0 gün |
-| DeepSeek V4 Flash | Kullanılır | Anlaşma yok |
+| DeepSeek V4 Flash | Kullanılmaz | 0 gün |
| Hy3 | Kullanılmaz | 0 gün |
- **Grok 4.5:** 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).
- **GPT 5.6 Luna:** Tüm API özelliklerinin kullanımı için kötüye kullanım izleme günlükleri oluşturulur ve 30 güne kadar saklanır. [Daha fazla bilgi](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
+- **DeepSeek V4 Flash:** ZDR anlaşması aylık olarak yenilenir. Mevcut anlaşma 31 Ağustos 2026 tarihine kadar geçerlidir.
---
diff --git a/packages/web/src/content/docs/tr/zen.mdx b/packages/web/src/content/docs/tr/zen.mdx
index ed5ea7d5fe33..83f5cfea780e 100644
--- a/packages/web/src/content/docs/tr/zen.mdx
+++ b/packages/web/src/content/docs/tr/zen.mdx
@@ -86,8 +86,8 @@ Modellerimize aşağıdaki API uç noktaları aracılığıyla da erişebilirsin
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx
index 6d57973c55dc..6be3aa7d9928 100644
--- a/packages/web/src/content/docs/zen.mdx
+++ b/packages/web/src/content/docs/zen.mdx
@@ -95,8 +95,8 @@ You can also access our models through the following API endpoints.
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/zh-cn/go.mdx b/packages/web/src/content/docs/zh-cn/go.mdx
index 806bcd4b2b72..ecf553f33dd0 100644
--- a/packages/web/src/content/docs/zh-cn/go.mdx
+++ b/packages/web/src/content/docs/zh-cn/go.mdx
@@ -60,6 +60,7 @@ OpenCode Go 的工作方式与 OpenCode 中的其他提供商一样。
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ OpenCode Go 包含以下限制:
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -116,6 +118,7 @@ OpenCode Go 包含以下限制:
- MiMo-V2.5-Pro — 每次请求 790 个输入 token,86,000 个缓存 token,305 个输出 token
- MiniMax M3 — 每次请求 510 个输入 token,56,000 个缓存 token,190 个输出 token
- MiniMax M2.7 — 每次请求 300 个输入 token,55,000 个缓存 token,125 个输出 token
+- Qwen3.8 Max — 每次请求 420 个输入 token,66,000 个缓存 token,200 个输出 token
- 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
@@ -138,6 +141,7 @@ OpenCode Go 包含以下限制:
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ OpenCode Go 包含以下限制:
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | 不使用 | 0 天 |
| MiMo-V2.5-Pro | 不使用 | 0 天 |
| MiMo-V2.5 | 不使用 | 0 天 |
+| Qwen3.8 Max | 不使用 | 0 天 |
| Qwen3.7 Max | 不使用 | 0 天 |
| Qwen3.7 Plus | 不使用 | 0 天 |
| Qwen3.6 Plus | 不使用 | 0 天 |
| MiniMax M3 | 不使用 | 0 天 |
| MiniMax M2.7 | 不使用 | 0 天 |
| DeepSeek V4 Pro | 不使用 | 0 天 |
-| DeepSeek V4 Flash | 使用 | 无协议 |
+| DeepSeek V4 Flash | 不使用 | 0 天 |
| Hy3 | 不使用 | 0 天 |
- **Grok 4.5:** ZDR 会禁用依赖所存储数据的重要 API 功能,包括有状态的 Responses API、Files and Collections 和 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
- **GPT 5.6 Luna:** 所有 API 功能的使用都会生成滥用监控日志,并最多保留 30 天。[了解更多](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
+- **DeepSeek V4 Flash:** ZDR 协议每月续签。当前协议有效期至 2026 年 8 月 31 日。
---
diff --git a/packages/web/src/content/docs/zh-cn/zen.mdx b/packages/web/src/content/docs/zh-cn/zen.mdx
index 4838ec4ed5c1..f4bb9cc5022e 100644
--- a/packages/web/src/content/docs/zh-cn/zen.mdx
+++ b/packages/web/src/content/docs/zh-cn/zen.mdx
@@ -86,8 +86,8 @@ OpenCode Zen 的工作方式与 OpenCode 中的任何其他提供商相同。
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
diff --git a/packages/web/src/content/docs/zh-tw/go.mdx b/packages/web/src/content/docs/zh-tw/go.mdx
index 2959f63fa284..53da06c772f1 100644
--- a/packages/web/src/content/docs/zh-tw/go.mdx
+++ b/packages/web/src/content/docs/zh-tw/go.mdx
@@ -60,6 +60,7 @@ OpenCode Go 的運作方式與 OpenCode 中的任何其他供應商相同。
- **MiMo-V2.5-Pro**
- **MiniMax M3**
- **MiniMax M2.7**
+- **Qwen3.8 Max**
- **Qwen3.7 Max**
- **Qwen3.7 Plus**
- **Qwen3.6 Plus**
@@ -96,7 +97,8 @@ OpenCode Go 包含以下限制:
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
-| Qwen3.7 Max | 950 | 2,390 | 4,770 |
+| Qwen3.8 Max | 160 | 400 | 810 |
+| Qwen3.7 Max | 340 | 840 | 1,690 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
@@ -114,6 +116,7 @@ OpenCode Go 包含以下限制:
- DeepSeek V4 Flash — 每次請求 790 個輸入 token、68,000 個快取 token、280 個輸出 token
- MiniMax M3 — 每次請求 510 個輸入 token、56,000 個快取 token、190 個輸出 token
- MiniMax M2.7 — 每次請求 300 個輸入 token、55,000 個快取 token、125 個輸出 token
+- Qwen3.8 Max — 每次請求 420 個輸入 token、66,000 個快取 token、200 個輸出 token
- 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
@@ -138,6 +141,7 @@ OpenCode Go 包含以下限制:
| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | $60 |
+| Qwen3.8 Max | $2.00 | $6.00 | $0.25 | $2.50 | $15 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | $60 |
| 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 |
@@ -195,6 +199,7 @@ OpenCode Go 包含以下限制:
| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
+| Qwen3.8 Max | qwen3.8-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
| 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` |
@@ -227,17 +232,19 @@ https://opencode.ai/zen/go/v1/models
| Kimi K2.6 | 不使用 | 0 天 |
| MiMo-V2.5-Pro | 不使用 | 0 天 |
| MiMo-V2.5 | 不使用 | 0 天 |
+| Qwen3.8 Max | 不使用 | 0 天 |
| Qwen3.7 Max | 不使用 | 0 天 |
| Qwen3.7 Plus | 不使用 | 0 天 |
| Qwen3.6 Plus | 不使用 | 0 天 |
| MiniMax M3 | 不使用 | 0 天 |
| MiniMax M2.7 | 不使用 | 0 天 |
| DeepSeek V4 Pro | 不使用 | 0 天 |
-| DeepSeek V4 Flash | 使用 | 無協議 |
+| DeepSeek V4 Flash | 不使用 | 0 天 |
| Hy3 | 不使用 | 0 天 |
- **Grok 4.5:** ZDR 會停用依賴儲存資料的重要 API 功能,包括具狀態的 Responses API、Files and Collections 與 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
- **GPT 5.6 Luna:** 所有 API 功能的使用都會產生濫用監控日誌,並保留最多 30 天。[了解更多](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
+- **DeepSeek V4 Flash:** ZDR 協議每月續簽。目前的協議有效至 2026 年 8 月 31 日。
---
diff --git a/packages/web/src/content/docs/zh-tw/zen.mdx b/packages/web/src/content/docs/zh-tw/zen.mdx
index 54a8fcc92bf8..60b87c88df12 100644
--- a/packages/web/src/content/docs/zh-tw/zen.mdx
+++ b/packages/web/src/content/docs/zh-tw/zen.mdx
@@ -90,8 +90,8 @@ OpenCode Zen 的運作方式和 OpenCode 中的其他供應商一樣。
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | `https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite` | `@ai-sdk/google` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
-| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
-| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
+| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
+| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |