Compare commits

..

2 Commits

Author SHA1 Message Date
Adam
70eaf3545e wip(app): mcp settings 2026-03-05 08:46:49 -06:00
Adam
664f4c0a68 wip(app): mcp settings 2026-03-05 08:46:49 -06:00
75 changed files with 1618 additions and 717 deletions

View File

@@ -26,7 +26,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
@@ -47,7 +47,7 @@
"@thisbeyond/solid-dnd": "0.7.5",
"diff": "catalog:",
"fuzzysort": "catalog:",
"ghostty-web": "github:anomalyco/ghostty-web#main",
"ghostty-web": "0.4.0",
"luxon": "catalog:",
"marked": "catalog:",
"marked-shiki": "catalog:",
@@ -76,7 +76,7 @@
},
"packages/console/app": {
"name": "@opencode-ai/console-app",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
@@ -110,7 +110,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
@@ -137,7 +137,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@ai-sdk/anthropic": "2.0.0",
"@ai-sdk/openai": "2.0.2",
@@ -161,7 +161,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
@@ -185,7 +185,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -218,7 +218,7 @@
},
"packages/desktop-electron": {
"name": "@opencode-ai/desktop-electron",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -248,7 +248,7 @@
},
"packages/enterprise": {
"name": "@opencode-ai/enterprise",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@opencode-ai/ui": "workspace:*",
"@opencode-ai/util": "workspace:*",
@@ -277,7 +277,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "catalog:",
@@ -293,7 +293,7 @@
},
"packages/opencode": {
"name": "opencode",
"version": "1.2.18",
"version": "1.2.17",
"bin": {
"opencode": "./bin/opencode",
},
@@ -407,7 +407,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"zod": "catalog:",
@@ -427,7 +427,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
"version": "1.2.18",
"version": "1.2.17",
"devDependencies": {
"@hey-api/openapi-ts": "0.90.10",
"@tsconfig/node22": "catalog:",
@@ -438,7 +438,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
@@ -473,7 +473,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
@@ -519,7 +519,7 @@
},
"packages/util": {
"name": "@opencode-ai/util",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"zod": "catalog:",
},
@@ -530,7 +530,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
@@ -2958,7 +2958,7 @@
"get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="],
"ghostty-web": ["ghostty-web@github:anomalyco/ghostty-web#4af877d", {}, "anomalyco-ghostty-web-4af877d", "sha512-fbEK8mtr7ar4ySsF+JUGjhaZrane7dKphanN+SxHt5XXI6yLMAh/Hpf6sNCOyyVa2UlGCd7YpXG/T2v2RUAX+A=="],
"ghostty-web": ["ghostty-web@0.4.0", "", {}, "sha512-0puDBik2qapbD/QQBW9o5ZHfXnZBqZWx/ctBiVtKZ6ZLds4NYb+wZuw1cRLXZk9zYovIQ908z3rvFhexAvc5Hg=="],
"gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="],

View File

@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-v83hWzYVg/g4zJiBpGsQ71wTdndPk3BQVZ2mjMApUIQ=",
"aarch64-linux": "sha256-inpMwkQqwBFP2wL8w/pTOP7q3fg1aOqvE0wgzVd3/B8=",
"aarch64-darwin": "sha256-r42LGrQWqDyIy62mBSU5Nf3M22dJ3NNo7mjN/1h8d8Y=",
"x86_64-darwin": "sha256-J6XrrdK5qBK3sQBQOO/B3ZluOnsAf5f65l4q/K1nDTI="
"x86_64-linux": "sha256-ZmxeRNy2chc9py4m1iW6B+c/NSccMnVZ0lfni/EMdHw=",
"aarch64-linux": "sha256-R+1mxsmAQicerN8ixVy0ff6V8bZ4GH18MHpihvWnaTg=",
"aarch64-darwin": "sha256-m+QT20ohlqo9e86qXu67eKthZm6VDRLwlqJ9CNlEV+0=",
"x86_64-darwin": "sha256-4GeNPyTT2Hq4rxHGSON23ul5Ud3yFGE0QUVsB03Gidc="
}
}

View File

@@ -197,7 +197,6 @@ export async function createTestProject() {
await fs.writeFile(path.join(root, "README.md"), "# e2e\n")
execSync("git init", { cwd: root, stdio: "ignore" })
execSync("git config core.fsmonitor false", { cwd: root, stdio: "ignore" })
execSync("git add -A", { cwd: root, stdio: "ignore" })
execSync('git -c user.name="e2e" -c user.email="e2e@example.com" commit -m "init" --allow-empty', {
cwd: root,
@@ -208,10 +207,7 @@ export async function createTestProject() {
}
export async function cleanupTestProject(directory: string) {
try {
execSync("git fsmonitor--daemon stop", { cwd: directory, stdio: "ignore" })
} catch {}
await fs.rm(directory, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }).catch(() => undefined)
await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined)
}
export function sessionIDFromUrl(url: string) {

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.2.18",
"version": "1.2.17",
"description": "",
"type": "module",
"exports": {
@@ -57,7 +57,7 @@
"@thisbeyond/solid-dnd": "0.7.5",
"diff": "catalog:",
"fuzzysort": "catalog:",
"ghostty-web": "github:anomalyco/ghostty-web#main",
"ghostty-web": "0.4.0",
"luxon": "catalog:",
"marked": "catalog:",
"marked-shiki": "catalog:",

View File

@@ -8,6 +8,7 @@ import { SettingsGeneral } from "./settings-general"
import { SettingsKeybinds } from "./settings-keybinds"
import { SettingsProviders } from "./settings-providers"
import { SettingsModels } from "./settings-models"
import { SettingsMcp } from "./settings-mcp"
export const DialogSettings: Component = () => {
const language = useLanguage()
@@ -45,6 +46,10 @@ export const DialogSettings: Component = () => {
<Icon name="models" />
{language.t("settings.models.title")}
</Tabs.Trigger>
<Tabs.Trigger value="mcp">
<Icon name="mcp" />
{language.t("settings.mcp.title")}
</Tabs.Trigger>
</div>
</div>
</div>
@@ -67,6 +72,9 @@ export const DialogSettings: Component = () => {
<Tabs.Content value="models" class="no-scrollbar">
<SettingsModels />
</Tabs.Content>
<Tabs.Content value="mcp" class="no-scrollbar">
<SettingsMcp />
</Tabs.Content>
</Tabs>
</Dialog>
)

View File

@@ -1,15 +1,665 @@
import { Component } from "solid-js"
import type { Config, McpLocalConfig, McpRemoteConfig, McpStatus } from "@opencode-ai/sdk/v2/client"
import { Button } from "@opencode-ai/ui/button"
import { Icon, type IconProps } from "@opencode-ai/ui/icon"
import { Tag } from "@opencode-ai/ui/tag"
import { Switch } from "@opencode-ai/ui/switch"
import { TextField } from "@opencode-ai/ui/text-field"
import { showToast } from "@opencode-ai/ui/toast"
import { For, Show, createMemo, onMount, type Component } from "solid-js"
import { createStore } from "solid-js/store"
import { useGlobalSDK } from "@/context/global-sdk"
import { useGlobalSync } from "@/context/global-sync"
import { useLanguage } from "@/context/language"
type Mode = "remote" | "local"
type McpMap = NonNullable<Config["mcp"]>
type McpEntry = McpMap[string]
type McpConfig = McpLocalConfig | McpRemoteConfig
type McpState = McpStatus["status"]
const FEATURED = [
{
name: "playwright",
title: "Playwright",
description: "Browser automation tools for testing, scraping, and repros.",
icon: "window-cursor",
panel: "linear-gradient(135deg, rgba(59, 130, 246, 0.14), rgba(15, 23, 42, 0.04))",
glow: "rgba(96, 165, 250, 0.18)",
badge: "rgba(37, 99, 235, 0.14)",
color: "rgb(37, 99, 235)",
config: {
type: "local",
command: ["npx", "-y", "@playwright/mcp@latest"],
},
},
{
name: "context7",
title: "Context7",
description: "Fresh framework docs and API references in one remote server.",
icon: "code-lines",
panel: "linear-gradient(135deg, rgba(14, 165, 233, 0.16), rgba(15, 23, 42, 0.04))",
glow: "rgba(56, 189, 248, 0.2)",
badge: "rgba(8, 145, 178, 0.14)",
color: "rgb(8, 145, 178)",
config: {
type: "remote",
url: "https://mcp.context7.com/mcp",
},
},
{
name: "linear",
title: "Linear",
description: "Issue and project workflows from your Linear workspace.",
icon: "branch",
panel: "linear-gradient(135deg, rgba(124, 58, 237, 0.14), rgba(30, 41, 59, 0.04))",
glow: "rgba(139, 92, 246, 0.18)",
badge: "rgba(109, 40, 217, 0.14)",
color: "rgb(109, 40, 217)",
config: {
type: "remote",
url: "https://mcp.linear.app/sse",
oauth: {},
},
},
{
name: "sentry",
title: "Sentry",
description: "Error monitoring, traces, and issue triage in one place.",
icon: "warning",
panel: "linear-gradient(135deg, rgba(14, 116, 144, 0.16), rgba(15, 23, 42, 0.04))",
glow: "rgba(6, 182, 212, 0.16)",
badge: "rgba(8, 145, 178, 0.14)",
color: "rgb(8, 145, 178)",
config: {
type: "remote",
url: "https://mcp.sentry.dev/mcp",
oauth: {},
},
},
] satisfies Array<{
name: string
title: string
description: string
icon: IconProps["name"]
panel: string
glow: string
badge: string
color: string
config: McpConfig
}>
const STATUS = {
connected: "mcp.status.connected",
failed: "mcp.status.failed",
needs_auth: "mcp.status.needs_auth",
disabled: "mcp.status.disabled",
needs_client_registration: "settings.mcp.status.needs_client_registration",
} satisfies Record<McpState, string>
const empty = (mode: Mode = "remote") => ({
mode,
name: "",
url: "",
command: "",
headers: "",
environment: "",
timeout: "",
})
const isConfig = (value: McpEntry | undefined): value is McpConfig =>
typeof value === "object" && value !== null && "type" in value
const split = (value: string) =>
value
.split("\n")
.map((line) => line.trim())
.filter(Boolean)
const parseMap = (value: string, allowColon: boolean) => {
const out: Record<string, string> = {}
for (const line of split(value)) {
const eq = line.indexOf("=")
const cut = !allowColon ? eq : ([line.indexOf(":"), eq].filter((part) => part > 0).sort((a, b) => a - b)[0] ?? -1)
if (cut < 1) return { error: line }
const key = line.slice(0, cut).trim()
const item = line.slice(cut + 1).trim()
if (!key || !item) return { error: line }
out[key] = item
}
return { value: Object.keys(out).length > 0 ? out : undefined }
}
const parseCmd = (value: string) =>
(value.match(/"[^"]*"|'[^']*'|[^\s]+/g) ?? []).map((part) => {
if (part.startsWith('"') && part.endsWith('"')) return part.slice(1, -1)
if (part.startsWith("'") && part.endsWith("'")) return part.slice(1, -1)
return part
})
export const SettingsMcp: Component = () => {
// TODO: Replace this placeholder with full MCP settings controls.
const language = useLanguage()
const lang = useLanguage()
const sdk = useGlobalSDK()
const sync = useGlobalSync()
const [state, setState] = createStore({
form: empty(),
submitting: "",
statusLoading: false,
status: {} as Record<string, McpStatus>,
})
const busy = createMemo(() => state.submitting.length > 0)
const items = createMemo(() => {
return Object.entries(sync.data.config.mcp ?? {})
.filter((item): item is [string, McpConfig] => isConfig(item[1]))
.map(([name, config]) => ({ name, config }))
.sort((a, b) => a.name.localeCompare(b.name))
})
const names = createMemo(() => new Set(items().map((item) => item.name)))
const spin = () => `${lang.t("common.loading")}${lang.t("common.loading.ellipsis")}`
const kind = (value: Mode) => {
if (value === "remote") return lang.t("settings.mcp.type.remote")
return lang.t("settings.mcp.type.local")
}
const fail = (description: string) => {
showToast({
variant: "error",
title: lang.t("common.requestFailed"),
description,
})
}
const load = () => {
setState("statusLoading", true)
return sdk.client.mcp
.status()
.then((x) => {
setState("status", x.data ?? {})
})
.catch(() => undefined)
.finally(() => {
setState("statusLoading", false)
})
}
const save = (next: McpMap, job: string, onSuccess: () => void, title: string, description: string) => {
const prev = sync.data.config.mcp
setState("submitting", job)
sync.set("config", "mcp", next)
sync
.updateConfig({ mcp: next })
.then(() => {
onSuccess()
void load()
showToast({
variant: "success",
icon: "circle-check",
title,
description,
})
})
.catch((err: unknown) => {
sync.set("config", "mcp", prev)
fail(err instanceof Error ? err.message : String(err))
})
.finally(() => {
setState("submitting", "")
})
}
const add = (name: string, config: McpConfig, job: string, reset: boolean) => {
const key = name.trim()
if (!key) {
fail(lang.t("settings.mcp.validation.name"))
return
}
if (names().has(key)) {
fail(lang.t("settings.mcp.validation.duplicate", { name: key }))
return
}
const next = {
...(sync.data.config.mcp ?? {}),
[key]: config,
}
save(
next,
job,
() => {
if (!reset) return
setState("form", empty(state.form.mode))
},
lang.t("settings.mcp.toast.added.title"),
lang.t("settings.mcp.toast.added.description", { name: key }),
)
}
const addForm = () => {
if (busy()) return
const timeout = state.form.timeout.trim()
const wait = timeout ? Number(timeout) : undefined
if (wait !== undefined && (!Number.isInteger(wait) || wait <= 0)) {
fail(lang.t("settings.mcp.validation.timeout"))
return
}
if (state.form.mode === "remote") {
const url = state.form.url.trim()
if (!url) {
fail(lang.t("settings.mcp.validation.url"))
return
}
const headers = parseMap(state.form.headers, true)
if (headers.error) {
fail(lang.t("settings.mcp.validation.headers", { line: headers.error }))
return
}
add(
state.form.name,
{
type: "remote",
url,
...(headers.value ? { headers: headers.value } : {}),
...(wait ? { timeout: wait } : {}),
},
"form",
true,
)
return
}
const command = parseCmd(state.form.command.trim())
if (command.length === 0) {
fail(lang.t("settings.mcp.validation.command"))
return
}
const environment = parseMap(state.form.environment, false)
if (environment.error) {
fail(lang.t("settings.mcp.validation.environment", { line: environment.error }))
return
}
add(
state.form.name,
{
type: "local",
command,
...(environment.value ? { environment: environment.value } : {}),
...(wait ? { timeout: wait } : {}),
},
"form",
true,
)
}
const addFeatured = (item: (typeof FEATURED)[number]) => {
if (busy()) return
add(item.name, item.config, `featured:${item.name}`, false)
}
const toggle = (name: string, enabled: boolean) => {
if (busy()) return
const current = (sync.data.config.mcp ?? {})[name]
if (!isConfig(current)) return
const next = {
...(sync.data.config.mcp ?? {}),
[name]: {
...current,
enabled,
},
}
save(
next,
`toggle:${name}`,
() => undefined,
lang.t("settings.mcp.toast.updated.title"),
lang.t("settings.mcp.toast.updated.description", {
name,
state: enabled ? lang.t("settings.mcp.state.enabled") : lang.t("settings.mcp.state.disabled"),
}),
)
}
const remove = (name: string) => {
if (busy()) return
const next = { ...(sync.data.config.mcp ?? {}) }
delete next[name]
save(
next,
`remove:${name}`,
() => undefined,
lang.t("settings.mcp.toast.removed.title"),
lang.t("settings.mcp.toast.removed.description", { name }),
)
}
const label = (name: string) => {
const value = state.status[name]?.status
if (!value) return
return lang.t(STATUS[value])
}
const issue = (name: string) => {
const value = state.status[name]
if (!value || !("error" in value)) return
return value.error
}
const line = (config: McpConfig) => {
if (config.type === "remote") return config.url
return config.command.join(" ")
}
onMount(() => {
void load()
})
return (
<div class="flex flex-col h-full overflow-y-auto">
<div class="flex flex-col gap-6 p-6 max-w-[600px]">
<h2 class="text-16-medium text-text-strong">{language.t("settings.mcp.title")}</h2>
<p class="text-14-regular text-text-weak">{language.t("settings.mcp.description")}</p>
<div class="flex flex-col h-full overflow-y-auto no-scrollbar px-4 pb-10 sm:px-10 sm:pb-10">
<div class="sticky top-0 z-10 bg-[linear-gradient(to_bottom,var(--surface-stronger-non-alpha)_calc(100%_-_24px),transparent)]">
<div class="flex flex-col gap-1 pt-6 pb-8 max-w-[720px]">
<h2 class="text-16-medium text-text-strong">{lang.t("settings.mcp.title")}</h2>
<p class="text-14-regular text-text-weak">{lang.t("settings.mcp.description")}</p>
</div>
</div>
<div class="flex flex-col gap-8 max-w-[720px]">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-1">
<h3 class="text-14-medium text-text-strong">{lang.t("settings.mcp.section.featured")}</h3>
<p class="text-12-regular text-text-weak">{lang.t("settings.mcp.section.featured.description")}</p>
</div>
<div class="grid gap-3 sm:grid-cols-2">
<For each={FEATURED}>
{(item) => {
const added = () => names().has(item.name)
const pending = () => state.submitting === `featured:${item.name}`
return (
<button
type="button"
class="group relative overflow-hidden rounded-2xl border border-border-weak-base p-4 text-left transition-transform duration-200 disabled:cursor-default"
classList={{
"hover:-translate-y-0.5": !added() && !busy(),
"opacity-60": added(),
}}
disabled={added() || busy()}
onClick={() => addFeatured(item)}
>
<div class="absolute inset-0" aria-hidden="true">
<div class="absolute inset-0" style={{ background: item.panel }} />
<div
class="absolute -right-6 -top-6 size-24 rounded-full blur-2xl"
style={{ background: item.glow }}
/>
</div>
<div class="relative flex flex-col gap-4">
<div class="flex items-start justify-between gap-3">
<div
class="flex size-11 shrink-0 items-center justify-center rounded-2xl border border-border-weak-base"
style={{ background: item.badge, color: item.color }}
>
<Icon name={item.icon} class="size-5" />
</div>
<span class="rounded-full bg-surface-base px-2.5 py-1 text-11-medium text-text-weak">
{kind(item.config.type)}
</span>
</div>
<div class="flex flex-col gap-1">
<div class="flex flex-wrap items-center gap-2">
<span class="text-14-medium text-text-strong">{item.title}</span>
<Show when={added()}>
<span class="rounded-full bg-surface-base px-2 py-0.5 text-11-medium text-text-weak">
{lang.t("settings.mcp.featured.added")}
</span>
</Show>
<Show when={pending()}>
<span class="text-11-regular text-text-weak">{spin()}</span>
</Show>
</div>
<span class="text-12-regular leading-5 text-text-weak">{item.description}</span>
</div>
</div>
</button>
)
}}
</For>
</div>
</div>
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-1">
<div class="flex flex-wrap items-center gap-2">
<h3 class="text-14-medium text-text-strong">{lang.t("settings.mcp.section.configured")}</h3>
<Show when={state.statusLoading}>
<span class="text-11-regular text-text-weak">{spin()}</span>
</Show>
</div>
<p class="text-12-regular text-text-weak">{lang.t("settings.mcp.section.configured.description")}</p>
</div>
<div class="bg-surface-raised-base px-4 rounded-lg">
<Show
when={items().length > 0}
fallback={<div class="py-4 text-14-regular text-text-weak">{lang.t("dialog.mcp.empty")}</div>}
>
<For each={items()}>
{(item) => {
const current = () => state.status[item.name]?.status
const text = () => label(item.name)
const problem = () => issue(item.name)
const enabled = () => item.config.enabled !== false
const pendingToggle = () => state.submitting === `toggle:${item.name}`
const pending = () => state.submitting === `remove:${item.name}`
return (
<div class="flex flex-wrap items-start justify-between gap-4 py-4 border-b border-border-weak-base last:border-none">
<div class="min-w-0 flex-1 flex flex-col gap-2">
<div class="flex flex-wrap items-center gap-2">
<span class="text-14-medium text-text-strong">{item.name}</span>
<Tag>{kind(item.config.type)}</Tag>
<Show when={text()}>
<span
class="rounded-full bg-surface-base px-2 py-0.5 text-11-medium"
classList={{
"text-icon-success-base": current() === "connected",
"text-icon-warning-base": current() === "needs_auth",
"text-icon-critical-base":
current() === "failed" || current() === "needs_client_registration",
"text-text-weak": current() === "disabled",
}}
>
{text()}
</span>
</Show>
</div>
<span class="text-12-regular text-text-weak break-all">{line(item.config)}</span>
<Show when={problem()}>
<span class="text-12-regular text-icon-critical-base break-all">{problem()}</span>
</Show>
</div>
<div class="flex items-center gap-3" onClick={(e) => e.stopPropagation()}>
<div class="flex items-center gap-2 pl-1">
<Show when={pendingToggle()}>
<span class="text-11-regular text-text-weak">{spin()}</span>
</Show>
<Switch
checked={enabled()}
disabled={busy()}
onChange={(next) => toggle(item.name, next)}
hideLabel
>
{item.name}
</Switch>
<span class="text-12-regular text-text-weak">
{enabled() ? lang.t("settings.mcp.state.enabled") : lang.t("settings.mcp.state.disabled")}
</span>
</div>
<Button size="large" variant="ghost" disabled={busy()} onClick={() => remove(item.name)}>
{pending() ? spin() : lang.t("settings.mcp.action.remove")}
</Button>
</div>
</div>
)
}}
</For>
</Show>
</div>
</div>
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-1">
<h3 class="text-14-medium text-text-strong">{lang.t("settings.mcp.section.add")}</h3>
<p class="text-12-regular text-text-weak">{lang.t("settings.mcp.section.add.description")}</p>
</div>
<div class="rounded-2xl border border-border-weak-base bg-surface-raised-base p-4 sm:p-5">
<div class="flex flex-col gap-4">
<div class="flex flex-col gap-2">
<span class="text-12-medium text-text-strong">{lang.t("settings.mcp.form.type.label")}</span>
<div class="inline-flex w-full gap-1 rounded-xl bg-surface-base p-1 sm:w-auto">
<For each={["remote", "local"] as const}>
{(mode) => (
<button
type="button"
class="h-9 flex-1 rounded-lg px-3 text-12-medium transition-colors sm:flex-none"
classList={{
"bg-surface-raised-base text-text-strong": state.form.mode === mode,
"text-text-weak": state.form.mode !== mode,
}}
onClick={() => {
if (busy()) return
setState("form", "mode", mode)
}}
>
{kind(mode)}
</button>
)}
</For>
</div>
</div>
<div class="grid gap-4 sm:grid-cols-2">
<TextField
label={lang.t("settings.mcp.form.name.label")}
value={state.form.name}
onChange={(value) => setState("form", "name", value)}
placeholder={lang.t("settings.mcp.form.name.placeholder")}
spellcheck={false}
autocorrect="off"
autocomplete="off"
autocapitalize="off"
/>
<TextField
label={lang.t("settings.mcp.form.timeout.label")}
value={state.form.timeout}
onChange={(value) => setState("form", "timeout", value)}
placeholder={lang.t("settings.mcp.form.timeout.placeholder")}
inputMode="numeric"
spellcheck={false}
autocorrect="off"
autocomplete="off"
autocapitalize="off"
/>
</div>
<Show
when={state.form.mode === "remote"}
fallback={
<>
<TextField
label={lang.t("settings.mcp.form.command.label")}
value={state.form.command}
onChange={(value) => setState("form", "command", value)}
placeholder={lang.t("settings.mcp.form.command.placeholder")}
spellcheck={false}
autocorrect="off"
autocomplete="off"
autocapitalize="off"
/>
<TextField
label={lang.t("settings.mcp.form.environment.label")}
description={lang.t("settings.mcp.form.environment.description")}
value={state.form.environment}
onChange={(value) => setState("form", "environment", value)}
placeholder="API_KEY={env:API_KEY}"
multiline
rows={4}
spellcheck={false}
autocorrect="off"
autocomplete="off"
autocapitalize="off"
/>
</>
}
>
<TextField
label={lang.t("settings.mcp.form.url.label")}
value={state.form.url}
onChange={(value) => setState("form", "url", value)}
placeholder={lang.t("settings.mcp.form.url.placeholder")}
spellcheck={false}
autocorrect="off"
autocomplete="off"
autocapitalize="off"
/>
<TextField
label={lang.t("settings.mcp.form.headers.label")}
description={lang.t("settings.mcp.form.headers.description")}
value={state.form.headers}
onChange={(value) => setState("form", "headers", value)}
placeholder="Authorization: Bearer {env:API_KEY}"
multiline
rows={4}
spellcheck={false}
autocorrect="off"
autocomplete="off"
autocapitalize="off"
/>
</Show>
<Button
size="large"
variant="secondary"
icon="plus-small"
class="w-full justify-center sm:w-auto"
disabled={busy()}
onClick={addForm}
>
{state.submitting === "form" ? spin() : lang.t("settings.mcp.action.add")}
</Button>
</div>
</div>
</div>
</div>
</div>
)

View File

@@ -665,6 +665,47 @@ export const dict = {
"settings.commands.description": "ستكون إعدادات الأمر قابلة للتكوين هنا.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "ستكون إعدادات MCP قابلة للتكوين هنا.",
"settings.mcp.section.featured": "مميّز",
"settings.mcp.section.featured.description": "أضف إعدادًا مسبقًا لخوادم MCP الشهيرة بنقرة واحدة.",
"settings.mcp.section.configured": "الخوادم المهيأة",
"settings.mcp.section.configured.description":
"اطلع على خوادم MCP المثبتة، وكيفية اتصالها، وقم بإزالة تلك التي لم تعد بحاجة إليها.",
"settings.mcp.section.add": "أضف خادمًا",
"settings.mcp.section.add.description": "أنشئ تكوين خادم MCP محلي أو بعيد خاص بك.",
"settings.mcp.type.local": "محلي",
"settings.mcp.type.remote": "بعيد",
"settings.mcp.featured.added": "تمت الإضافة",
"settings.mcp.action.add": "أضف خادمًا",
"settings.mcp.action.remove": "إزالة",
"settings.mcp.state.enabled": "مفعل",
"settings.mcp.state.disabled": "معطل",
"settings.mcp.form.type.label": "نوع الاتصال",
"settings.mcp.form.name.label": "اسم الخادم",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "عنوان URL البعيد",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "الأمر",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "الرؤوس (Headers)",
"settings.mcp.form.headers.description": "اختياري. أضف رأسًا واحدًا في كل سطر بصيغة KEY: value.",
"settings.mcp.form.environment.label": "البيئة",
"settings.mcp.form.environment.description": "اختياري. أضف متغيرًا واحدًا في كل سطر بصيغة KEY=value.",
"settings.mcp.form.timeout.label": "المهلة (مللي ثانية)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "تمت إضافة خادم MCP",
"settings.mcp.toast.added.description": "تم حفظ {{name}} في إعدادات MCP الخاصة بك.",
"settings.mcp.toast.updated.title": "تم تحديث خادم MCP",
"settings.mcp.toast.updated.description": "أصبح {{name}} الآن {{state}}.",
"settings.mcp.toast.removed.title": "تمت إزالة خادم MCP",
"settings.mcp.toast.removed.description": "تمت إزالة {{name}} من إعدادات MCP الخاصة بك.",
"settings.mcp.validation.name": "أدخل اسم الخادم قبل الحفظ.",
"settings.mcp.validation.duplicate": "{{name}} مهيأ بالفعل.",
"settings.mcp.validation.url": "أدخل عنوان URL لخادم MCP البعيد.",
"settings.mcp.validation.command": "أدخل الأمر المستخدم لبدء تشغيل خادم MCP المحلي.",
"settings.mcp.validation.timeout": "يجب أن تكون المهلة عددًا صحيحًا موجبًا.",
"settings.mcp.validation.headers": "تعذر تحليل سطر الرأس: {{line}}",
"settings.mcp.validation.environment": "تعذر تحليل سطر البيئة: {{line}}",
"settings.mcp.status.needs_client_registration": "يحتاج إلى تسجيل العميل",
"settings.permissions.title": "الأذونات",
"settings.permissions.description": "تحكم في الأدوات التي يمكن للخادم استخدامها بشكل افتراضي.",
"settings.permissions.section.tools": "الأدوات",

View File

@@ -673,6 +673,48 @@ export const dict = {
"settings.commands.description": "Configurações de comandos estarão disponíveis aqui.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "Configurações de MCP estarão disponíveis aqui.",
"settings.mcp.section.featured": "Destaques",
"settings.mcp.section.featured.description":
"Adicione uma predefinição refinada para servidores MCP populares com um clique.",
"settings.mcp.section.configured": "Servidores configurados",
"settings.mcp.section.configured.description":
"Veja quais servidores MCP estão instalados, como eles se conectam e remova os que você não precisa mais.",
"settings.mcp.section.add": "Adicionar servidor",
"settings.mcp.section.add.description": "Crie sua própria configuração de servidor MCP local ou remoto.",
"settings.mcp.type.local": "Local",
"settings.mcp.type.remote": "Remoto",
"settings.mcp.featured.added": "Adicionado",
"settings.mcp.action.add": "Adicionar servidor",
"settings.mcp.action.remove": "Remover",
"settings.mcp.state.enabled": "Habilitado",
"settings.mcp.state.disabled": "Desabilitado",
"settings.mcp.form.type.label": "Tipo de conexão",
"settings.mcp.form.name.label": "Nome do servidor",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "URL remota",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Comando",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Cabeçalhos",
"settings.mcp.form.headers.description": "Opcional. Adicione um cabeçalho por linha usando KEY: value.",
"settings.mcp.form.environment.label": "Ambiente",
"settings.mcp.form.environment.description": "Opcional. Adicione uma variável por linha usando KEY=value.",
"settings.mcp.form.timeout.label": "Tempo limite (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "Servidor MCP adicionado",
"settings.mcp.toast.added.description": "{{name}} foi salvo nas suas configurações do MCP.",
"settings.mcp.toast.updated.title": "Servidor MCP atualizado",
"settings.mcp.toast.updated.description": "{{name}} está agora {{state}}.",
"settings.mcp.toast.removed.title": "Servidor MCP removido",
"settings.mcp.toast.removed.description": "{{name}} foi removido das suas configurações do MCP.",
"settings.mcp.validation.name": "Insira um nome para o servidor antes de salvar.",
"settings.mcp.validation.duplicate": "{{name}} já está configurado.",
"settings.mcp.validation.url": "Insira uma URL de servidor MCP remoto.",
"settings.mcp.validation.command": "Insira o comando usado para iniciar o servidor MCP local.",
"settings.mcp.validation.timeout": "O tempo limite deve ser um número inteiro positivo.",
"settings.mcp.validation.headers": "Não foi possível analisar a linha do cabeçalho: {{line}}",
"settings.mcp.validation.environment": "Não foi possível analisar a linha de ambiente: {{line}}",
"settings.mcp.status.needs_client_registration": "Requer registro do cliente",
"settings.permissions.title": "Permissões",
"settings.permissions.description": "Controle quais ferramentas o servidor pode usar por padrão.",
"settings.permissions.section.tools": "Ferramentas",

View File

@@ -745,6 +745,47 @@ export const dict = {
"settings.commands.description": "Postavke komandi će se ovdje moći podešavati.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP postavke će se ovdje moći podešavati.",
"settings.mcp.section.featured": "Izdvojeno",
"settings.mcp.section.featured.description": "Dodajte gotovu postavku za popularne MCP servere jednim klikom.",
"settings.mcp.section.configured": "Konfigurisani serveri",
"settings.mcp.section.configured.description":
"Pogledajte koji su MCP serveri instalirani, kako se povezuju i uklonite one koji vam više ne trebaju.",
"settings.mcp.section.add": "Dodaj server",
"settings.mcp.section.add.description": "Kreirajte vlastitu konfiguraciju lokalnog ili udaljenog MCP servera.",
"settings.mcp.type.local": "Lokalno",
"settings.mcp.type.remote": "Udaljeno",
"settings.mcp.featured.added": "Dodano",
"settings.mcp.action.add": "Dodaj server",
"settings.mcp.action.remove": "Ukloni",
"settings.mcp.state.enabled": "Omogućeno",
"settings.mcp.state.disabled": "Onemogućeno",
"settings.mcp.form.type.label": "Tip konekcije",
"settings.mcp.form.name.label": "Naziv servera",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "Udaljeni URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Komanda",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Zaglavlja",
"settings.mcp.form.headers.description": "Opcionalno. Dodajte jedno zaglavlje po liniji koristeći KEY: value.",
"settings.mcp.form.environment.label": "Okruženje",
"settings.mcp.form.environment.description": "Opcionalno. Dodajte jednu varijablu po liniji koristeći KEY=value.",
"settings.mcp.form.timeout.label": "Istek vremena (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP server dodan",
"settings.mcp.toast.added.description": "{{name}} je sačuvan u vaše MCP postavke.",
"settings.mcp.toast.updated.title": "MCP server ažuriran",
"settings.mcp.toast.updated.description": "{{name}} je sada {{state}}.",
"settings.mcp.toast.removed.title": "MCP server uklonjen",
"settings.mcp.toast.removed.description": "{{name}} je uklonjen iz vaših MCP postavki.",
"settings.mcp.validation.name": "Unesite naziv servera prije čuvanja.",
"settings.mcp.validation.duplicate": "{{name}} je već konfigurisan.",
"settings.mcp.validation.url": "Unesite URL udaljenog MCP servera.",
"settings.mcp.validation.command": "Unesite komandu koja se koristi za pokretanje lokalnog MCP servera.",
"settings.mcp.validation.timeout": "Istek vremena mora biti pozitivan cijeli broj.",
"settings.mcp.validation.headers": "Nije moguće parsirati liniju zaglavlja: {{line}}",
"settings.mcp.validation.environment": "Nije moguće parsirati liniju okruženja: {{line}}",
"settings.mcp.status.needs_client_registration": "Potrebna registracija klijenta",
"settings.permissions.title": "Dozvole",
"settings.permissions.description": "Kontroliši koje alate server smije koristiti po defaultu.",

View File

@@ -739,6 +739,48 @@ export const dict = {
"settings.commands.description": "Kommandoindstillinger vil kunne konfigureres her.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP-indstillinger vil kunne konfigureres her.",
"settings.mcp.section.featured": "Udvalgte",
"settings.mcp.section.featured.description":
"Tilføj en poleret forudindstilling for populære MCP-servere med ét klik.",
"settings.mcp.section.configured": "Konfigurerede servere",
"settings.mcp.section.configured.description":
"Se hvilke MCP-servere der er installeret, hvordan de forbinder, og fjern dem du ikke længere har brug for.",
"settings.mcp.section.add": "Tilføj en server",
"settings.mcp.section.add.description": "Opret din egen lokale eller fjern MCP-serverkonfiguration.",
"settings.mcp.type.local": "Lokal",
"settings.mcp.type.remote": "Fjern",
"settings.mcp.featured.added": "Tilføjet",
"settings.mcp.action.add": "Tilføj server",
"settings.mcp.action.remove": "Fjern",
"settings.mcp.state.enabled": "Aktiveret",
"settings.mcp.state.disabled": "Deaktiveret",
"settings.mcp.form.type.label": "Forbindelsestype",
"settings.mcp.form.name.label": "Servernavn",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "Fjern-URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Kommando",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Headere",
"settings.mcp.form.headers.description": "Valgfrit. Tilføj én header pr. linje ved brug af KEY: value.",
"settings.mcp.form.environment.label": "Miljø",
"settings.mcp.form.environment.description": "Valgfrit. Tilføj én variabel pr. linje ved brug af KEY=value.",
"settings.mcp.form.timeout.label": "Timeout (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP-server tilføjet",
"settings.mcp.toast.added.description": "{{name}} er blevet gemt i dine MCP-indstillinger.",
"settings.mcp.toast.updated.title": "MCP-server opdateret",
"settings.mcp.toast.updated.description": "{{name}} er nu {{state}}.",
"settings.mcp.toast.removed.title": "MCP-server fjernet",
"settings.mcp.toast.removed.description": "{{name}} er blevet fjernet fra dine MCP-indstillinger.",
"settings.mcp.validation.name": "Indtast et servernavn før du gemmer.",
"settings.mcp.validation.duplicate": "{{name}} er allerede konfigureret.",
"settings.mcp.validation.url": "Indtast en URL til en fjern MCP-server.",
"settings.mcp.validation.command": "Indtast kommandoen, der bruges til at starte den lokale MCP-server.",
"settings.mcp.validation.timeout": "Timeout skal være et positivt heltal.",
"settings.mcp.validation.headers": "Kunne ikke fortolke header-linje: {{line}}",
"settings.mcp.validation.environment": "Kunne ikke fortolke miljø-linje: {{line}}",
"settings.mcp.status.needs_client_registration": "Kræver klientregistrering",
"settings.permissions.title": "Tilladelser",
"settings.permissions.description": "Styr hvilke værktøjer serveren kan bruge som standard.",

View File

@@ -682,6 +682,47 @@ export const dict = {
"settings.commands.description": "Befehlseinstellungen können hier konfiguriert werden.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP-Einstellungen können hier konfiguriert werden.",
"settings.mcp.section.featured": "Vorgestellt",
"settings.mcp.section.featured.description": "Fügen Sie mit einem Klick eine Vorlage für beliebte MCP-Server hinzu.",
"settings.mcp.section.configured": "Konfigurierte Server",
"settings.mcp.section.configured.description":
"Sehen Sie, welche MCP-Server installiert sind, wie sie verbunden sind, und entfernen Sie nicht mehr benötigte.",
"settings.mcp.section.add": "Server hinzufügen",
"settings.mcp.section.add.description": "Erstellen Sie Ihre eigene lokale oder Remote-MCP-Server-Konfiguration.",
"settings.mcp.type.local": "Lokal",
"settings.mcp.type.remote": "Remote",
"settings.mcp.featured.added": "Hinzugefügt",
"settings.mcp.action.add": "Server hinzufügen",
"settings.mcp.action.remove": "Entfernen",
"settings.mcp.state.enabled": "Aktiviert",
"settings.mcp.state.disabled": "Deaktiviert",
"settings.mcp.form.type.label": "Verbindungstyp",
"settings.mcp.form.name.label": "Servername",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "Remote-URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Befehl",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Header",
"settings.mcp.form.headers.description": "Optional. Fügen Sie einen Header pro Zeile im Format KEY: value hinzu.",
"settings.mcp.form.environment.label": "Umgebung",
"settings.mcp.form.environment.description": "Optional. Fügen Sie eine Variable pro Zeile im Format KEY=value hinzu.",
"settings.mcp.form.timeout.label": "Timeout (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP-Server hinzugefügt",
"settings.mcp.toast.added.description": "{{name}} wurde in Ihren MCP-Einstellungen gespeichert.",
"settings.mcp.toast.updated.title": "MCP-Server aktualisiert",
"settings.mcp.toast.updated.description": "{{name}} ist jetzt {{state}}.",
"settings.mcp.toast.removed.title": "MCP-Server entfernt",
"settings.mcp.toast.removed.description": "{{name}} wurde aus Ihren MCP-Einstellungen entfernt.",
"settings.mcp.validation.name": "Geben Sie vor dem Speichern einen Servernamen ein.",
"settings.mcp.validation.duplicate": "{{name}} ist bereits konfiguriert.",
"settings.mcp.validation.url": "Geben Sie eine Remote-MCP-Server-URL ein.",
"settings.mcp.validation.command": "Geben Sie den Befehl zum Starten des lokalen MCP-Servers ein.",
"settings.mcp.validation.timeout": "Das Timeout muss eine positive ganze Zahl sein.",
"settings.mcp.validation.headers": "Header-Zeile konnte nicht verarbeitet werden: {{line}}",
"settings.mcp.validation.environment": "Umgebungsvariablen-Zeile konnte nicht verarbeitet werden: {{line}}",
"settings.mcp.status.needs_client_registration": "Client-Registrierung erforderlich",
"settings.permissions.title": "Berechtigungen",
"settings.permissions.description": "Steuern Sie, welche Tools der Server standardmäßig verwenden darf.",
"settings.permissions.section.tools": "Tools",

View File

@@ -770,7 +770,48 @@ export const dict = {
"settings.commands.title": "Commands",
"settings.commands.description": "Command settings will be configurable here.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP settings will be configurable here.",
"settings.mcp.description": "Manage local and remote MCP servers that OpenCode can use across your workspaces.",
"settings.mcp.section.featured": "Featured",
"settings.mcp.section.featured.description": "Add a polished preset for popular MCP servers in one click.",
"settings.mcp.section.configured": "Configured servers",
"settings.mcp.section.configured.description":
"See which MCP servers are installed, how they connect, and remove the ones you no longer need.",
"settings.mcp.section.add": "Add a server",
"settings.mcp.section.add.description": "Create your own local or remote MCP server configuration.",
"settings.mcp.type.local": "Local",
"settings.mcp.type.remote": "Remote",
"settings.mcp.featured.added": "Added",
"settings.mcp.action.add": "Add server",
"settings.mcp.action.remove": "Remove",
"settings.mcp.state.enabled": "Enabled",
"settings.mcp.state.disabled": "Disabled",
"settings.mcp.form.type.label": "Connection type",
"settings.mcp.form.name.label": "Server name",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "Remote URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Command",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Headers",
"settings.mcp.form.headers.description": "Optional. Add one header per line using KEY: value.",
"settings.mcp.form.environment.label": "Environment",
"settings.mcp.form.environment.description": "Optional. Add one variable per line using KEY=value.",
"settings.mcp.form.timeout.label": "Timeout (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP server added",
"settings.mcp.toast.added.description": "{{name}} has been saved to your MCP settings.",
"settings.mcp.toast.updated.title": "MCP server updated",
"settings.mcp.toast.updated.description": "{{name}} is now {{state}}.",
"settings.mcp.toast.removed.title": "MCP server removed",
"settings.mcp.toast.removed.description": "{{name}} has been removed from your MCP settings.",
"settings.mcp.validation.name": "Enter a server name before saving.",
"settings.mcp.validation.duplicate": "{{name}} is already configured.",
"settings.mcp.validation.url": "Enter a remote MCP server URL.",
"settings.mcp.validation.command": "Enter the command used to start the local MCP server.",
"settings.mcp.validation.timeout": "Timeout must be a positive whole number.",
"settings.mcp.validation.headers": "Couldn't parse header line: {{line}}",
"settings.mcp.validation.environment": "Couldn't parse environment line: {{line}}",
"settings.mcp.status.needs_client_registration": "Needs client registration",
"settings.permissions.title": "Permissions",
"settings.permissions.description": "Control what tools the server can use by default.",

View File

@@ -751,6 +751,48 @@ export const dict = {
"settings.commands.description": "La configuración de comandos estará disponible aquí.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "La configuración de MCP estará disponible aquí.",
"settings.mcp.section.featured": "Destacados",
"settings.mcp.section.featured.description":
"Añade un ajuste preestablecido para servidores MCP populares con un solo clic.",
"settings.mcp.section.configured": "Servidores configurados",
"settings.mcp.section.configured.description":
"Consulta qué servidores MCP están instalados, cómo se conectan y elimina los que ya no necesites.",
"settings.mcp.section.add": "Añadir un servidor",
"settings.mcp.section.add.description": "Crea tu propia configuración de servidor MCP local o remoto.",
"settings.mcp.type.local": "Local",
"settings.mcp.type.remote": "Remoto",
"settings.mcp.featured.added": "Añadido",
"settings.mcp.action.add": "Añadir servidor",
"settings.mcp.action.remove": "Eliminar",
"settings.mcp.state.enabled": "Habilitado",
"settings.mcp.state.disabled": "Deshabilitado",
"settings.mcp.form.type.label": "Tipo de conexión",
"settings.mcp.form.name.label": "Nombre del servidor",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "URL remota",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Comando",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Encabezados",
"settings.mcp.form.headers.description": "Opcional. Añade un encabezado por línea usando KEY: value.",
"settings.mcp.form.environment.label": "Entorno",
"settings.mcp.form.environment.description": "Opcional. Añade una variable por línea usando KEY=value.",
"settings.mcp.form.timeout.label": "Tiempo de espera (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "Servidor MCP añadido",
"settings.mcp.toast.added.description": "{{name}} se ha guardado en tu configuración de MCP.",
"settings.mcp.toast.updated.title": "Servidor MCP actualizado",
"settings.mcp.toast.updated.description": "{{name}} está ahora {{state}}.",
"settings.mcp.toast.removed.title": "Servidor MCP eliminado",
"settings.mcp.toast.removed.description": "{{name}} se ha eliminado de tu configuración de MCP.",
"settings.mcp.validation.name": "Introduce un nombre de servidor antes de guardar.",
"settings.mcp.validation.duplicate": "{{name}} ya está configurado.",
"settings.mcp.validation.url": "Introduce una URL de servidor MCP remoto.",
"settings.mcp.validation.command": "Introduce el comando utilizado para iniciar el servidor MCP local.",
"settings.mcp.validation.timeout": "El tiempo de espera debe ser un número entero positivo.",
"settings.mcp.validation.headers": "No se pudo analizar la línea de encabezado: {{line}}",
"settings.mcp.validation.environment": "No se pudo analizar la línea de entorno: {{line}}",
"settings.mcp.status.needs_client_registration": "Requiere registro de cliente",
"settings.permissions.title": "Permisos",
"settings.permissions.description": "Controla qué herramientas puede usar el servidor por defecto.",

View File

@@ -679,6 +679,48 @@ export const dict = {
"settings.commands.description": "Les paramètres des commandes seront configurables ici.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "Les paramètres MCP seront configurables ici.",
"settings.mcp.section.featured": "En vedette",
"settings.mcp.section.featured.description":
"Ajoutez un préréglage soigné pour les serveurs MCP populaires en un clic.",
"settings.mcp.section.configured": "Serveurs configurés",
"settings.mcp.section.configured.description":
"Consultez les serveurs MCP installés, leur mode de connexion, et supprimez ceux dont vous n'avez plus besoin.",
"settings.mcp.section.add": "Ajouter un serveur",
"settings.mcp.section.add.description": "Créez votre propre configuration de serveur MCP local ou distant.",
"settings.mcp.type.local": "Local",
"settings.mcp.type.remote": "Distant",
"settings.mcp.featured.added": "Ajouté",
"settings.mcp.action.add": "Ajouter un serveur",
"settings.mcp.action.remove": "Supprimer",
"settings.mcp.state.enabled": "Activé",
"settings.mcp.state.disabled": "Désactivé",
"settings.mcp.form.type.label": "Type de connexion",
"settings.mcp.form.name.label": "Nom du serveur",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "URL distante",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Commande",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "En-têtes",
"settings.mcp.form.headers.description": "Facultatif. Ajoutez un en-tête par ligne au format KEY: value.",
"settings.mcp.form.environment.label": "Environnement",
"settings.mcp.form.environment.description": "Facultatif. Ajoutez une variable par ligne au format KEY=value.",
"settings.mcp.form.timeout.label": "Délai d'attente (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "Serveur MCP ajouté",
"settings.mcp.toast.added.description": "{{name}} a été enregistré dans vos paramètres MCP.",
"settings.mcp.toast.updated.title": "Serveur MCP mis à jour",
"settings.mcp.toast.updated.description": "{{name}} est désormais {{state}}.",
"settings.mcp.toast.removed.title": "Serveur MCP supprimé",
"settings.mcp.toast.removed.description": "{{name}} a été supprimé de vos paramètres MCP.",
"settings.mcp.validation.name": "Saisissez un nom de serveur avant d'enregistrer.",
"settings.mcp.validation.duplicate": "{{name}} est déjà configuré.",
"settings.mcp.validation.url": "Saisissez une URL de serveur MCP distant.",
"settings.mcp.validation.command": "Saisissez la commande utilisée pour démarrer le serveur MCP local.",
"settings.mcp.validation.timeout": "Le délai d'attente doit être un nombre entier positif.",
"settings.mcp.validation.headers": "Impossible d'analyser la ligne d'en-tête : {{line}}",
"settings.mcp.validation.environment": "Impossible d'analyser la ligne d'environnement : {{line}}",
"settings.mcp.status.needs_client_registration": "Nécessite l'enregistrement du client",
"settings.permissions.title": "Permissions",
"settings.permissions.description": "Contrôlez les outils que le serveur peut utiliser par défaut.",
"settings.permissions.section.tools": "Outils",

View File

@@ -670,6 +670,48 @@ export const dict = {
"settings.commands.description": "コマンド設定はここで構成できます。",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP設定はここで構成できます。",
"settings.mcp.section.featured": "おすすめ",
"settings.mcp.section.featured.description":
"人気のMCPサーバー向けに調整されたプリセットをワンクリックで追加できます。",
"settings.mcp.section.configured": "設定済みのサーバー",
"settings.mcp.section.configured.description":
"インストールされているMCPサーバーや接続方法を確認したり、不要になったサーバーを削除したりできます。",
"settings.mcp.section.add": "サーバーを追加",
"settings.mcp.section.add.description": "ローカルまたはリモートの独自のMCPサーバー設定を作成します。",
"settings.mcp.type.local": "ローカル",
"settings.mcp.type.remote": "リモート",
"settings.mcp.featured.added": "追加済み",
"settings.mcp.action.add": "サーバーを追加",
"settings.mcp.action.remove": "削除",
"settings.mcp.state.enabled": "有効",
"settings.mcp.state.disabled": "無効",
"settings.mcp.form.type.label": "接続タイプ",
"settings.mcp.form.name.label": "サーバー名",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "リモートURL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "コマンド",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "ヘッダー",
"settings.mcp.form.headers.description": "任意。1行につき1つのヘッダーを KEY: value の形式で追加してください。",
"settings.mcp.form.environment.label": "環境変数",
"settings.mcp.form.environment.description": "任意。1行につき1つの変数を KEY=value の形式で追加してください。",
"settings.mcp.form.timeout.label": "タイムアウト (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCPサーバーを追加しました",
"settings.mcp.toast.added.description": "{{name}} をMCP設定に保存しました。",
"settings.mcp.toast.updated.title": "MCPサーバーを更新しました",
"settings.mcp.toast.updated.description": "{{name}} は現在{{state}}です。",
"settings.mcp.toast.removed.title": "MCPサーバーを削除しました",
"settings.mcp.toast.removed.description": "MCP設定から {{name}} を削除しました。",
"settings.mcp.validation.name": "保存する前にサーバー名を入力してください。",
"settings.mcp.validation.duplicate": "{{name}} は既に設定されています。",
"settings.mcp.validation.url": "リモートMCPサーバーのURLを入力してください。",
"settings.mcp.validation.command": "ローカルMCPサーバーの起動コマンドを入力してください。",
"settings.mcp.validation.timeout": "タイムアウトには正の整数を指定してください。",
"settings.mcp.validation.headers": "ヘッダー行を解析できませんでした: {{line}}",
"settings.mcp.validation.environment": "環境変数の行を解析できませんでした: {{line}}",
"settings.mcp.status.needs_client_registration": "クライアント登録が必要です",
"settings.permissions.title": "権限",
"settings.permissions.description": "サーバーがデフォルトで使用できるツールを制御します。",
"settings.permissions.section.tools": "ツール",

View File

@@ -670,6 +670,49 @@ export const dict = {
"settings.commands.description": "명령어 설정은 여기서 구성할 수 있습니다.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP 설정은 여기서 구성할 수 있습니다.",
"settings.mcp.section.featured": "추천",
"settings.mcp.section.featured.description": "클릭 한 번으로 인기 있는 MCP 서버에 대한 프리셋을 추가하세요.",
"settings.mcp.section.configured": "구성된 서버",
"settings.mcp.section.configured.description":
"설치된 MCP 서버와 연결 방식을 확인하고, 더 이상 필요하지 않은 서버를 제거하세요.",
"settings.mcp.section.add": "서버 추가",
"settings.mcp.section.add.description": "로컬 또는 원격 MCP 서버 구성을 직접 생성하세요.",
"settings.mcp.type.local": "로컬",
"settings.mcp.type.remote": "원격",
"settings.mcp.featured.added": "추가됨",
"settings.mcp.action.add": "서버 추가",
"settings.mcp.action.remove": "제거",
"settings.mcp.state.enabled": "활성화됨",
"settings.mcp.state.disabled": "비활성화됨",
"settings.mcp.form.type.label": "연결 유형",
"settings.mcp.form.name.label": "서버 이름",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "원격 URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "명령",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "헤더",
"settings.mcp.form.headers.description":
"선택 사항입니다. KEY: value 형식을 사용하여 한 줄에 하나의 헤더를 추가하세요.",
"settings.mcp.form.environment.label": "환경 변수",
"settings.mcp.form.environment.description":
"선택 사항입니다. KEY=value 형식을 사용하여 한 줄에 하나의 변수를 추가하세요.",
"settings.mcp.form.timeout.label": "시간 초과 (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP 서버 추가됨",
"settings.mcp.toast.added.description": "{{name}} 서버가 MCP 설정에 저장되었습니다.",
"settings.mcp.toast.updated.title": "MCP 서버 업데이트됨",
"settings.mcp.toast.updated.description": "{{name}}이(가) 이제 {{state}} 상태입니다.",
"settings.mcp.toast.removed.title": "MCP 서버 제거됨",
"settings.mcp.toast.removed.description": "{{name}} 서버가 MCP 설정에서 제거되었습니다.",
"settings.mcp.validation.name": "저장하기 전에 서버 이름을 입력하세요.",
"settings.mcp.validation.duplicate": "{{name}}은(는) 이미 구성되어 있습니다.",
"settings.mcp.validation.url": "원격 MCP 서버 URL을 입력하세요.",
"settings.mcp.validation.command": "로컬 MCP 서버를 시작하는 데 사용되는 명령을 입력하세요.",
"settings.mcp.validation.timeout": "시간 초과는 양의 정수여야 합니다.",
"settings.mcp.validation.headers": "헤더 줄을 구문 분석할 수 없습니다: {{line}}",
"settings.mcp.validation.environment": "환경 변수 줄을 구문 분석할 수 없습니다: {{line}}",
"settings.mcp.status.needs_client_registration": "클라이언트 등록 필요",
"settings.permissions.title": "권한",
"settings.permissions.description": "서버가 기본적으로 사용할 수 있는 도구를 제어합니다.",
"settings.permissions.section.tools": "도구",

View File

@@ -747,6 +747,47 @@ export const dict = {
"settings.commands.description": "Kommandoinnstillinger vil kunne konfigureres her.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP-innstillinger vil kunne konfigureres her.",
"settings.mcp.section.featured": "Utvalgte",
"settings.mcp.section.featured.description": "Legg til et ferdig oppsett for populære MCP-servere med ett klikk.",
"settings.mcp.section.configured": "Konfigurerte servere",
"settings.mcp.section.configured.description":
"Se hvilke MCP-servere som er installert, hvordan de kobler til, og fjern de du ikke lenger trenger.",
"settings.mcp.section.add": "Legg til en server",
"settings.mcp.section.add.description": "Opprett din egen konfigurasjon for lokal eller ekstern MCP-server.",
"settings.mcp.type.local": "Lokal",
"settings.mcp.type.remote": "Ekstern",
"settings.mcp.featured.added": "Lagt til",
"settings.mcp.action.add": "Legg til server",
"settings.mcp.action.remove": "Fjern",
"settings.mcp.state.enabled": "Aktivert",
"settings.mcp.state.disabled": "Deaktivert",
"settings.mcp.form.type.label": "Tilkoblingstype",
"settings.mcp.form.name.label": "Servernavn",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "Ekstern URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Kommando",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Headere",
"settings.mcp.form.headers.description": "Valgfritt. Legg til én header per linje med KEY: value.",
"settings.mcp.form.environment.label": "Miljø",
"settings.mcp.form.environment.description": "Valgfritt. Legg til én variabel per linje med KEY=value.",
"settings.mcp.form.timeout.label": "Tidsavbrudd (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP-server lagt til",
"settings.mcp.toast.added.description": "{{name}} er lagret i dine MCP-innstillinger.",
"settings.mcp.toast.updated.title": "MCP-server oppdatert",
"settings.mcp.toast.updated.description": "{{name}} er nå {{state}}.",
"settings.mcp.toast.removed.title": "MCP-server fjernet",
"settings.mcp.toast.removed.description": "{{name}} er fjernet fra dine MCP-innstillinger.",
"settings.mcp.validation.name": "Skriv inn et servernavn før du lagrer.",
"settings.mcp.validation.duplicate": "{{name}} er allerede konfigurert.",
"settings.mcp.validation.url": "Skriv inn URL for ekstern MCP-server.",
"settings.mcp.validation.command": "Skriv inn kommandoen for å starte den lokale MCP-serveren.",
"settings.mcp.validation.timeout": "Tidsavbrudd må være et positivt heltall.",
"settings.mcp.validation.headers": "Kunne ikke tolke header-linje: {{line}}",
"settings.mcp.validation.environment": "Kunne ikke tolke miljøvariabel-linje: {{line}}",
"settings.mcp.status.needs_client_registration": "Krever klientregistrering",
"settings.permissions.title": "Tillatelser",
"settings.permissions.description": "Kontroller hvilke verktøy serveren kan bruke som standard.",

View File

@@ -672,6 +672,48 @@ export const dict = {
"settings.commands.description": "Ustawienia poleceń będą tutaj konfigurowalne.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "Ustawienia MCP będą tutaj konfigurowalne.",
"settings.mcp.section.featured": "Wyróżnione",
"settings.mcp.section.featured.description":
"Dodaj dopracowany zestaw dla popularnych serwerów MCP jednym kliknięciem.",
"settings.mcp.section.configured": "Skonfigurowane serwery",
"settings.mcp.section.configured.description":
"Zobacz, które serwery MCP są zainstalowane, jak się łączą, i usuń te, których już nie potrzebujesz.",
"settings.mcp.section.add": "Dodaj serwer",
"settings.mcp.section.add.description": "Utwórz własną konfigurację lokalnego lub zdalnego serwera MCP.",
"settings.mcp.type.local": "Lokalny",
"settings.mcp.type.remote": "Zdalny",
"settings.mcp.featured.added": "Dodano",
"settings.mcp.action.add": "Dodaj serwer",
"settings.mcp.action.remove": "Usuń",
"settings.mcp.state.enabled": "Włączony",
"settings.mcp.state.disabled": "Wyłączony",
"settings.mcp.form.type.label": "Typ połączenia",
"settings.mcp.form.name.label": "Nazwa serwera",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "Zdalny adres URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Polecenie",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Nagłówki",
"settings.mcp.form.headers.description": "Opcjonalne. Dodaj jeden nagłówek w wierszu używając formatu KEY: value.",
"settings.mcp.form.environment.label": "Środowisko",
"settings.mcp.form.environment.description": "Opcjonalne. Dodaj jedną zmienną w wierszu używając formatu KEY=value.",
"settings.mcp.form.timeout.label": "Limit czasu (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "Dodano serwer MCP",
"settings.mcp.toast.added.description": "{{name}} został zapisany w ustawieniach MCP.",
"settings.mcp.toast.updated.title": "Zaktualizowano serwer MCP",
"settings.mcp.toast.updated.description": "{{name}} jest teraz {{state}}.",
"settings.mcp.toast.removed.title": "Usunięto serwer MCP",
"settings.mcp.toast.removed.description": "{{name}} został usunięty z ustawień MCP.",
"settings.mcp.validation.name": "Wprowadź nazwę serwera przed zapisaniem.",
"settings.mcp.validation.duplicate": "{{name}} jest już skonfigurowany.",
"settings.mcp.validation.url": "Wprowadź adres URL zdalnego serwera MCP.",
"settings.mcp.validation.command": "Wprowadź polecenie służące do uruchomienia lokalnego serwera MCP.",
"settings.mcp.validation.timeout": "Limit czasu musi być dodatnią liczbą całkowitą.",
"settings.mcp.validation.headers": "Nie udało się przetworzyć wiersza nagłówka: {{line}}",
"settings.mcp.validation.environment": "Nie udało się przetworzyć wiersza środowiska: {{line}}",
"settings.mcp.status.needs_client_registration": "Wymaga rejestracji klienta",
"settings.permissions.title": "Uprawnienia",
"settings.permissions.description": "Kontroluj, jakich narzędzi serwer może używać domyślnie.",
"settings.permissions.section.tools": "Narzędzia",

View File

@@ -747,6 +747,49 @@ export const dict = {
"settings.commands.description": "Настройки команд будут доступны здесь.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "Настройки MCP будут доступны здесь.",
"settings.mcp.section.featured": "Рекомендуемые",
"settings.mcp.section.featured.description": "Добавляйте готовые настройки для популярных серверов MCP в один клик.",
"settings.mcp.section.configured": "Настроенные серверы",
"settings.mcp.section.configured.description":
"Просматривайте установленные серверы MCP, способы их подключения и удаляйте ненужные.",
"settings.mcp.section.add": "Добавить сервер",
"settings.mcp.section.add.description": "Создайте собственную конфигурацию локального или удаленного сервера MCP.",
"settings.mcp.type.local": "Локальный",
"settings.mcp.type.remote": "Удаленный",
"settings.mcp.featured.added": "Добавлено",
"settings.mcp.action.add": "Добавить сервер",
"settings.mcp.action.remove": "Удалить",
"settings.mcp.state.enabled": "Включено",
"settings.mcp.state.disabled": "Отключено",
"settings.mcp.form.type.label": "Тип подключения",
"settings.mcp.form.name.label": "Имя сервера",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "URL удаленного сервера",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Команда",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Заголовки",
"settings.mcp.form.headers.description":
"Необязательно. Добавьте по одному заголовку на строку в формате KEY: value.",
"settings.mcp.form.environment.label": "Окружение",
"settings.mcp.form.environment.description":
"Необязательно. Добавьте по одной переменной на строку в формате KEY=value.",
"settings.mcp.form.timeout.label": "Тайм-аут (мс)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "Сервер MCP добавлен",
"settings.mcp.toast.added.description": "{{name}} сохранен в настройках MCP.",
"settings.mcp.toast.updated.title": "Сервер MCP обновлен",
"settings.mcp.toast.updated.description": "{{name}} теперь {{state}}.",
"settings.mcp.toast.removed.title": "Сервер MCP удален",
"settings.mcp.toast.removed.description": "{{name}} удален из настроек MCP.",
"settings.mcp.validation.name": "Введите имя сервера перед сохранением.",
"settings.mcp.validation.duplicate": "{{name}} уже настроен.",
"settings.mcp.validation.url": "Введите URL удаленного сервера MCP.",
"settings.mcp.validation.command": "Введите команду для запуска локального сервера MCP.",
"settings.mcp.validation.timeout": "Тайм-аут должен быть положительным целым числом.",
"settings.mcp.validation.headers": "Не удалось разобрать строку заголовка: {{line}}",
"settings.mcp.validation.environment": "Не удалось разобрать строку окружения: {{line}}",
"settings.mcp.status.needs_client_registration": "Требуется регистрация клиента",
"settings.permissions.title": "Разрешения",
"settings.permissions.description": "Контролируйте какие инструменты сервер может использовать по умолчанию.",

View File

@@ -738,6 +738,47 @@ export const dict = {
"settings.commands.description": "การตั้งค่าคำสั่งจะสามารถกำหนดค่าได้ที่นี่",
"settings.mcp.title": "MCP",
"settings.mcp.description": "การตั้งค่า MCP จะสามารถกำหนดค่าได้ที่นี่",
"settings.mcp.section.featured": "แนะนำ",
"settings.mcp.section.featured.description": "เพิ่มค่าที่ตั้งไว้ล่วงหน้าสำหรับเซิร์ฟเวอร์ MCP ยอดนิยมได้ในคลิกเดียว",
"settings.mcp.section.configured": "เซิร์ฟเวอร์ที่กำหนดค่าแล้ว",
"settings.mcp.section.configured.description":
"ดูว่าเซิร์ฟเวอร์ MCP ใดติดตั้งอยู่ เชื่อมต่ออย่างไร และลบสิ่งที่ไม่ต้องการออก",
"settings.mcp.section.add": "เพิ่มเซิร์ฟเวอร์",
"settings.mcp.section.add.description": "สร้างการกำหนดค่าเซิร์ฟเวอร์ MCP แบบ Local หรือ Remote ของคุณเอง",
"settings.mcp.type.local": "Local",
"settings.mcp.type.remote": "Remote",
"settings.mcp.featured.added": "เพิ่มแล้ว",
"settings.mcp.action.add": "เพิ่มเซิร์ฟเวอร์",
"settings.mcp.action.remove": "ลบ",
"settings.mcp.state.enabled": "เปิดใช้งาน",
"settings.mcp.state.disabled": "ปิดใช้งาน",
"settings.mcp.form.type.label": "ประเภทการเชื่อมต่อ",
"settings.mcp.form.name.label": "ชื่อเซิร์ฟเวอร์",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "URL ระยะไกล",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "คำสั่ง",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Headers",
"settings.mcp.form.headers.description": "ไม่บังคับ เพิ่มหนึ่ง header ต่อบรรทัดโดยใช้ KEY: value",
"settings.mcp.form.environment.label": "Environment",
"settings.mcp.form.environment.description": "ไม่บังคับ เพิ่มหนึ่งตัวแปรต่อบรรทัดโดยใช้ KEY=value",
"settings.mcp.form.timeout.label": "Timeout (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "เพิ่มเซิร์ฟเวอร์ MCP แล้ว",
"settings.mcp.toast.added.description": "บันทึก {{name}} ลงในค่าติดตั้ง MCP ของคุณแล้ว",
"settings.mcp.toast.updated.title": "อัปเดตเซิร์ฟเวอร์ MCP แล้ว",
"settings.mcp.toast.updated.description": "ขณะนี้ {{name}} อยู่ในสถานะ {{state}}",
"settings.mcp.toast.removed.title": "ลบเซิร์ฟเวอร์ MCP แล้ว",
"settings.mcp.toast.removed.description": "ลบ {{name}} ออกจากค่าติดตั้ง MCP ของคุณแล้ว",
"settings.mcp.validation.name": "ป้อนชื่อเซิร์ฟเวอร์ก่อนบันทึก",
"settings.mcp.validation.duplicate": "มีการกำหนดค่า {{name}} ไว้แล้ว",
"settings.mcp.validation.url": "ป้อน URL ของเซิร์ฟเวอร์ MCP ระยะไกล",
"settings.mcp.validation.command": "ป้อนคำสั่งที่ใช้เริ่มต้นเซิร์ฟเวอร์ MCP แบบ Local",
"settings.mcp.validation.timeout": "Timeout ต้องเป็นจำนวนเต็มบวก",
"settings.mcp.validation.headers": "ไม่สามารถแยกวิเคราะห์บรรทัด header: {{line}}",
"settings.mcp.validation.environment": "ไม่สามารถแยกวิเคราะห์บรรทัด environment: {{line}}",
"settings.mcp.status.needs_client_registration": "ต้องลงทะเบียนไคลเอนต์",
"settings.permissions.title": "สิทธิ์",
"settings.permissions.description": "ควบคุมเครื่องมือที่เซิร์ฟเวอร์สามารถใช้โดยค่าเริ่มต้น",

View File

@@ -759,6 +759,50 @@ export const dict = {
"settings.commands.description": "Komut ayarları burada yapılandırılabilecek.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP ayarları burada yapılandırılabilecek.",
"settings.mcp.section.featured": "Öne Çıkanlar",
"settings.mcp.section.featured.description":
"Tek tıkla popüler MCP sunucuları için cilalanmış bir hazır ayar ekleyin.",
"settings.mcp.section.configured": "Yapılandırılmış sunucular",
"settings.mcp.section.configured.description":
"Hangi MCP sunucularının yüklü olduğunu ve nasıl bağlandıklarını görün; artık ihtiyaç duymadıklarınızı kaldırın.",
"settings.mcp.section.add": "Sunucu ekle",
"settings.mcp.section.add.description": "Kendi yerel veya uzak MCP sunucu yapılandırmanızı oluşturun.",
"settings.mcp.type.local": "Yerel",
"settings.mcp.type.remote": "Uzak",
"settings.mcp.featured.added": "Eklendi",
"settings.mcp.action.add": "Sunucu ekle",
"settings.mcp.action.remove": "Kaldır",
"settings.mcp.state.enabled": "Etkin",
"settings.mcp.state.disabled": "Devre Dışı",
"settings.mcp.form.type.label": "Bağlantı türü",
"settings.mcp.form.name.label": "Sunucu adı",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "Uzak URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "Komut",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "Başlıklar",
"settings.mcp.form.headers.description":
"İsteğe bağlı. Her satıra bir başlık olacak şekilde KEY: value biçiminde ekleyin.",
"settings.mcp.form.environment.label": "Ortam",
"settings.mcp.form.environment.description":
"İsteğe bağlı. Her satıra bir değişken olacak şekilde KEY=value biçiminde ekleyin.",
"settings.mcp.form.timeout.label": "Zaman aşımı (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP sunucusu eklendi",
"settings.mcp.toast.added.description": "{{name}}, MCP ayarlarınıza kaydedildi.",
"settings.mcp.toast.updated.title": "MCP sunucusu güncellendi",
"settings.mcp.toast.updated.description": "{{name}} artık {{state}}.",
"settings.mcp.toast.removed.title": "MCP sunucusu kaldırıldı",
"settings.mcp.toast.removed.description": "{{name}}, MCP ayarlarınızdan kaldırıldı.",
"settings.mcp.validation.name": "Kaydetmeden önce bir sunucu adı girin.",
"settings.mcp.validation.duplicate": "{{name}} zaten yapılandırılmış.",
"settings.mcp.validation.url": "Bir uzak MCP sunucu URL'si girin.",
"settings.mcp.validation.command": "Yerel MCP sunucusunu başlatmak için kullanılan komutu girin.",
"settings.mcp.validation.timeout": "Zaman aşımı pozitif bir tam sayı olmalıdır.",
"settings.mcp.validation.headers": "Başlık satırı ayrıştırılamadı: {{line}}",
"settings.mcp.validation.environment": "Ortam satırı ayrıştırılamadı: {{line}}",
"settings.mcp.status.needs_client_registration": "İstemci kaydı gerekiyor",
"settings.permissions.title": "İzinler",
"settings.permissions.description": "Sunucunun varsayılan olarak hangi araçları kullanabileceğini kontrol edin.",

View File

@@ -738,6 +738,46 @@ export const dict = {
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP 设置将在此处可配置。",
"settings.mcp.section.featured": "精选",
"settings.mcp.section.featured.description": "一键添加经过精心优化的热门 MCP 服务器预设。",
"settings.mcp.section.configured": "已配置的服务器",
"settings.mcp.section.configured.description": "查看已安装的 MCP 服务器及其连接方式,并移除不再需要的服务器。",
"settings.mcp.section.add": "添加服务器",
"settings.mcp.section.add.description": "创建您自己的本地或远程 MCP 服务器配置。",
"settings.mcp.type.local": "本地",
"settings.mcp.type.remote": "远程",
"settings.mcp.featured.added": "已添加",
"settings.mcp.action.add": "添加服务器",
"settings.mcp.action.remove": "移除",
"settings.mcp.state.enabled": "已启用",
"settings.mcp.state.disabled": "已禁用",
"settings.mcp.form.type.label": "连接类型",
"settings.mcp.form.name.label": "服务器名称",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "远程 URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "命令",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "请求头",
"settings.mcp.form.headers.description": "可选。每行添加一个请求头,格式为 KEY: value。",
"settings.mcp.form.environment.label": "环境变量",
"settings.mcp.form.environment.description": "可选。每行添加一个变量,格式为 KEY=value。",
"settings.mcp.form.timeout.label": "超时 (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "MCP 服务器已添加",
"settings.mcp.toast.added.description": "{{name}} 已保存到您的 MCP 设置中。",
"settings.mcp.toast.updated.title": "MCP 服务器已更新",
"settings.mcp.toast.updated.description": "{{name}} 现已{{state}}。",
"settings.mcp.toast.removed.title": "MCP 服务器已移除",
"settings.mcp.toast.removed.description": "{{name}} 已从您的 MCP 设置中移除。",
"settings.mcp.validation.name": "保存前请输入服务器名称。",
"settings.mcp.validation.duplicate": "{{name}} 已配置。",
"settings.mcp.validation.url": "请输入远程 MCP 服务器 URL。",
"settings.mcp.validation.command": "请输入用于启动本地 MCP 服务器的命令。",
"settings.mcp.validation.timeout": "超时必须为正整数。",
"settings.mcp.validation.headers": "无法解析请求头行:{{line}}",
"settings.mcp.validation.environment": "无法解析环境行:{{line}}",
"settings.mcp.status.needs_client_registration": "需要客户端注册",
"settings.permissions.title": "权限",
"settings.permissions.description": "控制服务器默认可以使用哪些工具。",

View File

@@ -731,6 +731,46 @@ export const dict = {
"settings.commands.description": "命令設定將在此處可設定。",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP 設定將在此處可設定。",
"settings.mcp.section.featured": "精選",
"settings.mcp.section.featured.description": "一鍵新增熱門 MCP 伺服器的精選預設設定。",
"settings.mcp.section.configured": "已設定的伺服器",
"settings.mcp.section.configured.description": "查看已安裝的 MCP 伺服器及其連線方式,並移除不再需要的伺服器。",
"settings.mcp.section.add": "新增伺服器",
"settings.mcp.section.add.description": "建立您自己的本機或遠端 MCP 伺服器設定。",
"settings.mcp.type.local": "本機",
"settings.mcp.type.remote": "遠端",
"settings.mcp.featured.added": "已新增",
"settings.mcp.action.add": "新增伺服器",
"settings.mcp.action.remove": "移除",
"settings.mcp.state.enabled": "已啟用",
"settings.mcp.state.disabled": "已停用",
"settings.mcp.form.type.label": "連線類型",
"settings.mcp.form.name.label": "伺服器名稱",
"settings.mcp.form.name.placeholder": "my-mcp-server",
"settings.mcp.form.url.label": "遠端 URL",
"settings.mcp.form.url.placeholder": "https://mcp.example.com/mcp",
"settings.mcp.form.command.label": "指令",
"settings.mcp.form.command.placeholder": "npx -y @modelcontextprotocol/server-memory",
"settings.mcp.form.headers.label": "標頭",
"settings.mcp.form.headers.description": "選用。每行新增一個標頭,格式為 KEY: value。",
"settings.mcp.form.environment.label": "環境變數",
"settings.mcp.form.environment.description": "選用。每行新增一個變數,格式為 KEY=value。",
"settings.mcp.form.timeout.label": "逾時 (ms)",
"settings.mcp.form.timeout.placeholder": "5000",
"settings.mcp.toast.added.title": "已新增 MCP 伺服器",
"settings.mcp.toast.added.description": "{{name}} 已儲存至您的 MCP 設定。",
"settings.mcp.toast.updated.title": "MCP 伺服器已更新",
"settings.mcp.toast.updated.description": "{{name}} 現已{{state}}。",
"settings.mcp.toast.removed.title": "已移除 MCP 伺服器",
"settings.mcp.toast.removed.description": "{{name}} 已從您的 MCP 設定中移除。",
"settings.mcp.validation.name": "儲存前請輸入伺服器名稱。",
"settings.mcp.validation.duplicate": "{{name}} 已經設定過了。",
"settings.mcp.validation.url": "請輸入遠端 MCP 伺服器 URL。",
"settings.mcp.validation.command": "請輸入用於啟動本機 MCP 伺服器的指令。",
"settings.mcp.validation.timeout": "逾時必須是正整數。",
"settings.mcp.validation.headers": "無法解析標頭行:{{line}}",
"settings.mcp.validation.environment": "無法解析環境變數行:{{line}}",
"settings.mcp.status.needs_client_registration": "需要用戶端註冊",
"settings.permissions.title": "權限",
"settings.permissions.description": "控制伺服器預設可以使用哪些工具。",

View File

@@ -22,7 +22,7 @@ import { ResizeHandle } from "@opencode-ai/ui/resize-handle"
import { Button } from "@opencode-ai/ui/button"
import { Icon } from "@opencode-ai/ui/icon"
import { IconButton } from "@opencode-ai/ui/icon-button"
import { Tooltip } from "@opencode-ai/ui/tooltip"
import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip"
import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu"
import { Dialog } from "@opencode-ai/ui/dialog"
import { getFilename } from "@opencode-ai/util/path"
@@ -1937,14 +1937,20 @@ export default function Layout(props: ParentProps) {
fallback={
<>
<div class="shrink-0 py-4 px-3">
<Button
size="large"
icon="plus-small"
class="w-full"
onClick={() => navigateWithSidebarReset(`/${base64Encode(p.worktree)}/session`)}
<TooltipKeybind
title={language.t("command.session.new")}
keybind={command.keybind("session.new")}
placement="top"
>
{language.t("command.session.new")}
</Button>
<Button
size="large"
icon="plus-small"
class="w-full"
onClick={() => navigateWithSidebarReset(`/${base64Encode(p.worktree)}/session`)}
>
{language.t("command.session.new")}
</Button>
</TooltipKeybind>
</div>
<div class="flex-1 min-h-0">
<LocalWorkspace
@@ -1959,9 +1965,15 @@ export default function Layout(props: ParentProps) {
>
<>
<div class="shrink-0 py-4 px-3">
<Button size="large" icon="plus-small" class="w-full" onClick={() => createWorkspace(p)}>
{language.t("workspace.new")}
</Button>
<TooltipKeybind
title={language.t("workspace.new")}
keybind={command.keybind("workspace.new")}
placement="top"
>
<Button size="large" icon="plus-small" class="w-full" onClick={() => createWorkspace(p)}>
{language.t("workspace.new")}
</Button>
</TooltipKeybind>
</div>
<div class="relative flex-1 min-h-0">
<DragDropProvider

View File

@@ -720,7 +720,6 @@ export default function Page() {
showAllFiles,
tabForPath: file.tab,
openTab: tabs().open,
setActive: tabs().setActive,
loadFile: file.load,
})

View File

@@ -11,13 +11,12 @@ describe("createOpenReviewFile", () => {
return `file://${path}`
},
openTab: (tab) => calls.push(`open:${tab}`),
setActive: (tab) => calls.push(`active:${tab}`),
loadFile: (path) => calls.push(`load:${path}`),
})
openReviewFile("src/a.ts")
expect(calls).toEqual(["show", "load:src/a.ts", "tab:src/a.ts", "open:file://src/a.ts", "active:file://src/a.ts"])
expect(calls).toEqual(["show", "load:src/a.ts", "tab:src/a.ts", "open:file://src/a.ts"])
})
})

View File

@@ -24,20 +24,15 @@ export const createOpenReviewFile = (input: {
showAllFiles: () => void
tabForPath: (path: string) => string
openTab: (tab: string) => void
setActive: (tab: string) => void
loadFile: (path: string) => any | Promise<void>
}) => {
return (path: string) => {
batch(() => {
input.showAllFiles()
const maybePromise = input.loadFile(path)
const open = () => {
const tab = input.tabForPath(path)
input.openTab(tab)
input.setActive(tab)
}
if (maybePromise instanceof Promise) maybePromise.then(open)
else open()
const openTab = () => input.openTab(input.tabForPath(path))
if (maybePromise instanceof Promise) maybePromise.then(openTab)
else openTab()
})
}
}

View File

@@ -1,4 +1,4 @@
import { For, createEffect, createMemo, on, onCleanup, Show, Index, type JSX } from "solid-js"
import { For, createEffect, createMemo, on, onCleanup, Show, startTransition, Index, type JSX } from "solid-js"
import { createStore, produce } from "solid-js/store"
import { useNavigate, useParams } from "@solidjs/router"
import { Button } from "@opencode-ai/ui/button"
@@ -160,7 +160,7 @@ function createTimelineStaging(input: TimelineStageInput) {
}
const currentTotal = input.messages().length
count = Math.min(currentTotal, count + input.config.batch)
setState("count", count)
startTransition(() => setState("count", count))
if (count >= currentTotal) {
setState({ completedSession: sessionKey, activeSession: "" })
frame = undefined

View File

@@ -22,5 +22,6 @@
}
},
"include": ["src", "package.json"],
"exclude": ["dist", "ts-dist"]
"exclude": ["dist", "ts-dist"],
"references": [{ "path": "../sdk/js" }]
}

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
"version": "1.2.18",
"version": "1.2.17",
"type": "module",
"license": "MIT",
"scripts": {

View File

@@ -108,26 +108,6 @@ const DOCS_SEGMENT = new Set([
"zh-tw",
])
const DOCS_LOCALE = {
ar: "ar",
da: "da",
de: "de",
en: "en",
es: "es",
fr: "fr",
it: "it",
ja: "ja",
ko: "ko",
nb: "no",
"pt-br": "br",
root: "en",
ru: "ru",
th: "th",
tr: "tr",
"zh-cn": "zh",
"zh-tw": "zht",
} as const satisfies Record<string, Locale>
function suffix(pathname: string) {
const index = pathname.search(/[?#]/)
if (index === -1) {
@@ -150,12 +130,7 @@ export function docs(locale: Locale, pathname: string) {
return `${next.path}${next.suffix}`
}
if (value === "root") {
if (next.path === "/docs/en") return `/docs${next.suffix}`
if (next.path === "/docs/en/") return `/docs/${next.suffix}`
if (next.path.startsWith("/docs/en/")) return `/docs/${next.path.slice("/docs/en/".length)}${next.suffix}`
return `${next.path}${next.suffix}`
}
if (value === "root") return `${next.path}${next.suffix}`
if (next.path === "/docs") return `/docs/${value}${next.suffix}`
if (next.path === "/docs/") return `/docs/${value}/${next.suffix}`
@@ -179,15 +154,6 @@ export function fromPathname(pathname: string) {
return parseLocale(fix(pathname).split("/")[1])
}
export function fromDocsPathname(pathname: string) {
const next = fix(pathname)
const value = next.split("/")[2]?.toLowerCase()
if (!value) return null
if (!next.startsWith("/docs/")) return null
if (!(value in DOCS_LOCALE)) return null
return DOCS_LOCALE[value as keyof typeof DOCS_LOCALE]
}
export function strip(pathname: string) {
const locale = fromPathname(pathname)
if (!locale) return fix(pathname)
@@ -306,9 +272,6 @@ export function localeFromRequest(request: Request) {
const fromPath = fromPathname(new URL(request.url).pathname)
if (fromPath) return fromPath
const fromDocsPath = fromDocsPathname(new URL(request.url).pathname)
if (fromDocsPath) return fromDocsPath
return (
localeFromCookieHeader(request.headers.get("cookie")) ??
detectFromAcceptLanguage(request.headers.get("accept-language"))

View File

@@ -1,6 +1,6 @@
import type { APIEvent } from "@solidjs/start/server"
import { Resource } from "@opencode-ai/console-resource"
import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
import { docs, localeFromRequest, tag } from "~/lib/language"
async function handler(evt: APIEvent) {
const req = evt.request.clone()
@@ -17,9 +17,7 @@ async function handler(evt: APIEvent) {
headers,
body: req.body,
})
const next = new Response(response.body, response)
next.headers.append("set-cookie", cookie(locale))
return next
return response
}
export const GET = handler

View File

@@ -1,6 +1,6 @@
import type { APIEvent } from "@solidjs/start/server"
import { Resource } from "@opencode-ai/console-resource"
import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
import { docs, localeFromRequest, tag } from "~/lib/language"
async function handler(evt: APIEvent) {
const req = evt.request.clone()
@@ -17,9 +17,7 @@ async function handler(evt: APIEvent) {
headers,
body: req.body,
})
const next = new Response(response.body, response)
next.headers.append("set-cookie", cookie(locale))
return next
return response
}
export const GET = handler

View File

@@ -1,6 +1,6 @@
import type { APIEvent } from "@solidjs/start/server"
import { Resource } from "@opencode-ai/console-resource"
import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
import { docs, localeFromRequest, tag } from "~/lib/language"
async function handler(evt: APIEvent) {
const req = evt.request.clone()
@@ -17,9 +17,7 @@ async function handler(evt: APIEvent) {
headers,
body: req.body,
})
const next = new Response(response.body, response)
next.headers.append("set-cookie", cookie(locale))
return next
return response
}
export const GET = handler

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core",
"version": "1.2.18",
"version": "1.2.17",
"private": true,
"type": "module",
"license": "MIT",

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-function",
"version": "1.2.18",
"version": "1.2.17",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-mail",
"version": "1.2.18",
"version": "1.2.17",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",

View File

@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop-electron",
"private": true,
"version": "1.2.18",
"version": "1.2.17",
"type": "module",
"license": "MIT",
"homepage": "https://opencode.ai",

View File

@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop",
"private": true,
"version": "1.2.18",
"version": "1.2.17",
"type": "module",
"license": "MIT",
"scripts": {

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/enterprise",
"version": "1.2.18",
"version": "1.2.17",
"private": true,
"type": "module",
"license": "MIT",

View File

@@ -1,7 +1,7 @@
id = "opencode"
name = "OpenCode"
description = "The open source coding agent."
version = "1.2.18"
version = "1.2.17"
schema_version = 1
authors = ["Anomaly"]
repository = "https://github.com/anomalyco/opencode"
@@ -11,26 +11,26 @@ name = "OpenCode"
icon = "./icons/opencode.svg"
[agent_servers.opencode.targets.darwin-aarch64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-darwin-arm64.zip"
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-darwin-arm64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.darwin-x86_64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-darwin-x64.zip"
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-darwin-x64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-aarch64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-linux-arm64.tar.gz"
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/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.2.18/opencode-linux-x64.tar.gz"
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/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.2.18/opencode-windows-x64.zip"
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-windows-x64.zip"
cmd = "./opencode.exe"
args = ["acp"]

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/function",
"version": "1.2.18",
"version": "1.2.17",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.2.18",
"version": "1.2.17",
"name": "opencode",
"type": "module",
"license": "MIT",

View File

@@ -1625,14 +1625,11 @@ function InlineTool(props: {
spinner?: boolean
children: JSX.Element
part: ToolPart
onClick?: () => void
}) {
const [margin, setMargin] = createSignal(0)
const { theme } = useTheme()
const ctx = use()
const sync = useSync()
const renderer = useRenderer()
const [hover, setHover] = createSignal(false)
const permission = createMemo(() => {
const callID = sync.data.permission[ctx.sessionID]?.at(0)?.tool?.callID
@@ -1642,7 +1639,6 @@ function InlineTool(props: {
const fg = createMemo(() => {
if (permission()) return theme.warning
if (hover() && props.onClick) return theme.text
if (props.complete) return theme.textMuted
return theme.text
})
@@ -1660,12 +1656,6 @@ function InlineTool(props: {
<box
marginTop={margin()}
paddingLeft={3}
onMouseOver={() => props.onClick && setHover(true)}
onMouseOut={() => setHover(false)}
onMouseUp={() => {
if (renderer.getSelection()?.getSelectedText()) return
props.onClick?.()
}}
renderBefore={function () {
const el = this as BoxRenderable
const parent = el.parent
@@ -2009,11 +1999,6 @@ function Task(props: ToolProps<typeof TaskTool>) {
complete={props.input.description}
pending="Delegating..."
part={props.part}
onClick={() => {
if (props.metadata.sessionId) {
navigate({ type: "session", sessionID: props.metadata.sessionId })
}
}}
>
{content()}
</InlineTool>

View File

@@ -418,7 +418,7 @@ export namespace File {
const project = Instance.project
if (project.vcs !== "git") return []
const diffOutput = await $`git -c core.fsmonitor=false -c core.quotepath=false diff --numstat HEAD`
const diffOutput = await $`git -c core.quotepath=false diff --numstat HEAD`
.cwd(Instance.directory)
.quiet()
.nothrow()
@@ -439,12 +439,11 @@ export namespace File {
}
}
const untrackedOutput =
await $`git -c core.fsmonitor=false -c core.quotepath=false ls-files --others --exclude-standard`
.cwd(Instance.directory)
.quiet()
.nothrow()
.text()
const untrackedOutput = await $`git -c core.quotepath=false ls-files --others --exclude-standard`
.cwd(Instance.directory)
.quiet()
.nothrow()
.text()
if (untrackedOutput.trim()) {
const untrackedFiles = untrackedOutput.trim().split("\n")
@@ -465,12 +464,11 @@ export namespace File {
}
// Get deleted files
const deletedOutput =
await $`git -c core.fsmonitor=false -c core.quotepath=false diff --name-only --diff-filter=D HEAD`
.cwd(Instance.directory)
.quiet()
.nothrow()
.text()
const deletedOutput = await $`git -c core.quotepath=false diff --name-only --diff-filter=D HEAD`
.cwd(Instance.directory)
.quiet()
.nothrow()
.text()
if (deletedOutput.trim()) {
const deletedFiles = deletedOutput.trim().split("\n")
@@ -541,14 +539,8 @@ export namespace File {
const content = (await Filesystem.readText(full).catch(() => "")).trim()
if (project.vcs === "git") {
let diff = await $`git -c core.fsmonitor=false diff ${file}`.cwd(Instance.directory).quiet().nothrow().text()
if (!diff.trim()) {
diff = await $`git -c core.fsmonitor=false diff --staged ${file}`
.cwd(Instance.directory)
.quiet()
.nothrow()
.text()
}
let diff = await $`git diff ${file}`.cwd(Instance.directory).quiet().nothrow().text()
if (!diff.trim()) diff = await $`git diff --staged ${file}`.cwd(Instance.directory).quiet().nothrow().text()
if (diff.trim()) {
const original = await $`git show HEAD:${file}`.cwd(Instance.directory).quiet().nothrow().text()
const patch = structuredPatch(file, file, original, content, "old", "new", {

View File

@@ -474,11 +474,6 @@ export namespace Worktree {
throw new RemoveFailedError({ message: message || "Failed to remove git worktree directory" })
})
const stop = async (target: string) => {
if (!(await exists(target))) return
await $`git fsmonitor--daemon stop`.quiet().nothrow().cwd(target)
}
const list = await $`git worktree list --porcelain`.quiet().nothrow().cwd(Instance.worktree)
if (list.exitCode !== 0) {
throw new RemoveFailedError({ message: errorText(list) || "Failed to read git worktrees" })
@@ -489,13 +484,11 @@ export namespace Worktree {
if (!entry?.path) {
const directoryExists = await exists(directory)
if (directoryExists) {
await stop(directory)
await clean(directory)
}
return true
}
await stop(entry.path)
const removed = await $`git worktree remove --force ${entry.path}`.quiet().nothrow().cwd(Instance.worktree)
if (removed.exitCode !== 0) {
const next = await $`git worktree list --porcelain`.quiet().nothrow().cwd(Instance.worktree)
@@ -644,7 +637,7 @@ export namespace Worktree {
throw new ResetFailedError({ message: errorText(subClean) || "Failed to clean submodules" })
}
const status = await $`git -c core.fsmonitor=false status --porcelain=v1`.quiet().nothrow().cwd(worktreePath)
const status = await $`git status --porcelain=v1`.quiet().nothrow().cwd(worktreePath)
if (status.exitCode !== 0) {
throw new ResetFailedError({ message: errorText(status) || "Failed to read git status" })
}

View File

@@ -1,62 +0,0 @@
import { $ } from "bun"
import { describe, expect, test } from "bun:test"
import fs from "fs/promises"
import path from "path"
import { File } from "../../src/file"
import { Instance } from "../../src/project/instance"
import { tmpdir } from "../fixture/fixture"
const wintest = process.platform === "win32" ? test : test.skip
describe("file fsmonitor", () => {
wintest("status does not start fsmonitor for readonly git checks", async () => {
await using tmp = await tmpdir({ git: true })
const target = path.join(tmp.path, "tracked.txt")
await fs.writeFile(target, "base\n")
await $`git add tracked.txt`.cwd(tmp.path).quiet()
await $`git commit -m init`.cwd(tmp.path).quiet()
await $`git config core.fsmonitor true`.cwd(tmp.path).quiet()
await $`git fsmonitor--daemon stop`.cwd(tmp.path).quiet().nothrow()
await fs.writeFile(target, "next\n")
await fs.writeFile(path.join(tmp.path, "new.txt"), "new\n")
const before = await $`git fsmonitor--daemon status`.cwd(tmp.path).quiet().nothrow()
expect(before.exitCode).not.toBe(0)
await Instance.provide({
directory: tmp.path,
fn: async () => {
await File.status()
},
})
const after = await $`git fsmonitor--daemon status`.cwd(tmp.path).quiet().nothrow()
expect(after.exitCode).not.toBe(0)
})
wintest("read does not start fsmonitor for git diffs", async () => {
await using tmp = await tmpdir({ git: true })
const target = path.join(tmp.path, "tracked.txt")
await fs.writeFile(target, "base\n")
await $`git add tracked.txt`.cwd(tmp.path).quiet()
await $`git commit -m init`.cwd(tmp.path).quiet()
await $`git config core.fsmonitor true`.cwd(tmp.path).quiet()
await $`git fsmonitor--daemon stop`.cwd(tmp.path).quiet().nothrow()
await fs.writeFile(target, "next\n")
const before = await $`git fsmonitor--daemon status`.cwd(tmp.path).quiet().nothrow()
expect(before.exitCode).not.toBe(0)
await Instance.provide({
directory: tmp.path,
fn: async () => {
await File.read("tracked.txt")
},
})
const after = await $`git fsmonitor--daemon status`.cwd(tmp.path).quiet().nothrow()
expect(after.exitCode).not.toBe(0)
})
})

View File

@@ -1,26 +0,0 @@
import { $ } from "bun"
import { describe, expect, test } from "bun:test"
import fs from "fs/promises"
import { tmpdir } from "./fixture"
describe("tmpdir", () => {
test("disables fsmonitor for git fixtures", async () => {
await using tmp = await tmpdir({ git: true })
const value = (await $`git config core.fsmonitor`.cwd(tmp.path).quiet().text()).trim()
expect(value).toBe("false")
})
test("removes directories on dispose", async () => {
const tmp = await tmpdir({ git: true })
const dir = tmp.path
await tmp[Symbol.asyncDispose]()
const exists = await fs
.stat(dir)
.then(() => true)
.catch(() => false)
expect(exists).toBe(false)
})
})

View File

@@ -9,27 +9,6 @@ function sanitizePath(p: string): string {
return p.replace(/\0/g, "")
}
function exists(dir: string) {
return fs
.stat(dir)
.then(() => true)
.catch(() => false)
}
function clean(dir: string) {
return fs.rm(dir, {
recursive: true,
force: true,
maxRetries: 5,
retryDelay: 100,
})
}
async function stop(dir: string) {
if (!(await exists(dir))) return
await $`git fsmonitor--daemon stop`.cwd(dir).quiet().nothrow()
}
type TmpDirOptions<T> = {
git?: boolean
config?: Partial<Config.Info>
@@ -41,7 +20,6 @@ export async function tmpdir<T>(options?: TmpDirOptions<T>) {
await fs.mkdir(dirpath, { recursive: true })
if (options?.git) {
await $`git init`.cwd(dirpath).quiet()
await $`git config core.fsmonitor false`.cwd(dirpath).quiet()
await $`git commit --allow-empty -m "root commit ${dirpath}"`.cwd(dirpath).quiet()
}
if (options?.config) {
@@ -53,16 +31,12 @@ export async function tmpdir<T>(options?: TmpDirOptions<T>) {
}),
)
}
const extra = await options?.init?.(dirpath)
const realpath = sanitizePath(await fs.realpath(dirpath))
const extra = await options?.init?.(realpath)
const result = {
[Symbol.asyncDispose]: async () => {
try {
await options?.dispose?.(realpath)
} finally {
if (options?.git) await stop(realpath).catch(() => undefined)
await clean(realpath).catch(() => undefined)
}
await options?.dispose?.(dirpath)
// await fs.rm(dirpath, { recursive: true, force: true })
},
path: realpath,
extra: extra as T,

View File

@@ -7,8 +7,6 @@ import { Worktree } from "../../src/worktree"
import { Filesystem } from "../../src/util/filesystem"
import { tmpdir } from "../fixture/fixture"
const wintest = process.platform === "win32" ? test : test.skip
describe("Worktree.remove", () => {
test("continues when git remove exits non-zero after detaching", async () => {
await using tmp = await tmpdir({ git: true })
@@ -64,33 +62,4 @@ describe("Worktree.remove", () => {
const ref = await $`git show-ref --verify --quiet refs/heads/${branch}`.cwd(root).quiet().nothrow()
expect(ref.exitCode).not.toBe(0)
})
wintest("stops fsmonitor before removing a worktree", async () => {
await using tmp = await tmpdir({ git: true })
const root = tmp.path
const name = `remove-fsmonitor-${Date.now().toString(36)}`
const branch = `opencode/${name}`
const dir = path.join(root, "..", name)
await $`git worktree add --no-checkout -b ${branch} ${dir}`.cwd(root).quiet()
await $`git reset --hard`.cwd(dir).quiet()
await $`git config core.fsmonitor true`.cwd(dir).quiet()
await $`git fsmonitor--daemon stop`.cwd(dir).quiet().nothrow()
await Bun.write(path.join(dir, "tracked.txt"), "next\n")
await $`git diff`.cwd(dir).quiet()
const before = await $`git fsmonitor--daemon status`.cwd(dir).quiet().nothrow()
expect(before.exitCode).toBe(0)
const ok = await Instance.provide({
directory: root,
fn: () => Worktree.remove({ directory: dir }),
})
expect(ok).toBe(true)
expect(await Filesystem.exists(dir)).toBe(false)
const ref = await $`git show-ref --verify --quiet refs/heads/${branch}`.cwd(root).quiet().nothrow()
expect(ref.exitCode).not.toBe(0)
})
})

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/plugin",
"version": "1.2.18",
"version": "1.2.17",
"type": "module",
"license": "MIT",
"scripts": {

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/sdk",
"version": "1.2.18",
"version": "1.2.17",
"type": "module",
"license": "MIT",
"scripts": {
@@ -12,9 +12,18 @@
".": "./src/index.ts",
"./client": "./src/client.ts",
"./server": "./src/server.ts",
"./v2": "./src/v2/index.ts",
"./v2/client": "./src/v2/client.ts",
"./v2/gen/client": "./src/v2/gen/client/index.ts",
"./v2": {
"types": "./dist/v2/index.d.ts",
"default": "./src/v2/index.ts"
},
"./v2/client": {
"types": "./dist/v2/client.d.ts",
"default": "./src/v2/client.ts"
},
"./v2/gen/client": {
"types": "./dist/v2/gen/client/index.d.ts",
"default": "./src/v2/gen/client/index.ts"
},
"./v2/server": "./src/v2/server.ts"
},
"files": [
@@ -27,5 +36,8 @@
"typescript": "catalog:",
"@typescript/native-preview": "catalog:"
},
"dependencies": {}
"dependencies": {},
"publishConfig": {
"directory": "dist"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/slack",
"version": "1.2.18",
"version": "1.2.17",
"type": "module",
"license": "MIT",
"scripts": {

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/ui",
"version": "1.2.18",
"version": "1.2.17",
"type": "module",
"license": "MIT",
"exports": {

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/util",
"version": "1.2.18",
"version": "1.2.17",
"private": true,
"type": "module",
"license": "MIT",

View File

@@ -2,7 +2,7 @@
"name": "@opencode-ai/web",
"type": "module",
"license": "MIT",
"version": "1.2.18",
"version": "1.2.17",
"scripts": {
"dev": "astro dev",
"dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev",

View File

@@ -59,7 +59,6 @@ OpenCode Zen هو بوابة للذكاء الاصطناعي تتيح لك ال
| النموذج | معرّف النموذج | نقطة النهاية | حزمة AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -142,7 +141,6 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -186,19 +184,6 @@ https://opencode.ai/zen/v1/models
---
### نماذج مهملة
| النموذج | تاريخ الإيقاف |
| ---------------- | ------------- |
| Qwen3 Coder 480B | 6 فبراير 2026 |
| Kimi K2 Thinking | 6 مارس 2026 |
| Kimi K2 | 6 مارس 2026 |
| MiniMax M2.1 | 15 مارس 2026 |
| GLM 4.7 | 15 مارس 2026 |
| GLM 4.6 | 15 مارس 2026 |
---
## الخصوصية
تتم استضافة جميع نماذجنا في الولايات المتحدة. يلتزم مزوّدونا بسياسة عدم الاحتفاظ بالبيانات (zero-retention) ولا يستخدمون بياناتك لتدريب النماذج، مع الاستثناءات التالية:

View File

@@ -55,7 +55,6 @@ Nasim modelima mozete pristupiti i preko sljedecih API endpointa.
| Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,7 +136,6 @@ Podrzavamo pay-as-you-go model. Ispod su cijene **po 1M tokena**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -180,19 +178,6 @@ Na primjer, ako postavite mjesecni limit na $20, Zen nece potrositi vise od $20
---
### Zastarjeli modeli
| Model | Datum ukidanja |
| ---------------- | -------------- |
| Qwen3 Coder 480B | 6. feb. 2026. |
| Kimi K2 Thinking | 6. mart 2026. |
| Kimi K2 | 6. mart 2026. |
| MiniMax M2.1 | 15. mart 2026. |
| GLM 4.7 | 15. mart 2026. |
| GLM 4.6 | 15. mart 2026. |
---
## Privatnost
Svi nasi modeli su hostovani u SAD-u. Provajderi prate zero-retention politiku i ne koriste vase podatke za treniranje modela, uz sljedece izuzetke:

View File

@@ -64,7 +64,6 @@ Du kan også få adgang til vores modeller gennem følgende API-endpoints.
| Model | Model ID | Endpoint | AI SDK Pakke |
| ------------------- | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -148,7 +147,6 @@ Vi støtter en pay-as-you-go-model. Nedenfor er priserne **per 1 million tokens*
| Gemini 3 Pro (≤ 200K tokens) | $2,00 | $12,00 | $0,20 | - |
| Gemini 3 Pro (> 200K tokens) | $4,00 | $18,00 | $0,40 | - |
| Gemini 3 Flash | $0,50 | $3,00 | $0,05 | - |
| GPT 5.4 | $2,50 | $15,00 | $0,25 | - |
| GPT 5.3 Codex | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 Codex | $1,75 | $14,00 | $0,175 | - |
@@ -194,19 +192,6 @@ at opkræve dig mere end $20, hvis din saldo går under $5.
---
### Udfasede modeller
| Model | Udfasningsdato |
| ---------------- | -------------- |
| Qwen3-koder 480B | 6. feb. 2026 |
| Kimi K2 Tenker | 6. marts 2026 |
| Kimi K2 | 6. marts 2026 |
| MiniMax M2.1 | 15. marts 2026 |
| GLM 4.7 | 15. marts 2026 |
| GLM 4.6 | 15. marts 2026 |
---
## Privatliv
Alle vores modeller er hostet i USA. Vores udbydere følger en nul-opbevaringspolitik og bruger ikke dine data til modeltræning, med følgende undtagelser:

View File

@@ -57,7 +57,6 @@ Du kannst unsere Modelle auch ueber die folgenden API-Endpunkte aufrufen.
| Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -115,12 +114,12 @@ Unten siehst du die Preise **pro 1 Mio. Tokens**.
| --------------------------------- | ------ | ------ | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -141,7 +140,6 @@ Unten siehst du die Preise **pro 1 Mio. Tokens**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -186,19 +184,6 @@ Mit aktiviertem Auto-Reload kann die Abrechnung dennoch darueber liegen, falls d
---
### Veraltete Modelle
| Model | Datum der Abschaltung |
| ---------------- | --------------------- |
| Qwen3 Coder 480B | 6. Feb. 2026 |
| Kimi K2 Thinking | 6. Maerz 2026 |
| Kimi K2 | 6. Maerz 2026 |
| MiniMax M2.1 | 15. Maerz 2026 |
| GLM 4.7 | 15. Maerz 2026 |
| GLM 4.6 | 15. Maerz 2026 |
---
## Datenschutz
Alle Modelle werden in den USA gehostet.

View File

@@ -62,7 +62,6 @@ También puede acceder a nuestros modelos a través de los siguientes puntos fin
| Modelo | Model ID | Endpoint | AI SDK package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -146,7 +145,6 @@ Apoyamos un modelo de pago por uso. A continuación se muestran los precios **po
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0,20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0,40 | - |
| Gemini 3 Flash | $0,50 | $3.00 | $0,05 | - |
| GPT 5.4 | $2,50 | $15,00 | $0,25 | - |
| GPT 5.3 Codex | $1,75 | $14.00 | $0,175 | - |
| GPT 5.2 | $1,75 | $14.00 | $0,175 | - |
| GPT 5.2 Codex | $1,75 | $14.00 | $0,175 | - |
@@ -192,19 +190,6 @@ cobrarle más de $20 si su saldo es inferior a $5.
---
### Modelos obsoletos
| Modelo | Fecha de retiro |
| ---------------- | ------------------- |
| Qwen3 Coder 480B | 6 de feb. de 2026 |
| Kimi K2 Thinking | 6 de marzo de 2026 |
| Kimi K2 | 6 de marzo de 2026 |
| MiniMax M2.1 | 15 de marzo de 2026 |
| GLM 4.7 | 15 de marzo de 2026 |
| GLM 4.6 | 15 de marzo de 2026 |
---
## Privacidad
Todos nuestros modelos están alojados en los EE. UU. Nuestros proveedores siguen una política de retención cero y no utilizan sus datos para la capacitación de modelos, con las siguientes excepciones:

View File

@@ -55,7 +55,6 @@ Vous pouvez également accéder à nos modèles via les points de terminaison AP
| Modèle | ID du modèle | Point de terminaison | Package SDK IA |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,7 +136,6 @@ Nous soutenons un modèle de paiement à l'utilisation. Vous trouverez ci-dessou
| Gemini 3 Pro (≤ 200K jetons) | 2,00 $ | 12,00 $ | 0,20 $ | - |
| Gemini 3 Pro (> 200K jetons) | 4,00 $ | 18,00 $ | 0,40 $ | - |
| Gemini 3 Flash | 0,50 $ | 3,00 $ | 0,05 $ | - |
| GPT 5.4 | 2,50 $ | 15,00 $ | 0,25 $ | - |
| GPT 5.3 Codex | 1,75 $ | 14,00 $ | 0,175 $ | - |
| GPT 5.2 | 1,75 $ | 14,00 $ | 0,175 $ | - |
| GPT 5.2 Codex | 1,75 $ | 14,00 $ | 0,175 $ | - |
@@ -180,19 +178,6 @@ Par exemple, disons que vous définissez une limite d'utilisation mensuelle à 2
---
### Modèles obsolètes
| Modèle | Date de dépréciation |
| ---------------- | -------------------- |
| Qwen3 Coder 480B | 6 février 2026 |
| Kimi K2 Thinking | 6 mars 2026 |
| Kimi K2 | 6 mars 2026 |
| MiniMax M2.1 | 15 mars 2026 |
| GLM 4.7 | 15 mars 2026 |
| GLM 4.6 | 15 mars 2026 |
---
## Confidentialité
Tous nos modèles sont hébergés aux États-Unis. Nos fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour la formation de modèles, avec les exceptions suivantes :

View File

@@ -55,7 +55,6 @@ Puoi anche accedere ai nostri modelli tramite i seguenti endpoint API.
| Modello | ID modello | Endpoint | Pacchetto AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,7 +136,6 @@ Supportiamo un modello pay-as-you-go. Qui sotto trovi i prezzi **per 1M token**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -180,19 +178,6 @@ Per esempio, se imposti un limite mensile a $20, Zen non usera piu di $20 in un
---
### Modelli deprecati
| Modello | Data di deprecazione |
| ---------------- | -------------------- |
| Qwen3 Coder 480B | 6 feb 2026 |
| Kimi K2 Thinking | 6 mar 2026 |
| Kimi K2 | 6 mar 2026 |
| MiniMax M2.1 | 15 mar 2026 |
| GLM 4.7 | 15 mar 2026 |
| GLM 4.6 | 15 mar 2026 |
---
## Privacy
Tutti i nostri modelli sono ospitati negli US. I nostri provider seguono una policy di zero-retention e non usano i tuoi dati per training dei modelli, con le seguenti eccezioni:

View File

@@ -54,7 +54,6 @@ OpenCode Zen は、OpenCode の他のプロバイダーと同様に機能しま
| Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -138,7 +137,6 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -181,19 +179,6 @@ https://opencode.ai/zen/v1/models
---
### 非推奨モデル
| Model | Deprecation date |
| ---------------- | ---------------- |
| Qwen3 Coder 480B | 2026年2月6日 |
| Kimi K2 Thinking | 2026年3月6日 |
| Kimi K2 | 2026年3月6日 |
| MiniMax M2.1 | 2026年3月15日 |
| GLM 4.7 | 2026年3月15日 |
| GLM 4.6 | 2026年3月15日 |
---
## プライバシー
すべてのモデルは米国でホストされています。当社のプロバイダーはゼロ保持ポリシーに従い、次の例外を除いて、モデルのトレーニングにデータを使用しません。

View File

@@ -55,7 +55,6 @@ OpenCode Zen은 OpenCode의 다른 제공자와 동일한 방식으로 작동합
| 모델 | 모델 ID | 엔드포인트 | AI SDK 패키지 |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -112,12 +111,12 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------ | --------- | --------- |
| Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -138,7 +137,6 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -182,19 +180,6 @@ https://opencode.ai/zen/v1/models
---
### 지원 중단 모델
| 모델 | 지원 중단일 |
| ---------------- | --------------- |
| Qwen3 Coder 480B | 2026년 2월 6일 |
| Kimi K2 Thinking | 2026년 3월 6일 |
| Kimi K2 | 2026년 3월 6일 |
| MiniMax M2.1 | 2026년 3월 15일 |
| GLM 4.7 | 2026년 3월 15일 |
| GLM 4.6 | 2026년 3월 15일 |
---
## 개인정보 보호
당사의 모든 모델은 미국에서 호스팅됩니다. 당사 제공자는 데이터 무보존(zero-retention) 정책을 따르며, 아래의 예외를 제외하고는 귀하의 데이터를 모델 학습에 사용하지 않습니다.

View File

@@ -64,7 +64,6 @@ Du kan også få tilgang til modellene våre gjennom følgende API-endepunkter.
| Modell | Modell ID | Endepunkt | AI SDK Pakke |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -122,7 +121,7 @@ Vi støtter en pay-as-you-go-modell. Nedenfor er prisene **per 1 million tokens*
| --------------------------------- | ------- | ------ | ------------- | --------------- |
| Big Pickle | Gratis | Gratis | Gratis | - |
| MiniMax M2.5 Free | Gratis | Gratis | Gratis | - |
| MiniMax M2.5 | $0,30 | $1,20 | $0,06 | $0,375 |
| MiniMax M2.5 | $0,30 | $1,20 | $0,06 | - |
| MiniMax M2.1 | $0,30 | $1,20 | $0,10 | - |
| GLM 5 | $1,00 | $3,20 | $0,20 | - |
| GLM 4.7 | $0,60 | $2,20 | $0,10 | - |
@@ -148,7 +147,6 @@ Vi støtter en pay-as-you-go-modell. Nedenfor er prisene **per 1 million tokens*
| Gemini 3 Pro (≤ 200K tokens) | $2,00 | $12,00 | $0,20 | - |
| Gemini 3 Pro (> 200K tokens) | $4,00 | $18,00 | $0,40 | - |
| Gemini 3 Flash | $0,50 | $3,00 | $0,05 | - |
| GPT 5.4 | $2,50 | $15,00 | $0,25 | - |
| GPT 5.3 Codex | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 Codex | $1,75 | $14,00 | $0,175 | - |
@@ -194,19 +192,6 @@ belaster deg mer enn $20 hvis saldoen din går under $5.
---
### Utfasede modeller
| Modell | Utfasingdato |
| ---------------- | ------------- |
| Qwen3 Coder 480B | 6. feb. 2026 |
| Kimi K2 Thinking | 6. mars 2026 |
| Kimi K2 | 6. mars 2026 |
| MiniMax M2.1 | 15. mars 2026 |
| GLM 4.7 | 15. mars 2026 |
| GLM 4.6 | 15. mars 2026 |
---
## Personvern
Alle våre modeller er hostet i USA. Leverandørene våre følger retningslinjer om ingen datalagring og bruker ikke dataene dine til modellopplæring, med følgende unntak:

View File

@@ -1,21 +1,21 @@
---
title: Zen
description: Wyselekcjonowana lista modeli dostarczonych przez OpenCode.
description: Wyselekcjonowana lista modeli dostarczonych przez opencode.
---
import config from "../../../../config.mjs"
export const console = config.console
export const email = `mailto:${config.email}`
OpenCode Zen to lista przetestowanych i zweryfikowanych modeli udostępniona przez zespół OpenCode.
OpenCode Zen to lista przetestowanych i zweryfikowanych modeli udostępniona przez zespół opencode.
:::note
OpenCode Zen jest obecnie w wersji beta.
OpenCode Zen is currently in beta.
:::
Zen działa jak każdy inny dostawca w OpenCode. Logujesz się do OpenCode Zen i otrzymujesz
swój klucz API. Jest to **całkowicie opcjonalne** i nie musisz tego używać, aby korzystać z
OpenCode.
Zen działa jak każdy inny dostawca opencode. Logujesz się do OpenCode Zen i dostajesz
Twój klucz API. Jest **całkowicie opcjonalny** i nie musisz go używać, aby z niego korzystać
opencode.
---
@@ -23,23 +23,23 @@ OpenCode.
Istnieje ogromna liczba modeli, ale tylko kilka z nich
działa dobrze jako agenci kodujący. Dodatkowo większość dostawców jest
skonfigurowana bardzo różnie, więc otrzymujesz bardzo różną wydajność i jakość.
skonfigurowana bardzo różnie; więc otrzymujesz zupełnie inną wydajność i jakość.
:::tip
Przetestowaliśmy wybraną grupę modeli i dostawców, którzy dobrze współpracują z OpenCode.
Przetestowaliśmy wybraną grupę modeli i dostawców, którzy dobrze współpracują z opencode.
:::
Jeśli więc używasz modelu za pośrednictwem czegoś takiego jak OpenRouter, nigdy nie możesz być
Jeśli więc używasz modelu za pośrednictwem czegoś takiego jak OpenRouter, nigdy nie będzie to możliwe
pewien, czy otrzymujesz najlepszą wersję modelu, jaki chcesz.
Aby to naprawić, zrobiliśmy kilka rzeczy:
1. Przetestowaliśmy wybraną grupę modeli i rozmawialiśmy z ich zespołami o tym, jak
najlepiej je uruchamiać.
1. Przetestowaliśmy wybraną grupę modeli i rozmawialiśmy z ich zespołami o tym, jak to zrobić
najlepiej je uruchom.
2. Następnie współpracowaliśmy z kilkoma dostawcami, aby upewnić się, że są one obsługiwane
poprawnie.
3. Na koniec sprawdziliśmy wydajność kombinacji modelu/dostawcy i stworzyliśmy
listę, którą z czystym sumieniem polecamy.
correctly.
3. Na koniec porównaliśmy kombinację modelu/dostawcy i otrzymaliśmy wynik
z listą, którą z przyjemnością polecamy.
OpenCode Zen to brama AI, która zapewnia dostęp do tych modeli.
@@ -47,14 +47,14 @@ OpenCode Zen to brama AI, która zapewnia dostęp do tych modeli.
## Jak to działa
OpenCode Zen działa jak każdy inny dostawca w OpenCode.
OpenCode Zen działa jak każdy inny dostawca opencode.
1. Logujesz się do **<a href={console}>OpenCode Zen</a>**, dodajesz dane rozliczeniowe
i kopiujesz swój klucz API.
1. Logujesz się do **<a href={console}>OpenCode Zen</a>**, dodajesz swoje rozliczenia
szczegóły i skopiuj klucz API.
2. Uruchamiasz polecenie `/connect` w TUI, wybierasz OpenCode Zen i wklejasz klucz API.
3. Uruchom `/models` w TUI, aby zobaczyć listę zalecanych przez nas modeli.
Opłata jest pobierana za każde żądanie i możesz dodać środki do swojego konta.
Opłata jest pobierana za każde żądanie i możesz dodać kredyty do swojego konta.
---
@@ -64,7 +64,6 @@ Dostęp do naszych modeli można również uzyskać za pośrednictwem następuj
| Model | Identyfikator modelu | Punkt końcowy | Pakiet SDK AI |
| ------------------ | -------------------- | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -98,9 +97,9 @@ Dostęp do naszych modeli można również uzyskać za pośrednictwem następuj
| Qwen3 Coder 480B | qwen3-coder | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
[Identyfikator modelu](/docs/config/#models) w konfiguracji OpenCode
używa formatu `opencode/<model-id>`. Na przykład w przypadku GPT 5.2 Codex użyłbyś
`opencode/gpt-5.2-codex` w swojej konfiguracji.
[Identyfikator modelu](/docs/config/#models) w konfiguracji opencode
używa formatu `opencode/<model-id>`. Na przykład w przypadku Kodeksu GPT 5.2 zrobiłbyś to
użyj `opencode/gpt-5.2-codex` w swojej konfiguracji.
---
@@ -122,12 +121,12 @@ Wspieramy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów**.
| --------------------------------- | ------- | ------- | --------------------------- | -------------------------- |
| Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -148,7 +147,6 @@ Wspieramy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -160,10 +158,10 @@ Wspieramy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów**.
| GPT 5 Codex | $1.07 | $8.50 | $0.107 | - |
| GPT 5 Nano | Free | Free | Free | - |
Możesz zauważyć _Claude Haiku 3.5_ w swojej historii użytkowania. Jest to [tani model](/docs/config/#models), który jest używany do generowania tytułów Twoich sesji.
Możesz zauważyć _Claude Haiku 3.5_ w swojej historii użytkowania. To jest [model niskokosztowy](/docs/config/#models), który służy do generowania tytułów sesji.
:::note
Opłaty za karty kredytowe są przenoszone po kosztach (4,4% + 0,30 USD za transakcję); nie pobieramy nic poza tym.
Opłaty za karty kredytowe są przenoszone na koszt (4,4% + 0,30 USD za transakcję); nie pobieramy żadnych dodatkowych opłat.
:::
Darmowe modele:
@@ -179,31 +177,18 @@ Darmowe modele:
Jeśli Twoje saldo spadnie poniżej 5 USD, Zen automatycznie doładuje 20 USD.
Możesz zmienić kwotę automatycznego doładowania. Możesz także całkowicie wyłączyć automatyczne doładowanie.
Możesz zmienić kwotę automatycznego doładowania. Możesz także całkowicie wyłączyć automatyczne przeładowywanie.
---
### Limity miesięczne
Możesz także ustawić miesięczny limit użytkowania dla całego obszaru roboczego i dla każdego
członka Twojego zespołu.
Możesz także ustawić miesięczny limit wykorzystania dla całego obszaru roboczego i dla każdego z nich
członek Twojego zespołu.
Na przykład, jeśli ustawisz miesięczny limit użytkowania na 20 USD, Zen nie zużyje
więcej niż 20 dolarów w miesiącu. Ale jeśli masz włączone automatyczne doładowanie, Zen może
obciążyć Cię kwotą wyższą niż 20 USD, jeśli saldo spadnie poniżej 5 USD.
---
### Przestarzałe modele
| Model | Data wycofania |
| ---------------- | -------------- |
| Qwen3 Coder 480B | 6 lutego 2026 |
| Kimi K2 Thinking | 6 marca 2026 |
| Kimi K2 | 6 marca 2026 |
| MiniMax M2.1 | 15 marca 2026 |
| GLM 4.7 | 15 marca 2026 |
| GLM 4.6 | 15 marca 2026 |
Załóżmy na przykład, że ustawiłeś miesięczny limit użytkowania na 20 USD, Zen nie będzie z niego korzystał
ponad 20 dolarów miesięcznie. Ale jeśli masz włączone automatyczne przeładowywanie, Zen może się skończyć
obciąży Cię kwotą wyższą niż 20 USD, jeśli saldo spadnie poniżej 5 USD.
---
@@ -213,22 +198,22 @@ Wszystkie nasze modele są hostowane w USA. Nasi dostawcy przestrzegają polityk
- Big Pickle: W okresie bezpłatnym zebrane dane mogą zostać wykorzystane do udoskonalenia modelu.
- MiniMax M2.5 Free: W okresie bezpłatnym zebrane dane mogą zostać wykorzystane do udoskonalenia modelu.
- API OpenAI: Żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych OpenAI](https://platform.openai.com/docs/guides/your-data).
- API Anthropic: Żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych Anthropic](https://docs.anthropic.com/en/docs/claude-code/data-usage).
- Interfejsy API OpenAI: żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych OpenAI](https://platform.openai.com/docs/guides/your-data).
- Interfejsy API Anthropic: żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych firmy Anthropic](https://docs.anthropic.com/en/docs/claude-code/data-usage).
---
## Dla zespołów
Zen działa świetnie także dla zespołów. Możesz zapraszać członków zespołu, przypisywać role, dobier
Zen świetnie sprawdza się także w zespołach. Możesz zapraszać członków zespołu, przypisywać role, zarządz
modele, z których korzysta Twój zespół i nie tylko.
:::note
Obszary robocze są obecnie bezpłatne dla zespołów w ramach wersji beta.
:::
Zarządzanie obszarem roboczym jest obecnie bezpłatne dla zespołów w ramach wersji beta.
Wkrótce udostępnimy więcej szczegółów na temat cen.
Zarządzanie obszarem roboczym jest obecnie bezpłatne dla zespołów w ramach wersji beta. Będziemy
wkrótce udostępnimy więcej szczegółów na temat cen.
---
@@ -236,8 +221,8 @@ Wkrótce udostępnimy więcej szczegółów na temat cen.
Możesz zapraszać członków zespołu do swojego obszaru roboczego i przypisywać role:
- **Admin**: Zarządzanie modelami, członkami, kluczami API i rozliczeniami
- **Członek**: Zarządzanie tylko własnymi kluczami API
- **Administrator**: Zarządzaj modelami, członkami, kluczami API i rozliczeniami
- **Członek**: Zarządzaj tylko własnymi kluczami API
Administratorzy mogą także ustawić miesięczne limity wydatków dla każdego członka, aby utrzymać koszty pod kontrolą.
@@ -248,7 +233,7 @@ Administratorzy mogą także ustawić miesięczne limity wydatków dla każdego
Administratorzy mogą włączać i wyłączać określone modele w obszarze roboczym. Żądania skierowane do wyłączonego modelu zwrócą błąd.
Jest to przydatne w przypadkach, gdy chcesz wyłączyć korzystanie z modelu, który
zbiera dane.
collects data.
---
@@ -268,6 +253,6 @@ i chcesz go używać zamiast tego, który zapewnia Zen.
Stworzyliśmy OpenCode Zen, aby:
1. **Testować** (Benchmark) najlepsze modele/dostawców dla agentów kodujących.
2. Mieć dostęp do opcji **najwyższej jakości**, a nie obniżać wydajności ani nie kierować do tańszych dostawców.
3. Przekazywać wszelkie **obniżki cen**, sprzedając po kosztach; więc jedyną marżą jest pokrycie naszych opłat manipulacyjnych.
4. Nie **mieć blokady** (no lock-in), umożliwiając używanie go z dowolnym innym agentem kodującym. I zawsze pozwalać na korzystanie z dowolnego innego dostawcy w OpenCode.
2. Miej dostęp do opcji **najwyższej jakości**, a nie obniżaj wydajności ani nie kieruj się do tańszych dostawców.
3. Przekaż wszelkie **obniżki cen**, sprzedając po kosztach; więc jedyną marżą jest pokrycie naszych opłat manipulacyjnych.
4. Nie **nie blokuj**, umożliwiając używanie go z dowolnym innym agentem kodującym. I zawsze pozwalaj na korzystanie z opencode dowolnego innego dostawcy.

View File

@@ -55,7 +55,6 @@ Você também pode acessar nossos modelos através dos seguintes endpoints da AP
| Modelo | ID do Modelo | Endpoint | Pacote AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,7 +136,6 @@ Nós suportamos um modelo de pagamento conforme o uso. Abaixo estão os preços
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -180,19 +178,6 @@ Por exemplo, digamos que você defina um limite de uso mensal de $20, o Zen não
---
### Modelos obsoletos
| Modelo | Data de descontinuação |
| ---------------- | ---------------------- |
| Qwen3 Coder 480B | 6 de fev. de 2026 |
| Kimi K2 Thinking | 6 de mar. de 2026 |
| Kimi K2 | 6 de mar. de 2026 |
| MiniMax M2.1 | 15 de mar. de 2026 |
| GLM 4.7 | 15 de mar. de 2026 |
| GLM 4.6 | 15 de mar. de 2026 |
---
## Privacidade
Todos os nossos modelos estão hospedados nos EUA. Nossos provedores seguem uma política de zero retenção e não usam seus dados para treinamento de modelos, com as seguintes exceções:

View File

@@ -63,7 +63,6 @@ OpenCode Zen работает так же, как и любой другой п
| Модель | Идентификатор модели | Конечная точка | Пакет AI SDK |
| ------------------ | -------------------- | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,7 +146,6 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200 тыс. токенов) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200 тыс. токенов) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -193,19 +191,6 @@ https://opencode.ai/zen/v1/models
---
### Устаревшие модели
| Модель | Дата отключения |
| ---------------- | ---------------- |
| Qwen3 Coder 480B | 6 февр. 2026 г. |
| Kimi K2 Thinking | 6 марта 2026 г. |
| Kimi K2 | 6 марта 2026 г. |
| MiniMax M2.1 | 15 марта 2026 г. |
| GLM 4.7 | 15 марта 2026 г. |
| GLM 4.6 | 15 марта 2026 г. |
---
## Конфиденциальность
Все наши модели размещены в США. Наши поставщики придерживаются политики нулевого хранения и не используют ваши данные для обучения моделей, за следующими исключениями:

View File

@@ -64,7 +64,6 @@ OpenCode Zen ทำงานเหมือนกับผู้ให้บร
| Model | Model ID | Endpoint | แพ็คเกจ AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -122,12 +121,12 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ---------- | -------- | ------- | ---------- |
| Big Pickle | ฟรี | ฟรี | ฟรี | - |
| MiniMax M2.5 Free | ฟรี | ฟรี | ฟรี | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -148,7 +147,6 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -194,24 +192,11 @@ https://opencode.ai/zen/v1/models
---
### โมเดลที่เลิกใช้แล้ว
| Model | วันที่เลิกใช้ |
| ---------------- | ------------- |
| Qwen3 Coder 480B | 6 ก.พ. 2026 |
| Kimi K2 Thinking | 6 มี.ค. 2026 |
| Kimi K2 | 6 มี.ค. 2026 |
| MiniMax M2.1 | 15 มี.ค. 2026 |
| GLM 4.7 | 15 มี.ค. 2026 |
| GLM 4.6 | 15 มี.ค. 2026 |
---
## ความเป็นส่วนตัว
โมเดลทั้งหมดของเราโฮสต์ในสหรัฐอเมริกา ผู้ให้บริการของเราปฏิบัติตามนโยบายการเก็บรักษาเป็นศูนย์ และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมีข้อยกเว้นต่อไปนี้:
- Big Pickle: ในช่วงระยะเวลาฟรี ข้อมูลที่รวบรวมอาจนำไปใช้ในการปรับปรุงโมเดลได้
- Big Pickle: ในช่วงระยะเวลาว่าง ข้อมูลที่รวบรวมอาจนำไปใช้ในการปรับปรุงโมเดลได้
- MiniMax M2.5 Free: ในช่วงระยะเวลาฟรี ข้อมูลที่รวบรวมอาจนำไปใช้ในการปรับปรุงโมเดล
- OpenAI API: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [นโยบายข้อมูลของ OpenAI](https://platform.openai.com/docs/guides/your-data)
- Anthropic API: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [นโยบายข้อมูลของ Anthropic](https://docs.anthropic.com/en/docs/claude-code/data-usage)

View File

@@ -55,7 +55,6 @@ Modellerimize aşağıdaki API uç noktaları aracılığıyla da erişebilirsin
| Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,7 +136,6 @@ Kullandıkça öde modelini destekliyoruz. Aşağıda **1 milyon token başına*
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -180,19 +178,6 @@ Ayrıca tüm çalışma alanı ve ekibinizin her üyesi için aylık kullanım l
---
### Kullanımdan kaldırılan modeller
| Model | Kullanımdan kaldırılma tarihi |
| ---------------- | ----------------------------- |
| Qwen3 Coder 480B | 6 Şub 2026 |
| Kimi K2 Thinking | 6 Mar 2026 |
| Kimi K2 | 6 Mar 2026 |
| MiniMax M2.1 | 15 Mar 2026 |
| GLM 4.7 | 15 Mar 2026 |
| GLM 4.6 | 15 Mar 2026 |
---
## Gizlilik
Tüm modellerimiz ABD'de barındırılmaktadır. Sağlayıcılarımız sıfır saklama politikasını izler ve aşağıdaki istisnalar dışında verilerinizi model eğitimi için kullanmaz:

View File

@@ -62,47 +62,44 @@ You are charged per request and you can add credits to your account.
You can also access our models through the following API endpoints.
| Model | Model ID | Endpoint | AI SDK Package |
| ------------------- | ------------------- | -------------------------------------------------- | --------------------------- |
| GPT 5.4 Pro | gpt-5.4-pro | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex Spark | gpt-5.3-codex-spark | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 | gpt-5.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 Codex | gpt-5.1-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 Codex Max | gpt-5.1-codex-max | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 Codex Mini | gpt-5.1-codex-mini | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5 | gpt-5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5 Codex | gpt-5-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5 Nano | gpt-5-nano | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Claude Opus 4.6 | claude-opus-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Opus 4.5 | claude-opus-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Opus 4.1 | claude-opus-4-1 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Sonnet 4.5 | claude-sonnet-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Sonnet 4 | claude-sonnet-4 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Haiku 4.5 | claude-haiku-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Haiku 3.5 | claude-3-5-haiku | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Pro | gemini-3-pro | `https://opencode.ai/zen/v1/models/gemini-3-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiniMax M2.5 Free | minimax-m2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiniMax M2.1 | minimax-m2.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| GLM 5 | glm-5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| GLM 4.7 | glm-4.7 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| GLM 4.6 | glm-4.6 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Kimi K2.5 | kimi-k2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Kimi K2 Thinking | kimi-k2-thinking | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Kimi K2 | kimi-k2 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Qwen3 Coder 480B | qwen3-coder | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 | gpt-5.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 Codex | gpt-5.1-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 Codex Max | gpt-5.1-codex-max | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.1 Codex Mini | gpt-5.1-codex-mini | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5 | gpt-5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5 Codex | gpt-5-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5 Nano | gpt-5-nano | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| Claude Opus 4.6 | claude-opus-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Opus 4.5 | claude-opus-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Opus 4.1 | claude-opus-4-1 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Sonnet 4.5 | claude-sonnet-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Sonnet 4 | claude-sonnet-4 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Haiku 4.5 | claude-haiku-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Claude Haiku 3.5 | claude-3-5-haiku | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` |
| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` |
| Gemini 3 Pro | gemini-3-pro | `https://opencode.ai/zen/v1/models/gemini-3-pro` | `@ai-sdk/google` |
| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` |
| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiniMax M2.5 Free | minimax-m2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| MiniMax M2.1 | minimax-m2.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| GLM 5 | glm-5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| GLM 4.7 | glm-4.7 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| GLM 4.6 | glm-4.6 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Kimi K2.5 | kimi-k2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Kimi K2 Thinking | kimi-k2-thinking | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Kimi K2 | kimi-k2 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Qwen3 Coder 480B | qwen3-coder | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
The [model id](/docs/config/#models) in your OpenCode config
uses the format `opencode/<model-id>`. For example, for GPT 5.3 Codex, you would
use `opencode/gpt-5.3-codex` in your config.
uses the format `opencode/<model-id>`. For example, for GPT 5.2 Codex, you would
use `opencode/gpt-5.2-codex` in your config.
---
@@ -120,49 +117,46 @@ https://opencode.ai/zen/v1/models
We support a pay-as-you-go model. Below are the prices **per 1M tokens**.
| Model | Input | Output | Cached Read | Cached Write |
| --------------------------------- | ------ | ------- | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
| Claude Opus 4.6 (≤ 200K tokens) | $5.00 | $25.00 | $0.50 | $6.25 |
| Claude Opus 4.6 (> 200K tokens) | $10.00 | $37.50 | $1.00 | $12.50 |
| Claude Opus 4.5 | $5.00 | $25.00 | $0.50 | $6.25 |
| Claude Opus 4.1 | $15.00 | $75.00 | $1.50 | $18.75 |
| Claude Sonnet 4.6 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 |
| Claude Sonnet 4.6 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 |
| Claude Sonnet 4.5 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 |
| Claude Sonnet 4.5 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 |
| Claude Sonnet 4 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 |
| Claude Sonnet 4 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 |
| Claude Haiku 4.5 | $1.00 | $5.00 | $0.10 | $1.25 |
| Claude Haiku 3.5 | $0.80 | $4.00 | $0.08 | $1.00 |
| Gemini 3.1 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3.1 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 Pro | $30.00 | $180.00 | $30.00 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex Spark | $1.75 | $14.00 | $0.175 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.1 | $1.07 | $8.50 | $0.107 | - |
| GPT 5.1 Codex | $1.07 | $8.50 | $0.107 | - |
| GPT 5.1 Codex Max | $1.25 | $10.00 | $0.125 | - |
| GPT 5.1 Codex Mini | $0.25 | $2.00 | $0.025 | - |
| GPT 5 | $1.07 | $8.50 | $0.107 | - |
| GPT 5 Codex | $1.07 | $8.50 | $0.107 | - |
| GPT 5 Nano | Free | Free | Free | - |
| Model | Input | Output | Cached Read | Cached Write |
| --------------------------------- | ------ | ------ | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
| Claude Opus 4.6 (≤ 200K tokens) | $5.00 | $25.00 | $0.50 | $6.25 |
| Claude Opus 4.6 (> 200K tokens) | $10.00 | $37.50 | $1.00 | $12.50 |
| Claude Opus 4.5 | $5.00 | $25.00 | $0.50 | $6.25 |
| Claude Opus 4.1 | $15.00 | $75.00 | $1.50 | $18.75 |
| Claude Sonnet 4.6 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 |
| Claude Sonnet 4.6 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 |
| Claude Sonnet 4.5 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 |
| Claude Sonnet 4.5 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 |
| Claude Sonnet 4 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 |
| Claude Sonnet 4 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 |
| Claude Haiku 4.5 | $1.00 | $5.00 | $0.10 | $1.25 |
| Claude Haiku 3.5 | $0.80 | $4.00 | $0.08 | $1.00 |
| Gemini 3.1 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3.1 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.1 | $1.07 | $8.50 | $0.107 | - |
| GPT 5.1 Codex | $1.07 | $8.50 | $0.107 | - |
| GPT 5.1 Codex Max | $1.25 | $10.00 | $0.125 | - |
| GPT 5.1 Codex Mini | $0.25 | $2.00 | $0.025 | - |
| GPT 5 | $1.07 | $8.50 | $0.107 | - |
| GPT 5 Codex | $1.07 | $8.50 | $0.107 | - |
| GPT 5 Nano | Free | Free | Free | - |
You might notice _Claude Haiku 3.5_ in your usage history. This is a [low cost model](/docs/config/#models) that's used to generate the titles of your sessions.

View File

@@ -55,7 +55,6 @@ OpenCode Zen 的工作方式与 OpenCode 中的任何其他提供商相同。
| 模型 | 模型 ID | 端点 | AI SDK 包 |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,7 +136,6 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -180,19 +178,6 @@ https://opencode.ai/zen/v1/models
---
### 已弃用模型
| 模型 | 弃用日期 |
| ---------------- | ------------------ |
| Qwen3 Coder 480B | 2026 年 2 月 6 日 |
| Kimi K2 Thinking | 2026 年 3 月 6 日 |
| Kimi K2 | 2026 年 3 月 6 日 |
| MiniMax M2.1 | 2026 年 3 月 15 日 |
| GLM 4.7 | 2026 年 3 月 15 日 |
| GLM 4.6 | 2026 年 3 月 15 日 |
---
## 隐私
我们所有的模型都托管在美国。我们的提供商遵循零保留政策,不会将你的数据用于模型训练,但以下情况除外:

View File

@@ -55,7 +55,6 @@ OpenCode Zen 的工作方式與 OpenCode 中的任何其他供應商相同。
| 模型 | 模型 ID | 端點 | AI SDK 套件 |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,7 +136,6 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K Token) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K Token) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -180,19 +178,6 @@ https://opencode.ai/zen/v1/models
---
### 已棄用的模型
| 模型 | 棄用日期 |
| ---------------- | ------------------ |
| Qwen3 Coder 480B | 2026 年 2 月 6 日 |
| Kimi K2 Thinking | 2026 年 3 月 6 日 |
| Kimi K2 | 2026 年 3 月 6 日 |
| MiniMax M2.1 | 2026 年 3 月 15 日 |
| GLM 4.7 | 2026 年 3 月 15 日 |
| GLM 4.6 | 2026 年 3 月 15 日 |
---
## 隱私
我們所有的模型都託管在美國。我們的供應商遵循零保留政策,不會將你的資料用於模型訓練,但以下情況除外:

View File

@@ -2,7 +2,7 @@
"name": "opencode",
"displayName": "opencode",
"description": "opencode for VS Code",
"version": "1.2.18",
"version": "1.2.17",
"publisher": "sst-dev",
"repository": {
"type": "git",