From 36234c462cdd48e6eabd6be2dc16225103881760 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Wed, 3 Jun 2026 21:16:06 +0000 Subject: [PATCH 01/15] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index ff96c14cd43..086b0a5afb5 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-rQ8kz/fChREJWnwY2Jp2zp06TYesyd3hia44hdo8l+s=", - "aarch64-linux": "sha256-t5WKzAN8NRO/4g2l+4V5SatK/LO3ZPBfmKjJFf/MsD4=", - "aarch64-darwin": "sha256-QbNaxGNiKdJ0/mKaTUk392qsOvlRYVi5mTuMmFByEic=", - "x86_64-darwin": "sha256-lewm6WvqxphR+rvXz9e7ZKvgu98MH3cxosvQkz3mLuA=" + "x86_64-linux": "sha256-+jW0q5WKHBKJw6LgbT39XccrorJRcOkFtLfzrUGBMUU=", + "aarch64-linux": "sha256-ITpAwTHD6q3GQp/dYSJGt19ZSzja8ZrPdl4N+168ps4=", + "aarch64-darwin": "sha256-lY3gef57ASnYkMnYSRm0cj3uxdxARcT3jTWQ5zojuZY=", + "x86_64-darwin": "sha256-yHICQCPYYlJh4S+AyBnaEDK67U9affGBuddJiP/GzeM=" } } From 2c32f7e520abf35ffaa0a0d255547cdd624791ff Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Wed, 3 Jun 2026 17:05:57 -0500 Subject: [PATCH 02/15] fix(stats): count all go usage --- packages/stats/core/src/domain/inference.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stats/core/src/domain/inference.ts b/packages/stats/core/src/domain/inference.ts index f63c35da2ea..9a74daf958e 100644 --- a/packages/stats/core/src/domain/inference.ts +++ b/packages/stats/core/src/domain/inference.ts @@ -80,6 +80,7 @@ WITH normalized AS ( tokens_reasoning, tokens_cache_read, tokens_cache_write_5m, + tokens_cache_write_1h, cost_input_microcents, cost_output_microcents, cost_total_microcents, @@ -91,7 +92,6 @@ WITH normalized AS ( WHERE event_type = 'completions' AND model IS NOT NULL AND model <> '' - AND (strpos(COALESCE(user_agent, ''), 'ai-sdk') > 0 OR strpos(COALESCE(user_agent, ''), 'opencode') > 0) AND event_timestamp >= ${periodStartValue} AND event_timestamp < ${periodEndValue} ), filtered AS ( @@ -119,7 +119,7 @@ WITH normalized AS ( tokens_output, tokens_reasoning, tokens_cache_read, - COALESCE(tokens_cache_read, 0) + COALESCE(tokens_cache_write_5m, 0) + COALESCE(tokens_input, 0) + COALESCE(tokens_output, 0) AS tokens_total, + COALESCE(tokens_cache_read, 0) + COALESCE(tokens_cache_write_5m, 0) + COALESCE(tokens_cache_write_1h, 0) + COALESCE(tokens_input, 0) + COALESCE(tokens_output, 0) AS tokens_total, COALESCE(cost_input_microcents, cost_input * 1000000) AS cost_input_microcents, COALESCE(cost_output_microcents, cost_output * 1000000) AS cost_output_microcents, COALESCE(cost_total_microcents, cost_total * 1000000) AS cost_total_microcents From d3d4335509c246b97f4bf36d33524e0c250fdd48 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 3 Jun 2026 17:16:21 -0500 Subject: [PATCH 03/15] chore: remove zed extension and automation (#30628) --- .github/workflows/sync-zed-extension.yml | 35 ------ packages/extensions/zed/LICENSE | 1 - packages/extensions/zed/extension.toml | 36 ------ packages/extensions/zed/icons/opencode.svg | 3 - script/publish.ts | 7 -- script/raw-changelog.ts | 4 +- script/sync-zed.ts | 130 --------------------- 7 files changed, 1 insertion(+), 215 deletions(-) delete mode 100644 .github/workflows/sync-zed-extension.yml delete mode 120000 packages/extensions/zed/LICENSE delete mode 100644 packages/extensions/zed/extension.toml delete mode 100644 packages/extensions/zed/icons/opencode.svg delete mode 100755 script/sync-zed.ts diff --git a/.github/workflows/sync-zed-extension.yml b/.github/workflows/sync-zed-extension.yml deleted file mode 100644 index 6e4b44083c1..00000000000 --- a/.github/workflows/sync-zed-extension.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: "sync-zed-extension" - -on: - workflow_dispatch: - release: - types: [published] - -jobs: - zed: - name: Release Zed Extension - runs-on: blacksmith-4vcpu-ubuntu-2404 - steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - with: - fetch-depth: 0 - - - uses: ./.github/actions/setup-bun - - - name: Get version tag - id: get_tag - run: | - if [ "${{ github.event_name }}" = "release" ]; then - TAG="${{ github.event.release.tag_name }}" - else - TAG=$(git tag --list 'v[0-9]*.*' --sort=-version:refname | head -n 1) - fi - echo "tag=${TAG}" >> $GITHUB_OUTPUT - echo "Using tag: ${TAG}" - - - name: Sync Zed extension - run: | - ./script/sync-zed.ts ${{ steps.get_tag.outputs.tag }} - env: - ZED_EXTENSIONS_PAT: ${{ secrets.ZED_EXTENSIONS_PAT }} - ZED_PR_PAT: ${{ secrets.ZED_PR_PAT }} diff --git a/packages/extensions/zed/LICENSE b/packages/extensions/zed/LICENSE deleted file mode 120000 index 5853aaea53b..00000000000 --- a/packages/extensions/zed/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../../LICENSE \ No newline at end of file diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml deleted file mode 100644 index a669a3a5dc0..00000000000 --- a/packages/extensions/zed/extension.toml +++ /dev/null @@ -1,36 +0,0 @@ -id = "opencode" -name = "OpenCode" -description = "The open source coding agent." -version = "1.15.13" -schema_version = 1 -authors = ["Anomaly"] -repository = "https://github.com/anomalyco/opencode" - -[agent_servers.opencode] -name = "OpenCode" -icon = "./icons/opencode.svg" - -[agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.15.13/opencode-darwin-arm64.zip" -cmd = "./opencode" -args = ["acp"] - -[agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.15.13/opencode-darwin-x64.zip" -cmd = "./opencode" -args = ["acp"] - -[agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.15.13/opencode-linux-arm64.tar.gz" -cmd = "./opencode" -args = ["acp"] - -[agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.15.13/opencode-linux-x64.tar.gz" -cmd = "./opencode" -args = ["acp"] - -[agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.15.13/opencode-windows-x64.zip" -cmd = "./opencode.exe" -args = ["acp"] diff --git a/packages/extensions/zed/icons/opencode.svg b/packages/extensions/zed/icons/opencode.svg deleted file mode 100644 index fc001e49b5c..00000000000 --- a/packages/extensions/zed/icons/opencode.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/script/publish.ts b/script/publish.ts index 7e91eef762d..46a265d5e43 100755 --- a/script/publish.ts +++ b/script/publish.ts @@ -24,13 +24,6 @@ async function prepareReleaseFiles() { await Bun.file(file).write(pkg) } - const extensionToml = fileURLToPath(new URL("../packages/extensions/zed/extension.toml", import.meta.url)) - let toml = await Bun.file(extensionToml).text() - toml = toml.replace(/^version = "[^"]+"/m, `version = "${Script.version}"`) - toml = toml.replaceAll(/releases\/download\/v[^/]+\//g, `releases/download/v${Script.version}/`) - console.log("updated:", extensionToml) - await Bun.file(extensionToml).write(toml) - await $`bun install` await $`./packages/sdk/js/script/build.ts` } diff --git a/script/raw-changelog.ts b/script/raw-changelog.ts index c571de322a3..2ea76247d58 100644 --- a/script/raw-changelog.ts +++ b/script/raw-changelog.ts @@ -39,7 +39,6 @@ const sections = { tauri: "Desktop", sdk: "SDK", plugin: "SDK", - "extensions/zed": "Extensions", "extensions/vscode": "Extensions", github: "Extensions", } as const @@ -75,7 +74,7 @@ async function diff(base: string, head: string) { } function section(areas: Set) { - const priority = ["core", "tui", "app", "tauri", "sdk", "plugin", "extensions/zed", "extensions/vscode", "github"] + const priority = ["core", "tui", "app", "tauri", "sdk", "plugin", "extensions/vscode", "github"] for (const area of priority) { if (areas.has(area)) return sections[area as keyof typeof sections] } @@ -138,7 +137,6 @@ async function commits(from: string, to: string) { else if (file.startsWith("packages/desktop/src-tauri/")) areas.add("tauri") else if (file.startsWith("packages/desktop/") || file.startsWith("packages/app/")) areas.add("app") else if (file.startsWith("packages/sdk/") || file.startsWith("packages/plugin/")) areas.add("sdk") - else if (file.startsWith("packages/extensions/")) areas.add("extensions/zed") else if (file.startsWith("sdks/vscode/") || file.startsWith("github/")) areas.add("extensions/vscode") } diff --git a/script/sync-zed.ts b/script/sync-zed.ts deleted file mode 100755 index 68deb6356c2..00000000000 --- a/script/sync-zed.ts +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env bun - -import { $ } from "bun" -import { tmpdir } from "os" -import { join } from "path" - -const FORK_REPO = "anomalyco/zed-extensions" -const UPSTREAM_REPO = "zed-industries/extensions" -const EXTENSION_NAME = "opencode" - -async function main() { - const version = process.argv[2] - if (!version) throw new Error("Version argument required, ex: bun script/sync-zed.ts v1.0.52") - - const token = process.env.ZED_EXTENSIONS_PAT - if (!token) throw new Error("ZED_EXTENSIONS_PAT environment variable required") - - const prToken = process.env.ZED_PR_PAT - if (!prToken) throw new Error("ZED_PR_PAT environment variable required") - - const cleanVersion = version.replace(/^v/, "") - console.log(`📦 Syncing Zed extension for version ${cleanVersion}`) - - const commitSha = await $`git rev-parse ${version}`.text() - const sha = commitSha.trim() - console.log(`🔍 Found commit SHA: ${sha}`) - - const extensionToml = await $`git show ${version}:packages/extensions/zed/extension.toml`.text() - const parsed = Bun.TOML.parse(extensionToml) as { version: string } - const extensionVersion = parsed.version - - if (extensionVersion !== cleanVersion) { - throw new Error(`Version mismatch: extension.toml has ${extensionVersion} but tag is ${cleanVersion}`) - } - console.log(`✅ Version ${extensionVersion} matches tag`) - - // Clone the fork to a temp directory - const workDir = join(tmpdir(), `zed-extensions-${Date.now()}`) - console.log(`📁 Working in ${workDir}`) - - await $`git clone https://x-access-token:${token}@github.com/${FORK_REPO}.git ${workDir}` - process.chdir(workDir) - - // Configure git identity - await $`git config user.name "Aiden Cline"` - await $`git config user.email "63023139+rekram1-node@users.noreply.github.com "` - - // Sync fork with upstream (force reset to match exactly) - console.log(`🔄 Syncing fork with upstream...`) - await $`git remote add upstream https://github.com/${UPSTREAM_REPO}.git` - await $`git fetch upstream` - await $`git checkout main` - await $`git reset --hard upstream/main` - await $`git push origin main --force` - console.log(`✅ Fork synced (force reset to upstream)`) - - // Create a new branch - const branchName = `update-${EXTENSION_NAME}-${cleanVersion}` - console.log(`🌿 Creating branch ${branchName}`) - await $`git checkout -b ${branchName}` - - const submodulePath = `extensions/${EXTENSION_NAME}` - console.log(`📌 Updating submodule to commit ${sha}`) - await $`git submodule update --init ${submodulePath}` - process.chdir(submodulePath) - await $`git fetch` - await $`git checkout ${sha}` - process.chdir(workDir) - await $`git add ${submodulePath}` - - console.log(`📝 Updating extensions.toml`) - const extensionsTomlPath = "extensions.toml" - const extensionsToml = await Bun.file(extensionsTomlPath).text() - - const versionRegex = new RegExp(`(\\[${EXTENSION_NAME}\\][\\s\\S]*?)version = "[^"]+"`) - const updatedToml = extensionsToml.replace(versionRegex, `$1version = "${cleanVersion}"`) - - if (updatedToml === extensionsToml) { - throw new Error(`Failed to update version in extensions.toml - pattern not found`) - } - - await Bun.write(extensionsTomlPath, updatedToml) - await $`git add extensions.toml` - - const commitMessage = `Update ${EXTENSION_NAME} to v${cleanVersion}` - - await $`git commit -m ${commitMessage}` - console.log(`✅ Changes committed`) - - // Delete any existing branches for opencode updates - console.log(`🔍 Checking for existing branches...`) - const branches = await $`git ls-remote --heads https://x-access-token:${token}@github.com/${FORK_REPO}.git`.text() - const branchPattern = `refs/heads/update-${EXTENSION_NAME}-` - const oldBranches = branches - .split("\n") - .filter((line) => line.includes(branchPattern)) - .map((line) => line.split("refs/heads/")[1]) - .filter(Boolean) - - if (oldBranches.length > 0) { - console.log(`🗑️ Found ${oldBranches.length} old branch(es), deleting...`) - for (const branch of oldBranches) { - await $`git push https://x-access-token:${token}@github.com/${FORK_REPO}.git --delete ${branch}` - console.log(`✅ Deleted branch ${branch}`) - } - } - - console.log(`🚀 Pushing to fork...`) - await $`git push https://x-access-token:${token}@github.com/${FORK_REPO}.git ${branchName}` - - console.log(`📬 Creating pull request...`) - const prResult = - await $`gh pr create --repo ${UPSTREAM_REPO} --base main --head ${FORK_REPO.split("/")[0]}:${branchName} --title "Update ${EXTENSION_NAME} to v${cleanVersion}" --body "Updating OpenCode extension to v${cleanVersion}"` - .env({ ...process.env, GH_TOKEN: prToken }) - .nothrow() - - if (prResult.exitCode !== 0) { - console.error("stderr:", prResult.stderr.toString()) - throw new Error(`Failed with exit code ${prResult.exitCode}`) - } - - const prUrl = prResult.stdout.toString().trim() - console.log(`✅ Pull request created: ${prUrl}`) - console.log(`🎉 Done!`) -} - -main().catch((err) => { - console.error("❌ Error:", err.message) - process.exit(1) -}) From ee74dd83f565446d840787ee20832a1631f773fe Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 3 Jun 2026 17:43:47 -0500 Subject: [PATCH 04/15] fix(opencode): preserve variant for delegated tasks (#30630) --- packages/opencode/src/tool/task.ts | 3 +++ packages/opencode/test/tool/task.test.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index be36e8db93c..ca80d113c47 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -172,6 +172,7 @@ export const TaskTool = Tool.define( Effect.orDie, ) if (msg.info.role !== "assistant") return yield* Effect.fail(new Error("Not an assistant message")) + const variant = msg.info.variant const model = next.model ?? { modelID: msg.info.modelID, @@ -201,6 +202,7 @@ export const TaskTool = Tool.define( modelID: model.modelID, providerID: model.providerID, }, + variant: next.model ? undefined : variant, agent: next.name, tools: { ...(next.permission.some((rule) => rule.permission === "todowrite") ? {} : { todowrite: false }), @@ -221,6 +223,7 @@ export const TaskTool = Tool.define( .prompt({ sessionID: ctx.sessionID, agent: currentParent.agent ?? ctx.agent, + variant, parts: [ { type: "text", diff --git a/packages/opencode/test/tool/task.test.ts b/packages/opencode/test/tool/task.test.ts index b8d2accf9de..653bec4dbfa 100644 --- a/packages/opencode/test/tool/task.test.ts +++ b/packages/opencode/test/tool/task.test.ts @@ -81,6 +81,7 @@ const seed = Effect.fn("TaskToolTest.seed")(function* (title = "Pinned") { tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, modelID: ref.modelID, providerID: ref.providerID, + variant: "xhigh", time: { created: Date.now() }, } yield* session.updateMessage(assistant) @@ -242,6 +243,7 @@ describe("tool.task", () => { expect(result.metadata.sessionId).toBe(child.id) expect(result.output).toContain(``) expect(seen?.sessionID).toBe(child.id) + expect(seen?.variant).toBe("xhigh") }), ) @@ -586,6 +588,7 @@ describe("tool.task", () => { expect(waited.info?.status).toBe("completed") expect(waited.info?.output).toBe("second done") const notification = yield* Effect.promise(() => injected.promise) + expect(notification.variant).toBe("xhigh") expect(notification.parts[0]?.type).toBe("text") if (notification.parts[0]?.type === "text") expect(notification.parts[0].text).toContain("second done") }), From fa6ea8bd25f2cb08cd11c4d02f78d26486a63bba Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 3 Jun 2026 19:08:49 -0400 Subject: [PATCH 05/15] zen: update nvidia tos --- .opencode/command/translate.md | 2 +- packages/console/app/src/routes/zen/util/handler.ts | 3 +-- packages/console/function/src/log-processor.ts | 2 +- packages/web/src/content/docs/ar/zen.mdx | 2 +- packages/web/src/content/docs/bs/zen.mdx | 2 +- packages/web/src/content/docs/da/zen.mdx | 2 +- packages/web/src/content/docs/de/zen.mdx | 2 +- packages/web/src/content/docs/es/zen.mdx | 2 +- packages/web/src/content/docs/fr/zen.mdx | 2 +- packages/web/src/content/docs/it/zen.mdx | 2 +- packages/web/src/content/docs/ja/zen.mdx | 2 +- packages/web/src/content/docs/ko/zen.mdx | 2 +- packages/web/src/content/docs/nb/zen.mdx | 2 +- packages/web/src/content/docs/pl/zen.mdx | 2 +- packages/web/src/content/docs/pt-br/zen.mdx | 2 +- packages/web/src/content/docs/ru/zen.mdx | 2 +- packages/web/src/content/docs/th/zen.mdx | 2 +- packages/web/src/content/docs/tr/zen.mdx | 2 +- packages/web/src/content/docs/zen.mdx | 2 +- packages/web/src/content/docs/zh-cn/zen.mdx | 2 +- packages/web/src/content/docs/zh-tw/zen.mdx | 2 +- 21 files changed, 21 insertions(+), 22 deletions(-) diff --git a/.opencode/command/translate.md b/.opencode/command/translate.md index ed185b1e289..8d493f4a812 100644 --- a/.opencode/command/translate.md +++ b/.opencode/command/translate.md @@ -1,6 +1,6 @@ --- description: translate English to other languages -model: opencode/claude-opus-4-7 +model: opencode/claude-opus-4-8 --- run git diff and translate changed english doc and UI copy files to other international languages. Translate all languages in parallel to save time. diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index 4438688c22f..0f9c17944cb 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -112,6 +112,7 @@ export async function handler( client: ocClient, user_agent: userAgent, "model.variant": variant, + "model.tier": opts.modelList === "full" ? "zen" : "go", }) const zenData = ZenData.list(opts.modelList) const modelInfo = validateModel(zenData, model) @@ -678,12 +679,10 @@ export async function handler( ...(() => { if (data.billing.subscription) return { - isSubscription: true, subscription: data.billing.subscription.plan, } if (data.billing.lite) return { - isSubscription: true, subscription: "lite", } return {} diff --git a/packages/console/function/src/log-processor.ts b/packages/console/function/src/log-processor.ts index b499a2c874d..c26f98f7433 100644 --- a/packages/console/function/src/log-processor.ts +++ b/packages/console/function/src/log-processor.ts @@ -132,7 +132,7 @@ function toLakeEvent(time: string, data: Record) { error_cause2: string(data, "error.cause2"), api_key: string(data, "api_key"), workspace: string(data, "workspace"), - is_subscription: boolean(data, "isSubscription"), + is_subscription: boolean(data, "isSubscription"), // removed subscription: string(data, "subscription"), response_length: integer(data, "response_length"), time_to_first_byte: integer(data, "time_to_first_byte"), diff --git a/packages/web/src/content/docs/ar/zen.mdx b/packages/web/src/content/docs/ar/zen.mdx index 7f085afc958..926a6005182 100644 --- a/packages/web/src/content/docs/ar/zen.mdx +++ b/packages/web/src/content/docs/ar/zen.mdx @@ -235,7 +235,7 @@ https://opencode.ai/zen/v1/models - Big Pickle: خلال فترته المجانية، قد تُستخدم البيانات المجمعة لتحسين النموذج. - DeepSeek V4 Flash Free: خلال فترته المجانية، قد تُستخدم البيانات المجمعة لتحسين النموذج. - MiMo-V2.5 Free: خلال فترته المجانية، قد تُستخدم البيانات المجمعة لتحسين النموذج. -- Nemotron 3 Super Free (نقاط نهاية NVIDIA المجانية): يُقدَّم بموجب [شروط خدمة النسخة التجريبية من واجهة NVIDIA API](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). للاستخدام التجريبي فقط، وليس للإنتاج أو البيانات الحساسة. تقوم NVIDIA بتسجيل المطالبات والمخرجات لتحسين نماذجها وخدماتها. لا ترسل بيانات شخصية أو سرية. +- Nemotron 3 Super Free (نقاط نهاية NVIDIA المجانية): للاستخدام التجريبي فقط — لا ترسل بيانات شخصية أو سرية. يُسجَّل استخدامك لأغراض أمنية ولتحسين منتجات وخدمات NVIDIA. بيانات الجلسة المُسجَّلة لأغراض التحسين غير مرتبطة بهويتك أو بأي مُعرِّف دائم. لمزيد من المعلومات حول ممارسات معالجة البيانات لدينا، راجع [سياسة الخصوصية](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). بتفاعلك مع نقطة النهاية هذه، فإنك توافق على جمعنا لهذه المعلومات وتسجيلها واستخدامها وعلى [شروط خدمة النسخة التجريبية من واجهة NVIDIA API](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: يتم الاحتفاظ بالطلبات لمدة 30 يوما وفقا لـ [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: يتم الاحتفاظ بالطلبات لمدة 30 يوما وفقا لـ [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/bs/zen.mdx b/packages/web/src/content/docs/bs/zen.mdx index fee1609f0fd..46ffd079305 100644 --- a/packages/web/src/content/docs/bs/zen.mdx +++ b/packages/web/src/content/docs/bs/zen.mdx @@ -247,7 +247,7 @@ i ne koriste vaše podatke za treniranje modela, uz sljedeće izuzetke: - Big Pickle: Tokom besplatnog perioda, prikupljeni podaci mogu se koristiti za poboljšanje modela. - DeepSeek V4 Flash Free: Tokom besplatnog perioda, prikupljeni podaci mogu se koristiti za poboljšanje modela. - MiMo-V2.5 Free: Tokom besplatnog perioda, prikupljeni podaci mogu se koristiti za poboljšanje modela. -- Nemotron 3 Super Free (besplatni NVIDIA endpointi): Dostupan je prema [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Samo za probnu upotrebu, nije za produkciju niti osjetljive podatke. NVIDIA bilježi promptove i izlaze radi poboljšanja svojih modela i usluga. Nemojte slati lične ili povjerljive podatke. +- Nemotron 3 Super Free (besplatni NVIDIA endpointi): Samo za probnu upotrebu — nemojte slati lične ili povjerljive podatke. Vaše korištenje se bilježi radi sigurnosti i poboljšanja NVIDIA proizvoda i usluga. Zabilježeni podaci sesije koji se koriste u svrhu poboljšanja nisu povezani s vašim identitetom niti bilo kojim trajnim identifikatorom. Za više informacija o našim praksama obrade podataka pogledajte našu [Politiku privatnosti](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Interakcijom s ovim endpointom pristajete na naše prikupljanje, bilježenje i korištenje takvih informacija te na [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: Requests are retained for 30 days in accordance with [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Requests are retained for 30 days in accordance with [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/da/zen.mdx b/packages/web/src/content/docs/da/zen.mdx index 4eb2632d2c9..0d8975d867f 100644 --- a/packages/web/src/content/docs/da/zen.mdx +++ b/packages/web/src/content/docs/da/zen.mdx @@ -245,7 +245,7 @@ Alle vores modeller hostes i US. Vores udbydere følger en nul-opbevaringspoliti - Big Pickle: I den gratis periode kan indsamlede data blive brugt til at forbedre modellen. - DeepSeek V4 Flash Free: I den gratis periode kan indsamlede data blive brugt til at forbedre modellen. - MiMo-V2.5 Free: I den gratis periode kan indsamlede data blive brugt til at forbedre modellen. -- Nemotron 3 Super Free (gratis NVIDIA-endpoints): Leveres under [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Kun til prøvebrug, ikke til produktion eller følsomme data. Prompts og outputs logges af NVIDIA for at forbedre deres modeller og tjenester. Indsend ikke personlige eller fortrolige data. +- Nemotron 3 Super Free (gratis NVIDIA-endpoints): Kun til prøvebrug — indsend ikke personlige eller fortrolige data. Din brug logges af sikkerhedshensyn og for at forbedre NVIDIAs produkter og tjenester. De loggede sessionsdata, der bruges til forbedringsformål, er ikke knyttet til din identitet eller nogen vedvarende identifikator. For mere information om vores databehandlingspraksis, se vores [privatlivspolitik](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ved at interagere med dette endpoint giver du samtykke til vores indsamling, registrering og brug af sådanne oplysninger samt [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: Anmodninger opbevares i 30 dage i overensstemmelse med [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Anmodninger opbevares i 30 dage i overensstemmelse med [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/de/zen.mdx b/packages/web/src/content/docs/de/zen.mdx index ed9ef93b483..771e8bb3115 100644 --- a/packages/web/src/content/docs/de/zen.mdx +++ b/packages/web/src/content/docs/de/zen.mdx @@ -231,7 +231,7 @@ Alle unsere Modelle werden in den USA gehostet. Unsere Provider folgen einer Zer - Big Pickle: Während des kostenlosen Zeitraums können gesammelte Daten zur Verbesserung des Modells verwendet werden. - DeepSeek V4 Flash Free: Während des kostenlosen Zeitraums können gesammelte Daten zur Verbesserung des Modells verwendet werden. - MiMo-V2.5 Free: Während des kostenlosen Zeitraums können gesammelte Daten zur Verbesserung des Modells verwendet werden. -- Nemotron 3 Super Free (kostenlose NVIDIA-Endpunkte): Bereitgestellt gemäß den [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Nur für Testzwecke, nicht für Produktion oder sensible Daten. Eingaben und Ausgaben werden von NVIDIA protokolliert, um seine Modelle und Dienste zu verbessern. Übermitteln Sie keine personenbezogenen oder vertraulichen Daten. +- Nemotron 3 Super Free (kostenlose NVIDIA-Endpunkte): Nur für Testzwecke — übermitteln Sie keine personenbezogenen oder vertraulichen Daten. Ihre Nutzung wird zu Sicherheitszwecken und zur Verbesserung der Produkte und Dienste von NVIDIA protokolliert. Die zu Verbesserungszwecken protokollierten Sitzungsdaten sind nicht mit Ihrer Identität oder einem dauerhaften Identifikator verknüpft. Weitere Informationen zu unseren Datenverarbeitungspraktiken finden Sie in unserer [Datenschutzrichtlinie](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Durch die Interaktion mit diesem Endpunkt stimmen Sie unserer Erhebung, Aufzeichnung und Nutzung solcher Informationen sowie den [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) zu. - OpenAI APIs: Anfragen werden in Übereinstimmung mit [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) 30 Tage lang gespeichert. - Anthropic APIs: Anfragen werden in Übereinstimmung mit [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage) 30 Tage lang gespeichert. diff --git a/packages/web/src/content/docs/es/zen.mdx b/packages/web/src/content/docs/es/zen.mdx index 5a59ad8541e..3cc05f13c31 100644 --- a/packages/web/src/content/docs/es/zen.mdx +++ b/packages/web/src/content/docs/es/zen.mdx @@ -245,7 +245,7 @@ Todos nuestros modelos están alojados en US. Nuestros proveedores siguen una po - Big Pickle: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo. - DeepSeek V4 Flash Free: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo. - MiMo-V2.5 Free: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo. -- Nemotron 3 Super Free (endpoints gratuitos de NVIDIA): Se ofrece bajo los [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Solo para uso de prueba, no para producción ni datos sensibles. NVIDIA registra los prompts y las salidas para mejorar sus modelos y servicios. No envíes datos personales ni confidenciales. +- Nemotron 3 Super Free (endpoints gratuitos de NVIDIA): Solo para uso de prueba — no envíes datos personales ni confidenciales. Tu uso se registra con fines de seguridad y para mejorar los productos y servicios de NVIDIA. Los datos de sesión registrados con fines de mejora no están vinculados a tu identidad ni a ningún identificador persistente. Para obtener más información sobre nuestras prácticas de procesamiento de datos, consulta nuestra [Política de privacidad](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Al interactuar con este endpoint, aceptas que recopilemos, registremos y usemos dicha información, así como los [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: Las solicitudes se conservan durante 30 días de acuerdo con [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Las solicitudes se conservan durante 30 días de acuerdo con [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/fr/zen.mdx b/packages/web/src/content/docs/fr/zen.mdx index f8ea7b3848e..8ce03ea0310 100644 --- a/packages/web/src/content/docs/fr/zen.mdx +++ b/packages/web/src/content/docs/fr/zen.mdx @@ -231,7 +231,7 @@ Tous nos modèles sont hébergés aux US. Nos fournisseurs suivent une politique - Big Pickle : Pendant sa période gratuite, les données collectées peuvent être utilisées pour améliorer le modèle. - DeepSeek V4 Flash Free : Pendant sa période gratuite, les données collectées peuvent être utilisées pour améliorer le modèle. - MiMo-V2.5 Free : Pendant sa période gratuite, les données collectées peuvent être utilisées pour améliorer le modèle. -- Nemotron 3 Super Free (endpoints NVIDIA gratuits) : Fourni dans le cadre des [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Réservé à un usage d'essai, pas à la production ni aux données sensibles. Les prompts et les sorties sont journalisés par NVIDIA pour améliorer ses modèles et services. N'envoyez pas de données personnelles ou confidentielles. +- Nemotron 3 Super Free (endpoints NVIDIA gratuits) : Réservé à un usage d'essai — n'envoyez pas de données personnelles ou confidentielles. Votre utilisation est journalisée à des fins de sécurité et pour améliorer les produits et services de NVIDIA. Les données de session journalisées à des fins d'amélioration ne sont pas liées à votre identité ni à un quelconque identifiant persistant. Pour plus d'informations sur nos pratiques de traitement des données, consultez notre [Politique de confidentialité](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). En interagissant avec cet endpoint, vous consentez à notre collecte, à notre enregistrement et à notre utilisation de ces informations ainsi qu'aux [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs : Les requêtes sont conservées pendant 30 jours conformément à [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs : Les requêtes sont conservées pendant 30 jours conformément à [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/it/zen.mdx b/packages/web/src/content/docs/it/zen.mdx index ca5ef676b62..d24ce76642c 100644 --- a/packages/web/src/content/docs/it/zen.mdx +++ b/packages/web/src/content/docs/it/zen.mdx @@ -245,7 +245,7 @@ Tutti i nostri modelli sono ospitati negli US. I nostri provider seguono una pol - Big Pickle: durante il periodo gratuito, i dati raccolti possono essere usati per migliorare il modello. - DeepSeek V4 Flash Free: durante il periodo gratuito, i dati raccolti possono essere usati per migliorare il modello. - MiMo-V2.5 Free: durante il periodo gratuito, i dati raccolti possono essere usati per migliorare il modello. -- Nemotron 3 Super Free (endpoint NVIDIA gratuiti): fornito secondo i [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Solo per uso di prova, non per produzione o dati sensibili. NVIDIA registra prompt e output per migliorare i propri modelli e servizi. Non inviare dati personali o riservati. +- Nemotron 3 Super Free (endpoint NVIDIA gratuiti): solo per uso di prova — non inviare dati personali o riservati. Il tuo utilizzo viene registrato per finalità di sicurezza e per migliorare i prodotti e i servizi di NVIDIA. I dati di sessione registrati a fini di miglioramento non sono collegati alla tua identità né ad alcun identificatore persistente. Per maggiori informazioni sulle nostre pratiche di trattamento dei dati, consulta la nostra [Informativa sulla privacy](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Interagendo con questo endpoint, acconsenti alla nostra raccolta, registrazione e utilizzo di tali informazioni e ai [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: le richieste vengono conservate per 30 giorni in conformità con [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: le richieste vengono conservate per 30 giorni in conformità con [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/ja/zen.mdx b/packages/web/src/content/docs/ja/zen.mdx index ae5e2dc816f..136e4d07107 100644 --- a/packages/web/src/content/docs/ja/zen.mdx +++ b/packages/web/src/content/docs/ja/zen.mdx @@ -231,7 +231,7 @@ https://opencode.ai/zen/v1/models - Big Pickle: 無料提供期間中、収集されたデータがモデル改善に使われる場合があります。 - DeepSeek V4 Flash Free: 無料提供期間中、収集されたデータがモデル改善に使われる場合があります。 - MiMo-V2.5 Free: 無料提供期間中、収集されたデータがモデル改善に使われる場合があります。 -- Nemotron 3 Super Free(NVIDIA の無料エンドポイント): [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) に基づいて提供されます。試用専用であり、本番環境や機密性の高いデータには使用しないでください。プロンプトと出力は、NVIDIA が自社のモデルとサービスを改善するために記録します。個人情報や機密データは送信しないでください。 +- Nemotron 3 Super Free(NVIDIA の無料エンドポイント): 試用専用です — 個人情報や機密データは送信しないでください。お客様の利用は、セキュリティ目的および NVIDIA の製品とサービスの改善のために記録されます。改善目的で記録されたセッションデータは、お客様の身元や永続的な識別子とは関連付けられません。当社のデータ処理慣行の詳細については、[プライバシーポリシー](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)をご覧ください。このエンドポイントを利用することで、お客様はそのような情報の当社による収集、記録、利用、および [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) に同意したものとみなされます。 - OpenAI APIs: リクエストは [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) に従って 30 日間保持されます。 - Anthropic APIs: リクエストは [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage) に従って 30 日間保持されます。 diff --git a/packages/web/src/content/docs/ko/zen.mdx b/packages/web/src/content/docs/ko/zen.mdx index 7376eb74bc3..da947f08b26 100644 --- a/packages/web/src/content/docs/ko/zen.mdx +++ b/packages/web/src/content/docs/ko/zen.mdx @@ -231,7 +231,7 @@ https://opencode.ai/zen/v1/models - Big Pickle: 무료 제공 기간에는 수집된 데이터가 모델 개선에 사용될 수 있습니다. - DeepSeek V4 Flash Free: 무료 제공 기간에는 수집된 데이터가 모델 개선에 사용될 수 있습니다. - MiMo-V2.5 Free: 무료 제공 기간에는 수집된 데이터가 모델 개선에 사용될 수 있습니다. -- Nemotron 3 Super Free(NVIDIA 무료 엔드포인트): [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)에 따라 제공됩니다. 평가판 전용이며 프로덕션 환경이나 민감한 데이터에는 사용할 수 없습니다. NVIDIA는 자사 모델과 서비스를 개선하기 위해 프롬프트와 출력을 기록합니다. 개인 정보나 기밀 데이터는 제출하지 마세요. +- Nemotron 3 Super Free(NVIDIA 무료 엔드포인트): 평가판 전용이며 — 개인 정보나 기밀 데이터는 제출하지 마세요. 사용 내역은 보안 목적과 NVIDIA 제품 및 서비스 개선을 위해 기록됩니다. 개선 목적으로 기록된 세션 데이터는 사용자의 신원이나 영구 식별자와 연결되지 않습니다. 당사의 데이터 처리 관행에 대한 자세한 내용은 [개인정보처리방침](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)을 참조하세요. 이 엔드포인트와 상호 작용함으로써 사용자는 당사가 이러한 정보를 수집, 기록, 사용하는 것과 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)에 동의하게 됩니다. - OpenAI APIs: 요청은 [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data)에 따라 30일 동안 보관됩니다. - Anthropic APIs: 요청은 [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage)에 따라 30일 동안 보관됩니다. diff --git a/packages/web/src/content/docs/nb/zen.mdx b/packages/web/src/content/docs/nb/zen.mdx index a08a724d16e..1dc86ab101c 100644 --- a/packages/web/src/content/docs/nb/zen.mdx +++ b/packages/web/src/content/docs/nb/zen.mdx @@ -245,7 +245,7 @@ Alle modellene våre hostes i US. Leverandørene våre følger en policy for zer - Big Pickle: I gratisperioden kan innsamlede data brukes til å forbedre modellen. - DeepSeek V4 Flash Free: I gratisperioden kan innsamlede data brukes til å forbedre modellen. - MiMo-V2.5 Free: I gratisperioden kan innsamlede data brukes til å forbedre modellen. -- Nemotron 3 Super Free (gratis NVIDIA-endepunkter): Leveres under [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Kun for prøvebruk, ikke for produksjon eller sensitive data. Prompter og svar logges av NVIDIA for å forbedre modellene og tjenestene deres. Ikke send inn personopplysninger eller konfidensielle data. +- Nemotron 3 Super Free (gratis NVIDIA-endepunkter): Kun for prøvebruk — ikke send inn personopplysninger eller konfidensielle data. Bruken din logges av sikkerhetshensyn og for å forbedre NVIDIAs produkter og tjenester. Sesjonsdataene som logges for forbedringsformål, er ikke knyttet til identiteten din eller noen vedvarende identifikator. For mer informasjon om vår databehandlingspraksis, se vår [personvernerklæring](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ved å samhandle med dette endepunktet samtykker du til at vi samler inn, registrerer og bruker slik informasjon, samt til [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: Forespørsler lagres i 30 dager i samsvar med [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Forespørsler lagres i 30 dager i samsvar med [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/pl/zen.mdx b/packages/web/src/content/docs/pl/zen.mdx index c349490580b..79bb6581278 100644 --- a/packages/web/src/content/docs/pl/zen.mdx +++ b/packages/web/src/content/docs/pl/zen.mdx @@ -246,7 +246,7 @@ Wszystkie nasze modele są hostowane w US. Nasi dostawcy stosują politykę zero - Big Pickle: W czasie darmowego okresu zebrane dane mogą być wykorzystywane do ulepszania modelu. - DeepSeek V4 Flash Free: W czasie darmowego okresu zebrane dane mogą być wykorzystywane do ulepszania modelu. - MiMo-V2.5 Free: W czasie darmowego okresu zebrane dane mogą być wykorzystywane do ulepszania modelu. -- Nemotron 3 Super Free (darmowe endpointy NVIDIA): Udostępniany zgodnie z [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Tylko do użytku próbnego, nie do produkcji ani danych wrażliwych. NVIDIA rejestruje prompty i odpowiedzi, aby ulepszać swoje modele i usługi. Nie przesyłaj danych osobowych ani poufnych. +- Nemotron 3 Super Free (darmowe endpointy NVIDIA): Tylko do użytku próbnego — nie przesyłaj danych osobowych ani poufnych. Twoje korzystanie jest rejestrowane w celach bezpieczeństwa oraz w celu ulepszania produktów i usług NVIDIA. Rejestrowane dane sesji wykorzystywane do celów ulepszania nie są powiązane z Twoją tożsamością ani żadnym trwałym identyfikatorem. Aby uzyskać więcej informacji o naszych praktykach przetwarzania danych, zapoznaj się z naszą [Polityką prywatności](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Korzystając z tego endpointu, wyrażasz zgodę na gromadzenie, rejestrowanie i wykorzystywanie przez nas takich informacji oraz na [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: Żądania są przechowywane przez 30 dni zgodnie z [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Żądania są przechowywane przez 30 dni zgodnie z [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/pt-br/zen.mdx b/packages/web/src/content/docs/pt-br/zen.mdx index 62c18c92701..45fc0c0bfc0 100644 --- a/packages/web/src/content/docs/pt-br/zen.mdx +++ b/packages/web/src/content/docs/pt-br/zen.mdx @@ -231,7 +231,7 @@ Todos os nossos modelos são hospedados nos US. Nossos provedores seguem uma pol - Big Pickle: Durante seu período gratuito, os dados coletados podem ser usados para melhorar o modelo. - DeepSeek V4 Flash Free: Durante seu período gratuito, os dados coletados podem ser usados para melhorar o modelo. - MiMo-V2.5 Free: Durante seu período gratuito, os dados coletados podem ser usados para melhorar o modelo. -- Nemotron 3 Super Free (endpoints gratuitos da NVIDIA): Fornecido sob os [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Apenas para uso de avaliação, não para produção nem dados sensíveis. A NVIDIA registra prompts e saídas para melhorar seus modelos e serviços. Não envie dados pessoais ou confidenciais. +- Nemotron 3 Super Free (endpoints gratuitos da NVIDIA): Apenas para uso de avaliação — não envie dados pessoais ou confidenciais. Seu uso é registrado para fins de segurança e para melhorar os produtos e serviços da NVIDIA. Os dados de sessão registrados para fins de melhoria não estão vinculados à sua identidade nem a qualquer identificador persistente. Para mais informações sobre nossas práticas de processamento de dados, consulte nossa [Política de Privacidade](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Ao interagir com este endpoint, você consente com a nossa coleta, registro e uso dessas informações e com os [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: As solicitações são retidas por 30 dias de acordo com [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: As solicitações são retidas por 30 dias de acordo com [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/ru/zen.mdx b/packages/web/src/content/docs/ru/zen.mdx index c4504c3266d..97d14b75d9b 100644 --- a/packages/web/src/content/docs/ru/zen.mdx +++ b/packages/web/src/content/docs/ru/zen.mdx @@ -245,7 +245,7 @@ https://opencode.ai/zen/v1/models - Big Pickle: во время бесплатного периода собранные данные могут использоваться для улучшения модели. - DeepSeek V4 Flash Free: во время бесплатного периода собранные данные могут использоваться для улучшения модели. - MiMo-V2.5 Free: во время бесплатного периода собранные данные могут использоваться для улучшения модели. -- Nemotron 3 Super Free (бесплатные эндпоинты NVIDIA): предоставляется в соответствии с [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Только для пробного использования, не для продакшена и не для чувствительных данных. NVIDIA логирует запросы и ответы, чтобы улучшать свои модели и сервисы. Не отправляйте персональные или конфиденциальные данные. +- Nemotron 3 Super Free (бесплатные эндпоинты NVIDIA): только для пробного использования — не отправляйте персональные или конфиденциальные данные. Использование логируется в целях безопасности и для улучшения продуктов и сервисов NVIDIA. Логируемые данные сессии, используемые в целях улучшения, не связаны с вашей личностью или каким-либо постоянным идентификатором. Подробнее о наших практиках обработки данных см. в нашей [Политике конфиденциальности](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Взаимодействуя с этим эндпоинтом, вы соглашаетесь на сбор, запись и использование нами такой информации, а также с [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: запросы хранятся 30 дней в соответствии с [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: запросы хранятся 30 дней в соответствии с [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/th/zen.mdx b/packages/web/src/content/docs/th/zen.mdx index 3824f86b2e0..487d13c9334 100644 --- a/packages/web/src/content/docs/th/zen.mdx +++ b/packages/web/src/content/docs/th/zen.mdx @@ -233,7 +233,7 @@ https://opencode.ai/zen/v1/models - Big Pickle: ระหว่างช่วงที่เปิดให้ใช้ฟรี ข้อมูลที่เก็บรวบรวมอาจถูกนำไปใช้เพื่อปรับปรุงโมเดล - DeepSeek V4 Flash Free: ระหว่างช่วงที่เปิดให้ใช้ฟรี ข้อมูลที่เก็บรวบรวมอาจถูกนำไปใช้เพื่อปรับปรุงโมเดล - MiMo-V2.5 Free: ระหว่างช่วงที่เปิดให้ใช้ฟรี ข้อมูลที่เก็บรวบรวมอาจถูกนำไปใช้เพื่อปรับปรุงโมเดล -- Nemotron 3 Super Free (endpoint ฟรีของ NVIDIA): ให้บริการภายใต้ [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) ใช้สำหรับการทดลองเท่านั้น ไม่เหมาะสำหรับ production หรือข้อมูลที่อ่อนไหว NVIDIA จะบันทึก prompt และ output เพื่อนำไปปรับปรุงโมเดลและบริการของตน โปรดอย่าส่งข้อมูลส่วนบุคคลหรือข้อมูลลับ. +- Nemotron 3 Super Free (endpoint ฟรีของ NVIDIA): ใช้สำหรับการทดลองเท่านั้น — โปรดอย่าส่งข้อมูลส่วนบุคคลหรือข้อมูลลับ การใช้งานของคุณจะถูกบันทึกเพื่อวัตถุประสงค์ด้านความปลอดภัยและเพื่อปรับปรุงผลิตภัณฑ์และบริการของ NVIDIA ข้อมูลเซสชันที่บันทึกไว้เพื่อวัตถุประสงค์ในการปรับปรุงจะไม่เชื่อมโยงกับตัวตนของคุณหรือตัวระบุถาวรใด ๆ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแนวปฏิบัติในการประมวลผลข้อมูลของเรา โปรดดู [นโยบายความเป็นส่วนตัว](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) ของเรา การโต้ตอบกับ endpoint นี้ถือว่าคุณยินยอมให้เราเก็บรวบรวม บันทึก และใช้ข้อมูลดังกล่าว รวมถึง [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) - OpenAI APIs: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/tr/zen.mdx b/packages/web/src/content/docs/tr/zen.mdx index 908ff86e442..b0b0418b566 100644 --- a/packages/web/src/content/docs/tr/zen.mdx +++ b/packages/web/src/content/docs/tr/zen.mdx @@ -231,7 +231,7 @@ Tüm modellerimiz US'de barındırılıyor. Sağlayıcılarımız zero-retention - Big Pickle: Ücretsiz döneminde toplanan veriler modeli iyileştirmek için kullanılabilir. - DeepSeek V4 Flash Free: Ücretsiz döneminde toplanan veriler modeli iyileştirmek için kullanılabilir. - MiMo-V2.5 Free: Ücretsiz döneminde toplanan veriler modeli iyileştirmek için kullanılabilir. -- Nemotron 3 Super Free (ücretsiz NVIDIA uç noktaları): [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) kapsamında sunulur. Yalnızca deneme amaçlıdır; üretim veya hassas veriler için uygun değildir. NVIDIA, modellerini ve hizmetlerini geliştirmek için promptları ve çıktıları kaydeder. Kişisel veya gizli veri göndermeyin. +- Nemotron 3 Super Free (ücretsiz NVIDIA uç noktaları): Yalnızca deneme amaçlıdır — kişisel veya gizli veri göndermeyin. Kullanımınız güvenlik amacıyla ve NVIDIA ürünlerini ve hizmetlerini geliştirmek için kaydedilir. Geliştirme amacıyla kaydedilen oturum verileri kimliğinizle veya herhangi bir kalıcı tanımlayıcıyla ilişkilendirilmez. Veri işleme uygulamalarımız hakkında daha fazla bilgi için [Gizlilik Politikamıza](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) bakın. Bu uç noktayla etkileşime geçerek, bu tür bilgileri toplamamıza, kaydetmemize ve kullanmamıza ve [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) koşullarına onay vermiş olursunuz. - OpenAI APIs: İstekler [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) uyarınca 30 gün boyunca saklanır. - Anthropic APIs: İstekler [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage) uyarınca 30 gün boyunca saklanır. diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx index 0e4b1e9dd5d..fc635be99a0 100644 --- a/packages/web/src/content/docs/zen.mdx +++ b/packages/web/src/content/docs/zen.mdx @@ -245,7 +245,7 @@ All our models are hosted in the US. Our providers follow a zero-retention polic - Big Pickle: During its free period, collected data may be used to improve the model. - DeepSeek V4 Flash Free: During its free period, collected data may be used to improve the model. - MiMo-V2.5 Free: During its free period, collected data may be used to improve the model. -- Nemotron 3 Super Free (NVIDIA free endpoints): Provided under the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Trial use only — not for production or sensitive data. Prompts and outputs are logged by NVIDIA to improve its models and services. Do not submit personal or confidential data. +- Nemotron 3 Super Free (NVIDIA free endpoints): Trial use only — do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). - OpenAI APIs: Requests are retained for 30 days in accordance with [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Requests are retained for 30 days in accordance with [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/packages/web/src/content/docs/zh-cn/zen.mdx b/packages/web/src/content/docs/zh-cn/zen.mdx index b5f77c0711f..0e6a2a2b073 100644 --- a/packages/web/src/content/docs/zh-cn/zen.mdx +++ b/packages/web/src/content/docs/zh-cn/zen.mdx @@ -231,7 +231,7 @@ https://opencode.ai/zen/v1/models - Big Pickle:在免费期间,收集的数据可能会被用于改进模型。 - DeepSeek V4 Flash Free:在免费期间,收集的数据可能会被用于改进模型。 - MiMo-V2.5 Free:在免费期间,收集的数据可能会被用于改进模型。 -- Nemotron 3 Super Free(NVIDIA 免费端点):根据 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) 提供。仅供试用,不适用于生产环境或敏感数据。NVIDIA 会记录提示词和输出内容,以改进其模型和服务。请勿提交个人或机密数据。 +- Nemotron 3 Super Free(NVIDIA 免费端点):仅供试用 — 请勿提交个人或机密数据。出于安全目的以及为改进 NVIDIA 产品和服务,系统会记录你的使用情况。出于改进目的而记录的会话数据不会与你的身份或任何持久标识符相关联。有关我们数据处理实践的更多信息,请参阅我们的[隐私政策](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。与此端点进行交互,即表示你同意我们收集、记录和使用此类信息,并同意 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。 - OpenAI APIs:请求会根据 [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) 保留 30 天。 - Anthropic APIs:请求会根据 [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage) 保留 30 天。 diff --git a/packages/web/src/content/docs/zh-tw/zen.mdx b/packages/web/src/content/docs/zh-tw/zen.mdx index c9ca47fc959..13a5a3be3d5 100644 --- a/packages/web/src/content/docs/zh-tw/zen.mdx +++ b/packages/web/src/content/docs/zh-tw/zen.mdx @@ -238,7 +238,7 @@ https://opencode.ai/zen/v1/models - Big Pickle: 在免費期間,收集到的資料可能會用於改進模型。 - DeepSeek V4 Flash Free: 在免費期間,收集到的資料可能會用於改進模型。 - MiMo-V2.5 Free: 在免費期間,收集到的資料可能會用於改進模型。 -- Nemotron 3 Super Free(NVIDIA 免費端點):依據 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf) 提供。僅供試用,不適用於正式環境或敏感資料。NVIDIA 會記錄提示詞與輸出內容,以改進其模型與服務。請勿提交個人或機密資料。 +- Nemotron 3 Super Free(NVIDIA 免費端點):僅供試用 — 請勿提交個人或機密資料。基於安全目的以及為了改進 NVIDIA 產品與服務,系統會記錄你的使用情況。基於改進目的而記錄的工作階段資料不會與你的身分或任何持久識別碼相關聯。有關我們資料處理實務的更多資訊,請參閱我們的[隱私政策](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。與此端點進行互動,即表示你同意我們收集、記錄與使用此類資訊,並同意 [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf)。 - OpenAI APIs: 請求會依據 [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data) 保留 30 天。 - Anthropic APIs: 請求會依據 [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage) 保留 30 天。 From 0b796c5f3d291400e2dfe68369f06de6c461f154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Thu, 4 Jun 2026 01:40:39 +0200 Subject: [PATCH 06/15] fix(opencode): route SAP AI Core reasoning variants through modelParams (#30482) --- .gitignore | 2 + packages/opencode/src/provider/transform.ts | 131 ++++++++---------- .../opencode/test/provider/transform.test.ts | 102 +++++++++----- 3 files changed, 127 insertions(+), 108 deletions(-) diff --git a/.gitignore b/.gitignore index 19198a7a591..006cab8c276 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ ts-dist .turbo **/.serena .serena/ +**/.omo +.omo/ /result refs Session.vim diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 7f751180b9c..a5c00afa297 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -611,6 +611,32 @@ function googleThinkingBudgetMax(apiId: string) { return 24_576 } +// SAP's Zod schema drops unknown top-level keys; reasoning controls survive +// only via `modelParams` (catchall), forwarded verbatim by the SAP SDKs. +function wrapInSapModelParams( + variants: Record>, +): Record> { + return Object.fromEntries(Object.entries(variants).map(([k, v]) => [k, { modelParams: v }])) +} + +function googleThinkingVariants(model: Provider.Model): Record> { + const id = model.api.id.toLowerCase() + if (id.includes("2.5")) { + return { + high: { thinkingConfig: { includeThoughts: true, thinkingBudget: 16000 } }, + max: { + thinkingConfig: { includeThoughts: true, thinkingBudget: googleThinkingBudgetMax(id) }, + }, + } + } + return Object.fromEntries( + googleThinkingLevelEfforts(id).map((effort) => [ + effort, + { thinkingConfig: { includeThoughts: true, thinkingLevel: effort } }, + ]), + ) +} + export function variants(model: Provider.Model): Record> { if (!model.capabilities.reasoning) return {} @@ -716,7 +742,7 @@ export function variants(model: Provider.Model): Record [ - effort, - { - thinkingConfig: { - includeThoughts: true, - thinkingLevel: effort, - }, - }, - ]), - ) + return googleThinkingVariants(model) case "@ai-sdk/mistral": // https://v5.ai-sdk.dev/providers/ai-sdk-providers/mistral @@ -969,57 +968,43 @@ export function variants(model: Provider.Model): Record [ - effort, - { - thinking: { - type: "adaptive", - ...(adaptiveOpus ? { display: "summarized" } : {}), - }, + // Bedrock adaptive splits `effort` out into `output_config` (vs Anthropic + // native which inlines it). Opus 4.7+ flipped `display` default to "omitted". + return wrapInSapModelParams( + Object.fromEntries( + adaptiveEfforts.map((effort) => [ effort, - }, - ]), + { + thinking: { type: "adaptive", ...(adaptiveOpus ? { display: "summarized" } : {}) }, + output_config: { effort }, + }, + ]), + ), ) } - return { - high: { - thinking: { - type: "enabled", - budgetTokens: 16000, - }, - }, - max: { - thinking: { - type: "enabled", - budgetTokens: 31999, - }, - }, - } + return wrapInSapModelParams({ + high: { thinking: { type: "enabled", budget_tokens: 16000 } }, + max: { thinking: { type: "enabled", budget_tokens: 31999 } }, + }) } - if (model.api.id.includes("gemini") && id.includes("2.5")) { - return { - high: { - thinkingConfig: { - includeThoughts: true, - thinkingBudget: 16000, - }, - }, - max: { - thinkingConfig: { - includeThoughts: true, - thinkingBudget: 24576, - }, - }, - } + if (id.includes("gemini") && id.includes("2.5")) { + return wrapInSapModelParams(googleThinkingVariants(model)) } - if (model.api.id.includes("gpt") || /\bo[1-9]/.test(model.api.id)) { - return Object.fromEntries(WIDELY_SUPPORTED_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }])) + if (id.includes("gpt") || /\bo[1-9]/.test(id)) { + const efforts = openaiReasoningEfforts(id, model.release_date) + return wrapInSapModelParams( + Object.fromEntries(efforts.map((effort) => [effort, { reasoning_effort: effort }])), + ) } - return {} + return wrapInSapModelParams( + Object.fromEntries( + ["low", "medium", "high"].map((effort) => [effort, { reasoning_effort: effort }]), + ), + ) + } } return {} } diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 5b59c4625ae..e25cb3f44af 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -3504,7 +3504,7 @@ describe("ProviderTransform.variants", () => { }) describe("@jerome-benoit/sap-ai-provider-v2", () => { - const sapModel = (apiId: string) => + const sapModel = (apiId: string, releaseDate = "2024-01-01") => createMockModel({ id: `sap-ai-core/${apiId}`, providerID: "sap-ai-core", @@ -3513,6 +3513,7 @@ describe("ProviderTransform.variants", () => { url: "https://api.ai.sap", npm: "@jerome-benoit/sap-ai-provider-v2", }, + release_date: releaseDate, }) for (const testCase of [ @@ -3520,71 +3521,102 @@ describe("ProviderTransform.variants", () => { name: "sonnet 4.6", apiIds: ["anthropic--claude-sonnet-4-6"], efforts: ["low", "medium", "high", "max"], - expectedHigh: { thinking: { type: "adaptive" }, effort: "high" }, + thinking: { type: "adaptive" }, }, { name: "opus 4.6", apiIds: ["anthropic--claude-4.6-opus", "anthropic--claude-4-6-opus"], efforts: ["low", "medium", "high", "max"], - expectedHigh: { thinking: { type: "adaptive" }, effort: "high" }, + thinking: { type: "adaptive" }, }, { name: "opus 4.7", apiIds: ["anthropic--claude-4.7-opus", "anthropic--claude-4-7-opus"], efforts: ["low", "medium", "high", "xhigh", "max"], - expectedHigh: { thinking: { type: "adaptive", display: "summarized" }, effort: "high" }, + thinking: { type: "adaptive", display: "summarized" }, }, { name: "opus 4.8", apiIds: ["anthropic--claude-4.8-opus", "anthropic--claude-4-8-opus"], efforts: ["low", "medium", "high", "xhigh", "max"], - expectedHigh: { thinking: { type: "adaptive", display: "summarized" }, effort: "high" }, + thinking: { type: "adaptive", display: "summarized" }, }, ]) { for (const apiId of testCase.apiIds) { - test(`${testCase.name} ${apiId} returns adaptive thinking variants`, () => { + test(`${testCase.name} ${apiId} returns adaptive thinking variants under modelParams`, () => { const result = ProviderTransform.variants(sapModel(apiId)) expect(Object.keys(result)).toEqual(testCase.efforts) - expect(result.high).toEqual(testCase.expectedHigh) - if (testCase.efforts.includes("xhigh")) { - expect(result.xhigh).toEqual({ ...testCase.expectedHigh, effort: "xhigh" }) + for (const effort of testCase.efforts) { + expect(result[effort]).toEqual({ + modelParams: { + thinking: testCase.thinking, + output_config: { effort }, + }, + }) } }) } } - test("anthropic sonnet 4 returns budget-tokens variants", () => { - const result = ProviderTransform.variants(sapModel("anthropic--claude-sonnet-4")) - expect(Object.keys(result)).toEqual(["high", "max"]) - expect(result.high).toEqual({ thinking: { type: "enabled", budgetTokens: 16000 } }) - expect(result.max).toEqual({ thinking: { type: "enabled", budgetTokens: 31999 } }) - }) + for (const apiId of ["anthropic--claude-sonnet-4", "anthropic--claude-4.5-opus"]) { + test(`${apiId} returns budget_tokens variants under modelParams`, () => { + const result = ProviderTransform.variants(sapModel(apiId)) + expect(Object.keys(result)).toEqual(["high", "max"]) + expect(result.high).toEqual({ + modelParams: { thinking: { type: "enabled", budget_tokens: 16000 } }, + }) + expect(result.max).toEqual({ + modelParams: { thinking: { type: "enabled", budget_tokens: 31999 } }, + }) + }) + } - test("gemini 2.5 returns thinkingConfig variants", () => { - const result = ProviderTransform.variants(sapModel("gcp--gemini-2.5-pro")) - expect(Object.keys(result)).toEqual(["high", "max"]) - expect(result.high).toEqual({ thinkingConfig: { includeThoughts: true, thinkingBudget: 16000 } }) - expect(result.max).toEqual({ thinkingConfig: { includeThoughts: true, thinkingBudget: 24576 } }) - }) + for (const testCase of [ + { apiId: "gemini-2.5-pro", maxBudget: 32768 }, + { apiId: "gemini-2.5-flash", maxBudget: 24576 }, + ]) { + test(`${testCase.apiId} returns thinkingConfig variants under modelParams`, () => { + const result = ProviderTransform.variants(sapModel(testCase.apiId)) + expect(Object.keys(result)).toEqual(["high", "max"]) + expect(result.high).toEqual({ + modelParams: { thinkingConfig: { includeThoughts: true, thinkingBudget: 16000 } }, + }) + expect(result.max).toEqual({ + modelParams: { thinkingConfig: { includeThoughts: true, thinkingBudget: testCase.maxBudget } }, + }) + }) + } - for (const apiId of ["azure-openai--gpt-4o", "azure-openai--o3-mini"]) { - test(`${apiId} returns reasoningEffort variants`, () => { + for (const testCase of [ + { apiId: "gpt-5", releaseDate: "2025-08-07", efforts: ["minimal", "low", "medium", "high"] }, + { apiId: "gpt-5-mini", releaseDate: "2025-08-07", efforts: ["minimal", "low", "medium", "high"] }, + { apiId: "gpt-5-nano", releaseDate: "2025-08-07", efforts: ["minimal", "low", "medium", "high"] }, + { apiId: "gpt-5.4", releaseDate: "2026-01-15", efforts: ["none", "low", "medium", "high", "xhigh"] }, + { apiId: "azure-openai--o3-mini", releaseDate: "2024-01-01", efforts: ["low", "medium", "high"] }, + ]) { + test(`${testCase.apiId} returns reasoning_effort variants under modelParams`, () => { + const result = ProviderTransform.variants(sapModel(testCase.apiId, testCase.releaseDate)) + expect(Object.keys(result)).toEqual(testCase.efforts) + for (const effort of testCase.efforts) { + expect(result[effort]).toEqual({ modelParams: { reasoning_effort: effort } }) + } + }) + } + + for (const apiId of [ + "gemini-3.1-flash-lite", + "cohere--command-a-reasoning", + "sonar-deep-research", + "aws--llama-opus-4.7-fake", + ]) { + test(`${apiId} falls through to harmonized reasoning_effort fallback`, () => { const result = ProviderTransform.variants(sapModel(apiId)) expect(Object.keys(result)).toEqual(["low", "medium", "high"]) - expect(result.low).toEqual({ reasoningEffort: "low" }) - expect(result.high).toEqual({ reasoningEffort: "high" }) + for (const effort of ["low", "medium", "high"]) { + expect(result[effort]).toEqual({ modelParams: { reasoning_effort: effort } }) + } }) } - - for (const apiId of ["perplexity--sonar-pro", "mistral--mistral-large"]) { - test(`${apiId} returns empty object`, () => { - expect(ProviderTransform.variants(sapModel(apiId))).toEqual({}) - }) - } - - test("non-anthropic models with opus-like substrings do not get adaptive thinking", () => { - expect(ProviderTransform.variants(sapModel("aws--llama-opus-4.7-fake"))).toEqual({}) - }) }) describe("ai-gateway-provider (cloudflare-ai-gateway)", () => { From 04b38ce830db3144fc1057274ef66b1a6a3f9c99 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Wed, 3 Jun 2026 23:42:15 +0000 Subject: [PATCH 07/15] chore: generate --- packages/opencode/src/provider/transform.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index a5c00afa297..9f6ca5a0d55 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -613,9 +613,7 @@ function googleThinkingBudgetMax(apiId: string) { // SAP's Zod schema drops unknown top-level keys; reasoning controls survive // only via `modelParams` (catchall), forwarded verbatim by the SAP SDKs. -function wrapInSapModelParams( - variants: Record>, -): Record> { +function wrapInSapModelParams(variants: Record>): Record> { return Object.fromEntries(Object.entries(variants).map(([k, v]) => [k, { modelParams: v }])) } @@ -995,14 +993,10 @@ export function variants(model: Provider.Model): Record [effort, { reasoning_effort: effort }])), - ) + return wrapInSapModelParams(Object.fromEntries(efforts.map((effort) => [effort, { reasoning_effort: effort }]))) } return wrapInSapModelParams( - Object.fromEntries( - ["low", "medium", "high"].map((effort) => [effort, { reasoning_effort: effort }]), - ), + Object.fromEntries(["low", "medium", "high"].map((effort) => [effort, { reasoning_effort: effort }])), ) } } From f62ba5eb865898d515270ab31a11cbcbbb8d5ff6 Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Thu, 4 Jun 2026 09:51:40 +1000 Subject: [PATCH 08/15] fix(app): hide unavailable titlebar update (#30642) --- packages/app/src/components/titlebar.tsx | 4 +++- packages/app/src/pages/layout.tsx | 7 ++----- packages/app/src/pages/layout/update.test.ts | 19 +++++++++++++++++++ packages/app/src/pages/layout/update.ts | 10 ++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 packages/app/src/pages/layout/update.test.ts create mode 100644 packages/app/src/pages/layout/update.ts diff --git a/packages/app/src/components/titlebar.tsx b/packages/app/src/components/titlebar.tsx index e383518733d..c2af7273873 100644 --- a/packages/app/src/components/titlebar.tsx +++ b/packages/app/src/components/titlebar.tsx @@ -707,7 +707,9 @@ type TitlebarV2RightState = { function TitlebarV2Right(props: { state: TitlebarV2RightState }) { return (
- + + +
) diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 3ac042360b8..c507ff4aa14 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -89,6 +89,7 @@ import { } from "./layout/sidebar-workspace" import { ProjectDragOverlay, SortableProject, type ProjectSidebarContext } from "./layout/sidebar-project" import { SidebarContent } from "./layout/sidebar-shell" +import { runUpdateAndRestart } from "./layout/update" export default function Layout(props: ParentProps) { const [store, setStore, , ready] = persisted( @@ -183,11 +184,7 @@ export default function Layout(props: ParentProps) { return updateQuery.data.version ?? "" } const installUpdate = () => { - if (!platform.updateAndRestart) return - setUpdate("installing", true) - void platform.updateAndRestart().catch(() => { - setUpdate("installing", false) - }) + runUpdateAndRestart(platform.updateAndRestart, (installing) => setUpdate("installing", installing)) } const titlebarUpdate: TitlebarUpdate = { version: updateVersion, diff --git a/packages/app/src/pages/layout/update.test.ts b/packages/app/src/pages/layout/update.test.ts new file mode 100644 index 00000000000..1fd86965c01 --- /dev/null +++ b/packages/app/src/pages/layout/update.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, test } from "bun:test" +import { runUpdateAndRestart } from "./update" + +describe("runUpdateAndRestart", () => { + test("clears the installing state when restart resolves without exiting", async () => { + const states: boolean[] = [] + await new Promise((resolve) => { + runUpdateAndRestart( + async () => {}, + (installing) => { + states.push(installing) + if (states.length === 2) resolve() + }, + ) + }) + + expect(states).toEqual([true, false]) + }) +}) diff --git a/packages/app/src/pages/layout/update.ts b/packages/app/src/pages/layout/update.ts new file mode 100644 index 00000000000..563e2c745f2 --- /dev/null +++ b/packages/app/src/pages/layout/update.ts @@ -0,0 +1,10 @@ +export function runUpdateAndRestart( + updateAndRestart: (() => Promise) | undefined, + setInstalling: (installing: boolean) => void, +) { + if (!updateAndRestart) return + setInstalling(true) + void updateAndRestart() + .catch(() => undefined) + .finally(() => setInstalling(false)) +} From 55bafa29d4b98e1d60f596bb080162a6243bf92f Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Thu, 4 Jun 2026 11:35:30 +1000 Subject: [PATCH 09/15] feat(app): v2 thinking level selector (#30646) --- .../regression/prompt-thinking-level.spec.ts | 86 +++++++++++++++++++ packages/app/src/components/prompt-input.tsx | 39 ++++++++- 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 packages/app/e2e/regression/prompt-thinking-level.spec.ts diff --git a/packages/app/e2e/regression/prompt-thinking-level.spec.ts b/packages/app/e2e/regression/prompt-thinking-level.spec.ts new file mode 100644 index 00000000000..d3a42071d1a --- /dev/null +++ b/packages/app/e2e/regression/prompt-thinking-level.spec.ts @@ -0,0 +1,86 @@ +import { expect, test, type Page } from "@playwright/test" +import { base64Encode } from "@opencode-ai/core/util/encode" +import { mockOpenCodeServer } from "../utils/mock-server" + +const directory = "C:/OpenCode/PromptThinkingLevelRegression" +const projectID = "proj_prompt_thinking_level_regression" +const sessionID = "ses_prompt_thinking_level_regression" + +test("shows the V2 thinking level control while relevant", async ({ page }) => { + await mockOpenCodeServer(page, { + directory, + project: { + id: projectID, + worktree: directory, + vcs: "git", + name: "prompt-thinking-level-regression", + time: { created: 1700000000000, updated: 1700000000000 }, + sandboxes: [], + }, + provider: { + all: [ + { + id: "opencode", + name: "OpenCode", + models: { + "thinking-model": { + id: "thinking-model", + name: "Thinking Model", + limit: { context: 200_000 }, + variants: { high: {} }, + }, + }, + }, + ], + connected: ["opencode"], + default: { providerID: "opencode", modelID: "thinking-model" }, + }, + sessions: [ + { + id: sessionID, + slug: "prompt-thinking-level-regression", + projectID, + directory, + title: "Prompt thinking level regression", + version: "dev", + time: { created: 1700000000000, updated: 1700000000000 }, + }, + ], + pageMessages: () => ({ items: [] }), + }) + await page.addInitScript(() => { + localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } })) + }) + + await page.goto(`/${base64Encode(directory)}/session/${sessionID}`) + const composer = page.locator('[data-component="session-composer"]') + const input = composer.locator('[data-component="prompt-input"]') + const control = composer.locator('[data-component="prompt-variant-control"]') + await expect(composer).toBeVisible() + + await idleComposer(page) + await expect(control).toBeHidden() + + await composer.hover() + await expect(control).toBeVisible() + + await control.locator('[data-action="prompt-model-variant"]').click() + const high = page.getByRole("option", { name: "high" }) + await expect(high).toBeVisible() + await page.mouse.move(0, 0) + await expect(control).toBeVisible() + await expect(high).toBeVisible() + await high.click() + + await idleComposer(page) + await input.focus() + await expect(control).toBeVisible() + + await idleComposer(page) + await expect(control).toBeVisible() +}) + +async function idleComposer(page: Page) { + await page.mouse.move(0, 0) + await page.evaluate(() => (document.activeElement as HTMLElement | null)?.blur()) +} diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 8a5ab87d25f..8e4913b1f5b 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -277,6 +277,7 @@ export const PromptInput: Component = (props) => { draggingType: "image" | "@mention" | null mode: "normal" | "shell" applyingHistory: boolean + variantOpen: boolean }>({ popover: null, historyIndex: -1, @@ -285,6 +286,7 @@ export const PromptInput: Component = (props) => { draggingType: null, mode: "normal", applyingHistory: false, + variantOpen: false, }) const [picker, setPicker] = createStore({ projectOpen: false, @@ -1101,6 +1103,8 @@ export const PromptInput: Component = (props) => { ) const variants = createMemo(() => ["default", ...local.model.variant.list()]) + // Check provider variants directly: `variants` also includes the UI-only default option. + const showVariantControl = createMemo(() => local.model.variant.list().length > 0) const accepting = createMemo(() => { const id = params.id if (!id) return permission.isAutoAcceptingDirectory(sdk.directory) @@ -1571,6 +1575,39 @@ export const PromptInput: Component = (props) => { + +
+ +