From 45ac20b8aa1c96751af6824bf7dd736554ef7938 Mon Sep 17 00:00:00 2001 From: James Long Date: Wed, 4 Mar 2026 18:12:05 -0500 Subject: [PATCH 01/42] fix(core): handle SIGHUP and kill process (#16057) --- packages/opencode/src/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts index 35b42dce77..4fd5f0e67b 100644 --- a/packages/opencode/src/index.ts +++ b/packages/opencode/src/index.ts @@ -46,6 +46,11 @@ process.on("uncaughtException", (e) => { }) }) +// Ensure the process exits on terminal hangup (eg. closing the terminal tab). +// Without this, long-running commands like `serve` block on a never-resolving +// promise and survive as orphaned processes. +process.on("SIGHUP", () => process.exit()) + let cli = yargs(hideBin(process.argv)) .parserConfiguration({ "populate--": true }) .scriptName("opencode") From 27447bab2614e1beca999da0b1dfc5fd9e0ecf3b Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 4 Mar 2026 18:28:41 -0500 Subject: [PATCH 02/42] wip: zen --- packages/console/app/src/i18n/en.ts | 2 +- packages/console/app/src/routes/go/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts index 82ec78bda0..19e1cdefdb 100644 --- a/packages/console/app/src/i18n/en.ts +++ b/packages/console/app/src/i18n/en.ts @@ -258,7 +258,7 @@ export const dict = { "go.cta.price": "$10/month", "go.pricing.body": "Use with any agent. Top up credit if needed. Cancel any time.", "go.graph.free": "Free", - "go.graph.freePill": "Big Pickle and promotional", + "go.graph.freePill": "Big Pickle and free models", "go.graph.go": "Go", "go.graph.label": "Requests per 5 hour", "go.graph.usageLimits": "Usage limits", diff --git a/packages/console/app/src/routes/go/index.tsx b/packages/console/app/src/routes/go/index.tsx index 7c5981cbc4..af4a1d8c40 100644 --- a/packages/console/app/src/routes/go/index.tsx +++ b/packages/console/app/src/routes/go/index.tsx @@ -169,8 +169,8 @@ function LimitsGraph(props: { href: string }) { - + {i18n.t("go.faq.a4.p1.pricingLink")}{" "} {i18n.t("go.faq.a4.p1.afterPricing")} {i18n.t("go.faq.a4.p2.beforeAccount")}{" "} - {i18n.t("go.faq.a4.p2.accountLink")}. {i18n.t("go.faq.a4.p3")} + {i18n.t("go.faq.a4.p2.accountLink")}. {i18n.t("go.faq.a4.p3")}
  • From f363904febd2134e8c73681e1b02cfb283e075a2 Mon Sep 17 00:00:00 2001 From: Daniel Polito Date: Thu, 5 Mar 2026 03:16:53 -0300 Subject: [PATCH 06/42] feat(opencode): Adding options to auth login to skip questions (#14470) Co-authored-by: Shoubhit Dash --- packages/opencode/src/cli/cmd/auth.ts | 124 +++++++++++++++++--------- 1 file changed, 80 insertions(+), 44 deletions(-) diff --git a/packages/opencode/src/cli/cmd/auth.ts b/packages/opencode/src/cli/cmd/auth.ts index 4afe7a8224..a7300e0293 100644 --- a/packages/opencode/src/cli/cmd/auth.ts +++ b/packages/opencode/src/cli/cmd/auth.ts @@ -20,10 +20,19 @@ type PluginAuth = NonNullable * Handle plugin-based authentication flow. * Returns true if auth was handled, false if it should fall through to default handling. */ -async function handlePluginAuth(plugin: { auth: PluginAuth }, provider: string): Promise { +async function handlePluginAuth(plugin: { auth: PluginAuth }, provider: string, methodName?: string): Promise { let index = 0 - if (plugin.auth.methods.length > 1) { - const method = await prompts.select({ + if (methodName) { + const match = plugin.auth.methods.findIndex((x) => x.label.toLowerCase() === methodName.toLowerCase()) + if (match === -1) { + prompts.log.error( + `Unknown method "${methodName}" for ${provider}. Available: ${plugin.auth.methods.map((x) => x.label).join(", ")}`, + ) + process.exit(1) + } + index = match + } else if (plugin.auth.methods.length > 1) { + const selected = await prompts.select({ message: "Login method", options: [ ...plugin.auth.methods.map((x, index) => ({ @@ -32,8 +41,8 @@ async function handlePluginAuth(plugin: { auth: PluginAuth }, provider: string): })), ], }) - if (prompts.isCancel(method)) throw new UI.CancelledError() - index = parseInt(method) + if (prompts.isCancel(selected)) throw new UI.CancelledError() + index = parseInt(selected) } const method = plugin.auth.methods[index] @@ -252,10 +261,21 @@ export const AuthLoginCommand = cmd({ command: "login [url]", describe: "log in to a provider", builder: (yargs) => - yargs.positional("url", { - describe: "opencode auth provider", - type: "string", - }), + yargs + .positional("url", { + describe: "opencode auth provider", + type: "string", + }) + .option("provider", { + alias: ["p"], + describe: "provider id or name to log in to (skips provider selection)", + type: "string", + }) + .option("method", { + alias: ["m"], + describe: "login method label (skips method selection)", + type: "string", + }), async handler(args) { await Instance.provide({ directory: process.cwd(), @@ -322,60 +342,76 @@ export const AuthLoginCommand = cmd({ enabled, providerNames: Object.fromEntries(Object.entries(config.provider ?? {}).map(([id, p]) => [id, p.name])), }) - let provider = await prompts.autocomplete({ - message: "Select provider", - maxItems: 8, - options: [ - ...pipe( - providers, - values(), - sortBy( - (x) => priority[x.id] ?? 99, - (x) => x.name ?? x.id, - ), - map((x) => ({ - label: x.name, - value: x.id, - hint: { - opencode: "recommended", - anthropic: "Claude Max or API key", - openai: "ChatGPT Plus/Pro or API key", - }[x.id], - })), + const options = [ + ...pipe( + providers, + values(), + sortBy( + (x) => priority[x.id] ?? 99, + (x) => x.name ?? x.id, ), - ...pluginProviders.map((x) => ({ + map((x) => ({ label: x.name, value: x.id, - hint: "plugin", + hint: { + opencode: "recommended", + anthropic: "Claude Max or API key", + openai: "ChatGPT Plus/Pro or API key", + }[x.id], })), - { - value: "other", - label: "Other", - }, - ], - }) + ), + ...pluginProviders.map((x) => ({ + label: x.name, + value: x.id, + hint: "plugin", + })), + ] - if (prompts.isCancel(provider)) throw new UI.CancelledError() + let provider: string + if (args.provider) { + const input = args.provider + const byID = options.find((x) => x.value === input) + const byName = options.find((x) => x.label.toLowerCase() === input.toLowerCase()) + const match = byID ?? byName + if (!match) { + prompts.log.error(`Unknown provider "${input}"`) + process.exit(1) + } + provider = match.value + } else { + const selected = await prompts.autocomplete({ + message: "Select provider", + maxItems: 8, + options: [ + ...options, + { + value: "other", + label: "Other", + }, + ], + }) + if (prompts.isCancel(selected)) throw new UI.CancelledError() + provider = selected as string + } const plugin = await Plugin.list().then((x) => x.findLast((x) => x.auth?.provider === provider)) if (plugin && plugin.auth) { - const handled = await handlePluginAuth({ auth: plugin.auth }, provider) + const handled = await handlePluginAuth({ auth: plugin.auth }, provider, args.method) if (handled) return } if (provider === "other") { - provider = await prompts.text({ + const custom = await prompts.text({ message: "Enter provider id", validate: (x) => (x && x.match(/^[0-9a-z-]+$/) ? undefined : "a-z, 0-9 and hyphens only"), }) - if (prompts.isCancel(provider)) throw new UI.CancelledError() - provider = provider.replace(/^@ai-sdk\//, "") - if (prompts.isCancel(provider)) throw new UI.CancelledError() + if (prompts.isCancel(custom)) throw new UI.CancelledError() + provider = custom.replace(/^@ai-sdk\//, "") // Check if a plugin provides auth for this custom provider const customPlugin = await Plugin.list().then((x) => x.findLast((x) => x.auth?.provider === provider)) if (customPlugin && customPlugin.auth) { - const handled = await handlePluginAuth({ auth: customPlugin.auth }, provider) + const handled = await handlePluginAuth({ auth: customPlugin.auth }, provider, args.method) if (handled) return } From 7948de16129970ab01286fbbd7ba7a5e5dcf7be9 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Thu, 5 Mar 2026 14:41:12 +0800 Subject: [PATCH 07/42] app: prefer using useLocation instead of window.location (#15989) --- bun.lock | 1 + .../app/src/pages/layout/sidebar-items.tsx | 34 ++++++++--------- .../src/pages/session/message-id-from-hash.ts | 6 +++ .../session/use-session-hash-scroll.test.ts | 2 +- .../pages/session/use-session-hash-scroll.ts | 38 +++++++++---------- packages/app/src/utils/notification-click.ts | 5 ++- packages/ui/package.json | 1 + packages/ui/src/components/message-part.tsx | 5 ++- 8 files changed, 49 insertions(+), 43 deletions(-) create mode 100644 packages/app/src/pages/session/message-id-from-hash.ts diff --git a/bun.lock b/bun.lock index c3b108a0e2..d93b563293 100644 --- a/bun.lock +++ b/bun.lock @@ -484,6 +484,7 @@ "@solid-primitives/media": "2.3.3", "@solid-primitives/resize-observer": "2.1.3", "@solidjs/meta": "catalog:", + "@solidjs/router": "catalog:", "dompurify": "3.3.1", "fuzzysort": "catalog:", "katex": "0.16.27", diff --git a/packages/app/src/pages/layout/sidebar-items.tsx b/packages/app/src/pages/layout/sidebar-items.tsx index 0aaabc03ba..e991d8225d 100644 --- a/packages/app/src/pages/layout/sidebar-items.tsx +++ b/packages/app/src/pages/layout/sidebar-items.tsx @@ -1,10 +1,4 @@ -import { A, useNavigate, useParams } from "@solidjs/router" -import { useGlobalSync } from "@/context/global-sync" -import { useLanguage } from "@/context/language" -import { useLayout, type LocalProject, getAvatarColors } from "@/context/layout" -import { useNotification } from "@/context/notification" -import { usePermission } from "@/context/permission" -import { base64Encode } from "@opencode-ai/util/encode" +import type { Message, Session, TextPart, UserMessage } from "@opencode-ai/sdk/v2/client" import { Avatar } from "@opencode-ai/ui/avatar" import { HoverCard } from "@opencode-ai/ui/hover-card" import { Icon } from "@opencode-ai/ui/icon" @@ -12,12 +6,18 @@ import { IconButton } from "@opencode-ai/ui/icon-button" import { MessageNav } from "@opencode-ai/ui/message-nav" import { Spinner } from "@opencode-ai/ui/spinner" import { Tooltip } from "@opencode-ai/ui/tooltip" +import { base64Encode } from "@opencode-ai/util/encode" import { getFilename } from "@opencode-ai/util/path" -import { type Message, type Session, type TextPart, type UserMessage } from "@opencode-ai/sdk/v2/client" -import { For, Match, Show, Switch, createMemo, onCleanup, type Accessor, type JSX } from "solid-js" +import { A, useNavigate, useParams } from "@solidjs/router" +import { type Accessor, createMemo, For, type JSX, Match, onCleanup, Show, Switch } from "solid-js" +import { useGlobalSync } from "@/context/global-sync" +import { useLanguage } from "@/context/language" +import { getAvatarColors, type LocalProject, useLayout } from "@/context/layout" +import { useNotification } from "@/context/notification" +import { usePermission } from "@/context/permission" import { agentColor } from "@/utils/agent" -import { hasProjectPermissions } from "./helpers" import { sessionPermissionRequest } from "../session/composer/session-request-tree" +import { hasProjectPermissions } from "./helpers" const OPENCODE_PROJECT_ID = "4b0ea68d7af9a6031a7ffda7ad66e0cb83315750" @@ -231,7 +231,9 @@ export const SessionItem = (props: SessionItemProps): JSX.Element => { const hoverEnabled = createMemo(() => (props.popover ?? true) && hoverAllowed()) const isActive = createMemo(() => props.session.id === params.id) - const hoverPrefetch = { current: undefined as ReturnType | undefined } + const hoverPrefetch = { + current: undefined as ReturnType | undefined, + } const cancelHoverPrefetch = () => { if (hoverPrefetch.current === undefined) return clearTimeout(hoverPrefetch.current) @@ -300,17 +302,15 @@ export const SessionItem = (props: SessionItemProps): JSX.Element => { setHoverSession={props.setHoverSession} messageLabel={messageLabel} onMessageSelect={(message) => { - if (!isActive()) { + if (!isActive()) layout.pendingMessage.set(`${base64Encode(props.session.directory)}/${props.session.id}`, message.id) - navigate(`${props.slug}/session/${props.session.id}`) - return - } - window.history.replaceState(null, "", `#message-${message.id}`) - window.dispatchEvent(new HashChangeEvent("hashchange")) + + navigate(`${props.slug}/session/${props.session.id}#message-${message.id}`) }} trigger={item} /> +
    { + const value = hash.startsWith("#") ? hash.slice(1) : hash + const match = value.match(/^message-(.+)$/) + if (!match) return + return match[1] +} diff --git a/packages/app/src/pages/session/use-session-hash-scroll.test.ts b/packages/app/src/pages/session/use-session-hash-scroll.test.ts index 844f5451e3..7f3389baaa 100644 --- a/packages/app/src/pages/session/use-session-hash-scroll.test.ts +++ b/packages/app/src/pages/session/use-session-hash-scroll.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import { messageIdFromHash } from "./use-session-hash-scroll" +import { messageIdFromHash } from "./message-id-from-hash" describe("messageIdFromHash", () => { test("parses hash with leading #", () => { diff --git a/packages/app/src/pages/session/use-session-hash-scroll.ts b/packages/app/src/pages/session/use-session-hash-scroll.ts index 473409fd99..20e88a3ea3 100644 --- a/packages/app/src/pages/session/use-session-hash-scroll.ts +++ b/packages/app/src/pages/session/use-session-hash-scroll.ts @@ -1,12 +1,9 @@ -import { createEffect, createMemo, onCleanup, onMount } from "solid-js" -import { UserMessage } from "@opencode-ai/sdk/v2" +import type { UserMessage } from "@opencode-ai/sdk/v2" +import { useLocation, useNavigate } from "@solidjs/router" +import { createEffect, createMemo, onMount } from "solid-js" +import { messageIdFromHash } from "./message-id-from-hash" -export const messageIdFromHash = (hash: string) => { - const value = hash.startsWith("#") ? hash.slice(1) : hash - const match = value.match(/^message-(.+)$/) - if (!match) return - return match[1] -} +export { messageIdFromHash } from "./message-id-from-hash" export const useSessionHashScroll = (input: { sessionKey: () => string @@ -30,13 +27,18 @@ export const useSessionHashScroll = (input: { const messageIndex = createMemo(() => new Map(visibleUserMessages().map((m, i) => [m.id, i]))) let pendingKey = "" + const location = useLocation() + const navigate = useNavigate() + const clearMessageHash = () => { - if (!window.location.hash) return - window.history.replaceState(null, "", window.location.href.replace(/#.*$/, "")) + if (!location.hash) return + navigate(location.pathname + location.search, { replace: true }) } const updateHash = (id: string) => { - window.history.replaceState(null, "", `#${input.anchor(id)}`) + navigate(location.pathname + location.search + `#${input.anchor(id)}`, { + replace: true, + }) } const scrollToElement = (el: HTMLElement, behavior: ScrollBehavior) => { @@ -53,6 +55,7 @@ export const useSessionHashScroll = (input: { } const scrollToMessage = (message: UserMessage, behavior: ScrollBehavior = "smooth") => { + console.log({ message, behavior }) if (input.currentMessageId() !== message.id) input.setActiveMessage(message) const index = messageIndex().get(message.id) ?? -1 @@ -100,7 +103,7 @@ export const useSessionHashScroll = (input: { } const applyHash = (behavior: ScrollBehavior) => { - const hash = window.location.hash.slice(1) + const hash = location.hash.slice(1) if (!hash) { input.autoScroll.forceScrollToBottom() const el = input.scroller() @@ -132,6 +135,7 @@ export const useSessionHashScroll = (input: { } createEffect(() => { + location.hash if (!input.sessionID() || !input.messagesReady()) return requestAnimationFrame(() => applyHash("auto")) }) @@ -155,7 +159,7 @@ export const useSessionHashScroll = (input: { } } - if (!targetId) targetId = messageIdFromHash(window.location.hash) + if (!targetId) targetId = messageIdFromHash(location.hash) if (!targetId) return if (input.currentMessageId() === targetId) return @@ -171,14 +175,6 @@ export const useSessionHashScroll = (input: { if (typeof window !== "undefined" && "scrollRestoration" in window.history) { window.history.scrollRestoration = "manual" } - - const handler = () => { - if (!input.sessionID() || !input.messagesReady()) return - requestAnimationFrame(() => applyHash("auto")) - } - - window.addEventListener("hashchange", handler) - onCleanup(() => window.removeEventListener("hashchange", handler)) }) return { diff --git a/packages/app/src/utils/notification-click.ts b/packages/app/src/utils/notification-click.ts index 94086c5959..316b278206 100644 --- a/packages/app/src/utils/notification-click.ts +++ b/packages/app/src/utils/notification-click.ts @@ -7,6 +7,7 @@ export const setNavigate = (fn: (href: string) => void) => { export const handleNotificationClick = (href?: string) => { window.focus() if (!href) return - if (nav) nav(href) - else window.location.assign(href) + if (nav) return nav(href) + console.warn("notification-click: navigate function not set, falling back to window.location.assign") + window.location.assign(href) } diff --git a/packages/ui/package.json b/packages/ui/package.json index 52420009f1..85197f30f4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -51,6 +51,7 @@ "@solid-primitives/media": "2.3.3", "@solid-primitives/resize-observer": "2.1.3", "@solidjs/meta": "catalog:", + "@solidjs/router": "catalog:", "dompurify": "3.3.1", "fuzzysort": "catalog:", "katex": "0.16.27", diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index aecdbc8e41..766060f1ba 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -52,6 +52,7 @@ import { TextShimmer } from "./text-shimmer" import { AnimatedCountList } from "./tool-count-summary" import { ToolStatusTitle } from "./tool-status-title" import { animate } from "motion" +import { useLocation } from "@solidjs/router" function ShellSubmessage(props: { text: string; animate?: boolean }) { let widthRef: HTMLSpanElement | undefined @@ -1471,6 +1472,7 @@ ToolRegistry.register({ render(props) { const data = useData() const i18n = useI18n() + const location = useLocation() const childSessionId = () => props.metadata.sessionId as string | undefined const title = createMemo(() => i18n.t("ui.tool.agent", { type: props.input.subagent_type || props.tool })) const description = createMemo(() => { @@ -1487,8 +1489,7 @@ ToolRegistry.register({ const direct = data.sessionHref?.(sessionId) if (direct) return direct - if (typeof window === "undefined") return - const path = window.location.pathname + const path = location.pathname const idx = path.indexOf("/session") if (idx === -1) return return `${path.slice(0, idx)}/session/${sessionId}` From 6ddd13c6ac9bb918bd8239e5cc2308d8938db747 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Thu, 5 Mar 2026 06:53:43 +0000 Subject: [PATCH 08/42] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index 0ef20b235d..a4ffb0b795 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-jtBYpfiE9g0otqZEtOksW1Nbg+O8CJP9OEOEhsa7sa8=", - "aarch64-linux": "sha256-m+YNZIB7I7EMPyfqkKsvDvmBX9R1szmEKxXpxTNFLH8=", - "aarch64-darwin": "sha256-1gVmtkC1/I8sdHZcaeSFJheySVlpCyKCjf9zbVsVqAQ=", - "x86_64-darwin": "sha256-Tvk5YL6Z0xRul4jopbGme/997iHBylXC0Cq3RnjQb+I=" + "x86_64-linux": "sha256-ZmxeRNy2chc9py4m1iW6B+c/NSccMnVZ0lfni/EMdHw=", + "aarch64-linux": "sha256-R+1mxsmAQicerN8ixVy0ff6V8bZ4GH18MHpihvWnaTg=", + "aarch64-darwin": "sha256-m+QT20ohlqo9e86qXu67eKthZm6VDRLwlqJ9CNlEV+0=", + "x86_64-darwin": "sha256-4GeNPyTT2Hq4rxHGSON23ul5Ud3yFGE0QUVsB03Gidc=" } } From 6531cfc521f069ad86eb22990fc42924d161d0d9 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Thu, 5 Mar 2026 17:00:13 +0800 Subject: [PATCH 09/42] desktop-electon: handle latest version update check properly --- packages/desktop-electron/src/main/index.ts | 44 ++++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/packages/desktop-electron/src/main/index.ts b/packages/desktop-electron/src/main/index.ts index 03c1e128ea..7b6acd1477 100644 --- a/packages/desktop-electron/src/main/index.ts +++ b/packages/desktop-electron/src/main/index.ts @@ -1,14 +1,18 @@ -import { app, BrowserWindow, dialog } from "electron" -import type { Event } from "electron" -import pkg from "electron-updater" import { randomUUID } from "node:crypto" import { EventEmitter } from "node:events" import { existsSync } from "node:fs" +import { createServer } from "node:net" import { homedir } from "node:os" import { join } from "node:path" -import { createServer } from "node:net" +import type { Event } from "electron" +import { app, type BrowserWindow, dialog } from "electron" +import pkg from "electron-updater" -const APP_NAMES: Record = { dev: "OpenCode Dev", beta: "OpenCode Beta", prod: "OpenCode" } +const APP_NAMES: Record = { + dev: "OpenCode Dev", + beta: "OpenCode Beta", + prod: "OpenCode", +} const APP_IDS: Record = { dev: "ai.opencode.desktop.dev", beta: "ai.opencode.desktop.beta", @@ -18,7 +22,9 @@ app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev") app.setPath("userData", join(app.getPath("appData"), app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev")) const { autoUpdater } = pkg +import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types" import { checkAppExists, resolveAppPath, wslPath } from "./apps" +import type { CommandChild } from "./cli" import { installCli, syncCli } from "./cli" import { CHANNEL, UPDATER_ENABLED } from "./constants" import { registerIpcHandlers, sendDeepLinks, sendMenuCommand, sendSqliteMigrationProgress } from "./ipc" @@ -37,9 +43,6 @@ import { } from "./server" import { createLoadingWindow, createMainWindow, setDockIcon } from "./windows" -import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types" -import type { CommandChild } from "./cli" - type ServerConnection = | { variant: "existing"; url: string } | { @@ -56,16 +59,19 @@ const initEmitter = new EventEmitter() let initStep: InitStep = { phase: "server_waiting" } let mainWindow: BrowserWindow | null = null -let loadingWindow: BrowserWindow | null = null +const loadingWindow: BrowserWindow | null = null let sidecar: CommandChild | null = null -let loadingComplete = defer() +const loadingComplete = defer() const pendingDeepLinks: string[] = [] const serverReady = defer() const logger = initLogging() -logger.log("app starting", { version: app.getVersion(), packaged: app.isPackaged }) +logger.log("app starting", { + version: app.getVersion(), + packaged: app.isPackaged, +}) setupApp() @@ -162,7 +168,10 @@ async function initialize() { const loadingTask = (async () => { logger.log("setting up server connection") const serverConnection = await setupServerConnection() - logger.log("server connection ready", { variant: serverConnection.variant, url: serverConnection.url }) + logger.log("server connection ready", { + variant: serverConnection.variant, + url: serverConnection.url, + }) const cliHealthCheck = (() => { if (serverConnection.variant == "cli") { @@ -175,7 +184,10 @@ async function initialize() { if (progress.type === "Done") sqliteDone?.resolve() }) await health.wait - serverReady.resolve({ url: serverConnection.url, password: serverConnection.password }) + serverReady.resolve({ + url: serverConnection.url, + password: serverConnection.password, + }) } } else { serverReady.resolve({ url: serverConnection.url, password: null }) @@ -370,8 +382,10 @@ async function checkUpdate() { files: updateInfo?.files?.map((file) => file.url) ?? [], }) const version = result?.updateInfo?.version - if (!version) { - logger.log("no update available", { reason: "provider returned no newer version" }) + if (result?.isUpdateAvailable === false || !version) { + logger.log("no update available", { + reason: "provider returned no newer version", + }) return { updateAvailable: false } } logger.log("update available", { version }) From 4e26b0aec7052b9daf1f1d26906198775cd3ad66 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Thu, 5 Mar 2026 17:15:14 +0800 Subject: [PATCH 10/42] desktop: new-session deeplink (#15322) --- packages/app/src/pages/layout.tsx | 19 ++++++- packages/app/src/pages/layout/deep-links.ts | 32 ++++++++--- packages/app/src/pages/layout/helpers.test.ts | 41 ++++++++++---- packages/app/src/pages/session.tsx | 53 ++++++++++++------- 4 files changed, 107 insertions(+), 38 deletions(-) diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 2fd2f2fe3d..cc322d74fc 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -44,6 +44,7 @@ import { playSound, soundSrc } from "@/utils/sound" import { createAim } from "@/utils/aim" import { setNavigate } from "@/utils/notification-click" import { Worktree as WorktreeState } from "@/utils/worktree" +import { setSessionHandoff } from "@/pages/session/handoff" import { useDialog } from "@opencode-ai/ui/context/dialog" import { useTheme, type ColorScheme } from "@opencode-ai/ui/theme" @@ -67,7 +68,12 @@ import { sortedRootSessions, workspaceKey, } from "./layout/helpers" -import { collectOpenProjectDeepLinks, deepLinkEvent, drainPendingDeepLinks } from "./layout/deep-links" +import { + collectNewSessionDeepLinks, + collectOpenProjectDeepLinks, + deepLinkEvent, + drainPendingDeepLinks, +} from "./layout/deep-links" import { createInlineEditorController } from "./layout/inline-editor" import { LocalWorkspace, @@ -1177,9 +1183,20 @@ export default function Layout(props: ParentProps) { const handleDeepLinks = (urls: string[]) => { if (!server.isLocal()) return + for (const directory of collectOpenProjectDeepLinks(urls)) { openProject(directory) } + + for (const link of collectNewSessionDeepLinks(urls)) { + openProject(link.directory, false) + const slug = base64Encode(link.directory) + if (link.prompt) { + setSessionHandoff(slug, { prompt: link.prompt }) + } + const href = link.prompt ? `/${slug}/session?prompt=${encodeURIComponent(link.prompt)}` : `/${slug}/session` + navigateWithSidebarReset(href) + } } onMount(() => { diff --git a/packages/app/src/pages/layout/deep-links.ts b/packages/app/src/pages/layout/deep-links.ts index 7bdb002a36..5dca421f74 100644 --- a/packages/app/src/pages/layout/deep-links.ts +++ b/packages/app/src/pages/layout/deep-links.ts @@ -1,15 +1,17 @@ export const deepLinkEvent = "opencode:deep-link" -export const parseDeepLink = (input: string) => { +const parseUrl = (input: string) => { if (!input.startsWith("opencode://")) return if (typeof URL.canParse === "function" && !URL.canParse(input)) return - const url = (() => { - try { - return new URL(input) - } catch { - return undefined - } - })() + try { + return new URL(input) + } catch { + return + } +} + +export const parseDeepLink = (input: string) => { + const url = parseUrl(input) if (!url) return if (url.hostname !== "open-project") return const directory = url.searchParams.get("directory") @@ -17,9 +19,23 @@ export const parseDeepLink = (input: string) => { return directory } +export const parseNewSessionDeepLink = (input: string) => { + const url = parseUrl(input) + if (!url) return + if (url.hostname !== "new-session") return + const directory = url.searchParams.get("directory") + if (!directory) return + const prompt = url.searchParams.get("prompt") || undefined + if (!prompt) return { directory } + return { directory, prompt } +} + export const collectOpenProjectDeepLinks = (urls: string[]) => urls.map(parseDeepLink).filter((directory): directory is string => !!directory) +export const collectNewSessionDeepLinks = (urls: string[]) => + urls.map(parseNewSessionDeepLink).filter((link): link is { directory: string; prompt?: string } => !!link) + type OpenCodeWindow = Window & { __OPENCODE__?: { deepLinks?: string[] diff --git a/packages/app/src/pages/layout/helpers.test.ts b/packages/app/src/pages/layout/helpers.test.ts index 29517b6248..d1569dbd9a 100644 --- a/packages/app/src/pages/layout/helpers.test.ts +++ b/packages/app/src/pages/layout/helpers.test.ts @@ -1,15 +1,14 @@ import { describe, expect, test } from "bun:test" -import { type Session } from "@opencode-ai/sdk/v2/client" -import { collectOpenProjectDeepLinks, drainPendingDeepLinks, parseDeepLink } from "./deep-links" import { - displayName, - errorMessage, - getDraggableId, - hasProjectPermissions, - latestRootSession, - syncWorkspaceOrder, - workspaceKey, -} from "./helpers" + collectNewSessionDeepLinks, + collectOpenProjectDeepLinks, + drainPendingDeepLinks, + parseDeepLink, + parseNewSessionDeepLink, +} from "./deep-links" +import { displayName, errorMessage, getDraggableId, syncWorkspaceOrder, workspaceKey } from "./helpers" +import { type Session } from "@opencode-ai/sdk/v2/client" +import { hasProjectPermissions, latestRootSession } from "./helpers" const session = (input: Partial & Pick) => ({ @@ -62,6 +61,28 @@ describe("layout deep links", () => { expect(result).toEqual(["/a", "/c"]) }) + test("parses new-session deep links with optional prompt", () => { + expect(parseNewSessionDeepLink("opencode://new-session?directory=/tmp/demo")).toEqual({ directory: "/tmp/demo" }) + expect(parseNewSessionDeepLink("opencode://new-session?directory=/tmp/demo&prompt=hello%20world")).toEqual({ + directory: "/tmp/demo", + prompt: "hello world", + }) + }) + + test("ignores new-session deep links without directory", () => { + expect(parseNewSessionDeepLink("opencode://new-session")).toBeUndefined() + expect(parseNewSessionDeepLink("opencode://new-session?directory=")).toBeUndefined() + }) + + test("collects only valid new-session deep links", () => { + const result = collectNewSessionDeepLinks([ + "opencode://new-session?directory=/a", + "opencode://open-project?directory=/b", + "opencode://new-session?directory=/c&prompt=ship%20it", + ]) + expect(result).toEqual([{ directory: "/a" }, { directory: "/c", prompt: "ship it" }]) + }) + test("drains global deep links once", () => { const target = { __OPENCODE__: { diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index cc81ae7b6c..24a754428d 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -1,3 +1,5 @@ +import type { UserMessage } from "@opencode-ai/sdk/v2" +import { useDialog } from "@opencode-ai/ui/context/dialog" import { onCleanup, Show, @@ -9,7 +11,6 @@ import { on, onMount, untrack, - createSignal, } from "solid-js" import { createMediaQuery } from "@solid-primitives/media" import { createResizeObserver } from "@solid-primitives/resize-observer" @@ -20,29 +21,26 @@ import { ResizeHandle } from "@opencode-ai/ui/resize-handle" import { Select } from "@opencode-ai/ui/select" import { createAutoScroll } from "@opencode-ai/ui/hooks" import { Mark } from "@opencode-ai/ui/logo" - -import { useSync } from "@/context/sync" -import { useLayout } from "@/context/layout" -import { checksum, base64Encode } from "@opencode-ai/util/encode" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { useLanguage } from "@/context/language" -import { useNavigate, useParams } from "@solidjs/router" -import { UserMessage } from "@opencode-ai/sdk/v2" -import { useSDK } from "@/context/sdk" -import { usePrompt } from "@/context/prompt" +import { base64Encode, checksum } from "@opencode-ai/util/encode" +import { useNavigate, useParams, useSearchParams } from "@solidjs/router" +import { NewSessionView, SessionHeader } from "@/components/session" import { useComments } from "@/context/comments" -import { SessionHeader, NewSessionView } from "@/components/session" -import { same } from "@/utils/same" +import { useLanguage } from "@/context/language" +import { useLayout } from "@/context/layout" +import { usePrompt } from "@/context/prompt" +import { useSDK } from "@/context/sdk" +import { useSync } from "@/context/sync" +import { createSessionComposerState, SessionComposerRegion } from "@/pages/session/composer" import { createOpenReviewFile } from "@/pages/session/helpers" -import { createScrollSpy } from "@/pages/session/scroll-spy" -import { SessionReviewTab, type DiffStyle, type SessionReviewTabProps } from "@/pages/session/review-tab" -import { TerminalPanel } from "@/pages/session/terminal-panel" import { MessageTimeline } from "@/pages/session/message-timeline" -import { useSessionCommands } from "@/pages/session/use-session-commands" -import { SessionComposerRegion, createSessionComposerState } from "@/pages/session/composer" +import { type DiffStyle, SessionReviewTab, type SessionReviewTabProps } from "@/pages/session/review-tab" +import { createScrollSpy } from "@/pages/session/scroll-spy" import { SessionMobileTabs } from "@/pages/session/session-mobile-tabs" import { SessionSidePanel } from "@/pages/session/session-side-panel" +import { TerminalPanel } from "@/pages/session/terminal-panel" +import { useSessionCommands } from "@/pages/session/use-session-commands" import { useSessionHashScroll } from "@/pages/session/use-session-hash-scroll" +import { same } from "@/utils/same" const emptyUserMessages: UserMessage[] = [] @@ -265,6 +263,19 @@ export default function Page() { const sdk = useSDK() const prompt = usePrompt() const comments = useComments() + const [searchParams, setSearchParams] = useSearchParams<{ prompt?: string }>() + + createEffect(() => { + if (!untrack(() => prompt.ready())) return + prompt.ready() + untrack(() => { + if (params.id || !prompt.ready()) return + const text = searchParams.prompt + if (!text) return + prompt.set([{ type: "text", content: text, start: 0, end: text.length }], text.length) + setSearchParams({ ...searchParams, prompt: undefined }) + }) + }) const [ui, setUi] = createStore({ pendingMessage: undefined as string | undefined, @@ -679,7 +690,11 @@ export default function Page() { on( sessionKey, () => { - setTree({ reviewScroll: undefined, pendingDiff: undefined, activeDiff: undefined }) + setTree({ + reviewScroll: undefined, + pendingDiff: undefined, + activeDiff: undefined, + }) }, { defer: true }, ), From 161734fb951541642fd7c6d4e20458542df18ee9 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Thu, 5 Mar 2026 17:13:21 +0530 Subject: [PATCH 11/42] desktop: remove unnecessary macOS entitlements (#16161) --- .../desktop-electron/resources/entitlements.plist | 12 ------------ packages/desktop/src-tauri/entitlements.plist | 12 ------------ 2 files changed, 24 deletions(-) diff --git a/packages/desktop-electron/resources/entitlements.plist b/packages/desktop-electron/resources/entitlements.plist index 61d6c38cef..b61dc02228 100644 --- a/packages/desktop-electron/resources/entitlements.plist +++ b/packages/desktop-electron/resources/entitlements.plist @@ -12,19 +12,7 @@ com.apple.security.cs.disable-library-validation - com.apple.security.automation.apple-events - com.apple.security.device.audio-input - com.apple.security.device.camera - - com.apple.security.personal-information.addressbook - - com.apple.security.personal-information.calendars - - com.apple.security.personal-information.location - - com.apple.security.personal-information.photos-library - diff --git a/packages/desktop/src-tauri/entitlements.plist b/packages/desktop/src-tauri/entitlements.plist index 61d6c38cef..b61dc02228 100644 --- a/packages/desktop/src-tauri/entitlements.plist +++ b/packages/desktop/src-tauri/entitlements.plist @@ -12,19 +12,7 @@ com.apple.security.cs.disable-library-validation - com.apple.security.automation.apple-events - com.apple.security.device.audio-input - com.apple.security.device.camera - - com.apple.security.personal-information.addressbook - - com.apple.security.personal-information.calendars - - com.apple.security.personal-information.location - - com.apple.security.personal-information.photos-library - From a60e715fc6b1e90e7bfcf8ee6db6d6d1c30643f6 Mon Sep 17 00:00:00 2001 From: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:26:20 +0100 Subject: [PATCH 12/42] fix(app): improve agent selection logic passing in configured models and variants correctly (#16072) --- packages/app/src/context/local.tsx | 30 ++++++++++++++++++++---------- packages/app/src/pages/session.tsx | 5 ++++- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx index ac5da60e86..15afb302c7 100644 --- a/packages/app/src/context/local.tsx +++ b/packages/app/src/context/local.tsx @@ -35,6 +35,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const agent = (() => { const list = createMemo(() => sync.data.agent.filter((x) => x.mode !== "subagent" && !x.hidden)) + const models = useModels() + const [store, setStore] = createStore<{ current?: string }>({ @@ -53,11 +55,17 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ setStore("current", undefined) return } - if (name && available.some((x) => x.name === name)) { - setStore("current", name) - return - } - setStore("current", available[0].name) + const match = name ? available.find((x) => x.name === name) : undefined + const value = match ?? available[0] + if (!value) return + setStore("current", value.name) + if (!value.model) return + setModel({ + providerID: value.model.providerID, + modelID: value.model.modelID, + }) + if (value.variant) + models.variant.set({ providerID: value.model.providerID, modelID: value.model.modelID }, value.variant) }, move(direction: 1 | -1) { const available = list() @@ -71,11 +79,13 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const value = available[next] if (!value) return setStore("current", value.name) - if (value.model) - setModel({ - providerID: value.model.providerID, - modelID: value.model.modelID, - }) + if (!value.model) return + setModel({ + providerID: value.model.providerID, + modelID: value.model.modelID, + }) + if (value.variant) + models.variant.set({ providerID: value.model.providerID, modelID: value.model.modelID }, value.variant) }, } })() diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 24a754428d..9ef7cffe5b 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -416,7 +416,10 @@ export default function Page() { () => { const msg = lastUserMessage() if (!msg) return - if (msg.agent) local.agent.set(msg.agent) + if (msg.agent) { + local.agent.set(msg.agent) + if (local.agent.current()?.model) return + } if (msg.model) local.model.set(msg.model) }, ), From 62909e917ada44f64bf46fb38936bc99357cb63c Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Thu, 5 Mar 2026 12:27:12 +0000 Subject: [PATCH 13/42] chore: generate --- packages/app/src/context/local.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx index 15afb302c7..75d1334a5a 100644 --- a/packages/app/src/context/local.tsx +++ b/packages/app/src/context/local.tsx @@ -64,7 +64,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ providerID: value.model.providerID, modelID: value.model.modelID, }) - if (value.variant) + if (value.variant) models.variant.set({ providerID: value.model.providerID, modelID: value.model.modelID }, value.variant) }, move(direction: 1 | -1) { @@ -84,7 +84,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ providerID: value.model.providerID, modelID: value.model.modelID, }) - if (value.variant) + if (value.variant) models.variant.set({ providerID: value.model.providerID, modelID: value.model.modelID }, value.variant) }, } From 27baa2d65cfa100283bda334e80244d6d8c440fb Mon Sep 17 00:00:00 2001 From: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:28:17 +0100 Subject: [PATCH 14/42] refactor(desktop): improve error handling and translation in server error formatting (#16171) --- .../app/src/components/prompt-input/submit.ts | 3 +- packages/app/src/context/global-sync.tsx | 11 +-- .../app/src/context/global-sync/bootstrap.ts | 16 +--- packages/app/src/utils/server-errors.test.ts | 90 ++++++++++++++++--- packages/app/src/utils/server-errors.ts | 83 +++++++++++------ 5 files changed, 142 insertions(+), 61 deletions(-) diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts index a8c2609f43..db1b5a5ca1 100644 --- a/packages/app/src/components/prompt-input/submit.ts +++ b/packages/app/src/components/prompt-input/submit.ts @@ -16,6 +16,7 @@ import { Identifier } from "@/utils/id" import { Worktree as WorktreeState } from "@/utils/worktree" import { buildRequestParts } from "./build-request-parts" import { setCursorPosition } from "./editor-dom" +import { formatServerError } from "@/utils/server-errors" type PendingPrompt = { abort: AbortController @@ -286,7 +287,7 @@ export function createPromptSubmit(input: PromptSubmitInput) { .catch((err) => { showToast({ title: language.t("prompt.toast.commandSendFailed.title"), - description: errorMessage(err), + description: formatServerError(err, language.t, language.t("common.requestFailed")), }) restoreInput() }) diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx index 5749291157..b3a351382f 100644 --- a/packages/app/src/context/global-sync.tsx +++ b/packages/app/src/context/global-sync.tsx @@ -228,10 +228,7 @@ function createGlobalSync() { showToast({ variant: "error", title: language.t("toast.session.listFailed.title", { project }), - description: formatServerError(err, { - unknown: language.t("error.chain.unknown"), - invalidConfiguration: language.t("error.server.invalidConfiguration"), - }), + description: formatServerError(err, language.t), }) }) @@ -261,8 +258,7 @@ function createGlobalSync() { setStore: child[1], vcsCache: cache, loadSessions, - unknownError: language.t("error.chain.unknown"), - invalidConfigurationError: language.t("error.server.invalidConfiguration"), + translate: language.t, }) })() @@ -331,8 +327,7 @@ function createGlobalSync() { url: globalSDK.url, }), requestFailedTitle: language.t("common.requestFailed"), - unknownError: language.t("error.chain.unknown"), - invalidConfigurationError: language.t("error.server.invalidConfiguration"), + translate: language.t, formatMoreCount: (count) => language.t("common.moreCountSuffix", { count }), setGlobalStore: setBootStore, }) diff --git a/packages/app/src/context/global-sync/bootstrap.ts b/packages/app/src/context/global-sync/bootstrap.ts index bc84eb1694..8b1a3c48c5 100644 --- a/packages/app/src/context/global-sync/bootstrap.ts +++ b/packages/app/src/context/global-sync/bootstrap.ts @@ -36,8 +36,7 @@ export async function bootstrapGlobal(input: { connectErrorTitle: string connectErrorDescription: string requestFailedTitle: string - unknownError: string - invalidConfigurationError: string + translate: (key: string, vars?: Record) => string formatMoreCount: (count: number) => string setGlobalStore: SetStoreFunction }) { @@ -91,10 +90,7 @@ export async function bootstrapGlobal(input: { const results = await Promise.allSettled(tasks) const errors = results.filter((r): r is PromiseRejectedResult => r.status === "rejected").map((r) => r.reason) if (errors.length) { - const message = formatServerError(errors[0], { - unknown: input.unknownError, - invalidConfiguration: input.invalidConfigurationError, - }) + const message = formatServerError(errors[0], input.translate) const more = errors.length > 1 ? input.formatMoreCount(errors.length - 1) : "" showToast({ variant: "error", @@ -122,8 +118,7 @@ export async function bootstrapDirectory(input: { setStore: SetStoreFunction vcsCache: VcsCache loadSessions: (directory: string) => Promise | void - unknownError: string - invalidConfigurationError: string + translate: (key: string, vars?: Record) => string }) { if (input.store.status !== "complete") input.setStore("status", "loading") @@ -145,10 +140,7 @@ export async function bootstrapDirectory(input: { showToast({ variant: "error", title: `Failed to reload ${project}`, - description: formatServerError(err, { - unknown: input.unknownError, - invalidConfiguration: input.invalidConfigurationError, - }), + description: formatServerError(err, input.translate), }) input.setStore("status", "partial") return diff --git a/packages/app/src/utils/server-errors.test.ts b/packages/app/src/utils/server-errors.test.ts index 1969d1afc2..1f53bb8cf6 100644 --- a/packages/app/src/utils/server-errors.test.ts +++ b/packages/app/src/utils/server-errors.test.ts @@ -1,8 +1,37 @@ import { describe, expect, test } from "bun:test" -import type { ConfigInvalidError } from "./server-errors" -import { formatServerError, parseReabaleConfigInvalidError } from "./server-errors" +import type { ConfigInvalidError, ProviderModelNotFoundError } from "./server-errors" +import { formatServerError, parseReadableConfigInvalidError } from "./server-errors" -describe("parseReabaleConfigInvalidError", () => { +function fill(text: string, vars?: Record) { + if (!vars) return text + return text.replace(/{{\s*(\w+)\s*}}/g, (_, key: string) => { + const value = vars[key] + if (value === undefined) return "" + return String(value) + }) +} + +function useLanguageMock() { + const dict: Record = { + "error.chain.unknown": "Erro desconhecido", + "error.chain.configInvalid": "Arquivo de config em {{path}} invalido", + "error.chain.configInvalidWithMessage": "Arquivo de config em {{path}} invalido: {{message}}", + "error.chain.modelNotFound": "Modelo nao encontrado: {{provider}}/{{model}}", + "error.chain.didYouMean": "Voce quis dizer: {{suggestions}}", + "error.chain.checkConfig": "Revise provider/model no config", + } + return { + t(key: string, vars?: Record) { + const text = dict[key] + if (!text) return key + return fill(text, vars) + }, + } +} + +const language = useLanguageMock() + +describe("parseReadableConfigInvalidError", () => { test("formats issues with file path", () => { const error = { name: "ConfigInvalidError", @@ -15,10 +44,10 @@ describe("parseReabaleConfigInvalidError", () => { }, } satisfies ConfigInvalidError - const result = parseReabaleConfigInvalidError(error) + const result = parseReadableConfigInvalidError(error, language.t) expect(result).toBe( - ["Invalid configuration", "opencode.config.ts", "settings.host: Required", "mode: Invalid"].join("\n"), + ["Arquivo de config em opencode.config.ts invalido: settings.host: Required", "mode: Invalid"].join("\n"), ) }) @@ -31,9 +60,9 @@ describe("parseReabaleConfigInvalidError", () => { }, } satisfies ConfigInvalidError - const result = parseReabaleConfigInvalidError(error) + const result = parseReadableConfigInvalidError(error, language.t) - expect(result).toBe(["Invalid configuration", "Bad value"].join("\n")) + expect(result).toBe("Arquivo de config em config invalido: Bad value") }) }) @@ -46,24 +75,57 @@ describe("formatServerError", () => { }, } satisfies ConfigInvalidError - const result = formatServerError(error) + const result = formatServerError(error, language.t) - expect(result).toBe(["Invalid configuration", "Missing host"].join("\n")) + expect(result).toBe("Arquivo de config em config invalido: Missing host") }) test("returns error messages", () => { - expect(formatServerError(new Error("Request failed with status 503"))).toBe("Request failed with status 503") + expect(formatServerError(new Error("Request failed with status 503"), language.t)).toBe( + "Request failed with status 503", + ) }) test("returns provided string errors", () => { - expect(formatServerError("Failed to connect to server")).toBe("Failed to connect to server") + expect(formatServerError("Failed to connect to server", language.t)).toBe("Failed to connect to server") }) - test("falls back to unknown", () => { - expect(formatServerError(0)).toBe("Unknown error") + test("uses translated unknown fallback", () => { + expect(formatServerError(0, language.t)).toBe("Erro desconhecido") }) test("falls back for unknown error objects and names", () => { - expect(formatServerError({ name: "ServerTimeoutError", data: { seconds: 30 } })).toBe("Unknown error") + expect(formatServerError({ name: "ServerTimeoutError", data: { seconds: 30 } }, language.t)).toBe( + "Erro desconhecido", + ) + }) + + test("formats provider model errors using provider/model", () => { + const error = { + name: "ProviderModelNotFoundError", + data: { + providerID: "openai", + modelID: "gpt-4.1", + }, + } satisfies ProviderModelNotFoundError + + expect(formatServerError(error, language.t)).toBe( + ["Modelo nao encontrado: openai/gpt-4.1", "Revise provider/model no config"].join("\n"), + ) + }) + + test("formats provider model suggestions", () => { + const error = { + name: "ProviderModelNotFoundError", + data: { + providerID: "x", + modelID: "y", + suggestions: ["x/y2", "x/y3"], + }, + } satisfies ProviderModelNotFoundError + + expect(formatServerError(error, language.t)).toBe( + ["Modelo nao encontrado: x/y", "Voce quis dizer: x/y2, x/y3", "Revise provider/model no config"].join("\n"), + ) }) }) diff --git a/packages/app/src/utils/server-errors.ts b/packages/app/src/utils/server-errors.ts index 85ebca1320..2c3a8c54db 100644 --- a/packages/app/src/utils/server-errors.ts +++ b/packages/app/src/utils/server-errors.ts @@ -7,28 +7,31 @@ export type ConfigInvalidError = { } } -type Label = { - unknown: string - invalidConfiguration: string -} - -const fallback: Label = { - unknown: "Unknown error", - invalidConfiguration: "Invalid configuration", -} - -function resolveLabel(labels: Partial
    + } + > + {content()} {content()} diff --git a/packages/ui/src/components/tooltip.tsx b/packages/ui/src/components/tooltip.tsx index 055e504654..63105d00fc 100644 --- a/packages/ui/src/components/tooltip.tsx +++ b/packages/ui/src/components/tooltip.tsx @@ -47,7 +47,7 @@ export function Tooltip(props: TooltipProps) { {local.children} - + {local.children} From 3448118be8c33b30a7153331cf35644d763be620 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 06:57:50 -0600 Subject: [PATCH 16/42] fix(app): mod+f always opens search --- packages/app/e2e/files/file-viewer.spec.ts | 53 +++++++++++++++++++ packages/app/src/pages/session/file-tabs.tsx | 1 - packages/ui/src/components/session-review.tsx | 2 - 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/packages/app/e2e/files/file-viewer.spec.ts b/packages/app/e2e/files/file-viewer.spec.ts index bee67c7d12..49fe1baa13 100644 --- a/packages/app/e2e/files/file-viewer.spec.ts +++ b/packages/app/e2e/files/file-viewer.spec.ts @@ -101,3 +101,56 @@ test("cmd+f opens text viewer search while prompt is focused", async ({ page, go await expect(findInput).toBeVisible() await expect(findInput).toBeFocused() }) + +test("cmd+f opens text viewer search while prompt is not focused", async ({ page, gotoSession }) => { + await gotoSession() + + await page.locator(promptSelector).click() + await page.keyboard.type("/open") + + const command = page.locator('[data-slash-id="file.open"]').first() + await expect(command).toBeVisible() + await page.keyboard.press("Enter") + + const dialog = page + .getByRole("dialog") + .filter({ has: page.getByPlaceholder(/search files/i) }) + .first() + await expect(dialog).toBeVisible() + + const input = dialog.getByRole("textbox").first() + await input.fill("package.json") + + const items = dialog.locator('[data-slot="list-item"][data-key^="file:"]') + let index = -1 + await expect + .poll( + async () => { + const keys = await items.evaluateAll((nodes) => nodes.map((node) => node.getAttribute("data-key") ?? "")) + index = keys.findIndex((key) => /packages[\\/]+app[\\/]+package\.json$/i.test(key.replace(/^file:/, ""))) + return index >= 0 + }, + { timeout: 30_000 }, + ) + .toBe(true) + + const item = items.nth(index) + await expect(item).toBeVisible() + await item.click() + + await expect(dialog).toHaveCount(0) + + const tab = page.getByRole("tab", { name: "package.json" }) + await expect(tab).toBeVisible() + await tab.click() + + const viewer = page.locator('[data-component="file"][data-mode="text"]').first() + await expect(viewer).toBeVisible() + + await viewer.click() + await page.keyboard.press(`${modKey}+f`) + + const findInput = page.getByPlaceholder("Find") + await expect(findInput).toBeVisible() + await expect(findInput).toBeFocused() +}) diff --git a/packages/app/src/pages/session/file-tabs.tsx b/packages/app/src/pages/session/file-tabs.tsx index 93264353bd..77643789d0 100644 --- a/packages/app/src/pages/session/file-tabs.tsx +++ b/packages/app/src/pages/session/file-tabs.tsx @@ -234,7 +234,6 @@ export function FileTabContent(props: { tab: string }) { if (typeof window === "undefined") return const onKeyDown = (event: KeyboardEvent) => { - if (event.defaultPrevented) return if (tabs().active() !== props.tab) return if (!(event.metaKey || event.ctrlKey) || event.altKey || event.shiftKey) return if (event.key.toLowerCase() !== "f") return diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx index c75baf921a..ad9e5b2c33 100644 --- a/packages/ui/src/components/session-review.tsx +++ b/packages/ui/src/components/session-review.tsx @@ -355,8 +355,6 @@ export const SessionReview = (props: SessionReviewProps) => { if (typeof window === "undefined") return const onKeyDown = (event: KeyboardEvent) => { - if (event.defaultPrevented) return - const mod = event.metaKey || event.ctrlKey if (!mod) return From 0e5edef51eacc132e8f05d3c12a39bac7ec7855f Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 06:58:57 -0600 Subject: [PATCH 17/42] chore(console): go page i18n --- packages/console/app/src/i18n/ar.ts | 98 ++++++++++++++++++++++++++ packages/console/app/src/i18n/br.ts | 101 +++++++++++++++++++++++++++ packages/console/app/src/i18n/da.ts | 99 ++++++++++++++++++++++++++ packages/console/app/src/i18n/de.ts | 100 ++++++++++++++++++++++++++ packages/console/app/src/i18n/es.ts | 101 +++++++++++++++++++++++++++ packages/console/app/src/i18n/fr.ts | 99 ++++++++++++++++++++++++++ packages/console/app/src/i18n/it.ts | 100 ++++++++++++++++++++++++++ packages/console/app/src/i18n/ja.ts | 101 +++++++++++++++++++++++++++ packages/console/app/src/i18n/ko.ts | 99 ++++++++++++++++++++++++++ packages/console/app/src/i18n/no.ts | 100 ++++++++++++++++++++++++++ packages/console/app/src/i18n/pl.ts | 100 ++++++++++++++++++++++++++ packages/console/app/src/i18n/ru.ts | 101 +++++++++++++++++++++++++++ packages/console/app/src/i18n/th.ts | 99 ++++++++++++++++++++++++++ packages/console/app/src/i18n/tr.ts | 101 +++++++++++++++++++++++++++ packages/console/app/src/i18n/zh.ts | 93 ++++++++++++++++++++++++ packages/console/app/src/i18n/zht.ts | 94 +++++++++++++++++++++++++ 16 files changed, 1586 insertions(+) diff --git a/packages/console/app/src/i18n/ar.ts b/packages/console/app/src/i18n/ar.ts index 0155baf031..89fd39b931 100644 --- a/packages/console/app/src/i18n/ar.ts +++ b/packages/console/app/src/i18n/ar.ts @@ -247,6 +247,104 @@ export const dict = { "تتم استضافة جميع نماذج Zen في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع", "zen.privacy.exceptionsLink": "الاستثناءات التالية", + "go.title": "OpenCode Go | نماذج برمجة منخفضة التكلفة للجميع", + "go.meta.description": + "Go هو اشتراك بقيمة 10 دولارات شهريًا مع حدود سخية تبلغ 5 ساعات للطلبات لنماذج GLM-5 وKimi K2.5 وMiniMax M2.5.", + "go.hero.title": "نماذج برمجة منخفضة التكلفة للجميع", + "go.hero.body": + "يجلب Go البرمجة الوكيلة للمبرمجين حول العالم. يوفر حدودًا سخية ووصولًا موثوقًا إلى أقوى النماذج مفتوحة المصدر، حتى تتمكن من البناء باستخدام وكلاء أقوياء دون القلق بشأن التكلفة أو التوفر.", + + "go.cta.start": "اشترك في Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "اشترك في Go", + "go.cta.price": "$10/شهر", + "go.pricing.body": "استخدمه مع أي وكيل. اشحن الرصيد إذا لزم الأمر. ألغِ في أي وقت.", + "go.graph.free": "مجاني", + "go.graph.freePill": "Big Pickle ونماذج مجانية", + "go.graph.go": "Go", + "go.graph.label": "الطلبات كل 5 ساعات", + "go.graph.usageLimits": "حدود الاستخدام", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "الطلبات كل 5 ساعات: {{free}} مقابل {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "الرئيس التنفيذي السابق، منتجات Terminal", + "go.testimonials.dax.quoteAfter": "كان تغييرًا جذريًا في الحياة، إنه قرار لا يحتاج لتفكير.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "مؤسس سابق، SEED، PM، Melt، Pop، Dapt، Cadmus، وViewPoint", + "go.testimonials.jay.quoteBefore": "4 من كل 5 أشخاص في فريقنا يحبون استخدام", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "بطل سابق، AWS", + "go.testimonials.adam.quoteBefore": "لا أستطيع التوصية بـ", + "go.testimonials.adam.quoteAfter": "بما فيه الكفاية. بجدية، إنه جيد حقًا.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "رئيس التصميم السابق، Laravel", + "go.testimonials.david.quoteBefore": "مع", + "go.testimonials.david.quoteAfter": "أعلم أن جميع النماذج مختبرة ومثالية لوكلاء البرمجة.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "متدرب سابق، Nvidia (4 مرات)", + "go.testimonials.frank.quote": "أتمنى لو كنت لا أزال في Nvidia.", + "go.problem.title": "ما المشكلة التي يحلها Go؟", + "go.problem.body": + "نحن نركز على جلب تجربة OpenCode لأكبر عدد ممكن من الناس. OpenCode Go هو اشتراك منخفض التكلفة (10 دولارات شهريًا) مصمم لجلب البرمجة الوكيلة للمبرمجين حول العالم. يوفر حدودًا سخية ووصولًا موثوقًا إلى أقوى النماذج مفتوحة المصدر.", + "go.problem.subtitle": " ", + "go.problem.item1": "أسعار اشتراك منخفضة التكلفة", + "go.problem.item2": "حدود سخية ووصول موثوق", + "go.problem.item3": "مصمم لأكبر عدد ممكن من المبرمجين", + "go.problem.item4": "يتضمن GLM-5 وKimi K2.5 وMiniMax M2.5", + "go.how.title": "كيف يعمل Go", + "go.how.body": "Go هو اشتراك بقيمة 10 دولارات شهريًا يمكنك استخدامه مع OpenCode أو أي وكيل.", + "go.how.step1.title": "أنشئ حسابًا", + "go.how.step1.beforeLink": "اتبع", + "go.how.step1.link": "تعليمات الإعداد", + "go.how.step2.title": "اشترك في Go", + "go.how.step2.link": "$10/شهر", + "go.how.step2.afterLink": "مع حدود سخية", + "go.how.step3.title": "ابدأ البرمجة", + "go.how.step3.body": "مع وصول موثوق لنماذج مفتوحة المصدر", + "go.privacy.title": "خصوصيتك مهمة بالنسبة لنا", + "go.privacy.body": + "تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر.", + "go.privacy.contactAfter": "إذا كان لديك أي أسئلة.", + "go.privacy.beforeExceptions": + "تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع", + "go.privacy.exceptionsLink": "الاستثناءات التالية", + "go.faq.q1": "ما هو OpenCode Go؟", + "go.faq.a1": "Go هو اشتراك منخفض التكلفة يمنحك وصولًا موثوقًا إلى نماذج مفتوحة المصدر قادرة على البرمجة الوكيلة.", + "go.faq.q2": "ما النماذج التي يتضمنها Go؟", + "go.faq.a2": "يتضمن Go نماذج GLM-5 وKimi K2.5 وMiniMax M2.5، مع حدود سخية ووصول موثوق.", + "go.faq.q3": "هل Go هو نفسه Zen؟", + "go.faq.a3": + "لا. Zen هو نظام الدفع حسب الاستخدام، بينما Go هو اشتراك بقيمة 10 دولارات شهريًا مع حدود سخية ووصول موثوق لنماذج مفتوحة المصدر GLM-5 وKimi K2.5 وMiniMax M2.5.", + "go.faq.q4": "كم تكلفة Go؟", + "go.faq.a4.p1.beforePricing": "تكلفة Go", + "go.faq.a4.p1.pricingLink": "$10/شهر", + "go.faq.a4.p1.afterPricing": "مع حدود سخية.", + "go.faq.a4.p2.beforeAccount": "يمكنك إدارة اشتراكك في", + "go.faq.a4.p2.accountLink": "حسابك", + "go.faq.a4.p3": "ألغِ في أي وقت.", + "go.faq.q5": "ماذا عن البيانات والخصوصية؟", + "go.faq.a5.body": + "تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر.", + "go.faq.a5.contactAfter": "إذا كان لديك أي أسئلة.", + "go.faq.a5.beforeExceptions": + "تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع", + "go.faq.a5.exceptionsLink": "الاستثناءات التالية", + "go.faq.q6": "هل يمكنني شحن رصيد إضافي؟", + "go.faq.a6": "إذا كنت بحاجة إلى مزيد من الاستخدام، يمكنك شحن رصيد في حسابك.", + "go.faq.q7": "هل يمكنني الإلغاء؟", + "go.faq.a7": "نعم، يمكنك الإلغاء في أي وقت.", + "go.faq.q8": "هل يمكنني استخدام Go مع وكلاء برمجة آخرين؟", + "go.faq.a8": "نعم، يمكنك استخدام Go مع أي وكيل. اتبع تعليمات الإعداد في وكيل البرمجة المفضل لديك.", + + "go.faq.q9": "ما الفرق بين النماذج المجانية وGo؟", + "go.faq.a9": + "تشمل النماذج المجانية Big Pickle بالإضافة إلى النماذج الترويجية المتاحة في ذلك الوقت، مع حصة 200 طلب/يوم. يتضمن Go نماذج GLM-5 وKimi K2.5 وMiniMax M2.5 مع حصص طلبات أعلى مطبقة عبر نوافذ متجددة (5 ساعات، أسبوعيًا، وشهريًا)، تعادل تقريبًا 12 دولارًا كل 5 ساعات، و30 دولارًا في الأسبوع، و60 دولارًا في الشهر (تختلف أعداد الطلبات الفعلية حسب النموذج والاستخدام).", + "zen.api.error.rateLimitExceeded": "تم تجاوز حد الطلبات. يرجى المحاولة مرة أخرى لاحقًا.", "zen.api.error.modelNotSupported": "النموذج {{model}} غير مدعوم", "zen.api.error.modelFormatNotSupported": "النموذج {{model}} غير مدعوم للتنسيق {{format}}", diff --git a/packages/console/app/src/i18n/br.ts b/packages/console/app/src/i18n/br.ts index b28c5f45ad..d7d9191729 100644 --- a/packages/console/app/src/i18n/br.ts +++ b/packages/console/app/src/i18n/br.ts @@ -251,6 +251,107 @@ export const dict = { "Todos os modelos Zen são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelo, com as", "zen.privacy.exceptionsLink": "seguintes exceções", + "go.title": "OpenCode Go | Modelos de codificação de baixo custo para todos", + "go.meta.description": + "O Go é uma assinatura de $10/mês com limites generosos de 5 horas de requisição para GLM-5, Kimi K2.5 e MiniMax M2.5.", + "go.hero.title": "Modelos de codificação de baixo custo para todos", + "go.hero.body": + "O Go traz a codificação com agentes para programadores em todo o mundo. Oferecendo limites generosos e acesso confiável aos modelos de código aberto mais capazes, para que você possa construir com agentes poderosos sem se preocupar com custos ou disponibilidade.", + + "go.cta.start": "Assinar o Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Assinar o Go", + "go.cta.price": "$10/mês", + "go.pricing.body": "Use com qualquer agente. Recarregue crédito se necessário. Cancele a qualquer momento.", + "go.graph.free": "Grátis", + "go.graph.freePill": "Big Pickle e modelos gratuitos", + "go.graph.go": "Go", + "go.graph.label": "Requisições por 5 horas", + "go.graph.usageLimits": "Limites de uso", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Requisições por 5h: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "mudou minha vida, é realmente uma escolha óbvia.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Fundador, SEED, PM, Melt, Pop, Dapt, Cadmus e ViewPoint", + "go.testimonials.jay.quoteBefore": "4 de 5 pessoas em nossa equipe adoram usar", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "Eu não consigo recomendar o", + "go.testimonials.adam.quoteAfter": "o suficiente. Sério, é muito bom.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Head de Design, Laravel", + "go.testimonials.david.quoteBefore": "Com o", + "go.testimonials.david.quoteAfter": + "eu sei que todos os modelos são testados e perfeitos para agentes de codificação.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Estagiário, Nvidia (4 vezes)", + "go.testimonials.frank.quote": "Eu queria ainda estar na Nvidia.", + "go.problem.title": "Que problema o Go resolve?", + "go.problem.body": + "Estamos focados em levar a experiência OpenCode para o maior número possível de pessoas. OpenCode Go é uma assinatura de baixo custo ($10/mês) projetada para levar a codificação com agentes para programadores em todo o mundo. Fornece limites generosos e acesso confiável aos modelos de código aberto mais capazes.", + "go.problem.subtitle": " ", + "go.problem.item1": "Preço de assinatura de baixo custo", + "go.problem.item2": "Limites generosos e acesso confiável", + "go.problem.item3": "Feito para o maior número possível de programadores", + "go.problem.item4": "Inclui GLM-5, Kimi K2.5 e MiniMax M2.5", + "go.how.title": "Como o Go funciona", + "go.how.body": "Go é uma assinatura de $10/mês que você pode usar com OpenCode ou qualquer agente.", + "go.how.step1.title": "Crie uma conta", + "go.how.step1.beforeLink": "siga as", + "go.how.step1.link": "instruções de configuração", + "go.how.step2.title": "Assinar o Go", + "go.how.step2.link": "$10/mês", + "go.how.step2.afterLink": "com limites generosos", + "go.how.step3.title": "Comece a codificar", + "go.how.step3.body": "com acesso confiável a modelos de código aberto", + "go.privacy.title": "Sua privacidade é importante para nós", + "go.privacy.body": + "O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável.", + "go.privacy.contactAfter": "se você tiver alguma dúvida.", + "go.privacy.beforeExceptions": + "Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as", + "go.privacy.exceptionsLink": "seguintes exceções", + "go.faq.q1": "O que é OpenCode Go?", + "go.faq.a1": + "Go é uma assinatura de baixo custo que oferece acesso confiável a modelos de código aberto capazes para codificação com agentes.", + "go.faq.q2": "Quais modelos o Go inclui?", + "go.faq.a2": "Go inclui GLM-5, Kimi K2.5 e MiniMax M2.5, com limites generosos e acesso confiável.", + "go.faq.q3": "O Go é o mesmo que o Zen?", + "go.faq.a3": + "Não. O Zen é pago por uso (pay-as-you-go), enquanto o Go é uma assinatura de $10/mês com limites generosos e acesso confiável aos modelos de código aberto GLM-5, Kimi K2.5 e MiniMax M2.5.", + "go.faq.q4": "Quanto custa o Go?", + "go.faq.a4.p1.beforePricing": "O Go custa", + "go.faq.a4.p1.pricingLink": "$10/mês", + "go.faq.a4.p1.afterPricing": "com limites generosos.", + "go.faq.a4.p2.beforeAccount": "Você pode gerenciar sua assinatura em sua", + "go.faq.a4.p2.accountLink": "conta", + "go.faq.a4.p3": "Cancele a qualquer momento.", + "go.faq.q5": "E sobre dados e privacidade?", + "go.faq.a5.body": + "O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável.", + "go.faq.a5.contactAfter": "se você tiver alguma dúvida.", + "go.faq.a5.beforeExceptions": + "Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as", + "go.faq.a5.exceptionsLink": "seguintes exceções", + "go.faq.q6": "Posso recarregar crédito?", + "go.faq.a6": "Se você precisar de mais uso, pode recarregar crédito em sua conta.", + "go.faq.q7": "Posso cancelar?", + "go.faq.a7": "Sim, você pode cancelar a qualquer momento.", + "go.faq.q8": "Posso usar o Go com outros agentes de codificação?", + "go.faq.a8": + "Sim, você pode usar o Go com qualquer agente. Siga as instruções de configuração no seu agente de codificação preferido.", + + "go.faq.q9": "Qual a diferença entre os modelos gratuitos e o Go?", + "go.faq.a9": + "Os modelos gratuitos incluem Big Pickle e modelos promocionais disponíveis no momento, com uma cota de 200 requisições/dia. O Go inclui GLM-5, Kimi K2.5 e MiniMax M2.5 com cotas de requisição mais altas aplicadas em janelas móveis (5 horas, semanal e mensal), aproximadamente equivalentes a $12 por 5 horas, $30 por semana e $60 por mês (as contagens reais de requisições variam de acordo com o modelo e o uso).", + "zen.api.error.rateLimitExceeded": "Limite de taxa excedido. Por favor, tente novamente mais tarde.", "zen.api.error.modelNotSupported": "Modelo {{model}} não suportado", "zen.api.error.modelFormatNotSupported": "Modelo {{model}} não suportado para o formato {{format}}", diff --git a/packages/console/app/src/i18n/da.ts b/packages/console/app/src/i18n/da.ts index dfcefc5b9c..919f9c646a 100644 --- a/packages/console/app/src/i18n/da.ts +++ b/packages/console/app/src/i18n/da.ts @@ -249,6 +249,105 @@ export const dict = { "Alle Zen-modeller er hostet i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning med", "zen.privacy.exceptionsLink": "følgende undtagelser", + "go.title": "OpenCode Go | Kodningsmodeller til lav pris for alle", + "go.meta.description": + "Go er et abonnement til $10/måned med generøse grænser på 5 timers forespørgsler for GLM-5, Kimi K2.5 og MiniMax M2.5.", + "go.hero.title": "Kodningsmodeller til lav pris for alle", + "go.hero.body": + "Go bringer agentisk kodning til programmører over hele verden. Med generøse grænser og pålidelig adgang til de mest kapable open source-modeller, så du kan bygge med kraftfulde agenter uden at bekymre dig om omkostninger eller tilgængelighed.", + + "go.cta.start": "Abonner på Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Abonner på Go", + "go.cta.price": "$10/måned", + "go.pricing.body": "Brug med enhver agent. Genopfyld kredit om nødvendigt. Annuller til enhver tid.", + "go.graph.free": "Gratis", + "go.graph.freePill": "Big Pickle og gratis modeller", + "go.graph.go": "Go", + "go.graph.label": "Forespørgsler pr. 5 timer", + "go.graph.usageLimits": "Brugsgrænser", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Forespørgsler pr. 5t: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "har været livsændrende, det er virkelig en no-brainer.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, og ViewPoint", + "go.testimonials.jay.quoteBefore": "4 ud af 5 personer på vores team elsker at bruge", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "Jeg kan ikke anbefale", + "go.testimonials.adam.quoteAfter": "nok. Seriøst, det er virkelig godt.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Head of Design, Laravel", + "go.testimonials.david.quoteBefore": "Med", + "go.testimonials.david.quoteAfter": "ved jeg, at alle modellerne er testede og perfekte til kodningsagenter.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Intern, Nvidia (4 gange)", + "go.testimonials.frank.quote": "Jeg ville ønske, jeg stadig var hos Nvidia.", + "go.problem.title": "Hvilket problem løser Go?", + "go.problem.body": + "Vi fokuserer på at bringe OpenCode-oplevelsen til så mange mennesker som muligt. OpenCode Go er et lavprisabonnement ($10/måned) designet til at bringe agentisk kodning til programmører over hele verden. Det giver generøse grænser og pålidelig adgang til de mest kapable open source-modeller.", + "go.problem.subtitle": " ", + "go.problem.item1": "Lavpris abonnementspriser", + "go.problem.item2": "Generøse grænser og pålidelig adgang", + "go.problem.item3": "Bygget til så mange programmører som muligt", + "go.problem.item4": "Inkluderer GLM-5, Kimi K2.5 og MiniMax M2.5", + "go.how.title": "Hvordan Go virker", + "go.how.body": "Go er et abonnement til $10/måned, som du kan bruge med OpenCode eller enhver anden agent.", + "go.how.step1.title": "Opret en konto", + "go.how.step1.beforeLink": "følg", + "go.how.step1.link": "opsætningsinstruktionerne", + "go.how.step2.title": "Abonner på Go", + "go.how.step2.link": "$10/måned", + "go.how.step2.afterLink": "med generøse grænser", + "go.how.step3.title": "Start kodning", + "go.how.step3.body": "med pålidelig adgang til open source-modeller", + "go.privacy.title": "Dit privatliv er vigtigt for os", + "go.privacy.body": + "Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang.", + "go.privacy.contactAfter": "hvis du har spørgsmål.", + "go.privacy.beforeExceptions": + "Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de", + "go.privacy.exceptionsLink": "følgende undtagelser", + "go.faq.q1": "Hvad er OpenCode Go?", + "go.faq.a1": + "Go er et lavprisabonnement, der giver dig pålidelig adgang til kapable open source-modeller til agentisk kodning.", + "go.faq.q2": "Hvilke modeller inkluderer Go?", + "go.faq.a2": "Go inkluderer GLM-5, Kimi K2.5 og MiniMax M2.5, med generøse grænser og pålidelig adgang.", + "go.faq.q3": "Er Go det samme som Zen?", + "go.faq.a3": + "Nej. Zen er pay-as-you-go, mens Go er et abonnement til $10/måned med generøse grænser og pålidelig adgang til open source-modellerne GLM-5, Kimi K2.5 og MiniMax M2.5.", + "go.faq.q4": "Hvad koster Go?", + "go.faq.a4.p1.beforePricing": "Go koster", + "go.faq.a4.p1.pricingLink": "$10/måned", + "go.faq.a4.p1.afterPricing": "med generøse grænser.", + "go.faq.a4.p2.beforeAccount": "Du kan administrere dit abonnement i din", + "go.faq.a4.p2.accountLink": "konto", + "go.faq.a4.p3": "Annuller til enhver tid.", + "go.faq.q5": "Hvad med data og privatliv?", + "go.faq.a5.body": + "Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang.", + "go.faq.a5.contactAfter": "hvis du har spørgsmål.", + "go.faq.a5.beforeExceptions": + "Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de", + "go.faq.a5.exceptionsLink": "følgende undtagelser", + "go.faq.q6": "Kan jeg tanke kredit op?", + "go.faq.a6": "Hvis du har brug for mere forbrug, kan du tanke kredit op på din konto.", + "go.faq.q7": "Kan jeg annullere?", + "go.faq.a7": "Ja, du kan annullere til enhver tid.", + "go.faq.q8": "Kan jeg bruge Go med andre kodningsagenter?", + "go.faq.a8": "Ja, du kan bruge Go med enhver agent. Følg opsætningsinstruktionerne i din foretrukne kodningsagent.", + + "go.faq.q9": "Hvad er forskellen på gratis modeller og Go?", + "go.faq.a9": + "Gratis modeller inkluderer Big Pickle plus salgsfremmende modeller tilgængelige på det tidspunkt, med en kvote på 200 forespørgsler/dag. Go inkluderer GLM-5, Kimi K2.5 og MiniMax M2.5 med højere anmodningskvoter håndhævet over rullende vinduer (5-timers, ugentlig og månedlig), nogenlunde svarende til $12 pr. 5 timer, $30 pr. uge og $60 pr. måned (faktiske anmodningstal varierer efter model og brug).", + "zen.api.error.rateLimitExceeded": "Hastighedsgrænse overskredet. Prøv venligst igen senere.", "zen.api.error.modelNotSupported": "Model {{model}} understøttes ikke", "zen.api.error.modelFormatNotSupported": "Model {{model}} understøttes ikke for format {{format}}", diff --git a/packages/console/app/src/i18n/de.ts b/packages/console/app/src/i18n/de.ts index b5d8070aec..082d66bbe3 100644 --- a/packages/console/app/src/i18n/de.ts +++ b/packages/console/app/src/i18n/de.ts @@ -251,6 +251,106 @@ export const dict = { "Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und nutzen deine Daten nicht für Modelltraining, mit den", "zen.privacy.exceptionsLink": "folgenden Ausnahmen", + "go.title": "OpenCode Go | Kostengünstige Coding-Modelle für alle", + "go.meta.description": + "Go ist ein Abonnement für $10/Monat mit großzügigen 5-Stunden-Limits für GLM-5, Kimi K2.5 und MiniMax M2.5.", + "go.hero.title": "Kostengünstige Coding-Modelle für alle", + "go.hero.body": + "Go bringt Agentic Coding zu Programmierern auf der ganzen Welt. Mit großzügigen Limits und zuverlässigem Zugang zu den leistungsfähigsten Open-Source-Modellen, damit du mit leistungsstarken Agenten entwickeln kannst, ohne dir Gedanken über Kosten oder Verfügbarkeit zu machen.", + + "go.cta.start": "Go abonnieren", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Go abonnieren", + "go.cta.price": "$10/Monat", + "go.pricing.body": "Nutzung mit jedem Agenten. Guthaben bei Bedarf aufladen. Jederzeit kündbar.", + "go.graph.free": "Kostenlos", + "go.graph.freePill": "Big Pickle und kostenlose Modelle", + "go.graph.go": "Go", + "go.graph.label": "Anfragen pro 5 Stunden", + "go.graph.usageLimits": "Nutzungslimits", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Anfragen pro 5h: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "hat mein Leben verändert, es ist wirklich ein No-Brainer.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Gründer, SEED, PM, Melt, Pop, Dapt, Cadmus und ViewPoint", + "go.testimonials.jay.quoteBefore": "4 von 5 Leuten in unserem Team lieben die Nutzung von", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "Ich kann", + "go.testimonials.adam.quoteAfter": "nicht genug empfehlen. Ernsthaft, es ist wirklich gut.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Head of Design, Laravel", + "go.testimonials.david.quoteBefore": "Mit", + "go.testimonials.david.quoteAfter": "weiß ich, dass alle Modelle getestet und perfekt für Coding-Agenten sind.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Praktikant, Nvidia (4 mal)", + "go.testimonials.frank.quote": "Ich wünschte, ich wäre noch bei Nvidia.", + "go.problem.title": "Welches Problem löst Go?", + "go.problem.body": + "Wir konzentrieren uns darauf, die OpenCode-Erfahrung so vielen Menschen wie möglich zugänglich zu machen. OpenCode Go ist ein kostengünstiges ($10/Monat) Abonnement, das entwickelt wurde, um Agentic Coding zu Programmierern auf der ganzen Welt zu bringen. Es bietet großzügige Limits und zuverlässigen Zugang zu den leistungsfähigsten Open-Source-Modellen.", + "go.problem.subtitle": " ", + "go.problem.item1": "Kostengünstiges Abonnement", + "go.problem.item2": "Großzügige Limits und zuverlässiger Zugang", + "go.problem.item3": "Für so viele Programmierer wie möglich gebaut", + "go.problem.item4": "Beinhaltet GLM-5, Kimi K2.5 und MiniMax M2.5", + "go.how.title": "Wie Go funktioniert", + "go.how.body": "Go ist ein Abonnement für $10/Monat, das du mit OpenCode oder jedem anderen Agenten nutzen kannst.", + "go.how.step1.title": "Konto erstellen", + "go.how.step1.beforeLink": "folge den", + "go.how.step1.link": "Einrichtungsanweisungen", + "go.how.step2.title": "Go abonnieren", + "go.how.step2.link": "$10/Monat", + "go.how.step2.afterLink": "mit großzügigen Limits", + "go.how.step3.title": "Loslegen mit Coding", + "go.how.step3.body": "mit zuverlässigem Zugang zu Open-Source-Modellen", + "go.privacy.title": "Deine Privatsphäre ist uns wichtig", + "go.privacy.body": + "Der Plan ist primär für internationale Nutzer konzipiert, mit Modellen gehostet in den USA, der EU und Singapur für stabilen globalen Zugang.", + "go.privacy.contactAfter": "wenn du Fragen hast.", + "go.privacy.beforeExceptions": + "Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den", + "go.privacy.exceptionsLink": "folgenden Ausnahmen", + "go.faq.q1": "Was ist OpenCode Go?", + "go.faq.a1": + "Go ist ein kostengünstiges Abonnement, das dir zuverlässigen Zugang zu leistungsfähigen Open-Source-Modellen für Agentic Coding bietet.", + "go.faq.q2": "Welche Modelle beinhaltet Go?", + "go.faq.a2": "Go beinhaltet GLM-5, Kimi K2.5 und MiniMax M2.5, mit großzügigen Limits und zuverlässigem Zugang.", + "go.faq.q3": "Ist Go dasselbe wie Zen?", + "go.faq.a3": + "Nein. Zen ist Pay-as-you-go, während Go ein Abonnement für $10/Monat mit großzügigen Limits und zuverlässigem Zugang zu den Open-Source-Modellen GLM-5, Kimi K2.5 und MiniMax M2.5 ist.", + "go.faq.q4": "Wie viel kostet Go?", + "go.faq.a4.p1.beforePricing": "Go kostet", + "go.faq.a4.p1.pricingLink": "$10/Monat", + "go.faq.a4.p1.afterPricing": "mit großzügigen Limits.", + "go.faq.a4.p2.beforeAccount": "Du kannst dein Abonnement in deinem", + "go.faq.a4.p2.accountLink": "Konto verwalten", + "go.faq.a4.p3": "Jederzeit kündbar.", + "go.faq.q5": "Was ist mit Daten und Privatsphäre?", + "go.faq.a5.body": + "Der Plan ist primär für internationale Nutzer konzipiert, mit Modellen gehostet in den USA, der EU und Singapur für stabilen globalen Zugang.", + "go.faq.a5.contactAfter": "wenn du Fragen hast.", + "go.faq.a5.beforeExceptions": + "Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den", + "go.faq.a5.exceptionsLink": "folgenden Ausnahmen", + "go.faq.q6": "Kann ich Guthaben aufladen?", + "go.faq.a6": "Wenn du mehr Nutzung benötigst, kannst du Guthaben in deinem Konto aufladen.", + "go.faq.q7": "Kann ich kündigen?", + "go.faq.a7": "Ja, du kannst jederzeit kündigen.", + "go.faq.q8": "Kann ich Go mit anderen Coding-Agenten nutzen?", + "go.faq.a8": + "Ja, du kannst Go mit jedem Agenten nutzen. Folge den Einrichtungsanweisungen in deinem bevorzugten Coding-Agenten.", + + "go.faq.q9": "Was ist der Unterschied zwischen kostenlosen Modellen und Go?", + "go.faq.a9": + "Kostenlose Modelle beinhalten Big Pickle sowie Werbemodelle, die zum jeweiligen Zeitpunkt verfügbar sind, mit einem Kontingent von 200 Anfragen/Tag. Go beinhaltet GLM-5, Kimi K2.5 und MiniMax M2.5 mit höheren Anfragekontingenten, die über rollierende Zeitfenster (5 Stunden, wöchentlich und monatlich) durchgesetzt werden, grob äquivalent zu $12 pro 5 Stunden, $30 pro Woche und $60 pro Monat (tatsächliche Anfragezahlen variieren je nach Modell und Nutzung).", + "zen.api.error.rateLimitExceeded": "Ratenlimit überschritten. Bitte versuche es später erneut.", "zen.api.error.modelNotSupported": "Modell {{model}} wird nicht unterstützt", "zen.api.error.modelFormatNotSupported": "Modell {{model}} wird für das Format {{format}} nicht unterstützt", diff --git a/packages/console/app/src/i18n/es.ts b/packages/console/app/src/i18n/es.ts index 65c81648be..c1bfdeeb77 100644 --- a/packages/console/app/src/i18n/es.ts +++ b/packages/console/app/src/i18n/es.ts @@ -252,6 +252,107 @@ export const dict = { "Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de cero retención y no usan tus datos para entrenamiento de modelos, con las", "zen.privacy.exceptionsLink": "siguientes excepciones", + "go.title": "OpenCode Go | Modelos de programación de bajo coste para todos", + "go.meta.description": + "Go es una suscripción de 10 $/mes con generosos límites de solicitudes de 5 horas para GLM-5, Kimi K2.5 y MiniMax M2.5.", + "go.hero.title": "Modelos de programación de bajo coste para todos", + "go.hero.body": + "Go lleva la programación agéntica a programadores de todo el mundo. Ofrece límites generosos y acceso fiable a los modelos de código abierto más capaces, para que puedas crear con agentes potentes sin preocuparte por el coste o la disponibilidad.", + + "go.cta.start": "Suscribirse a Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Suscribirse a Go", + "go.cta.price": "10 $/mes", + "go.pricing.body": "Úsalo con cualquier agente. Recarga crédito si es necesario. Cancela en cualquier momento.", + "go.graph.free": "Gratis", + "go.graph.freePill": "Big Pickle y modelos gratuitos", + "go.graph.go": "Go", + "go.graph.label": "Solicitudes por 5 horas", + "go.graph.usageLimits": "Límites de uso", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Solicitudes por 5h: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "ha cambiado mi vida, es realmente una obviedad.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint", + "go.testimonials.jay.quoteBefore": "A 4 de cada 5 personas en nuestro equipo les encanta usar", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "No puedo recomendar", + "go.testimonials.adam.quoteAfter": "lo suficiente. En serio, es realmente bueno.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Head of Design, Laravel", + "go.testimonials.david.quoteBefore": "Con", + "go.testimonials.david.quoteAfter": + "sé que todos los modelos están probados y son perfectos para agentes de programación.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)", + "go.testimonials.frank.quote": "Ojalá siguiera en Nvidia.", + "go.problem.title": "¿Qué problema resuelve Go?", + "go.problem.body": + "Estamos enfocados en llevar la experiencia de OpenCode a tanta gente como sea posible. OpenCode Go es una suscripción de bajo coste (10 $/mes) diseñada para llevar la programación agéntica a programadores de todo el mundo. Proporciona límites generosos y acceso fiable a los modelos de código abierto más capaces.", + "go.problem.subtitle": " ", + "go.problem.item1": "Precios de suscripción de bajo coste", + "go.problem.item2": "Límites generosos y acceso fiable", + "go.problem.item3": "Creado para tantos programadores como sea posible", + "go.problem.item4": "Incluye GLM-5, Kimi K2.5 y MiniMax M2.5", + "go.how.title": "Cómo funciona Go", + "go.how.body": "Go es una suscripción de 10 $/mes que puedes usar con OpenCode o cualquier agente.", + "go.how.step1.title": "Crear una cuenta", + "go.how.step1.beforeLink": "sigue las", + "go.how.step1.link": "instrucciones de configuración", + "go.how.step2.title": "Suscribirse a Go", + "go.how.step2.link": "10 $/mes", + "go.how.step2.afterLink": "con límites generosos", + "go.how.step3.title": "Empezar a programar", + "go.how.step3.body": "con acceso fiable a modelos de código abierto", + "go.privacy.title": "Tu privacidad es importante para nosotros", + "go.privacy.body": + "El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., UE y Singapur para un acceso global estable.", + "go.privacy.contactAfter": "si tienes alguna pregunta.", + "go.privacy.beforeExceptions": + "Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las", + "go.privacy.exceptionsLink": "siguientes excepciones", + "go.faq.q1": "¿Qué es OpenCode Go?", + "go.faq.a1": + "Go es una suscripción de bajo coste que te da acceso fiable a modelos de código abierto capaces para programación agéntica.", + "go.faq.q2": "¿Qué modelos incluye Go?", + "go.faq.a2": "Go incluye GLM-5, Kimi K2.5 y MiniMax M2.5, con límites generosos y acceso fiable.", + "go.faq.q3": "¿Es Go lo mismo que Zen?", + "go.faq.a3": + "No. Zen es pago por uso, mientras que Go es una suscripción de 10 $/mes con límites generosos y acceso fiable a modelos de código abierto GLM-5, Kimi K2.5 y MiniMax M2.5.", + "go.faq.q4": "¿Cuánto cuesta Go?", + "go.faq.a4.p1.beforePricing": "Go cuesta", + "go.faq.a4.p1.pricingLink": "10 $/mes", + "go.faq.a4.p1.afterPricing": "con límites generosos.", + "go.faq.a4.p2.beforeAccount": "Puedes gestionar tu suscripción en tu", + "go.faq.a4.p2.accountLink": "cuenta", + "go.faq.a4.p3": "Cancela en cualquier momento.", + "go.faq.q5": "¿Qué pasa con los datos y la privacidad?", + "go.faq.a5.body": + "El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., UE y Singapur para un acceso global estable.", + "go.faq.a5.contactAfter": "si tienes alguna pregunta.", + "go.faq.a5.beforeExceptions": + "Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las", + "go.faq.a5.exceptionsLink": "siguientes excepciones", + "go.faq.q6": "¿Puedo recargar crédito?", + "go.faq.a6": "Si necesitas más uso, puedes recargar crédito en tu cuenta.", + "go.faq.q7": "¿Puedo cancelar?", + "go.faq.a7": "Sí, puedes cancelar en cualquier momento.", + "go.faq.q8": "¿Puedo usar Go con otros agentes de programación?", + "go.faq.a8": + "Sí, puedes usar Go con cualquier agente. Sigue las instrucciones de configuración en tu agente de programación preferido.", + + "go.faq.q9": "¿Cuál es la diferencia entre los modelos gratuitos y Go?", + "go.faq.a9": + "Los modelos gratuitos incluyen Big Pickle más modelos promocionales disponibles en el momento, con una cuota de 200 solicitudes/día. Go incluye GLM-5, Kimi K2.5 y MiniMax M2.5 con cuotas de solicitud más altas aplicadas a través de ventanas móviles (5 horas, semanal y mensual), aproximadamente equivalente a 12 $ por 5 horas, 30 $ por semana y 60 $ por mes (los recuentos reales de solicitudes varían según el modelo y el uso).", + "zen.api.error.rateLimitExceeded": "Límite de tasa excedido. Por favor, inténtalo de nuevo más tarde.", "zen.api.error.modelNotSupported": "Modelo {{model}} no soportado", "zen.api.error.modelFormatNotSupported": "Modelo {{model}} no soportado para el formato {{format}}", diff --git a/packages/console/app/src/i18n/fr.ts b/packages/console/app/src/i18n/fr.ts index bf741aa9d0..6d8134afbe 100644 --- a/packages/console/app/src/i18n/fr.ts +++ b/packages/console/app/src/i18n/fr.ts @@ -253,6 +253,105 @@ export const dict = { "Tous les modèles Zen sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les", "zen.privacy.exceptionsLink": "exceptions suivantes", + "go.title": "OpenCode Go | Modèles de code à faible coût pour tous", + "go.meta.description": + "Go est un abonnement à 10 $/mois avec des limites généreuses de 5 heures de requêtes pour GLM-5, Kimi K2.5 et MiniMax M2.5.", + "go.hero.title": "Modèles de code à faible coût pour tous", + "go.hero.body": + "Go apporte le codage agentique aux programmeurs du monde entier. Offrant des limites généreuses et un accès fiable aux modèles open source les plus capables, pour que vous puissiez construire avec des agents puissants sans vous soucier du coût ou de la disponibilité.", + + "go.cta.start": "S'abonner à Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "S'abonner à Go", + "go.cta.price": "10 $/mois", + "go.pricing.body": "Utilisez avec n'importe quel agent. Rechargez du crédit si nécessaire. Annulez à tout moment.", + "go.graph.free": "Gratuit", + "go.graph.freePill": "Big Pickle et modèles gratuits", + "go.graph.go": "Go", + "go.graph.label": "Requêtes par tranche de 5 heures", + "go.graph.usageLimits": "Limites d'utilisation", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Requêtes par 5h : {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-PDG, Terminal Products", + "go.testimonials.dax.quoteAfter": "a changé ma vie, c'est vraiment une évidence.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Fondateur, SEED, PM, Melt, Pop, Dapt, Cadmus, et ViewPoint", + "go.testimonials.jay.quoteBefore": "4 personnes sur 5 dans notre équipe adorent utiliser", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "Je ne peux pas recommander", + "go.testimonials.adam.quoteAfter": "assez. Sérieusement, c'est vraiment bien.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Directeur du Design, Laravel", + "go.testimonials.david.quoteBefore": "Avec", + "go.testimonials.david.quoteAfter": "je sais que tous les modèles sont testés et parfaits pour les agents de code.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Stagiaire, Nvidia (4 fois)", + "go.testimonials.frank.quote": "J'aimerais être encore chez Nvidia.", + "go.problem.title": "Quel problème Go résout-il ?", + "go.problem.body": + "Nous nous concentrons sur le fait d'apporter l'expérience OpenCode à autant de personnes que possible. OpenCode Go est un abonnement à faible coût (10 $/mois) conçu pour apporter le codage agentique aux programmeurs du monde entier. Il offre des limites généreuses et un accès fiable aux modèles open source les plus capables.", + "go.problem.subtitle": " ", + "go.problem.item1": "Prix d'abonnement bas", + "go.problem.item2": "Limites généreuses et accès fiable", + "go.problem.item3": "Conçu pour autant de programmeurs que possible", + "go.problem.item4": "Inclut GLM-5, Kimi K2.5 et MiniMax M2.5", + "go.how.title": "Comment fonctionne Go", + "go.how.body": "Go est un abonnement à 10 $/mois que vous pouvez utiliser avec OpenCode ou n'importe quel agent.", + "go.how.step1.title": "Créez un compte", + "go.how.step1.beforeLink": "suivez les", + "go.how.step1.link": "instructions de configuration", + "go.how.step2.title": "Abonnez-vous à Go", + "go.how.step2.link": "10 $/mois", + "go.how.step2.afterLink": "avec des limites généreuses", + "go.how.step3.title": "Commencez à coder", + "go.how.step3.body": "avec un accès fiable aux modèles open source", + "go.privacy.title": "Votre vie privée est importante pour nous", + "go.privacy.body": + "Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable.", + "go.privacy.contactAfter": "si vous avez des questions.", + "go.privacy.beforeExceptions": + "Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les", + "go.privacy.exceptionsLink": "exceptions suivantes", + "go.faq.q1": "Qu'est-ce que OpenCode Go ?", + "go.faq.a1": + "Go est un abonnement à faible coût qui vous donne un accès fiable à des modèles open source performants pour le codage agentique.", + "go.faq.q2": "Quels modèles Go inclut-il ?", + "go.faq.a2": "Go inclut GLM-5, Kimi K2.5 et MiniMax M2.5, avec des limites généreuses et un accès fiable.", + "go.faq.q3": "Est-ce que Go est la même chose que Zen ?", + "go.faq.a3": + "Non. Zen est payé à l'usage (pay-as-you-go), tandis que Go est un abonnement à 10 $/mois avec des limites généreuses et un accès fiable aux modèles open source GLM-5, Kimi K2.5 et MiniMax M2.5.", + "go.faq.q4": "Combien coûte Go ?", + "go.faq.a4.p1.beforePricing": "Go coûte", + "go.faq.a4.p1.pricingLink": "10 $/mois", + "go.faq.a4.p1.afterPricing": "avec des limites généreuses.", + "go.faq.a4.p2.beforeAccount": "Vous pouvez gérer votre abonnement dans votre", + "go.faq.a4.p2.accountLink": "compte", + "go.faq.a4.p3": "Annulez à tout moment.", + "go.faq.q5": "Et pour les données et la confidentialité ?", + "go.faq.a5.body": + "Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable.", + "go.faq.a5.contactAfter": "si vous avez des questions.", + "go.faq.a5.beforeExceptions": + "Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les", + "go.faq.a5.exceptionsLink": "exceptions suivantes", + "go.faq.q6": "Puis-je recharger mon crédit ?", + "go.faq.a6": "Si vous avez besoin de plus d'utilisation, vous pouvez recharger du crédit dans votre compte.", + "go.faq.q7": "Puis-je annuler ?", + "go.faq.a7": "Oui, vous pouvez annuler à tout moment.", + "go.faq.q8": "Puis-je utiliser Go avec d'autres agents de code ?", + "go.faq.a8": + "Oui, vous pouvez utiliser Go avec n'importe quel agent. Suivez les instructions de configuration dans votre agent de code préféré.", + "go.faq.q9": "Quelle est la différence entre les modèles gratuits et Go ?", + "go.faq.a9": + "Les modèles gratuits incluent Big Pickle ainsi que des modèles promotionnels disponibles à ce moment-là, avec un quota de 200 requêtes/jour. Go inclut GLM-5, Kimi K2.5 et MiniMax M2.5 avec des quotas de requêtes plus élevés appliqués sur des fenêtres glissantes (5 heures, hebdomadaire et mensuelle), à peu près équivalent à 12 $ par 5 heures, 30 $ par semaine et 60 $ par mois (le nombre réel de requêtes varie selon le modèle et l'utilisation).", + "zen.api.error.rateLimitExceeded": "Limite de débit dépassée. Veuillez réessayer plus tard.", "zen.api.error.modelNotSupported": "Modèle {{model}} non pris en charge", "zen.api.error.modelFormatNotSupported": "Modèle {{model}} non pris en charge pour le format {{format}}", diff --git a/packages/console/app/src/i18n/it.ts b/packages/console/app/src/i18n/it.ts index 0a9e4f9592..66a66dc17e 100644 --- a/packages/console/app/src/i18n/it.ts +++ b/packages/console/app/src/i18n/it.ts @@ -249,6 +249,106 @@ export const dict = { "Tutti i modelli Zen sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le", "zen.privacy.exceptionsLink": "seguenti eccezioni", + "go.title": "OpenCode Go | Modelli di coding a basso costo per tutti", + "go.meta.description": + "Go è un abbonamento da $10/mese con generosi limiti di richieste di 5 ore per GLM-5, Kimi K2.5 e MiniMax M2.5.", + "go.hero.title": "Modelli di coding a basso costo per tutti", + "go.hero.body": + "Go porta il coding agentico ai programmatori di tutto il mondo. Offrendo limiti generosi e un accesso affidabile ai modelli open source più capaci, in modo da poter costruire con agenti potenti senza preoccuparsi dei costi o della disponibilità.", + + "go.cta.start": "Abbonati a Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Abbonati a Go", + "go.cta.price": "$10/mese", + "go.pricing.body": "Usa con qualsiasi agente. Ricarica credito se necessario. Annulla in qualsiasi momento.", + "go.graph.free": "Gratis", + "go.graph.freePill": "Big Pickle e modelli gratuiti", + "go.graph.go": "Go", + "go.graph.label": "Richieste ogni 5 ore", + "go.graph.usageLimits": "Limiti di utilizzo", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Richieste ogni 5h: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "ha cambiato la vita, è davvero una scelta ovvia.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, e ViewPoint", + "go.testimonials.jay.quoteBefore": "4 persone su 5 nel nostro team amano usare", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "Non posso raccomandare", + "go.testimonials.adam.quoteAfter": "abbastanza. Seriamente, è davvero buono.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Head of Design, Laravel", + "go.testimonials.david.quoteBefore": "Con", + "go.testimonials.david.quoteAfter": "so che tutti i modelli sono testati e perfetti per gli agenti di coding.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Intern, Nvidia (4 volte)", + "go.testimonials.frank.quote": "Vorrei essere ancora a Nvidia.", + "go.problem.title": "Quale problema risolve Go?", + "go.problem.body": + "Ci concentriamo nel portare l'esperienza OpenCode a quante più persone possibile. OpenCode Go è un abbonamento a basso costo ($10/mese) progettato per portare il coding agentico ai programmatori di tutto il mondo. Fornisce limiti generosi e accesso affidabile ai modelli open source più capaci.", + "go.problem.subtitle": " ", + "go.problem.item1": "Prezzo di abbonamento a basso costo", + "go.problem.item2": "Limiti generosi e accesso affidabile", + "go.problem.item3": "Costruito per il maggior numero possibile di programmatori", + "go.problem.item4": "Include GLM-5, Kimi K2.5 e MiniMax M2.5", + "go.how.title": "Come funziona Go", + "go.how.body": "Go è un abbonamento da $10/mese che puoi usare con OpenCode o qualsiasi agente.", + "go.how.step1.title": "Crea un account", + "go.how.step1.beforeLink": "segui le", + "go.how.step1.link": "istruzioni di configurazione", + "go.how.step2.title": "Abbonati a Go", + "go.how.step2.link": "$10/mese", + "go.how.step2.afterLink": "con limiti generosi", + "go.how.step3.title": "Inizia a programmare", + "go.how.step3.body": "con accesso affidabile ai modelli open source", + "go.privacy.title": "La tua privacy è importante per noi", + "go.privacy.body": + "Il piano è progettato principalmente per gli utenti internazionali, con modelli ospitati negli Stati Uniti, UE e Singapore per un accesso globale stabile.", + "go.privacy.contactAfter": "se hai domande.", + "go.privacy.beforeExceptions": + "I modelli Go sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le", + "go.privacy.exceptionsLink": "seguenti eccezioni", + "go.faq.q1": "Che cos'è OpenCode Go?", + "go.faq.a1": + "Go è un abbonamento a basso costo che ti dà un accesso affidabile a modelli open source capaci per il coding agentico.", + "go.faq.q2": "Quali modelli include Go?", + "go.faq.a2": "Go include GLM-5, Kimi K2.5 e MiniMax M2.5, con limiti generosi e accesso affidabile.", + "go.faq.q3": "Go è lo stesso di Zen?", + "go.faq.a3": + "No. Zen è a consumo, mentre Go è un abbonamento da $10/mese con limiti generosi e accesso affidabile ai modelli open source GLM-5, Kimi K2.5 e MiniMax M2.5.", + "go.faq.q4": "Quanto costa Go?", + "go.faq.a4.p1.beforePricing": "Go costa", + "go.faq.a4.p1.pricingLink": "$10/mese", + "go.faq.a4.p1.afterPricing": "con limiti generosi.", + "go.faq.a4.p2.beforeAccount": "Puoi gestire il tuo abbonamento nel tuo", + "go.faq.a4.p2.accountLink": "account", + "go.faq.a4.p3": "Annulla in qualsiasi momento.", + "go.faq.q5": "E per quanto riguarda dati e privacy?", + "go.faq.a5.body": + "Il piano è progettato principalmente per gli utenti internazionali, con modelli ospitati negli Stati Uniti, UE e Singapore per un accesso globale stabile.", + "go.faq.a5.contactAfter": "se hai domande.", + "go.faq.a5.beforeExceptions": + "I modelli Go sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le", + "go.faq.a5.exceptionsLink": "seguenti eccezioni", + "go.faq.q6": "Posso ricaricare il credito?", + "go.faq.a6": "Se hai bisogno di più utilizzo, puoi ricaricare il credito nel tuo account.", + "go.faq.q7": "Posso annullare?", + "go.faq.a7": "Sì, puoi annullare in qualsiasi momento.", + "go.faq.q8": "Posso usare Go con altri agenti di coding?", + "go.faq.a8": + "Sì, puoi usare Go con qualsiasi agente. Segui le istruzioni di configurazione nel tuo agente di coding preferito.", + + "go.faq.q9": "Qual è la differenza tra i modelli gratuiti e Go?", + "go.faq.a9": + "I modelli gratuiti includono Big Pickle più modelli promozionali disponibili al momento, con una quota di 200 richieste/giorno. Go include GLM-5, Kimi K2.5 e MiniMax M2.5 con quote di richiesta più elevate applicate su finestre mobili (5 ore, settimanale e mensile), approssimativamente equivalenti a $12 ogni 5 ore, $30 a settimana e $60 al mese (il conteggio effettivo delle richieste varia in base al modello e all'utilizzo).", + "zen.api.error.rateLimitExceeded": "Limite di richieste superato. Riprova più tardi.", "zen.api.error.modelNotSupported": "Modello {{model}} non supportato", "zen.api.error.modelFormatNotSupported": "Modello {{model}} non supportato per il formato {{format}}", diff --git a/packages/console/app/src/i18n/ja.ts b/packages/console/app/src/i18n/ja.ts index ee7b5f9288..d43105a70a 100644 --- a/packages/console/app/src/i18n/ja.ts +++ b/packages/console/app/src/i18n/ja.ts @@ -248,6 +248,107 @@ export const dict = { "すべてのZenモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(", "zen.privacy.exceptionsLink": "以下の例外", + "go.title": "OpenCode Go | すべての人のための低価格なコーディングモデル", + "go.meta.description": + "Goは、GLM-5、Kimi K2.5、MiniMax M2.5を5時間ごとの十分なリクエスト制限で利用できる月額$10のサブスクリプションです。", + "go.hero.title": "すべての人のための低価格なコーディングモデル", + "go.hero.body": + "Goは、世界中のプログラマーにエージェント型コーディングをもたらします。最も高性能なオープンソースモデルへの十分な制限と安定したアクセスを提供し、コストや可用性を気にすることなく強力なエージェントで構築できます。", + + "go.cta.start": "Goを購読する", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Goを購読する", + "go.cta.price": "$10/月", + "go.pricing.body": "任意のエージェントで利用可能。必要に応じてクレジットを追加。いつでもキャンセル可能。", + "go.graph.free": "無料", + "go.graph.freePill": "Big Pickleと無料モデル", + "go.graph.go": "Go", + "go.graph.label": "5時間あたりのリクエスト数", + "go.graph.usageLimits": "利用制限", + "go.graph.tick": "{{n}}倍", + "go.graph.aria": "5時間あたりのリクエスト数: {{free}} 対 {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "元CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "は人生を変えるものでした。本当に迷う必要はありません。", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "元創業者, SEED, PM, Melt, Pop, Dapt, Cadmus, ViewPoint", + "go.testimonials.jay.quoteBefore": "チームの5人中4人が", + "go.testimonials.jay.quoteAfter": "の使用を気に入っています。", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "元Hero, AWS", + "go.testimonials.adam.quoteBefore": "私は", + "go.testimonials.adam.quoteAfter": "をどれだけ推薦してもしきれません。真剣に、本当に良いです。", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "元デザイン責任者, Laravel", + "go.testimonials.david.quoteBefore": "", + "go.testimonials.david.quoteAfter": + "を使えば、すべてのモデルがテスト済みでコーディングエージェントに最適だと確信できます。", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "元インターン, Nvidia (4回)", + "go.testimonials.frank.quote": "まだNvidiaにいられたらよかったのに。", + "go.problem.title": "Goはどのような問題を解決していますか?", + "go.problem.body": + "私たちは、OpenCodeの体験をできるだけ多くの人々に届けることに注力しています。OpenCode Goは、世界中のプログラマーにエージェント型コーディングをもたらすために設計された低価格($10/月)のサブスクリプションです。最も高性能なオープンソースモデルへの十分な制限と安定したアクセスを提供します。", + "go.problem.subtitle": " ", + "go.problem.item1": "低価格なサブスクリプション料金", + "go.problem.item2": "十分な制限と安定したアクセス", + "go.problem.item3": "できるだけ多くのプログラマーのために構築", + "go.problem.item4": "GLM-5、Kimi K2.5、MiniMax M2.5を含む", + "go.how.title": "Goの仕組み", + "go.how.body": "Goは、OpenCodeまたは任意のエージェントで使用できる月額$10のサブスクリプションです。", + "go.how.step1.title": "アカウントを作成", + "go.how.step1.beforeLink": "", + "go.how.step1.link": "セットアップ手順はこちら", + "go.how.step2.title": "Goを購読する", + "go.how.step2.link": "$10/月", + "go.how.step2.afterLink": "(十分な制限付き)", + "go.how.step3.title": "コーディングを開始", + "go.how.step3.body": "オープンソースモデルへの安定したアクセスで", + "go.privacy.title": "あなたのプライバシーは私たちにとって重要です", + "go.privacy.body": + "このプランは主に海外ユーザー向けに設計されており、米国、EU、シンガポールでホストされたモデルにより安定したグローバルアクセスを提供します。", + "go.privacy.contactAfter": "ご質問がございましたら。", + "go.privacy.beforeExceptions": + "Goのモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(", + "go.privacy.exceptionsLink": "以下の例外", + "go.faq.q1": "OpenCode Goとは?", + "go.faq.a1": + "Goは、エージェント型コーディングのための有能なオープンソースモデルへの安定したアクセスを提供する低価格なサブスクリプションです。", + "go.faq.q2": "Goにはどのモデルが含まれますか?", + "go.faq.a2": "Goには、GLM-5、Kimi K2.5、MiniMax M2.5が含まれており、十分な制限と安定したアクセスが提供されます。", + "go.faq.q3": "GoはZenと同じですか?", + "go.faq.a3": + "いいえ。Zenは従量課金制ですが、Goは月額$10のサブスクリプションで、GLM-5、Kimi K2.5、MiniMax M2.5といったオープンソースモデルへの十分な制限と安定したアクセスを提供します。", + "go.faq.q4": "Goの料金は?", + "go.faq.a4.p1.beforePricing": "Goは", + "go.faq.a4.p1.pricingLink": "月額$10", + "go.faq.a4.p1.afterPricing": "で、十分な制限が含まれます。", + "go.faq.a4.p2.beforeAccount": "管理画面:", + "go.faq.a4.p2.accountLink": "アカウント", + "go.faq.a4.p3": "いつでもキャンセル可能です。", + "go.faq.q5": "データとプライバシーは?", + "go.faq.a5.body": + "このプランは主に海外ユーザー向けに設計されており、米国、EU、シンガポールでホストされたモデルにより安定したグローバルアクセスを提供します。", + "go.faq.a5.contactAfter": "ご質問がございましたら。", + "go.faq.a5.beforeExceptions": + "Goのモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(", + "go.faq.a5.exceptionsLink": "以下の例外", + "go.faq.q6": "クレジットをチャージできますか?", + "go.faq.a6": "利用枠を追加したい場合は、アカウントでクレジットをチャージできます。", + "go.faq.q7": "キャンセルできますか?", + "go.faq.a7": "はい、いつでもキャンセル可能です。", + "go.faq.q8": "他のコーディングエージェントでGoを使えますか?", + "go.faq.a8": + "はい、Goは任意のエージェントで使用できます。お使いのコーディングエージェントのセットアップ手順に従ってください。", + + "go.faq.q9": "無料モデルとGoの違いは何ですか?", + "go.faq.a9": + "無料モデルにはBig Pickleと、その時点で利用可能なプロモーションモデルが含まれ、1日200リクエストの制限があります。GoにはGLM-5、Kimi K2.5、MiniMax M2.5が含まれ、ローリングウィンドウ(5時間、週間、月間)全体でより高いリクエスト制限が適用されます。これは概算で5時間あたり$12、週間$30、月間$60相当です(実際のリクエスト数はモデルと使用状況により異なります)。", + "zen.api.error.rateLimitExceeded": "レート制限を超えました。後でもう一度お試しください。", "zen.api.error.modelNotSupported": "モデル {{model}} はサポートされていません", "zen.api.error.modelFormatNotSupported": "フォーマット {{format}} ではモデル {{model}} はサポートされていません", diff --git a/packages/console/app/src/i18n/ko.ts b/packages/console/app/src/i18n/ko.ts index 2dc3f9466c..c2271e9585 100644 --- a/packages/console/app/src/i18n/ko.ts +++ b/packages/console/app/src/i18n/ko.ts @@ -245,6 +245,105 @@ export const dict = { "모든 Zen 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,", "zen.privacy.exceptionsLink": "다음 예외", + "go.title": "OpenCode Go | 모두를 위한 저비용 코딩 모델", + "go.meta.description": + "Go는 GLM-5, Kimi K2.5, MiniMax M2.5에 대해 넉넉한 5시간 요청 한도를 제공하는 월 $10 구독입니다.", + "go.hero.title": "모두를 위한 저비용 코딩 모델", + "go.hero.body": + "Go는 전 세계 프로그래머들에게 에이전트 코딩을 제공합니다. 가장 유능한 오픈 소스 모델에 대한 넉넉한 한도와 안정적인 액세스를 제공하므로, 비용이나 가용성 걱정 없이 강력한 에이전트로 빌드할 수 있습니다.", + + "go.cta.start": "Go 구독하기", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Go 구독하기", + "go.cta.price": "$10/월", + "go.pricing.body": "모든 에이전트와 함께 사용하세요. 필요 시 크레딧을 충전하세요. 언제든지 취소 가능.", + "go.graph.free": "무료", + "go.graph.freePill": "Big Pickle 및 무료 모델", + "go.graph.go": "Go", + "go.graph.label": "5시간당 요청 수", + "go.graph.usageLimits": "사용 한도", + "go.graph.tick": "{{n}}배", + "go.graph.aria": "5시간당 요청 수: {{free}} 대 {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "전 Terminal Products CEO", + "go.testimonials.dax.quoteAfter": "(은)는 삶을 변화시켰습니다. 정말 당연한 선택입니다.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "전 Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, ViewPoint", + "go.testimonials.jay.quoteBefore": "우리 팀 5명 중 4명이", + "go.testimonials.jay.quoteAfter": " 사용을 정말 좋아합니다.", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "전 AWS Hero", + "go.testimonials.adam.quoteBefore": "저는", + "go.testimonials.adam.quoteAfter": "를(을) 아무리 추천해도 부족합니다. 진심으로 정말 좋습니다.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "전 Laravel 디자인 총괄", + "go.testimonials.david.quoteBefore": "", + "go.testimonials.david.quoteAfter": + "와(과) 함께라면 모든 모델이 테스트를 거쳤고 코딩 에이전트에 완벽하다는 것을 알 수 있습니다.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "전 Nvidia 인턴 (4회)", + "go.testimonials.frank.quote": "아직 Nvidia에 있었으면 좋았을 텐데요.", + "go.problem.title": "Go는 어떤 문제를 해결하나요?", + "go.problem.body": + "우리는 가능한 한 많은 사람들에게 OpenCode 경험을 제공하는 데 집중하고 있습니다. OpenCode Go는 전 세계 프로그래머들에게 에이전트 코딩을 제공하기 위해 설계된 저렴한(월 $10) 구독입니다. 가장 유능한 오픈 소스 모델에 대해 넉넉한 한도와 안정적인 액세스를 제공합니다.", + "go.problem.subtitle": " ", + "go.problem.item1": "저렴한 구독 가격", + "go.problem.item2": "넉넉한 한도와 안정적인 액세스", + "go.problem.item3": "가능한 한 많은 프로그래머를 위해 제작됨", + "go.problem.item4": "GLM-5, Kimi K2.5, MiniMax M2.5 포함", + "go.how.title": "Go 작동 방식", + "go.how.body": "Go는 OpenCode 또는 다른 어떤 에이전트와도 사용할 수 있는 월 $10 구독입니다.", + "go.how.step1.title": "계정 생성", + "go.how.step1.beforeLink": "", + "go.how.step1.link": "설정 지침을 따르세요", + "go.how.step2.title": "Go 구독", + "go.how.step2.link": "$10/월", + "go.how.step2.afterLink": "(넉넉한 한도 포함)", + "go.how.step3.title": "코딩 시작", + "go.how.step3.body": "오픈 소스 모델에 대한 안정적인 액세스와 함께", + "go.privacy.title": "귀하의 프라이버시는 우리에게 중요합니다", + "go.privacy.body": + "이 플랜은 주로 글로벌 사용자를 위해 설계되었으며, 안정적인 글로벌 액세스를 위해 미국, EU, 싱가포르에 모델이 호스팅되어 있습니다.", + "go.privacy.contactAfter": "질문이 있으시면 언제든지 문의해 주세요.", + "go.privacy.beforeExceptions": + "Go 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,", + "go.privacy.exceptionsLink": "다음 예외", + "go.faq.q1": "OpenCode Go란 무엇인가요?", + "go.faq.a1": "Go는 에이전트 코딩을 위한 유능한 오픈 소스 모델에 대해 안정적인 액세스를 제공하는 저비용 구독입니다.", + "go.faq.q2": "Go에는 어떤 모델이 포함되나요?", + "go.faq.a2": "Go에는 넉넉한 한도와 안정적인 액세스를 제공하는 GLM-5, Kimi K2.5, MiniMax M2.5가 포함됩니다.", + "go.faq.q3": "Go는 Zen과 같은가요?", + "go.faq.a3": + "아니요. Zen은 사용한 만큼 지불(pay-as-you-go)하는 방식인 반면, Go는 월 $10 구독으로 오픈 소스 모델인 GLM-5, Kimi K2.5, MiniMax M2.5에 대해 넉넉한 한도와 안정적인 액세스를 제공합니다.", + "go.faq.q4": "Go 비용은 얼마인가요?", + "go.faq.a4.p1.beforePricing": "Go 비용은", + "go.faq.a4.p1.pricingLink": "$10/월", + "go.faq.a4.p1.afterPricing": "이며 넉넉한 한도를 제공합니다.", + "go.faq.a4.p2.beforeAccount": "구독 관리는 다음에서 가능합니다:", + "go.faq.a4.p2.accountLink": "계정", + "go.faq.a4.p3": "언제든지 취소할 수 있습니다.", + "go.faq.q5": "데이터와 프라이버시는 어떤가요?", + "go.faq.a5.body": + "이 플랜은 주로 글로벌 사용자를 위해 설계되었으며, 안정적인 글로벌 액세스를 위해 미국, EU, 싱가포르에 모델이 호스팅되어 있습니다.", + "go.faq.a5.contactAfter": "질문이 있으시면 언제든지 문의해 주세요.", + "go.faq.a5.beforeExceptions": + "Go 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,", + "go.faq.a5.exceptionsLink": "다음 예외", + "go.faq.q6": "크레딧을 충전할 수 있나요?", + "go.faq.a6": "사용량이 더 필요한 경우 계정에서 크레딧을 충전할 수 있습니다.", + "go.faq.q7": "취소할 수 있나요?", + "go.faq.a7": "네, 언제든지 취소할 수 있습니다.", + "go.faq.q8": "다른 코딩 에이전트와 Go를 사용할 수 있나요?", + "go.faq.a8": "네, Go는 어떤 에이전트와도 사용할 수 있습니다. 선호하는 코딩 에이전트의 설정 지침을 따르세요.", + + "go.faq.q9": "무료 모델과 Go의 차이점은 무엇인가요?", + "go.faq.a9": + "무료 모델에는 Big Pickle과 당시 사용 가능한 프로모션 모델이 포함되며, 하루 200회 요청 할당량이 적용됩니다. Go는 GLM-5, Kimi K2.5, MiniMax M2.5를 포함하며, 롤링 윈도우(5시간, 주간, 월간)에 걸쳐 더 높은 요청 할당량을 적용합니다. 이는 대략 5시간당 $12, 주당 $30, 월 $60에 해당합니다(실제 요청 수는 모델 및 사용량에 따라 다름).", + "zen.api.error.rateLimitExceeded": "속도 제한을 초과했습니다. 나중에 다시 시도해 주세요.", "zen.api.error.modelNotSupported": "{{model}} 모델은 지원되지 않습니다", "zen.api.error.modelFormatNotSupported": "{{model}} 모델은 {{format}} 형식에 대해 지원되지 않습니다", diff --git a/packages/console/app/src/i18n/no.ts b/packages/console/app/src/i18n/no.ts index 35c4bbb6ab..9f8585e241 100644 --- a/packages/console/app/src/i18n/no.ts +++ b/packages/console/app/src/i18n/no.ts @@ -249,6 +249,106 @@ export const dict = { "Alle Zen-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med", "zen.privacy.exceptionsLink": "følgende unntak", + "go.title": "OpenCode Go | Rimelige kodemodeller for alle", + "go.meta.description": + "Go er et abonnement til $10/måned med rause grenser på 5 timer for GLM-5, Kimi K2.5 og MiniMax M2.5.", + "go.hero.title": "Rimelige kodemodeller for alle", + "go.hero.body": + "Go bringer agent-koding til programmerere over hele verden. Med rause grenser og pålitelig tilgang til de mest kapable åpen kildekode-modellene, kan du bygge med kraftige agenter uten å bekymre deg for kostnader eller tilgjengelighet.", + + "go.cta.start": "Abonner på Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Abonner på Go", + "go.cta.price": "$10/måned", + "go.pricing.body": "Bruk med hvilken som helst agent. Fyll på kreditt om nødvendig. Avslutt når som helst.", + "go.graph.free": "Gratis", + "go.graph.freePill": "Big Pickle og gratis modeller", + "go.graph.go": "Go", + "go.graph.label": "Forespørsler per 5 timer", + "go.graph.usageLimits": "Bruksgrenser", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Forespørsler per 5t: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "tidligere CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "har endret livet mitt, det er virkelig en no-brainer.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "tidligere grunnlegger, SEED, PM, Melt, Pop, Dapt, Cadmus og ViewPoint", + "go.testimonials.jay.quoteBefore": "4 av 5 personer på teamet vårt elsker å bruke", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "tidligere Hero, AWS", + "go.testimonials.adam.quoteBefore": "Jeg kan ikke anbefale", + "go.testimonials.adam.quoteAfter": "nok. Seriøst, det er virkelig bra.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "tidligere Head of Design, Laravel", + "go.testimonials.david.quoteBefore": "Med", + "go.testimonials.david.quoteAfter": "vet jeg at alle modellene er testet og perfekte for kodeagenter.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "tidligere intern, Nvidia (4 ganger)", + "go.testimonials.frank.quote": "Jeg skulle ønske jeg fortsatt var hos Nvidia.", + "go.problem.title": "Hvilket problem løser Go?", + "go.problem.body": + "Vi fokuserer på å bringe OpenCode-opplevelsen til så mange mennesker som mulig. OpenCode Go er et rimelig ($10/måned) abonnement designet for å bringe agent-koding til programmerere over hele verden. Det gir rause grenser og pålitelig tilgang til de mest kapable åpen kildekode-modellene.", + "go.problem.subtitle": " ", + "go.problem.item1": "Rimelig abonnementspris", + "go.problem.item2": "Rause grenser og pålitelig tilgang", + "go.problem.item3": "Bygget for så mange programmerere som mulig", + "go.problem.item4": "Inkluderer GLM-5, Kimi K2.5 og MiniMax M2.5", + "go.how.title": "Hvordan Go fungerer", + "go.how.body": "Go er et abonnement til $10/måned som du kan bruke med OpenCode eller hvilken som helst agent.", + "go.how.step1.title": "Opprett en konto", + "go.how.step1.beforeLink": "følg", + "go.how.step1.link": "oppsettsinstruksjonene", + "go.how.step2.title": "Abonner på Go", + "go.how.step2.link": "$10/måned", + "go.how.step2.afterLink": "med rause grenser", + "go.how.step3.title": "Begynn å kode", + "go.how.step3.body": "med pålitelig tilgang til åpen kildekode-modeller", + "go.privacy.title": "Personvernet ditt er viktig for oss", + "go.privacy.body": + "Planen er primært designet for internasjonale brukere, med modeller driftet i USA, EU og Singapore for stabil global tilgang.", + "go.privacy.contactAfter": "hvis du har spørsmål.", + "go.privacy.beforeExceptions": + "Go-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med", + "go.privacy.exceptionsLink": "følgende unntak", + "go.faq.q1": "Hva er OpenCode Go?", + "go.faq.a1": + "Go er et rimelig abonnement som gir deg pålitelig tilgang til kapable åpen kildekode-modeller for agent-koding.", + "go.faq.q2": "Hvilke modeller inkluderer Go?", + "go.faq.a2": "Go inkluderer GLM-5, Kimi K2.5 og MiniMax M2.5, med rause grenser og pålitelig tilgang.", + "go.faq.q3": "Er Go det samme som Zen?", + "go.faq.a3": + "Nei. Zen er pay-as-you-go, mens Go er et abonnement til $10/måned med rause grenser og pålitelig tilgang til åpen kildekode-modellene GLM-5, Kimi K2.5 og MiniMax M2.5.", + "go.faq.q4": "Hva koster Go?", + "go.faq.a4.p1.beforePricing": "Go koster", + "go.faq.a4.p1.pricingLink": "$10/måned", + "go.faq.a4.p1.afterPricing": "med rause grenser.", + "go.faq.a4.p2.beforeAccount": "Du kan administrere abonnementet ditt i din", + "go.faq.a4.p2.accountLink": "konto", + "go.faq.a4.p3": "Avslutt når som helst.", + "go.faq.q5": "Hva med data og personvern?", + "go.faq.a5.body": + "Planen er primært designet for internasjonale brukere, med modeller driftet i USA, EU og Singapore for stabil global tilgang.", + "go.faq.a5.contactAfter": "hvis du har spørsmål.", + "go.faq.a5.beforeExceptions": + "Go-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med", + "go.faq.a5.exceptionsLink": "følgende unntak", + "go.faq.q6": "Kan jeg fylle på kreditt?", + "go.faq.a6": "Hvis du trenger mer bruk, kan du fylle på kreditt i kontoen din.", + "go.faq.q7": "Kan jeg avslutte?", + "go.faq.a7": "Ja, du kan avslutte når som helst.", + "go.faq.q8": "Kan jeg bruke Go med andre kodeagenter?", + "go.faq.a8": + "Ja, du kan bruke Go med hvilken som helst agent. Følg oppsettinstruksjonene i din foretrukne kodeagent.", + + "go.faq.q9": "Hva er forskjellen mellom gratis modeller og Go?", + "go.faq.a9": + "Gratis modeller inkluderer Big Pickle pluss kampanjemodeller tilgjengelig på det tidspunktet, med en kvote på 200 forespørsler/dag. Go inkluderer GLM-5, Kimi K2.5 og MiniMax M2.5 med høyere kvoter håndhevet over rullerende vinduer (5 timer, ukentlig og månedlig), omtrent tilsvarende $12 per 5 timer, $30 per uke og $60 per måned (faktiske forespørselsantall varierer etter modell og bruk).", + "zen.api.error.rateLimitExceeded": "Rate limit overskredet. Vennligst prøv igjen senere.", "zen.api.error.modelNotSupported": "Modell {{model}} støttes ikke", "zen.api.error.modelFormatNotSupported": "Modell {{model}} støttes ikke for format {{format}}", diff --git a/packages/console/app/src/i18n/pl.ts b/packages/console/app/src/i18n/pl.ts index 0ff5388be9..bcc4618a62 100644 --- a/packages/console/app/src/i18n/pl.ts +++ b/packages/console/app/src/i18n/pl.ts @@ -250,6 +250,106 @@ export const dict = { "Wszystkie modele Zen są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie wykorzystują Twoich danych do trenowania modeli, z", "zen.privacy.exceptionsLink": "następującymi wyjątkami", + "go.title": "OpenCode Go | Niskokosztowe modele do kodowania dla każdego", + "go.meta.description": + "Go to subskrypcja za $10/miesiąc z hojnymi 5-godzinnymi limitami zapytań dla GLM-5, Kimi K2.5 i MiniMax M2.5.", + "go.hero.title": "Niskokosztowe modele do kodowania dla każdego", + "go.hero.body": + "Go udostępnia programowanie z agentami programistom na całym świecie. Oferuje hojne limity i niezawodny dostęp do najzdolniejszych modeli open source, dzięki czemu możesz budować za pomocą potężnych agentów, nie martwiąc się o koszty czy dostępność.", + + "go.cta.start": "Zasubskrybuj Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Zasubskrybuj Go", + "go.cta.price": "$10/miesiąc", + "go.pricing.body": "Używaj z dowolnym agentem. Doładuj środki w razie potrzeby. Anuluj w dowolnym momencie.", + "go.graph.free": "Darmowe", + "go.graph.freePill": "Big Pickle i darmowe modele", + "go.graph.go": "Go", + "go.graph.label": "Żądania na 5 godzin", + "go.graph.usageLimits": "Limity użycia", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Żądania na 5h: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "zmieniło moje życie, to naprawdę oczywisty wybór.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint", + "go.testimonials.jay.quoteBefore": "4 na 5 osób w naszym zespole uwielbia używać", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "Nie mogę wystarczająco polecić", + "go.testimonials.adam.quoteAfter": ". Poważnie, to jest naprawdę dobre.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Head of Design, Laravel", + "go.testimonials.david.quoteBefore": "Dzięki", + "go.testimonials.david.quoteAfter": "wiem, że wszystkie modele są przetestowane i idealne dla agentów kodujących.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)", + "go.testimonials.frank.quote": "Chciałbym wciąż być w Nvidia.", + "go.problem.title": "Jaki problem rozwiązuje Go?", + "go.problem.body": + "Skupiamy się na dostarczeniu doświadczenia OpenCode jak największej liczbie osób. OpenCode Go to niskokosztowa ($10/miesiąc) subskrypcja zaprojektowana, aby udostępnić programowanie z agentami programistom na całym świecie. Zapewnia hojne limity i niezawodny dostęp do najzdolniejszych modeli open source.", + "go.problem.subtitle": " ", + "go.problem.item1": "Niskokosztowa cena subskrypcji", + "go.problem.item2": "Hojne limity i niezawodny dostęp", + "go.problem.item3": "Stworzony dla jak największej liczby programistów", + "go.problem.item4": "Zawiera GLM-5, Kimi K2.5 i MiniMax M2.5", + "go.how.title": "Jak działa Go", + "go.how.body": "Go to subskrypcja za $10/miesiąc, której możesz używać z OpenCode lub dowolnym agentem.", + "go.how.step1.title": "Załóż konto", + "go.how.step1.beforeLink": "postępuj zgodnie z", + "go.how.step1.link": "instrukcją konfiguracji", + "go.how.step2.title": "Zasubskrybuj Go", + "go.how.step2.link": "$10/miesiąc", + "go.how.step2.afterLink": "z hojnymi limitami", + "go.how.step3.title": "Zacznij kodować", + "go.how.step3.body": "z niezawodnym dostępem do modeli open source", + "go.privacy.title": "Twoja prywatność jest dla nas ważna", + "go.privacy.body": + "Plan został zaprojektowany głównie dla użytkowników międzynarodowych, z modelami hostowanymi w USA, UE i Singapurze, aby zapewnić stabilny globalny dostęp.", + "go.privacy.contactAfter": "jeśli masz jakiekolwiek pytania.", + "go.privacy.beforeExceptions": + "Modele Go są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli, z", + "go.privacy.exceptionsLink": "następującymi wyjątkami", + "go.faq.q1": "Czym jest OpenCode Go?", + "go.faq.a1": + "Go to niskokosztowa subskrypcja, która daje niezawodny dostęp do zdolnych modeli open source dla agentów kodujących.", + "go.faq.q2": "Jakie modele zawiera Go?", + "go.faq.a2": "Go zawiera GLM-5, Kimi K2.5 i MiniMax M2.5, z hojnymi limitami i niezawodnym dostępem.", + "go.faq.q3": "Czy Go to to samo co Zen?", + "go.faq.a3": + "Nie. Zen działa w modelu pay-as-you-go (płacisz za użycie), podczas gdy Go to subskrypcja za $10/miesiąc z hojnymi limitami i niezawodnym dostępem do modeli open source GLM-5, Kimi K2.5 i MiniMax M2.5.", + "go.faq.q4": "Ile kosztuje Go?", + "go.faq.a4.p1.beforePricing": "Go kosztuje", + "go.faq.a4.p1.pricingLink": "$10/miesiąc", + "go.faq.a4.p1.afterPricing": "z hojnymi limitami.", + "go.faq.a4.p2.beforeAccount": "Możesz zarządzać subskrypcją na swoim", + "go.faq.a4.p2.accountLink": "koncie", + "go.faq.a4.p3": "Anuluj w dowolnym momencie.", + "go.faq.q5": "A co z danymi i prywatnością?", + "go.faq.a5.body": + "Plan został zaprojektowany głównie dla użytkowników międzynarodowych, z modelami hostowanymi w USA, UE i Singapurze, aby zapewnić stabilny globalny dostęp.", + "go.faq.a5.contactAfter": "jeśli masz jakiekolwiek pytania.", + "go.faq.a5.beforeExceptions": + "Modele Go są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli, z", + "go.faq.a5.exceptionsLink": "następującymi wyjątkami", + "go.faq.q6": "Czy mogę doładować środki?", + "go.faq.a6": "Jeśli potrzebujesz większego użycia, możesz doładować środki na swoim koncie.", + "go.faq.q7": "Czy mogę anulować?", + "go.faq.a7": "Tak, możesz anulować w dowolnym momencie.", + "go.faq.q8": "Czy mogę używać Go z innymi agentami kodującymi?", + "go.faq.a8": + "Tak, możesz używać Go z dowolnym agentem. Postępuj zgodnie z instrukcjami konfiguracji w swoim preferowanym agencie.", + + "go.faq.q9": "Jaka jest różnica między darmowymi modelami a Go?", + "go.faq.a9": + "Darmowe modele obejmują Big Pickle oraz modele promocyjne dostępne w danym momencie, z limitem 200 zapytań/dzień. Go zawiera GLM-5, Kimi K2.5 i MiniMax M2.5 z wyższymi limitami zapytań egzekwowanymi w oknach kroczących (5-godzinnych, tygodniowych i miesięcznych), w przybliżeniu równoważnymi $12 na 5 godzin, $30 tygodniowo i $60 miesięcznie (rzeczywista liczba zapytań zależy od modelu i użycia).", + "zen.api.error.rateLimitExceeded": "Przekroczono limit zapytań. Spróbuj ponownie później.", "zen.api.error.modelNotSupported": "Model {{model}} nie jest obsługiwany", "zen.api.error.modelFormatNotSupported": "Model {{model}} nie jest obsługiwany dla formatu {{format}}", diff --git a/packages/console/app/src/i18n/ru.ts b/packages/console/app/src/i18n/ru.ts index d0db17d29a..5ac9a7ab5f 100644 --- a/packages/console/app/src/i18n/ru.ts +++ b/packages/console/app/src/i18n/ru.ts @@ -253,6 +253,107 @@ export const dict = { "Все модели Zen размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за", "zen.privacy.exceptionsLink": "следующими исключениями", + "go.title": "OpenCode Go | Недорогие модели для кодинга для всех", + "go.meta.description": + "Go — это подписка за $10/месяц с щедрыми 5-часовыми лимитами запросов для GLM-5, Kimi K2.5 и MiniMax M2.5.", + "go.hero.title": "Недорогие модели для кодинга для всех", + "go.hero.body": + "Go открывает доступ к агентам-программистам разработчикам по всему миру. Предлагая щедрые лимиты и надежный доступ к наиболее способным моделям с открытым исходным кодом, вы можете создавать проекты с мощными агентами, не беспокоясь о затратах или доступности.", + + "go.cta.start": "Подписаться на Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Подписаться на Go", + "go.cta.price": "$10/месяц", + "go.pricing.body": "Используйте с любым агентом. Пополняйте баланс при необходимости. Отменяйте в любое время.", + "go.graph.free": "Бесплатно", + "go.graph.freePill": "Big Pickle и бесплатные модели", + "go.graph.go": "Go", + "go.graph.label": "Запросов за 5 часов", + "go.graph.usageLimits": "Лимиты использования", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "Запросов за 5ч: {{free}} против {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "ex-CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "изменил мою жизнь, это действительно очевидный выбор.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, и ViewPoint", + "go.testimonials.jay.quoteBefore": "4 из 5 человек в нашей команде любят использовать", + "go.testimonials.jay.quoteAfter": ".", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "ex-Hero, AWS", + "go.testimonials.adam.quoteBefore": "Я не могу не порекомендовать", + "go.testimonials.adam.quoteAfter": "достаточно сильно. Серьезно, это очень круто.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "ex-Head of Design, Laravel", + "go.testimonials.david.quoteBefore": "С", + "go.testimonials.david.quoteAfter": + "я знаю, что все модели протестированы и идеально подходят для агентов-программистов.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "ex-Intern, Nvidia (4 раза)", + "go.testimonials.frank.quote": "Жаль, что я больше не в Nvidia.", + "go.problem.title": "Какую проблему решает Go?", + "go.problem.body": + "Мы сосредоточены на том, чтобы сделать OpenCode доступным как можно большему числу людей. OpenCode Go — это недорогая ($10/месяц) подписка, разработанная, чтобы сделать агентов-программистов доступными для разработчиков по всему миру. Она предоставляет щедрые лимиты и надежный доступ к самым способным моделям с открытым исходным кодом.", + "go.problem.subtitle": " ", + "go.problem.item1": "Недорогая подписка", + "go.problem.item2": "Щедрые лимиты и надежный доступ", + "go.problem.item3": "Создан для максимального числа программистов", + "go.problem.item4": "Включает GLM-5, Kimi K2.5 и MiniMax M2.5", + "go.how.title": "Как работает Go", + "go.how.body": "Go — это подписка за $10/месяц, которую можно использовать с OpenCode или любым агентом.", + "go.how.step1.title": "Создайте аккаунт", + "go.how.step1.beforeLink": "следуйте", + "go.how.step1.link": "инструкциям по настройке", + "go.how.step2.title": "Подпишитесь на Go", + "go.how.step2.link": "$10/месяц", + "go.how.step2.afterLink": "с щедрыми лимитами", + "go.how.step3.title": "Начните кодить", + "go.how.step3.body": "с надежным доступом к open-source моделям", + "go.privacy.title": "Ваша приватность важна для нас", + "go.privacy.body": + "План разработан в первую очередь для международных пользователей, с моделями, размещенными в США, ЕС и Сингапуре для стабильного глобального доступа.", + "go.privacy.contactAfter": "если у вас есть вопросы.", + "go.privacy.beforeExceptions": + "Модели Go размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за", + "go.privacy.exceptionsLink": "следующими исключениями", + "go.faq.q1": "Что такое OpenCode Go?", + "go.faq.a1": + "Go — это недорогая подписка, дающая надежный доступ к мощным моделям с открытым исходным кодом для агентов-программистов.", + "go.faq.q2": "Какие модели включает Go?", + "go.faq.a2": "Go включает GLM-5, Kimi K2.5 и MiniMax M2.5, с щедрыми лимитами и надежным доступом.", + "go.faq.q3": "Go — это то же самое, что и Zen?", + "go.faq.a3": + "Нет. Zen работает по системе оплаты за использование (pay-as-you-go), тогда как Go — это подписка за $10/месяц с щедрыми лимитами и надежным доступом к open-source моделям GLM-5, Kimi K2.5 и MiniMax M2.5.", + "go.faq.q4": "Сколько стоит Go?", + "go.faq.a4.p1.beforePricing": "Go стоит", + "go.faq.a4.p1.pricingLink": "$10/месяц", + "go.faq.a4.p1.afterPricing": "с щедрыми лимитами.", + "go.faq.a4.p2.beforeAccount": "Вы можете управлять подпиской в своем", + "go.faq.a4.p2.accountLink": "аккаунте", + "go.faq.a4.p3": "Отмена в любое время.", + "go.faq.q5": "Как насчет данных и приватности?", + "go.faq.a5.body": + "План разработан в первую очередь для международных пользователей, с моделями, размещенными в США, ЕС и Сингапуре для стабильного глобального доступа.", + "go.faq.a5.contactAfter": "если у вас есть вопросы.", + "go.faq.a5.beforeExceptions": + "Модели Go размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за", + "go.faq.a5.exceptionsLink": "следующими исключениями", + "go.faq.q6": "Могу ли я пополнить баланс?", + "go.faq.a6": "Если вам нужно больше использования, вы можете пополнить баланс в своем аккаунте.", + "go.faq.q7": "Могу ли я отменить подписку?", + "go.faq.a7": "Да, вы можете отменить подписку в любое время.", + "go.faq.q8": "Могу ли я использовать Go с другими кодинг-агентами?", + "go.faq.a8": + "Да, вы можете использовать Go с любым агентом. Следуйте инструкциям по настройке в вашем предпочитаемом агенте.", + + "go.faq.q9": "В чем разница между бесплатными моделями и Go?", + "go.faq.a9": + "Бесплатные модели включают Big Pickle плюс промо-модели, доступные на данный момент, с квотой 200 запросов/день. Go включает GLM-5, Kimi K2.5 и MiniMax M2.5 с более высокими квотами запросов, применяемыми в скользящих окнах (5 часов, неделя и месяц), что примерно эквивалентно $12 за 5 часов, $30 в неделю и $60 в месяц (фактическое количество запросов зависит от модели и использования).", + "zen.api.error.rateLimitExceeded": "Превышен лимит запросов. Пожалуйста, попробуйте позже.", "zen.api.error.modelNotSupported": "Модель {{model}} не поддерживается", "zen.api.error.modelFormatNotSupported": "Модель {{model}} не поддерживается для формата {{format}}", diff --git a/packages/console/app/src/i18n/th.ts b/packages/console/app/src/i18n/th.ts index 129b789c97..b442597f18 100644 --- a/packages/console/app/src/i18n/th.ts +++ b/packages/console/app/src/i18n/th.ts @@ -248,6 +248,105 @@ export const dict = { "โมเดล Zen ทั้งหมดโฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี", "zen.privacy.exceptionsLink": "ข้อยกเว้นดังนี้", + "go.title": "OpenCode Go | โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน", + "go.meta.description": + "Go คือการสมัครสมาชิกราคา $10/เดือน พร้อมขีดจำกัดการร้องขอที่กว้างขวางถึง 5 ชั่วโมงสำหรับ GLM-5, Kimi K2.5 และ MiniMax M2.5", + "go.hero.title": "โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน", + "go.hero.body": + "Go นำการเขียนโค้ดแบบเอเจนต์มาสู่นักเขียนโปรแกรมทั่วโลก เสนอขีดจำกัดที่กว้างขวางและการเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสูงสุดได้อย่างน่าเชื่อถือ เพื่อให้คุณสามารถสร้างสรรค์ด้วยเอเจนต์ที่ทรงพลังโดยไม่ต้องกังวลเรื่องค่าใช้จ่ายหรือความพร้อมใช้งาน", + + "go.cta.start": "สมัครสมาชิก Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "สมัครสมาชิก Go", + "go.cta.price": "$10/เดือน", + "go.pricing.body": "ใช้กับเอเจนต์ใดก็ได้ เติมเงินเครดิตหากต้องการ ยกเลิกได้ตลอดเวลา", + "go.graph.free": "ฟรี", + "go.graph.freePill": "Big Pickle และโมเดลฟรี", + "go.graph.go": "Go", + "go.graph.label": "คำขอต่อ 5 ชั่วโมง", + "go.graph.usageLimits": "ขีดจำกัดการใช้งาน", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "คำขอต่อ 5 ชม.: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "อดีต CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "เปลี่ยนชีวิตไปเลย มันเป็นสิ่งที่ต้องมีจริงๆ", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "อดีตผู้ก่อตั้ง SEED, PM, Melt, Pop, Dapt, Cadmus และ ViewPoint", + "go.testimonials.jay.quoteBefore": "4 ใน 5 คนในทีมของเราชอบใช้", + "go.testimonials.jay.quoteAfter": "", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "อดีต Hero, AWS", + "go.testimonials.adam.quoteBefore": "ผมแนะนำ", + "go.testimonials.adam.quoteAfter": "ได้ไม่พอจริงๆ พูดจริงนะ มันดีมากๆ", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "อดีตหัวหน้าฝ่ายออกแบบ, Laravel", + "go.testimonials.david.quoteBefore": "ด้วย", + "go.testimonials.david.quoteAfter": "ผมรู้ว่าโมเดลทั้งหมดผ่านการทดสอบและสมบูรณ์แบบสำหรับเอเจนต์เขียนโค้ด", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "อดีตเด็กฝึกงาน, Nvidia (4 ครั้ง)", + "go.testimonials.frank.quote": "ผมหวังว่าผมจะยังอยู่ที่ Nvidia", + "go.problem.title": "Go แก้ปัญหาอะไร?", + "go.problem.body": + "เรามุ่งเน้นที่จะนำประสบการณ์ OpenCode ไปสู่ผู้คนให้ได้มากที่สุด OpenCode Go เป็นการสมัครสมาชิกราคาประหยัด ($10/เดือน) ที่ออกแบบมาเพื่อนำการเขียนโค้ดแบบเอเจนต์มาสู่นักเขียนโปรแกรมทั่วโลก โดยมอบขีดจำกัดที่กว้างขวางและการเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสูงสุดได้อย่างน่าเชื่อถือ", + "go.problem.subtitle": " ", + "go.problem.item1": "ราคาการสมัครสมาชิกที่ต่ำ", + "go.problem.item2": "ขีดจำกัดที่กว้างขวางและการเข้าถึงที่เชื่อถือได้", + "go.problem.item3": "สร้างขึ้นเพื่อโปรแกรมเมอร์จำนวนมากที่สุดเท่าที่จะเป็นไปได้", + "go.problem.item4": "รวมถึง GLM-5, Kimi K2.5 และ MiniMax M2.5", + "go.how.title": "Go ทำงานอย่างไร", + "go.how.body": "Go คือการสมัครสมาชิกราคา $10/เดือน ที่คุณสามารถใช้กับ OpenCode หรือเอเจนต์ใดก็ได้", + "go.how.step1.title": "สร้างบัญชี", + "go.how.step1.beforeLink": "ทำตาม", + "go.how.step1.link": "คำแนะนำการตั้งค่า", + "go.how.step2.title": "สมัครสมาชิก Go", + "go.how.step2.link": "$10/เดือน", + "go.how.step2.afterLink": "ด้วยขีดจำกัดที่กว้างขวาง", + "go.how.step3.title": "เริ่มเขียนโค้ด", + "go.how.step3.body": "ด้วยการเข้าถึงโมเดลโอเพนซอร์สที่เชื่อถือได้", + "go.privacy.title": "ความเป็นส่วนตัวของคุณสำคัญสำหรับเรา", + "go.privacy.body": + "แผนนี้ออกแบบมาเพื่อผู้ใช้งานระหว่างประเทศเป็นหลัก โดยมีโมเดลโฮสต์ในสหรัฐอเมริกา สหภาพยุโรป และสิงคโปร์ เพื่อการเข้าถึงทั่วโลกที่เสถียร", + "go.privacy.contactAfter": "หากคุณมีคำถามใดๆ", + "go.privacy.beforeExceptions": + "โมเดล Go โฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี", + "go.privacy.exceptionsLink": "ข้อยกเว้นดังนี้", + "go.faq.q1": "OpenCode Go คืออะไร?", + "go.faq.a1": + "Go คือการสมัครสมาชิกราคาประหยัดที่ให้คุณเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสำหรับการเขียนโค้ดแบบเอเจนต์ได้อย่างน่าเชื่อถือ", + "go.faq.q2": "Go รวมโมเดลอะไรบ้าง?", + "go.faq.a2": "Go รวมถึง GLM-5, Kimi K2.5 และ MiniMax M2.5 พร้อมขีดจำกัดที่กว้างขวางและการเข้าถึงที่เชื่อถือได้", + "go.faq.q3": "Go เหมือนกับ Zen หรือไม่?", + "go.faq.a3": + "ไม่ Zen เป็นแบบจ่ายตามการใช้งาน (pay-as-you-go) ในขณะที่ Go เป็นการสมัครสมาชิกราคา $10/เดือน พร้อมขีดจำกัดที่กว้างขวางและการเข้าถึงโมเดลโอเพนซอร์ส GLM-5, Kimi K2.5 และ MiniMax M2.5 ได้อย่างน่าเชื่อถือ", + "go.faq.q4": "Go ราคาเท่าไหร่?", + "go.faq.a4.p1.beforePricing": "Go ราคา", + "go.faq.a4.p1.pricingLink": "$10/เดือน", + "go.faq.a4.p1.afterPricing": "พร้อมขีดจำกัดที่กว้างขวาง", + "go.faq.a4.p2.beforeAccount": "คุณสามารถจัดการการสมัครสมาชิกของคุณได้ใน", + "go.faq.a4.p2.accountLink": "บัญชีของคุณ", + "go.faq.a4.p3": "ยกเลิกได้ตลอดเวลา", + "go.faq.q5": "แล้วเรื่องข้อมูลและความเป็นส่วนตัวล่ะ?", + "go.faq.a5.body": + "แผนนี้ออกแบบมาเพื่อผู้ใช้งานระหว่างประเทศเป็นหลัก โดยมีโมเดลโฮสต์ในสหรัฐอเมริกา สหภาพยุโรป และสิงคโปร์ เพื่อการเข้าถึงทั่วโลกที่เสถียร", + "go.faq.a5.contactAfter": "หากคุณมีคำถามใดๆ", + "go.faq.a5.beforeExceptions": + "โมเดล Go โฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี", + "go.faq.a5.exceptionsLink": "ข้อยกเว้นดังนี้", + "go.faq.q6": "ฉันสามารถเติมเครดิตได้หรือไม่?", + "go.faq.a6": "หากคุณต้องการใช้งานเพิ่ม คุณสามารถเติมเครดิตในบัญชีของคุณได้", + "go.faq.q7": "ฉันสามารถยกเลิกได้หรือไม่?", + "go.faq.a7": "ได้ คุณสามารถยกเลิกได้ตลอดเวลา", + "go.faq.q8": "ฉันสามารถใช้ Go กับเอเจนต์เขียนโค้ดอื่นได้หรือไม่?", + "go.faq.a8": "ได้ คุณสามารถใช้ Go กับเอเจนต์ใดก็ได้ ทำตามคำแนะนำการตั้งค่าในเอเจนต์เขียนโค้ดที่คุณต้องการ", + + "go.faq.q9": "ความแตกต่างระหว่างโมเดลฟรีและ Go คืออะไร?", + "go.faq.a9": + "โมเดลฟรีรวมถึง Big Pickle บวกกับโมเดลโปรโมชั่นที่มีให้ในขณะนั้น ด้วยโควต้า 200 คำขอ/วัน Go รวมถึง GLM-5, Kimi K2.5 และ MiniMax M2.5 ที่มีโควต้าคำขอสูงกว่า ซึ่งบังคับใช้ผ่านช่วงเวลาหมุนเวียน (5 ชั่วโมง, รายสัปดาห์ และรายเดือน) เทียบเท่าประมาณ $12 ต่อ 5 ชั่วโมง, $30 ต่อสัปดาห์ และ $60 ต่อเดือน (จำนวนคำขอจริงจะแตกต่างกันไปตามโมเดลและการใช้งาน)", + "zen.api.error.rateLimitExceeded": "เกินขีดจำกัดอัตราการใช้งาน กรุณาลองใหม่ในภายหลัง", "zen.api.error.modelNotSupported": "ไม่รองรับโมเดล {{model}}", "zen.api.error.modelFormatNotSupported": "ไม่รองรับโมเดล {{model}} สำหรับรูปแบบ {{format}}", diff --git a/packages/console/app/src/i18n/tr.ts b/packages/console/app/src/i18n/tr.ts index bd7a3042d7..12e88ca12d 100644 --- a/packages/console/app/src/i18n/tr.ts +++ b/packages/console/app/src/i18n/tr.ts @@ -251,6 +251,107 @@ export const dict = { "Tüm Zen modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu", "zen.privacy.exceptionsLink": "aşağıdaki istisnalar", + "go.title": "OpenCode Go | Herkes için düşük maliyetli kodlama modelleri", + "go.meta.description": + "Go, GLM-5, Kimi K2.5 ve MiniMax M2.5 için cömert 5 saatlik istek limitleri sunan aylık 10$'lık bir aboneliktir.", + "go.hero.title": "Herkes için düşük maliyetli kodlama modelleri", + "go.hero.body": + "Go, dünya çapındaki programcılara ajan tabanlı kodlama getiriyor. En yetenekli açık kaynaklı modellere cömert limitler ve güvenilir erişim sunarak, maliyet veya erişilebilirlik konusunda endişelenmeden güçlü ajanlarla geliştirme yapmanızı sağlar.", + + "go.cta.start": "Go'ya abone ol", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "Go'ya abone ol", + "go.cta.price": "Ayda 10$", + "go.pricing.body": "Herhangi bir ajanla kullanın. Gerekirse kredi yükleyin. İstediğiniz zaman iptal edin.", + "go.graph.free": "Ücretsiz", + "go.graph.freePill": "Big Pickle ve ücretsiz modeller", + "go.graph.go": "Go", + "go.graph.label": "5 saat başına istekler", + "go.graph.usageLimits": "Kullanım limitleri", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "5 saatlik istekler: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "Eski CEO, Terminal Ürünleri", + "go.testimonials.dax.quoteAfter": "hayat değiştirdi, gerçekten düşünmeye bile gerek yok.", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "Eski Kurucu, SEED, PM, Melt, Pop, Dapt, Cadmus ve ViewPoint", + "go.testimonials.jay.quoteBefore": "Ekibimizdeki 5 kişiden 4'ü", + "go.testimonials.jay.quoteAfter": "kullanmayı seviyor.", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "Eski Hero, AWS", + "go.testimonials.adam.quoteBefore": "", + "go.testimonials.adam.quoteAfter": "için tavsiyem sonsuz. Cidden, gerçekten çok iyi.", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "Eski Tasarım Başkanı, Laravel", + "go.testimonials.david.quoteBefore": "", + "go.testimonials.david.quoteAfter": + " ile modellerin test edildiğini ve kodlama ajanları için mükemmel olduğunu biliyorum.", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "Eski Stajyer, Nvidia (4 kez)", + "go.testimonials.frank.quote": "Keşke hala Nvidia'da olsaydım.", + "go.problem.title": "Go hangi sorunu çözüyor?", + "go.problem.body": + "OpenCode deneyimini mümkün olduğunca çok kişiye ulaştırmaya odaklanıyoruz. OpenCode Go, ajan tabanlı kodlamayı dünya çapındaki programcılara sunmak için tasarlanmış düşük maliyetli (ayda 10$) bir aboneliktir. En yetenekli açık kaynaklı modellere cömert limitler ve güvenilir erişim sağlar.", + "go.problem.subtitle": " ", + "go.problem.item1": "Düşük maliyetli abonelik fiyatlandırması", + "go.problem.item2": "Cömert limitler ve güvenilir erişim", + "go.problem.item3": "Mümkün olduğunca çok programcı için geliştirildi", + "go.problem.item4": "GLM-5, Kimi K2.5 ve MiniMax M2.5 içerir", + "go.how.title": "Go nasıl çalışır?", + "go.how.body": "Go, OpenCode veya herhangi bir ajanla kullanabileceğiniz aylık 10$'lık bir aboneliktir.", + "go.how.step1.title": "Bir hesap oluşturun", + "go.how.step1.beforeLink": "takip edin", + "go.how.step1.link": "kurulum talimatları", + "go.how.step2.title": "Go'ya abone olun", + "go.how.step2.link": "Ayda 10$", + "go.how.step2.afterLink": ", cömert limitlerle", + "go.how.step3.title": "Kodlamaya başlayın", + "go.how.step3.body": "açık kaynaklı modellere güvenilir erişimle", + "go.privacy.title": "Gizliliğiniz bizim için önemlidir", + "go.privacy.body": + "Bu plan öncelikle uluslararası kullanıcılar için tasarlanmış olup, istikrarlı küresel erişim için modeller ABD, AB ve Singapur'da barındırılmaktadır.", + "go.privacy.contactAfter": "herhangi bir sorunuz varsa.", + "go.privacy.beforeExceptions": + "Go modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu", + "go.privacy.exceptionsLink": "aşağıdaki istisnalar", + "go.faq.q1": "OpenCode Go nedir?", + "go.faq.a1": + "Go, ajan tabanlı kodlama için yetenekli açık kaynaklı modellere güvenilir erişim sağlayan düşük maliyetli bir aboneliktir.", + "go.faq.q2": "Go hangi modelleri içerir?", + "go.faq.a2": "Go, cömert limitler ve güvenilir erişim ile GLM-5, Kimi K2.5 ve MiniMax M2.5 modellerini içerir.", + "go.faq.q3": "Go, Zen ile aynı mı?", + "go.faq.a3": + "Hayır. Zen kullandıkça öde sistemidir; Go ise GLM-5, Kimi K2.5 ve MiniMax M2.5 açık kaynak modellerine cömert limitler ve güvenilir erişim sağlayan aylık 10$'lık bir aboneliktir.", + "go.faq.q4": "Go ne kadar?", + "go.faq.a4.p1.beforePricing": "Go'nun maliyeti", + "go.faq.a4.p1.pricingLink": "ayda 10$", + "go.faq.a4.p1.afterPricing": ", cömert limitlerle.", + "go.faq.a4.p2.beforeAccount": "Aboneliğinizi", + "go.faq.a4.p2.accountLink": "hesabınızdan", + "go.faq.a4.p3": "yönetebilirsiniz. İstediğiniz zaman iptal edin.", + "go.faq.q5": "Veri ve gizlilik ne olacak?", + "go.faq.a5.body": + "Bu plan öncelikle uluslararası kullanıcılar için tasarlanmış olup, istikrarlı küresel erişim için modeller ABD, AB ve Singapur'da barındırılmaktadır.", + "go.faq.a5.contactAfter": "herhangi bir sorunuz varsa.", + "go.faq.a5.beforeExceptions": + "Go modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu", + "go.faq.a5.exceptionsLink": "aşağıdaki istisnalar", + "go.faq.q6": "Kredi yükleyebilir miyim?", + "go.faq.a6": "Daha fazla kullanıma ihtiyacınız varsa, hesabınıza kredi yükleyebilirsiniz.", + "go.faq.q7": "İptal edebilir miyim?", + "go.faq.a7": "Evet, istediğiniz zaman iptal edebilirsiniz.", + "go.faq.q8": "Go'yu diğer kodlama ajanlarıyla kullanabilir miyim?", + "go.faq.a8": + "Evet, Go'yu herhangi bir ajanla kullanabilirsiniz. Tercih ettiğiniz kodlama ajanındaki kurulum talimatlarını izleyin.", + + "go.faq.q9": "Ücretsiz modeller ve Go arasındaki fark nedir?", + "go.faq.a9": + "Ücretsiz modeller, günlük 200 istek kotası ile Big Pickle ve o sırada mevcut olan promosyonel modelleri içerir. Go ise GLM-5, Kimi K2.5 ve MiniMax M2.5 modellerini; yuvarlanan pencereler (5 saatlik, haftalık ve aylık) üzerinden uygulanan daha yüksek istek kotalarıyla içerir. Bu kotalar kabaca her 5 saatte 12$, haftada 30$ ve ayda 60$ değerine eşdeğerdir (gerçek istek sayıları modele ve kullanıma göre değişir).", + "zen.api.error.rateLimitExceeded": "İstek limiti aşıldı. Lütfen daha sonra tekrar deneyin.", "zen.api.error.modelNotSupported": "{{model}} modeli desteklenmiyor", "zen.api.error.modelFormatNotSupported": "{{model}} modeli {{format}} formatı için desteklenmiyor", diff --git a/packages/console/app/src/i18n/zh.ts b/packages/console/app/src/i18n/zh.ts index 74c8de4344..d358d166ea 100644 --- a/packages/console/app/src/i18n/zh.ts +++ b/packages/console/app/src/i18n/zh.ts @@ -238,6 +238,99 @@ export const dict = { "zen.privacy.beforeExceptions": "所有 Zen 模型均托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,", "zen.privacy.exceptionsLink": "以下例外情况除外", + "go.title": "OpenCode Go | 人人可用的低成本编程模型", + "go.meta.description": "Go 是每月 $10 的订阅服务,提供对 GLM-5, Kimi K2.5, 和 MiniMax M2.5 的 5 小时内充裕请求限额。", + "go.hero.title": "人人可用的低成本编程模型", + "go.hero.body": + "Go 将代理编程带给全世界的程序员。提供充裕的限额和对最强大的开源模型的可靠访问,让您可以利用强大的代理进行构建,而无需担心成本或可用性。", + + "go.cta.start": "订阅 Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "订阅 Go", + "go.cta.price": "$10/月", + "go.pricing.body": "可配合任何代理使用。按需充值。随时取消。", + "go.graph.free": "免费", + "go.graph.freePill": "Big Pickle 和免费模型", + "go.graph.go": "Go", + "go.graph.label": "每 5 小时请求数", + "go.graph.usageLimits": "使用限制", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "每 5 小时请求数: {{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "前 CEO, Terminal Products", + "go.testimonials.dax.quoteAfter": "彻底改变了我的生活,这绝对是不二之选。", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "前创始人, SEED, PM, Melt, Pop, Dapt, Cadmus, 和 ViewPoint", + "go.testimonials.jay.quoteBefore": "我们团队 5 个人里有 4 个都爱用", + "go.testimonials.jay.quoteAfter": "。", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "前 Hero, AWS", + "go.testimonials.adam.quoteBefore": "我强烈推荐", + "go.testimonials.adam.quoteAfter": "。真的,非常好用。", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "前设计主管, Laravel", + "go.testimonials.david.quoteBefore": "有了", + "go.testimonials.david.quoteAfter": "我知道所有模型都经过测试,非常适合编程代理。", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "前实习生, Nvidia (4 次)", + "go.testimonials.frank.quote": "我希望我还在 Nvidia。", + "go.problem.title": "Go 解决了什么问题?", + "go.problem.body": + "我们致力于将 OpenCode 体验带给尽可能多的人。OpenCode Go 是一个低成本 ($10/月) 的订阅服务,旨在将代理编程带给全世界的程序员。它提供充裕的限额和对最强大的开源模型的可靠访问。", + "go.problem.subtitle": " ", + "go.problem.item1": "低成本订阅定价", + "go.problem.item2": "充裕的限额和可靠的访问", + "go.problem.item3": "为尽可能多的程序员打造", + "go.problem.item4": "包含 GLM-5, Kimi K2.5, 和 MiniMax M2.5", + "go.how.title": "Go 如何工作", + "go.how.body": "Go 是每月 $10 的订阅服务,您可以配合 OpenCode 或任何代理使用。", + "go.how.step1.title": "创建账户", + "go.how.step1.beforeLink": "遵循", + "go.how.step1.link": "设置说明", + "go.how.step2.title": "订阅 Go", + "go.how.step2.link": "$10/月", + "go.how.step2.afterLink": "享受充裕限额", + "go.how.step3.title": "开始编程", + "go.how.step3.body": "可靠访问开源模型", + "go.privacy.title": "您的隐私对我们很重要", + "go.privacy.body": "该计划主要面向国际用户设计,模型部署在美国、欧盟和新加坡,以确保稳定的全球访问。", + "go.privacy.contactAfter": "如果您有任何问题。", + "go.privacy.beforeExceptions": "Go 模型托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,", + "go.privacy.exceptionsLink": "以下例外情况除外", + "go.faq.q1": "什么是 OpenCode Go?", + "go.faq.a1": "Go 是一项低成本订阅服务,为您提供对强大的开源模型的可靠访问,用于代理编程。", + "go.faq.q2": "Go 包含哪些模型?", + "go.faq.a2": "Go 包含 GLM-5, Kimi K2.5, 和 MiniMax M2.5,并提供充裕的限额和可靠的访问。", + "go.faq.q3": "Go 和 Zen 一样吗?", + "go.faq.a3": + "不一样。Zen 是即用即付,而 Go 是每月 $10 的订阅服务,提供对开源模型 GLM-5, Kimi K2.5, 和 MiniMax M2.5 的充裕限额和可靠访问。", + "go.faq.q4": "Go 多少钱?", + "go.faq.a4.p1.beforePricing": "Go 费用为", + "go.faq.a4.p1.pricingLink": "$10/月", + "go.faq.a4.p1.afterPricing": "包含充裕限额。", + "go.faq.a4.p2.beforeAccount": "您可以在您的", + "go.faq.a4.p2.accountLink": "账户", + "go.faq.a4.p3": "中管理订阅。随时取消。", + "go.faq.q5": "数据和隐私如何?", + "go.faq.a5.body": "该计划主要面向国际用户设计,模型部署在美国、欧盟和新加坡,以确保稳定的全球访问。", + "go.faq.a5.contactAfter": "如果您有任何问题。", + "go.faq.a5.beforeExceptions": "Go 模型托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,", + "go.faq.a5.exceptionsLink": "以下例外情况除外", + "go.faq.q6": "我可以充值余额吗?", + "go.faq.a6": "如果您需要更多用量,可以在账户中充值余额。", + "go.faq.q7": "我可以取消吗?", + "go.faq.a7": "可以,您可以随时取消。", + "go.faq.q8": "我可以在其他编程代理中使用 Go 吗?", + "go.faq.a8": "可以,您可以在任何代理中使用 Go。请遵循您首选编程代理中的设置说明。", + + "go.faq.q9": "免费模型和 Go 之间的区别是什么?", + "go.faq.a9": + "免费模型包含 Big Pickle 加上当时可用的促销模型,每天有 200 次请求的配额。Go 包含 GLM-5, Kimi K2.5, 和 MiniMax M2.5,并在滚动窗口(5 小时、每周和每月)内执行更高的请求配额,大致相当于每 5 小时 $12、每周 $30 和每月 $60(实际请求计数因模型和使用情况而异)。", + "zen.api.error.rateLimitExceeded": "超出速率限制。请稍后重试。", "zen.api.error.modelNotSupported": "不支持模型 {{model}}", "zen.api.error.modelFormatNotSupported": "格式 {{format}} 不支持模型 {{model}}", diff --git a/packages/console/app/src/i18n/zht.ts b/packages/console/app/src/i18n/zht.ts index db06860eed..71488405a8 100644 --- a/packages/console/app/src/i18n/zht.ts +++ b/packages/console/app/src/i18n/zht.ts @@ -238,6 +238,100 @@ export const dict = { "zen.privacy.beforeExceptions": "所有 Zen 模型均在美國託管。供應商遵循零留存政策,不會將你的資料用於模型訓練,並且有", "zen.privacy.exceptionsLink": "以下例外情況", + "go.title": "OpenCode Go | 低成本全民編碼模型", + "go.meta.description": + "Go 是一個每月 $10 的訂閱方案,提供對 GLM-5、Kimi K2.5 與 MiniMax M2.5 的 5 小時寬裕使用限額。", + "go.hero.title": "低成本全民編碼模型", + "go.hero.body": + "Go 將代理編碼帶給全世界的程式設計師。提供寬裕的限額以及對最強大開源模型的穩定存取,讓你可以使用強大的代理進行構建,而無需擔心成本或可用性。", + + "go.cta.start": "訂閱 Go", + "go.cta.template": "{{text}} {{price}}", + "go.cta.text": "訂閱 Go", + "go.cta.price": "$10/月", + "go.pricing.body": "可與任何代理一起使用。需要時可儲值額度。隨時取消。", + "go.graph.free": "免費", + "go.graph.freePill": "Big Pickle 與免費模型", + "go.graph.go": "Go", + "go.graph.label": "每 5 小時請求數", + "go.graph.usageLimits": "使用限制", + "go.graph.tick": "{{n}}x", + "go.graph.aria": "每 5 小時請求數:{{free}} vs {{go}}", + + "go.testimonials.brand.zen": "Zen", + "go.testimonials.brand.go": "Go", + "go.testimonials.handle": "@OpenCode", + "go.testimonials.dax.name": "Dax Raad", + "go.testimonials.dax.title": "前 Terminal Products CEO", + "go.testimonials.dax.quoteAfter": "改變了我的生活,這絕對是不二之選。", + "go.testimonials.jay.name": "Jay V", + "go.testimonials.jay.title": "前 SEED、Melt、Pop、Dapt、Cadmus 與 ViewPoint 創辦人", + "go.testimonials.jay.quoteBefore": "我們團隊中 5 個人有 4 個人喜歡使用", + "go.testimonials.jay.quoteAfter": "。", + "go.testimonials.adam.name": "Adam Elmore", + "go.testimonials.adam.title": "前 AWS Hero", + "go.testimonials.adam.quoteBefore": "我強烈推薦", + "go.testimonials.adam.quoteAfter": "。認真說,真的很好用。", + "go.testimonials.david.name": "David Hill", + "go.testimonials.david.title": "前 Laravel 設計總監", + "go.testimonials.david.quoteBefore": "有了", + "go.testimonials.david.quoteAfter": ",我知道所有模型都經過測試並且完美適用於編碼代理。", + "go.testimonials.frank.name": "Frank Wang", + "go.testimonials.frank.title": "前 Nvidia 實習生(4 次)", + "go.testimonials.frank.quote": "我希望我還在 Nvidia。", + "go.problem.title": "Go 正在解決什麼問題?", + "go.problem.body": + "我們致力於將 OpenCode 體驗帶給盡可能多的人。OpenCode Go 是一個低成本(每月 $10)的訂閱方案,旨在將代理編碼帶給全世界的程式設計師。它提供寬裕的限額以及對最強大開源模型的穩定存取。", + "go.problem.subtitle": " ", + "go.problem.item1": "低成本訂閱定價", + "go.problem.item2": "寬裕的限額與穩定存取", + "go.problem.item3": "專為盡可能多的程式設計師打造", + "go.problem.item4": "包含 GLM-5、Kimi K2.5 與 MiniMax M2.5", + "go.how.title": "Go 如何運作", + "go.how.body": "Go 是一個每月 $10 的訂閱方案,你可以將其與 OpenCode 或任何代理一起使用。", + "go.how.step1.title": "建立帳號", + "go.how.step1.beforeLink": "遵循", + "go.how.step1.link": "設定說明", + "go.how.step2.title": "訂閱 Go", + "go.how.step2.link": "$10/月", + "go.how.step2.afterLink": "享寬裕限額", + "go.how.step3.title": "開始編碼", + "go.how.step3.body": "穩定存取開源模型", + "go.privacy.title": "你的隱私對我們很重要", + "go.privacy.body": "該方案主要面向國際用戶設計,模型託管在美國、歐盟和新加坡,以確保全球穩定存取。", + "go.privacy.contactAfter": "如果你有任何問題。", + "go.privacy.beforeExceptions": "Go 模型託管在美國。供應商遵循零留存政策,不會將你的資料用於模型訓練,但有", + "go.privacy.exceptionsLink": "以下例外", + "go.faq.q1": "什麼是 OpenCode Go?", + "go.faq.a1": "Go 是一個低成本訂閱方案,讓你穩定存取強大的開源模型以進行代理編碼。", + "go.faq.q2": "Go 包含哪些模型?", + "go.faq.a2": "Go 包含 GLM-5、Kimi K2.5 與 MiniMax M2.5,並提供寬裕的限額與穩定存取。", + "go.faq.q3": "Go 與 Zen 一樣嗎?", + "go.faq.a3": + "不一樣。Zen 是按量付費,而 Go 是每月 $10 的訂閱方案,提供對開源模型 GLM-5、Kimi K2.5 與 MiniMax M2.5 的寬裕限額與穩定存取。", + "go.faq.q4": "Go 費用是多少?", + "go.faq.a4.p1.beforePricing": "Go 費用為", + "go.faq.a4.p1.pricingLink": "$10/月", + "go.faq.a4.p1.afterPricing": "享寬裕限額。", + "go.faq.a4.p2.beforeAccount": "你可以在你的", + "go.faq.a4.p2.accountLink": "帳戶", + "go.faq.a4.p3": "中管理訂閱。隨時取消。", + "go.faq.q5": "資料與隱私怎麼辦?", + "go.faq.a5.body": "該方案主要面向國際用戶設計,模型託管在美國、歐盟和新加坡,以確保全球穩定存取。", + "go.faq.a5.contactAfter": "如果你有任何問題。", + "go.faq.a5.beforeExceptions": "Go 模型託管在美國。供應商遵循零留存政策,不會將你的資料用於模型訓練,但有", + "go.faq.a5.exceptionsLink": "以下例外", + "go.faq.q6": "我可以儲值額度嗎?", + "go.faq.a6": "如果你需要更多使用量,可以在帳戶中儲值額度。", + "go.faq.q7": "我可以取消嗎?", + "go.faq.a7": "可以,你可以隨時取消。", + "go.faq.q8": "我可以在其他編碼代理中使用 Go 嗎?", + "go.faq.a8": "可以,你可以將 Go 與任何代理一起使用。請在你偏好的編碼代理中按照設定說明進行配置。", + + "go.faq.q9": "免費模型與 Go 有什麼區別?", + "go.faq.a9": + "免費模型包括 Big Pickle 以及當時可用的促銷模型,配額為 200 次請求/天。Go 包括 GLM-5、Kimi K2.5 與 MiniMax M2.5,並在滾動視窗(5 小時、每週和每月)內執行更高的請求配額,大約相當於每 5 小時 $12、每週 $30 和每月 $60(實際請求數因模型和使用情況而異)。", + "zen.api.error.rateLimitExceeded": "超出頻率限制。請稍後再試。", "zen.api.error.modelNotSupported": "不支援模型 {{model}}", "zen.api.error.modelFormatNotSupported": "模型 {{model}} 不支援格式 {{format}}", From 5f40bd42f844c35b8bfb695fbda20a8ec01f127e Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:00:17 -0600 Subject: [PATCH 18/42] fix(app): icon jiggle --- .../components/session/session-new-view.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/app/src/components/session/session-new-view.tsx b/packages/app/src/components/session/session-new-view.tsx index b7a544ba9a..79a20430e0 100644 --- a/packages/app/src/components/session/session-new-view.tsx +++ b/packages/app/src/components/session/session-new-view.tsx @@ -51,22 +51,22 @@ export function NewSessionView(props: NewSessionViewProps) { return (
    {language.t("command.session.new")}
    -
    - -
    +
    + +
    {getDirectory(projectRoot())} {getFilename(projectRoot())}
    -
    - -
    {label(current())}
    +
    + +
    {label(current())}
    {(project) => ( -
    - -
    +
    + +
    {language.t("session.new.lastModified")}  {DateTime.fromMillis(project().time.updated ?? project().time.created) From 07348d14a2013b25434b91aecb30a82546bed1c5 Mon Sep 17 00:00:00 2001 From: ismeth Date: Thu, 5 Mar 2026 14:35:16 +0100 Subject: [PATCH 19/42] fix(app): preserve question dock state across session switches (#16173) --- .../composer/session-question-dock.tsx | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/app/src/pages/session/composer/session-question-dock.tsx b/packages/app/src/pages/session/composer/session-question-dock.tsx index fd2ced3dc8..b22a92eb0a 100644 --- a/packages/app/src/pages/session/composer/session-question-dock.tsx +++ b/packages/app/src/pages/session/composer/session-question-dock.tsx @@ -8,6 +8,8 @@ import type { QuestionAnswer, QuestionRequest } from "@opencode-ai/sdk/v2" import { useLanguage } from "@/context/language" import { useSDK } from "@/context/sdk" +const cache = new Map() + export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit: () => void }> = (props) => { const sdk = useSDK() const language = useLanguage() @@ -15,16 +17,18 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit const questions = createMemo(() => props.request.questions) const total = createMemo(() => questions().length) + const cached = cache.get(props.request.id) const [store, setStore] = createStore({ - tab: 0, - answers: [] as QuestionAnswer[], - custom: [] as string[], - customOn: [] as boolean[], + tab: cached?.tab ?? 0, + answers: cached?.answers ?? ([] as QuestionAnswer[]), + custom: cached?.custom ?? ([] as string[]), + customOn: cached?.customOn ?? ([] as boolean[]), editing: false, sending: false, }) let root: HTMLDivElement | undefined + let replied = false const question = createMemo(() => questions()[store.tab]) const options = createMemo(() => question()?.options ?? []) @@ -107,6 +111,16 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit }) }) + onCleanup(() => { + if (replied) return + cache.set(props.request.id, { + tab: store.tab, + answers: store.answers.map((a) => (a ? [...a] : [])), + custom: store.custom.map((s) => s ?? ""), + customOn: store.customOn.map((b) => b ?? false), + }) + }) + const fail = (err: unknown) => { const message = err instanceof Error ? err.message : String(err) showToast({ title: language.t("common.requestFailed"), description: message }) @@ -119,6 +133,8 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit setStore("sending", true) try { await sdk.client.question.reply({ requestID: props.request.id, answers }) + replied = true + cache.delete(props.request.id) } catch (err) { fail(err) } finally { @@ -133,6 +149,8 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit setStore("sending", true) try { await sdk.client.question.reject({ requestID: props.request.id }) + replied = true + cache.delete(props.request.id) } catch (err) { fail(err) } finally { From 8cbe7b4a017fe3087d817e776e46adb0dfce3fa6 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:07:50 -0600 Subject: [PATCH 20/42] fix(app): file icon stability --- packages/ui/src/components/file-icon.css | 1 + packages/ui/src/components/file-icon.tsx | 17 +++++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/components/file-icon.css b/packages/ui/src/components/file-icon.css index a49674a90d..5776425de3 100644 --- a/packages/ui/src/components/file-icon.css +++ b/packages/ui/src/components/file-icon.css @@ -1,4 +1,5 @@ [data-component="file-icon"] { + display: block; flex-shrink: 0; width: 16px; height: 16px; diff --git a/packages/ui/src/components/file-icon.tsx b/packages/ui/src/components/file-icon.tsx index 405cbe163a..133cb169c7 100644 --- a/packages/ui/src/components/file-icon.tsx +++ b/packages/ui/src/components/file-icon.tsx @@ -1,10 +1,8 @@ import type { Component, JSX } from "solid-js" -import { createMemo, splitProps, Show } from "solid-js" +import { createMemo, createUniqueId, splitProps, Show } from "solid-js" import sprite from "./file-icons/sprite.svg" import type { IconName } from "./file-icons/types" -let filter = 0 - export type FileIconProps = JSX.GSVGAttributes & { node: { path: string; type: "file" | "directory" } expanded?: boolean @@ -14,7 +12,7 @@ export type FileIconProps = JSX.GSVGAttributes & { export const FileIcon: Component = (props) => { const [local, rest] = splitProps(props, ["node", "class", "classList", "expanded", "mono"]) const name = createMemo(() => chooseIconName(local.node.path, local.node.type, local.expanded || false)) - const id = `file-icon-mono-${filter++}` + const id = `file-icon-mono-${createUniqueId()}` return ( = (props) => { [local.class ?? ""]: !!local.class, }} > - + }> - - - - + + + + - ) } From 6c9ae5ce9fb83ebfe175d763d33df2a778db7f64 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:17:21 -0600 Subject: [PATCH 21/42] fix(app): file path truncation in session turn --- packages/ui/src/components/session-turn.css | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/ui/src/components/session-turn.css b/packages/ui/src/components/session-turn.css index 15d7b50352..cf1e981159 100644 --- a/packages/ui/src/components/session-turn.css +++ b/packages/ui/src/components/session-turn.css @@ -171,10 +171,8 @@ [data-slot="session-turn-diff-path"] { display: flex; + flex-grow: 1; min-width: 0; - align-items: baseline; - overflow: hidden; - white-space: nowrap; font-family: var(--font-family-sans); font-size: var(--font-size-small); @@ -182,24 +180,16 @@ } [data-slot="session-turn-diff-directory"] { - flex: 1 1 auto; - color: var(--text-weak); - min-width: 0; + color: var(--text-base); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; direction: rtl; - unicode-bidi: plaintext; text-align: left; } [data-slot="session-turn-diff-filename"] { flex-shrink: 0; - max-width: 100%; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; color: var(--text-strong); font-weight: var(--font-weight-medium); } From 6f9e5335dc53339c7bbb3d511867946b8aa535d3 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:17:41 -0600 Subject: [PATCH 22/42] fix(app): file icon stability --- packages/ui/src/components/tabs.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/components/tabs.css b/packages/ui/src/components/tabs.css index f8045702fd..51917489e2 100644 --- a/packages/ui/src/components/tabs.css +++ b/packages/ui/src/components/tabs.css @@ -241,26 +241,26 @@ [data-slot="tabs-trigger"] { .tab-fileicon-color, .tab-fileicon-mono { - transition: opacity 120ms ease; + pointer-events: none; } .tab-fileicon-color { - opacity: 0; + display: none; } .tab-fileicon-mono { - opacity: 1; + display: block; color: currentColor; } &[data-selected], &:hover { .tab-fileicon-color { - opacity: 1; + display: block; } .tab-fileicon-mono { - opacity: 0; + display: none; } } } From 4c185c70f22f93a3a467a4cc4a28934e4384e393 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:18:38 -0600 Subject: [PATCH 23/42] fix(app): provider settings consistency --- packages/app/src/components/settings-providers.tsx | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/app/src/components/settings-providers.tsx b/packages/app/src/components/settings-providers.tsx index 21db62950d..a9839758b7 100644 --- a/packages/app/src/components/settings-providers.tsx +++ b/packages/app/src/components/settings-providers.tsx @@ -17,6 +17,7 @@ type ProviderItem = ReturnType["connected"]>[num const PROVIDER_NOTES = [ { match: (id: string) => id === "opencode", key: "dialog.provider.opencode.note" }, + { match: (id: string) => id === "opencode-go", key: "dialog.provider.opencodeGo.tagline" }, { match: (id: string) => id === "anthropic", key: "dialog.provider.anthropic.note" }, { match: (id: string) => id.startsWith("github-copilot"), key: "dialog.provider.copilot.note" }, { match: (id: string) => id === "openai", key: "dialog.provider.openai.note" }, @@ -181,21 +182,11 @@ export const SettingsProviders: Component = () => {
    {item.name} - - - {language.t("dialog.provider.opencode.tagline")} - - {language.t("dialog.provider.tag.recommended")} - <> - - {language.t("dialog.provider.opencodeGo.tagline")} - - {language.t("dialog.provider.tag.recommended")} - + {language.t("dialog.provider.tag.recommended")}
    From 1a420a1a710e94bedfedbe61946f86265a347790 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:46:31 -0600 Subject: [PATCH 24/42] fix(app): websearch and codesearch tool rendering --- packages/ui/src/components/basic-tool.tsx | 39 +++++++- packages/ui/src/components/message-part.css | 40 ++++++++ packages/ui/src/components/message-part.tsx | 102 ++++++++++++++++++++ packages/ui/src/i18n/ar.ts | 2 + packages/ui/src/i18n/br.ts | 2 + packages/ui/src/i18n/bs.ts | 2 + packages/ui/src/i18n/da.ts | 2 + packages/ui/src/i18n/de.ts | 2 + packages/ui/src/i18n/en.ts | 2 + packages/ui/src/i18n/es.ts | 2 + packages/ui/src/i18n/fr.ts | 2 + packages/ui/src/i18n/ja.ts | 2 + packages/ui/src/i18n/ko.ts | 2 + packages/ui/src/i18n/no.ts | 2 + packages/ui/src/i18n/pl.ts | 2 + packages/ui/src/i18n/ru.ts | 2 + packages/ui/src/i18n/th.ts | 2 + packages/ui/src/i18n/tr.ts | 2 + packages/ui/src/i18n/zh.ts | 2 + packages/ui/src/i18n/zht.ts | 2 + 20 files changed, 213 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/components/basic-tool.tsx b/packages/ui/src/components/basic-tool.tsx index fff6e92f17..4ad91824da 100644 --- a/packages/ui/src/components/basic-tool.tsx +++ b/packages/ui/src/components/basic-tool.tsx @@ -203,6 +203,41 @@ export function BasicTool(props: BasicToolProps) { ) } -export function GenericTool(props: { tool: string; status?: string; hideDetails?: boolean }) { - return +function label(input: Record | undefined) { + const keys = ["description", "query", "url", "filePath", "path", "pattern", "name"] + return keys.map((key) => input?.[key]).find((value): value is string => typeof value === "string" && value.length > 0) +} + +function args(input: Record | undefined) { + if (!input) return [] + const skip = new Set(["description", "query", "url", "filePath", "path", "pattern", "name"]) + return Object.entries(input) + .filter(([key]) => !skip.has(key)) + .flatMap(([key, value]) => { + if (typeof value === "string") return [`${key}=${value}`] + if (typeof value === "number") return [`${key}=${value}`] + if (typeof value === "boolean") return [`${key}=${value}`] + return [] + }) + .slice(0, 3) +} + +export function GenericTool(props: { + tool: string + status?: string + hideDetails?: boolean + input?: Record +}) { + return ( + + ) } diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css index 3eee45c75f..8fc7090133 100644 --- a/packages/ui/src/components/message-part.css +++ b/packages/ui/src/components/message-part.css @@ -577,6 +577,46 @@ justify-content: center; } +[data-component="exa-tool-output"] { + width: 100%; + padding-top: 8px; + display: flex; + flex-direction: column; +} + +[data-slot="basic-tool-tool-subtitle"].exa-tool-query { + display: block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +[data-slot="exa-tool-links"] { + display: flex; + flex-direction: column; + gap: 4px; +} + +[data-slot="exa-tool-link"] { + display: block; + max-width: 100%; + color: var(--text-interactive-base); + text-decoration: underline; + text-underline-offset: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:hover { + color: var(--text-interactive-base); + } + + &:visited { + color: var(--text-interactive-base); + } +} + [data-component="todos"] { padding: 10px 0 24px 0; display: flex; diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 766060f1ba..fbeb8bda28 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -243,6 +243,18 @@ export function getToolInfo(tool: string, input: any = {}): ToolInfo { title: i18n.t("ui.tool.webfetch"), subtitle: input.url, } + case "websearch": + return { + icon: "window-cursor", + title: i18n.t("ui.tool.websearch"), + subtitle: input.query, + } + case "codesearch": + return { + icon: "code", + title: i18n.t("ui.tool.codesearch"), + subtitle: input.query, + } case "task": return { icon: "task", @@ -303,6 +315,18 @@ export function getToolInfo(tool: string, input: any = {}): ToolInfo { } } +function urls(text: string | undefined) { + if (!text) return [] + const seen = new Set() + return [...text.matchAll(/https?:\/\/[^\s<>"'`)\]]+/g)] + .map((item) => item[0].replace(/[),.;:!?]+$/g, "")) + .filter((item) => { + if (seen.has(item)) return false + seen.add(item) + return true + }) +} + const CONTEXT_GROUP_TOOLS = new Set(["read", "glob", "grep", "list"]) const HIDDEN_TOOLS = new Set(["todowrite", "todoread"]) @@ -598,6 +622,32 @@ function contextToolSummary(parts: ToolPart[]) { return { read, search, list } } +function ExaOutput(props: { output?: string }) { + const links = createMemo(() => urls(props.output)) + + return ( + 0}> +
    +
    + + {(url) => ( + event.stopPropagation()} + > + {url} + + )} + +
    +
    +
    + ) +} + export function registerPartComponent(type: string, component: PartComponent) { PART_MAPPING[type] = component } @@ -1467,6 +1517,58 @@ ToolRegistry.register({ }, }) +ToolRegistry.register({ + name: "websearch", + render(props) { + const i18n = useI18n() + const query = createMemo(() => { + const value = props.input.query + if (typeof value !== "string") return "" + return value + }) + + return ( + + + + ) + }, +}) + +ToolRegistry.register({ + name: "codesearch", + render(props) { + const i18n = useI18n() + const query = createMemo(() => { + const value = props.input.query + if (typeof value !== "string") return "" + return value + }) + + return ( + + + + ) + }, +}) + ToolRegistry.register({ name: "task", render(props) { diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts index 3579eff5a8..f0a56f772c 100644 --- a/packages/ui/src/i18n/ar.ts +++ b/packages/ui/src/i18n/ar.ts @@ -94,6 +94,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "جلب الويب", + "ui.tool.websearch": "بحث الويب", + "ui.tool.codesearch": "بحث الكود", "ui.tool.shell": "Shell", "ui.tool.patch": "تصحيح", "ui.tool.todos": "المهام", diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts index 76028878f9..d060506054 100644 --- a/packages/ui/src/i18n/br.ts +++ b/packages/ui/src/i18n/br.ts @@ -94,6 +94,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Buscar Web", + "ui.tool.websearch": "Pesquisa na Web", + "ui.tool.codesearch": "Pesquisa de Código", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "Tarefas", diff --git a/packages/ui/src/i18n/bs.ts b/packages/ui/src/i18n/bs.ts index 9bc2293361..754c6bcefe 100644 --- a/packages/ui/src/i18n/bs.ts +++ b/packages/ui/src/i18n/bs.ts @@ -98,6 +98,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Web preuzimanje", + "ui.tool.websearch": "Pretraga weba", + "ui.tool.codesearch": "Pretraga koda", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "Lista zadataka", diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts index 1bb4758568..0126a60c89 100644 --- a/packages/ui/src/i18n/da.ts +++ b/packages/ui/src/i18n/da.ts @@ -93,6 +93,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webhentning", + "ui.tool.websearch": "Websøgning", + "ui.tool.codesearch": "Kodesøgning", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "Opgaver", diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts index 951833c309..24d99ef790 100644 --- a/packages/ui/src/i18n/de.ts +++ b/packages/ui/src/i18n/de.ts @@ -99,6 +99,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webabruf", + "ui.tool.websearch": "Websuche", + "ui.tool.codesearch": "Codesuche", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "Aufgaben", diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts index 9c9ae6e27a..1d92ea507c 100644 --- a/packages/ui/src/i18n/en.ts +++ b/packages/ui/src/i18n/en.ts @@ -95,6 +95,8 @@ export const dict: Record = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webfetch", + "ui.tool.websearch": "Web Search", + "ui.tool.codesearch": "Code Search", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "To-dos", diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts index 6fb6eea511..9ee95d8245 100644 --- a/packages/ui/src/i18n/es.ts +++ b/packages/ui/src/i18n/es.ts @@ -94,6 +94,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webfetch", + "ui.tool.websearch": "Búsqueda web", + "ui.tool.codesearch": "Búsqueda de código", "ui.tool.shell": "Shell", "ui.tool.patch": "Parche", "ui.tool.todos": "Tareas", diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts index 3a77a3f5c6..431abe5683 100644 --- a/packages/ui/src/i18n/fr.ts +++ b/packages/ui/src/i18n/fr.ts @@ -94,6 +94,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webfetch", + "ui.tool.websearch": "Recherche Web", + "ui.tool.codesearch": "Recherche de code", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "Tâches", diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts index 9dfb03f76b..c6cb2ac401 100644 --- a/packages/ui/src/i18n/ja.ts +++ b/packages/ui/src/i18n/ja.ts @@ -93,6 +93,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webfetch", + "ui.tool.websearch": "Web検索", + "ui.tool.codesearch": "コード検索", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "Todo", diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts index 84d261ac89..cd306e879e 100644 --- a/packages/ui/src/i18n/ko.ts +++ b/packages/ui/src/i18n/ko.ts @@ -94,6 +94,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "웹 가져오기", + "ui.tool.websearch": "웹 검색", + "ui.tool.codesearch": "코드 검색", "ui.tool.shell": "셸", "ui.tool.patch": "패치", "ui.tool.todos": "할 일", diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts index dd1822beee..ddfe094618 100644 --- a/packages/ui/src/i18n/no.ts +++ b/packages/ui/src/i18n/no.ts @@ -97,6 +97,8 @@ export const dict: Record = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webhenting", + "ui.tool.websearch": "Nettsøk", + "ui.tool.codesearch": "Kodesøk", "ui.tool.shell": "Shell", "ui.tool.patch": "Patch", "ui.tool.todos": "Gjøremål", diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts index fcfedb2ef9..73fa96afae 100644 --- a/packages/ui/src/i18n/pl.ts +++ b/packages/ui/src/i18n/pl.ts @@ -93,6 +93,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Pobieranie sieciowe", + "ui.tool.websearch": "Wyszukiwanie w sieci", + "ui.tool.codesearch": "Wyszukiwanie kodu", "ui.tool.shell": "Terminal", "ui.tool.patch": "Patch", "ui.tool.todos": "Zadania", diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts index 713ff47d1e..085be28436 100644 --- a/packages/ui/src/i18n/ru.ts +++ b/packages/ui/src/i18n/ru.ts @@ -93,6 +93,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webfetch", + "ui.tool.websearch": "Веб-поиск", + "ui.tool.codesearch": "Поиск кода", "ui.tool.shell": "Оболочка", "ui.tool.patch": "Патч", "ui.tool.todos": "Задачи", diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts index 44761a279e..705f68d1b4 100644 --- a/packages/ui/src/i18n/th.ts +++ b/packages/ui/src/i18n/th.ts @@ -95,6 +95,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "ดึงจากเว็บ", + "ui.tool.websearch": "ค้นหาเว็บ", + "ui.tool.codesearch": "ค้นหาโค้ด", "ui.tool.shell": "เชลล์", "ui.tool.patch": "แพตช์", "ui.tool.todos": "รายการงาน", diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts index 5ec108d4aa..fa3bddb218 100644 --- a/packages/ui/src/i18n/tr.ts +++ b/packages/ui/src/i18n/tr.ts @@ -90,6 +90,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Web getir", + "ui.tool.websearch": "Web Araması", + "ui.tool.codesearch": "Kod Araması", "ui.tool.shell": "Kabuk", "ui.tool.patch": "Yama", "ui.tool.todos": "Görevler", diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts index 39226605b9..571574d92e 100644 --- a/packages/ui/src/i18n/zh.ts +++ b/packages/ui/src/i18n/zh.ts @@ -98,6 +98,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webfetch", + "ui.tool.websearch": "网络搜索", + "ui.tool.codesearch": "代码搜索", "ui.tool.shell": "Shell", "ui.tool.patch": "补丁", "ui.tool.todos": "待办", diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts index 068e222d65..edbc96b12f 100644 --- a/packages/ui/src/i18n/zht.ts +++ b/packages/ui/src/i18n/zht.ts @@ -98,6 +98,8 @@ export const dict = { "ui.tool.glob": "Glob", "ui.tool.grep": "Grep", "ui.tool.webfetch": "Webfetch", + "ui.tool.websearch": "網頁搜尋", + "ui.tool.codesearch": "程式碼搜尋", "ui.tool.shell": "Shell", "ui.tool.patch": "修補", "ui.tool.todos": "待辦", From 152df2428df84a1029be2b472b4a840cd94c966d Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 08:09:29 -0600 Subject: [PATCH 25/42] fix(app): stale read error --- packages/app/src/pages/layout.tsx | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index cc322d74fc..2019ca4e5a 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -1846,7 +1846,7 @@ export default function Layout(props: ParentProps) { }} style={{ width: panelProps.mobile ? undefined : `${Math.max(layout.sidebar.width() - 64, 0)}px` }} > - + {(p) => ( <>
    @@ -1855,7 +1855,7 @@ export default function Layout(props: ParentProps) { renameProject(p(), next)} + onSave={(next) => renameProject(p, next)} class="text-14-medium text-text-strong truncate" displayClass="text-14-medium text-text-strong truncate" stopPropagation @@ -1864,7 +1864,7 @@ export default function Layout(props: ParentProps) { - {p().worktree.replace(homedir(), "~")} + {p.worktree.replace(homedir(), "~")}
    @@ -1883,7 +1883,7 @@ export default function Layout(props: ParentProps) { icon="dot-grid" variant="ghost" data-action="project-menu" - data-project={base64Encode(p().worktree)} + data-project={base64Encode(p.worktree)} class="shrink-0 size-6 rounded-md data-[expanded]:bg-surface-base-active" classList={{ "opacity-0 group-hover/project:opacity-100 data-[expanded]:opacity-100": !panelProps.mobile, @@ -1892,24 +1892,24 @@ export default function Layout(props: ParentProps) { /> - showEditProjectDialog(p())}> + showEditProjectDialog(p)}> {language.t("common.edit")} toggleProjectWorkspaces(p())} + data-project={base64Encode(p.worktree)} + disabled={p.vcs !== "git" && !layout.sidebar.workspaces(p.worktree)()} + onSelect={() => toggleProjectWorkspaces(p)} > - {layout.sidebar.workspaces(p().worktree)() + {layout.sidebar.workspaces(p.worktree)() ? language.t("sidebar.workspaces.disable") : language.t("sidebar.workspaces.enable")} @@ -1920,8 +1920,8 @@ export default function Layout(props: ParentProps) { closeProject(p().worktree)} + data-project={base64Encode(p.worktree)} + onSelect={() => closeProject(p.worktree)} > {language.t("common.close")} @@ -1946,7 +1946,7 @@ export default function Layout(props: ParentProps) { size="large" icon="plus-small" class="w-full" - onClick={() => navigateWithSidebarReset(`/${base64Encode(p().worktree)}/session`)} + onClick={() => navigateWithSidebarReset(`/${base64Encode(p.worktree)}/session`)} > {language.t("command.session.new")} @@ -1955,7 +1955,7 @@ export default function Layout(props: ParentProps) {
    @@ -1970,7 +1970,7 @@ export default function Layout(props: ParentProps) { keybind={command.keybind("workspace.new")} placement="top" > - @@ -1996,7 +1996,7 @@ export default function Layout(props: ParentProps) { From a3d4ea0de17ec208d73d27fdfe2f9a226db902f1 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 08:10:32 -0600 Subject: [PATCH 26/42] fix(app): locale error --- .../src/components/session-context-usage.tsx | 4 ++-- .../session/session-context-tab.tsx | 12 +++++----- .../components/session/session-new-view.tsx | 2 +- packages/app/src/context/language.tsx | 22 +++++++++++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx index 47030aa177..08ae4d3194 100644 --- a/packages/app/src/components/session-context-usage.tsx +++ b/packages/app/src/components/session-context-usage.tsx @@ -39,7 +39,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) { const usd = createMemo( () => - new Intl.NumberFormat(language.locale(), { + new Intl.NumberFormat(language.intl(), { style: "currency", currency: "USD", }), @@ -77,7 +77,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) { {(ctx) => ( <>
    - {ctx().total.toLocaleString(language.locale())} + {ctx().total.toLocaleString(language.intl())} {language.t("context.usage.tokens")}
    diff --git a/packages/app/src/components/session/session-context-tab.tsx b/packages/app/src/components/session/session-context-tab.tsx index 582aa33911..39eb4b4c0e 100644 --- a/packages/app/src/components/session/session-context-tab.tsx +++ b/packages/app/src/components/session/session-context-tab.tsx @@ -128,7 +128,7 @@ export function SessionContextTab() { const usd = createMemo( () => - new Intl.NumberFormat(language.locale(), { + new Intl.NumberFormat(language.intl(), { style: "currency", currency: "USD", }), @@ -136,7 +136,7 @@ export function SessionContextTab() { const metrics = createMemo(() => getSessionContextMetrics(messages(), sync.data.provider.all)) const ctx = createMemo(() => metrics().context) - const formatter = createMemo(() => createSessionContextFormatter(language.locale())) + const formatter = createMemo(() => createSessionContextFormatter(language.intl())) const cost = createMemo(() => { return usd().format(metrics().totalCost) @@ -200,7 +200,7 @@ export function SessionContextTab() { const stats = [ { label: "context.stats.session", value: () => info()?.title ?? params.id ?? "—" }, - { label: "context.stats.messages", value: () => counts().all.toLocaleString(language.locale()) }, + { label: "context.stats.messages", value: () => counts().all.toLocaleString(language.intl()) }, { label: "context.stats.provider", value: providerLabel }, { label: "context.stats.model", value: modelLabel }, { label: "context.stats.limit", value: () => formatter().number(ctx()?.limit) }, @@ -213,8 +213,8 @@ export function SessionContextTab() { label: "context.stats.cacheTokens", value: () => `${formatter().number(ctx()?.cacheRead)} / ${formatter().number(ctx()?.cacheWrite)}`, }, - { label: "context.stats.userMessages", value: () => counts().user.toLocaleString(language.locale()) }, - { label: "context.stats.assistantMessages", value: () => counts().assistant.toLocaleString(language.locale()) }, + { label: "context.stats.userMessages", value: () => counts().user.toLocaleString(language.intl()) }, + { label: "context.stats.assistantMessages", value: () => counts().assistant.toLocaleString(language.intl()) }, { label: "context.stats.totalCost", value: cost }, { label: "context.stats.sessionCreated", value: () => formatter().time(info()?.time.created) }, { label: "context.stats.lastActivity", value: () => formatter().time(ctx()?.message.time.created) }, @@ -307,7 +307,7 @@ export function SessionContextTab() {
    {breakdownLabel(segment.key)}
    -
    {segment.percent.toLocaleString(language.locale())}%
    +
    {segment.percent.toLocaleString(language.intl())}%
    )} diff --git a/packages/app/src/components/session/session-new-view.tsx b/packages/app/src/components/session/session-new-view.tsx index 79a20430e0..f2ecd51501 100644 --- a/packages/app/src/components/session/session-new-view.tsx +++ b/packages/app/src/components/session/session-new-view.tsx @@ -70,7 +70,7 @@ export function NewSessionView(props: NewSessionViewProps) { {language.t("session.new.lastModified")}  {DateTime.fromMillis(project().time.updated ?? project().time.created) - .setLocale(language.locale()) + .setLocale(language.intl()) .toRelative()}
    diff --git a/packages/app/src/context/language.tsx b/packages/app/src/context/language.tsx index 50cc302f43..be1a1769bf 100644 --- a/packages/app/src/context/language.tsx +++ b/packages/app/src/context/language.tsx @@ -84,6 +84,26 @@ const LOCALES: readonly Locale[] = [ "tr", ] +const INTL: Record = { + en: "en", + zh: "zh-Hans", + zht: "zh-Hant", + ko: "ko", + de: "de", + es: "es", + fr: "fr", + da: "da", + ja: "ja", + pl: "pl", + ru: "ru", + ar: "ar", + no: "nb-NO", + br: "pt-BR", + th: "th", + bs: "bs", + tr: "tr", +} + const LABEL_KEY: Record = { en: "language.en", zh: "language.zh", @@ -197,6 +217,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont ) const locale = createMemo(() => normalizeLocale(store.locale)) + const intl = createMemo(() => INTL[locale()]) const dict = createMemo(() => DICT[locale()]) @@ -213,6 +234,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont return { ready, locale, + intl, locales: LOCALES, label, t, From 7665b8e30def396059516ef6d870830baa1faedd Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 08:42:50 -0600 Subject: [PATCH 27/42] fix(app): stale keyed show errors --- .../app/src/pages/session/message-timeline.tsx | 6 +++--- .../app/src/pages/session/session-side-panel.tsx | 4 +++- .../app/src/pages/session/terminal-panel.tsx | 16 ++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx index 433c36e2e6..7a3b72ae4e 100644 --- a/packages/app/src/pages/session/message-timeline.tsx +++ b/packages/app/src/pages/session/message-timeline.tsx @@ -611,7 +611,7 @@ export function MessageTimeline(props: {
    - + {(id) => (
    @@ -646,12 +646,12 @@ export function MessageTimeline(props: { > {language.t("common.rename")} - void archiveSession(id())}> + void archiveSession(id)}> {language.t("common.archive")} dialog.show(() => )} + onSelect={() => dialog.show(() => )} > {language.t("common.delete")} diff --git a/packages/app/src/pages/session/session-side-panel.tsx b/packages/app/src/pages/session/session-side-panel.tsx index ad802d15d1..55c1607a09 100644 --- a/packages/app/src/pages/session/session-side-panel.tsx +++ b/packages/app/src/pages/session/session-side-panel.tsx @@ -331,7 +331,9 @@ export function SessionSidePanel(props: { const path = createMemo(() => file.pathFromTab(tab)) return (
    - {(p) => } + + {(p) => } +
    ) }} diff --git a/packages/app/src/pages/session/terminal-panel.tsx b/packages/app/src/pages/session/terminal-panel.tsx index cc4c17ee21..c8bfc14053 100644 --- a/packages/app/src/pages/session/terminal-panel.tsx +++ b/packages/app/src/pages/session/terminal-panel.tsx @@ -191,8 +191,8 @@ export function TerminalPanel() { {(id) => ( - - {(pty) => } + + {(pty) => } )} @@ -217,10 +217,10 @@ export function TerminalPanel() {
    {(id) => ( - + {(pty) => (
    - terminal.clone(id)} /> + terminal.clone(id)} />
    )}
    @@ -229,14 +229,14 @@ export function TerminalPanel() {
    - + {(draggedId) => ( - + {(t) => (
    {terminalTabLabel({ - title: t().title, - titleNumber: t().titleNumber, + title: t.title, + titleNumber: t.titleNumber, t: language.t as (key: string, vars?: Record) => string, })}
    From d802e28381cf798d2f59f5740012fa4e9e6c5cdc Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 5 Mar 2026 09:38:43 -0500 Subject: [PATCH 28/42] update sdk package.json --- packages/sdk/js/package.json | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index e83fa7c861..e3c8c9d015 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -12,18 +12,9 @@ ".": "./src/index.ts", "./client": "./src/client.ts", "./server": "./src/server.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": "./src/v2/index.ts", + "./v2/client": "./src/v2/client.ts", + "./v2/gen/client": "./src/v2/gen/client/index.ts", "./v2/server": "./src/v2/server.ts" }, "files": [ From bb37e908ad4a179313564c86bd67e8d31a382493 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 5 Mar 2026 09:42:57 -0500 Subject: [PATCH 29/42] ci: remove unused publishConfig that was breaking npm publishing --- packages/app/tsconfig.json | 3 +-- packages/sdk/js/package.json | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json index bfd45ff85e..e2a27dd5d8 100644 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -22,6 +22,5 @@ } }, "include": ["src", "package.json"], - "exclude": ["dist", "ts-dist"], - "references": [{ "path": "../sdk/js" }] + "exclude": ["dist", "ts-dist"] } diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index e3c8c9d015..4631f785fd 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -27,8 +27,5 @@ "typescript": "catalog:", "@typescript/native-preview": "catalog:" }, - "dependencies": {}, - "publishConfig": { - "directory": "dist" - } + "dependencies": {} } From 9cccaa693a796fb5b2fdfa1534b553ce407dc93e Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 08:56:34 -0600 Subject: [PATCH 30/42] chore(app): ghostty-web fork --- bun.lock | 4 ++-- packages/app/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index d93b563293..dff709f5ef 100644 --- a/bun.lock +++ b/bun.lock @@ -47,7 +47,7 @@ "@thisbeyond/solid-dnd": "0.7.5", "diff": "catalog:", "fuzzysort": "catalog:", - "ghostty-web": "0.4.0", + "ghostty-web": "github:anomalyco/ghostty-web#main", "luxon": "catalog:", "marked": "catalog:", "marked-shiki": "catalog:", @@ -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@0.4.0", "", {}, "sha512-0puDBik2qapbD/QQBW9o5ZHfXnZBqZWx/ctBiVtKZ6ZLds4NYb+wZuw1cRLXZk9zYovIQ908z3rvFhexAvc5Hg=="], + "ghostty-web": ["ghostty-web@github:anomalyco/ghostty-web#4af877d", {}, "anomalyco-ghostty-web-4af877d", "sha512-fbEK8mtr7ar4ySsF+JUGjhaZrane7dKphanN+SxHt5XXI6yLMAh/Hpf6sNCOyyVa2UlGCd7YpXG/T2v2RUAX+A=="], "gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="], diff --git a/packages/app/package.json b/packages/app/package.json index ed497a761f..9f1021e8c3 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -57,7 +57,7 @@ "@thisbeyond/solid-dnd": "0.7.5", "diff": "catalog:", "fuzzysort": "catalog:", - "ghostty-web": "0.4.0", + "ghostty-web": "github:anomalyco/ghostty-web#main", "luxon": "catalog:", "marked": "catalog:", "marked-shiki": "catalog:", From 4da199697b73d29d9704628de4f3b46a89a69596 Mon Sep 17 00:00:00 2001 From: Dax Date: Thu, 5 Mar 2026 10:02:30 -0500 Subject: [PATCH 31/42] feat(tui): add onClick handler to InlineTool and Task components (#16187) --- .../src/cli/cmd/tui/routes/session/index.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 11d30ff784..d3a4ff81e0 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -1625,11 +1625,14 @@ 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 @@ -1639,6 +1642,7 @@ 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 }) @@ -1656,6 +1660,12 @@ function InlineTool(props: { 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 @@ -1999,6 +2009,11 @@ function Task(props: ToolProps) { complete={props.input.description} pending="Delegating..." part={props.part} + onClick={() => { + if (props.metadata.sessionId) { + navigate({ type: "session", sessionID: props.metadata.sessionId }) + } + }} > {content()} From 9507b0eace17522f518963f7d9f651fd6e541137 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Thu, 5 Mar 2026 15:09:14 +0000 Subject: [PATCH 32/42] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index a4ffb0b795..47e3e240bb 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-ZmxeRNy2chc9py4m1iW6B+c/NSccMnVZ0lfni/EMdHw=", - "aarch64-linux": "sha256-R+1mxsmAQicerN8ixVy0ff6V8bZ4GH18MHpihvWnaTg=", - "aarch64-darwin": "sha256-m+QT20ohlqo9e86qXu67eKthZm6VDRLwlqJ9CNlEV+0=", - "x86_64-darwin": "sha256-4GeNPyTT2Hq4rxHGSON23ul5Ud3yFGE0QUVsB03Gidc=" + "x86_64-linux": "sha256-v83hWzYVg/g4zJiBpGsQ71wTdndPk3BQVZ2mjMApUIQ=", + "aarch64-linux": "sha256-inpMwkQqwBFP2wL8w/pTOP7q3fg1aOqvE0wgzVd3/B8=", + "aarch64-darwin": "sha256-r42LGrQWqDyIy62mBSU5Nf3M22dJ3NNo7mjN/1h8d8Y=", + "x86_64-darwin": "sha256-J6XrrdK5qBK3sQBQOO/B3ZluOnsAf5f65l4q/K1nDTI=" } } From 2c58964a6b343ebb826de601b39b03cbd0622718 Mon Sep 17 00:00:00 2001 From: opencode Date: Thu, 5 Mar 2026 19:01:03 +0000 Subject: [PATCH 33/42] release: v1.2.18 --- bun.lock | 32 +++++++++++++------------- packages/app/package.json | 2 +- packages/console/app/package.json | 2 +- packages/console/core/package.json | 2 +- packages/console/function/package.json | 2 +- packages/console/mail/package.json | 2 +- packages/desktop-electron/package.json | 2 +- packages/desktop/package.json | 2 +- packages/enterprise/package.json | 2 +- packages/extensions/zed/extension.toml | 12 +++++----- packages/function/package.json | 2 +- packages/opencode/package.json | 2 +- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- packages/slack/package.json | 2 +- packages/ui/package.json | 2 +- packages/util/package.json | 2 +- packages/web/package.json | 2 +- sdks/vscode/package.json | 2 +- 19 files changed, 39 insertions(+), 39 deletions(-) diff --git a/bun.lock b/bun.lock index dff709f5ef..325eeb15f5 100644 --- a/bun.lock +++ b/bun.lock @@ -26,7 +26,7 @@ }, "packages/app": { "name": "@opencode-ai/app", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -76,7 +76,7 @@ }, "packages/console/app": { "name": "@opencode-ai/console-app", - "version": "1.2.17", + "version": "1.2.18", "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.17", + "version": "1.2.18", "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.17", + "version": "1.2.18", "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.17", + "version": "1.2.18", "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.17", + "version": "1.2.18", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -218,7 +218,7 @@ }, "packages/desktop-electron": { "name": "@opencode-ai/desktop-electron", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -248,7 +248,7 @@ }, "packages/enterprise": { "name": "@opencode-ai/enterprise", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@opencode-ai/ui": "workspace:*", "@opencode-ai/util": "workspace:*", @@ -277,7 +277,7 @@ }, "packages/function": { "name": "@opencode-ai/function", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "catalog:", @@ -293,7 +293,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "1.2.17", + "version": "1.2.18", "bin": { "opencode": "./bin/opencode", }, @@ -407,7 +407,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@opencode-ai/sdk": "workspace:*", "zod": "catalog:", @@ -427,7 +427,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "1.2.17", + "version": "1.2.18", "devDependencies": { "@hey-api/openapi-ts": "0.90.10", "@tsconfig/node22": "catalog:", @@ -438,7 +438,7 @@ }, "packages/slack": { "name": "@opencode-ai/slack", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@opencode-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1", @@ -473,7 +473,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -519,7 +519,7 @@ }, "packages/util": { "name": "@opencode-ai/util", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "zod": "catalog:", }, @@ -530,7 +530,7 @@ }, "packages/web": { "name": "@opencode-ai/web", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", diff --git a/packages/app/package.json b/packages/app/package.json index 9f1021e8c3..37ccd9b53a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "1.2.17", + "version": "1.2.18", "description": "", "type": "module", "exports": { diff --git a/packages/console/app/package.json b/packages/console/app/package.json index fa264844ca..67a7eafa7c 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-app", - "version": "1.2.17", + "version": "1.2.18", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/console/core/package.json b/packages/console/core/package.json index 60eb69b202..37c94aecbb 100644 --- a/packages/console/core/package.json +++ b/packages/console/core/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/console-core", - "version": "1.2.17", + "version": "1.2.18", "private": true, "type": "module", "license": "MIT", diff --git a/packages/console/function/package.json b/packages/console/function/package.json index cca7329af2..bb7caccc58 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-function", - "version": "1.2.17", + "version": "1.2.18", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json index ed42abc081..00e7378fe5 100644 --- a/packages/console/mail/package.json +++ b/packages/console/mail/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-mail", - "version": "1.2.17", + "version": "1.2.18", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", diff --git a/packages/desktop-electron/package.json b/packages/desktop-electron/package.json index 9f635ebbd1..41791066ea 100644 --- a/packages/desktop-electron/package.json +++ b/packages/desktop-electron/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop-electron", "private": true, - "version": "1.2.17", + "version": "1.2.18", "type": "module", "license": "MIT", "homepage": "https://opencode.ai", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 30d1b94053..49699ff85e 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop", "private": true, - "version": "1.2.17", + "version": "1.2.18", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 66509f6de0..065015bc50 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/enterprise", - "version": "1.2.17", + "version": "1.2.18", "private": true, "type": "module", "license": "MIT", diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 6220664147..efd12836ee 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "opencode" name = "OpenCode" description = "The open source coding agent." -version = "1.2.17" +version = "1.2.18" 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.17/opencode-darwin-arm64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/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.17/opencode-darwin-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-linux-arm64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/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.17/opencode-linux-x64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/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.17/opencode-windows-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/function/package.json b/packages/function/package.json index 3d8606980c..162b564ad9 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/function", - "version": "1.2.17", + "version": "1.2.18", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 1afb22b6df..5edfca7e19 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "1.2.17", + "version": "1.2.18", "name": "opencode", "type": "module", "license": "MIT", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 467cadd612..e57e83d051 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/plugin", - "version": "1.2.17", + "version": "1.2.18", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 4631f785fd..22993464e3 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/sdk", - "version": "1.2.17", + "version": "1.2.18", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/slack/package.json b/packages/slack/package.json index cf9795762f..1407c0e4a9 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/slack", - "version": "1.2.17", + "version": "1.2.18", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 85197f30f4..0adc4c57f1 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "1.2.17", + "version": "1.2.18", "type": "module", "license": "MIT", "exports": { diff --git a/packages/util/package.json b/packages/util/package.json index f6f2b5514a..87cf20591e 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/util", - "version": "1.2.17", + "version": "1.2.18", "private": true, "type": "module", "license": "MIT", diff --git a/packages/web/package.json b/packages/web/package.json index ee5671e3ec..4e7ac7cd8b 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -2,7 +2,7 @@ "name": "@opencode-ai/web", "type": "module", "license": "MIT", - "version": "1.2.17", + "version": "1.2.18", "scripts": { "dev": "astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index a15de9fde4..64307f053d 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,7 +2,7 @@ "name": "opencode", "displayName": "opencode", "description": "opencode for VS Code", - "version": "1.2.17", + "version": "1.2.18", "publisher": "sst-dev", "repository": { "type": "git", From 0638e49b02ec288ff28d836d2d651f9efc38d4e7 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 5 Mar 2026 13:27:12 -0500 Subject: [PATCH 34/42] zen: gpt5.4 --- packages/web/src/content/docs/zen.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx index 5ed2125cb1..ad0e067276 100644 --- a/packages/web/src/content/docs/zen.mdx +++ b/packages/web/src/content/docs/zen.mdx @@ -64,6 +64,7 @@ You can also access our models through the following API endpoints. | 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` | @@ -147,6 +148,7 @@ We support a pay-as-you-go model. Below are the prices **per 1M 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 | - | From e3b6d84b570059030867a5e56fd47999f80243eb Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Thu, 5 Mar 2026 18:41:35 +0000 Subject: [PATCH 35/42] docs(i18n): sync locale docs from english changes --- packages/web/src/content/docs/ar/zen.mdx | 15 +++ packages/web/src/content/docs/bs/zen.mdx | 15 +++ packages/web/src/content/docs/da/zen.mdx | 15 +++ packages/web/src/content/docs/de/zen.mdx | 19 +++- packages/web/src/content/docs/es/zen.mdx | 15 +++ packages/web/src/content/docs/fr/zen.mdx | 15 +++ packages/web/src/content/docs/it/zen.mdx | 15 +++ packages/web/src/content/docs/ja/zen.mdx | 15 +++ packages/web/src/content/docs/ko/zen.mdx | 19 +++- packages/web/src/content/docs/nb/zen.mdx | 17 +++- packages/web/src/content/docs/pl/zen.mdx | 101 +++++++++++--------- packages/web/src/content/docs/pt-br/zen.mdx | 15 +++ packages/web/src/content/docs/ru/zen.mdx | 15 +++ packages/web/src/content/docs/th/zen.mdx | 21 +++- packages/web/src/content/docs/tr/zen.mdx | 15 +++ packages/web/src/content/docs/zh-cn/zen.mdx | 15 +++ packages/web/src/content/docs/zh-tw/zen.mdx | 15 +++ 17 files changed, 306 insertions(+), 51 deletions(-) diff --git a/packages/web/src/content/docs/ar/zen.mdx b/packages/web/src/content/docs/ar/zen.mdx index 2810dea7dd..e155748fbf 100644 --- a/packages/web/src/content/docs/ar/zen.mdx +++ b/packages/web/src/content/docs/ar/zen.mdx @@ -59,6 +59,7 @@ 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` | @@ -141,6 +142,7 @@ 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 | - | @@ -184,6 +186,19 @@ 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) ولا يستخدمون بياناتك لتدريب النماذج، مع الاستثناءات التالية: diff --git a/packages/web/src/content/docs/bs/zen.mdx b/packages/web/src/content/docs/bs/zen.mdx index ad428884d3..8da6697d09 100644 --- a/packages/web/src/content/docs/bs/zen.mdx +++ b/packages/web/src/content/docs/bs/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -136,6 +137,7 @@ 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 | - | @@ -178,6 +180,19 @@ 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: diff --git a/packages/web/src/content/docs/da/zen.mdx b/packages/web/src/content/docs/da/zen.mdx index e99c626c57..dee93e3bea 100644 --- a/packages/web/src/content/docs/da/zen.mdx +++ b/packages/web/src/content/docs/da/zen.mdx @@ -64,6 +64,7 @@ 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` | @@ -147,6 +148,7 @@ 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 | - | @@ -192,6 +194,19 @@ 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: diff --git a/packages/web/src/content/docs/de/zen.mdx b/packages/web/src/content/docs/de/zen.mdx index 7545b10deb..e5661ad569 100644 --- a/packages/web/src/content/docs/de/zen.mdx +++ b/packages/web/src/content/docs/de/zen.mdx @@ -57,6 +57,7 @@ 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` | @@ -114,12 +115,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 | - | +| 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.08 | - | +| 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 | - | - | @@ -140,6 +141,7 @@ 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 | - | @@ -184,6 +186,19 @@ 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. diff --git a/packages/web/src/content/docs/es/zen.mdx b/packages/web/src/content/docs/es/zen.mdx index 94838902a5..9848eb100a 100644 --- a/packages/web/src/content/docs/es/zen.mdx +++ b/packages/web/src/content/docs/es/zen.mdx @@ -62,6 +62,7 @@ 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` | @@ -145,6 +146,7 @@ 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 | - | @@ -190,6 +192,19 @@ 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: diff --git a/packages/web/src/content/docs/fr/zen.mdx b/packages/web/src/content/docs/fr/zen.mdx index e40b1be77e..7310922aea 100644 --- a/packages/web/src/content/docs/fr/zen.mdx +++ b/packages/web/src/content/docs/fr/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -136,6 +137,7 @@ 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 $ | - | @@ -178,6 +180,19 @@ 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 : diff --git a/packages/web/src/content/docs/it/zen.mdx b/packages/web/src/content/docs/it/zen.mdx index db0434db50..3c892f0d48 100644 --- a/packages/web/src/content/docs/it/zen.mdx +++ b/packages/web/src/content/docs/it/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -136,6 +137,7 @@ 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 | - | @@ -178,6 +180,19 @@ 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: diff --git a/packages/web/src/content/docs/ja/zen.mdx b/packages/web/src/content/docs/ja/zen.mdx index c7121fb3b7..7a380aa9fb 100644 --- a/packages/web/src/content/docs/ja/zen.mdx +++ b/packages/web/src/content/docs/ja/zen.mdx @@ -54,6 +54,7 @@ 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` | @@ -137,6 +138,7 @@ 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 | - | @@ -179,6 +181,19 @@ 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日 | + +--- + ## プライバシー すべてのモデルは米国でホストされています。当社のプロバイダーはゼロ保持ポリシーに従い、次の例外を除いて、モデルのトレーニングにデータを使用しません。 diff --git a/packages/web/src/content/docs/ko/zen.mdx b/packages/web/src/content/docs/ko/zen.mdx index ae598cee18..5c2b9644ff 100644 --- a/packages/web/src/content/docs/ko/zen.mdx +++ b/packages/web/src/content/docs/ko/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -111,12 +112,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 | - | +| 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.08 | - | +| 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 | - | - | @@ -137,6 +138,7 @@ 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,6 +182,19 @@ 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) 정책을 따르며, 아래의 예외를 제외하고는 귀하의 데이터를 모델 학습에 사용하지 않습니다. diff --git a/packages/web/src/content/docs/nb/zen.mdx b/packages/web/src/content/docs/nb/zen.mdx index 51399615e5..71dd0e9eaf 100644 --- a/packages/web/src/content/docs/nb/zen.mdx +++ b/packages/web/src/content/docs/nb/zen.mdx @@ -64,6 +64,7 @@ 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` | @@ -121,7 +122,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 | - | +| 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 | - | @@ -147,6 +148,7 @@ 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 | - | @@ -192,6 +194,19 @@ 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: diff --git a/packages/web/src/content/docs/pl/zen.mdx b/packages/web/src/content/docs/pl/zen.mdx index dbb75489cb..1a62e0464d 100644 --- a/packages/web/src/content/docs/pl/zen.mdx +++ b/packages/web/src/content/docs/pl/zen.mdx @@ -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" +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 is currently in beta. +OpenCode Zen jest obecnie w wersji beta. ::: -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. +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. --- @@ -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 zupełnie inną wydajność i jakość. +skonfigurowana bardzo różnie, więc otrzymujesz bardzo różną 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 będzie to możliwe +Jeśli więc używasz modelu za pośrednictwem czegoś takiego jak OpenRouter, nigdy nie możesz być 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 to zrobić - najlepiej je uruchom. +1. Przetestowaliśmy wybraną grupę modeli i rozmawialiśmy z ich zespołami o tym, jak + najlepiej je uruchamiać. 2. Następnie współpracowaliśmy z kilkoma dostawcami, aby upewnić się, że są one obsługiwane - correctly. -3. Na koniec porównaliśmy kombinację modelu/dostawcy i otrzymaliśmy wynik - z listą, którą z przyjemnością polecamy. + poprawnie. +3. Na koniec sprawdziliśmy wydajność kombinacji modelu/dostawcy i stworzyliśmy + listę, którą z czystym sumieniem 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 opencode. +OpenCode Zen działa jak każdy inny dostawca w OpenCode. -1. Logujesz się do **OpenCode Zen**, dodajesz swoje rozliczenia - szczegóły i skopiuj klucz API. +1. Logujesz się do **OpenCode Zen**, dodajesz dane rozliczeniowe + i kopiujesz swój 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ć kredyty do swojego konta. +Opłata jest pobierana za każde żądanie i możesz dodać środki do swojego konta. --- @@ -64,6 +64,7 @@ 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` | @@ -97,9 +98,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/`. Na przykład w przypadku Kodeksu GPT 5.2 zrobiłbyś to -użyj `opencode/gpt-5.2-codex` w swojej konfiguracji. +[Identyfikator modelu](/docs/config/#models) w konfiguracji OpenCode +używa formatu `opencode/`. Na przykład w przypadku GPT 5.2 Codex użyłbyś +`opencode/gpt-5.2-codex` w swojej konfiguracji. --- @@ -121,12 +122,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 | - | +| 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.08 | - | +| 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 | - | - | @@ -147,6 +148,7 @@ 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 | - | @@ -158,10 +160,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. To jest [model niskokosztowy](/docs/config/#models), który służy do generowania tytułów sesji. +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. :::note -Opłaty za karty kredytowe są przenoszone na koszt (4,4% + 0,30 USD za transakcję); nie pobieramy żadnych dodatkowych opłat. +Opłaty za karty kredytowe są przenoszone po kosztach (4,4% + 0,30 USD za transakcję); nie pobieramy nic poza tym. ::: Darmowe modele: @@ -177,18 +179,31 @@ 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 przeładowywanie. +Możesz zmienić kwotę automatycznego doładowania. Możesz także całkowicie wyłączyć automatyczne doładowanie. --- ### Limity miesięczne -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. +Możesz także ustawić miesięczny limit użytkowania dla całego obszaru roboczego i dla każdego +członka Twojego zespołu. -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. +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 | --- @@ -198,22 +213,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. -- 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). +- 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). --- ## Dla zespołów -Zen świetnie sprawdza się także w zespołach. Możesz zapraszać członków zespołu, przypisywać role, zarządzać +Zen działa świetnie także dla zespołów. Możesz zapraszać członków zespołu, przypisywać role, dobierać 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. Będziemy -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. +Wkrótce udostępnimy więcej szczegółów na temat cen. --- @@ -221,8 +236,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: -- **Administrator**: Zarządzaj modelami, członkami, kluczami API i rozliczeniami -- **Członek**: Zarządzaj tylko własnymi kluczami API +- **Admin**: Zarządzanie modelami, członkami, kluczami API i rozliczeniami +- **Członek**: Zarządzanie 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ą. @@ -233,7 +248,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 -collects data. +zbiera dane. --- @@ -253,6 +268,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. 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. +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. diff --git a/packages/web/src/content/docs/pt-br/zen.mdx b/packages/web/src/content/docs/pt-br/zen.mdx index ba029fb7fc..1ed92cbd78 100644 --- a/packages/web/src/content/docs/pt-br/zen.mdx +++ b/packages/web/src/content/docs/pt-br/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -136,6 +137,7 @@ 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 | - | @@ -178,6 +180,19 @@ 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: diff --git a/packages/web/src/content/docs/ru/zen.mdx b/packages/web/src/content/docs/ru/zen.mdx index 078d1a3819..dff843d034 100644 --- a/packages/web/src/content/docs/ru/zen.mdx +++ b/packages/web/src/content/docs/ru/zen.mdx @@ -63,6 +63,7 @@ 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` | @@ -146,6 +147,7 @@ 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 | - | @@ -191,6 +193,19 @@ 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 г. | + +--- + ## Конфиденциальность Все наши модели размещены в США. Наши поставщики придерживаются политики нулевого хранения и не используют ваши данные для обучения моделей, за следующими исключениями: diff --git a/packages/web/src/content/docs/th/zen.mdx b/packages/web/src/content/docs/th/zen.mdx index 7b9f172756..36b2090807 100644 --- a/packages/web/src/content/docs/th/zen.mdx +++ b/packages/web/src/content/docs/th/zen.mdx @@ -64,6 +64,7 @@ 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` | @@ -121,12 +122,12 @@ https://opencode.ai/zen/v1/models | --------------------------------- | ---------- | -------- | ------- | ---------- | | Big Pickle | ฟรี | ฟรี | ฟรี | - | | MiniMax M2.5 Free | ฟรี | ฟรี | ฟรี | - | -| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - | +| 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.08 | - | +| 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 | - | - | @@ -147,6 +148,7 @@ 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 | - | @@ -192,11 +194,24 @@ 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) diff --git a/packages/web/src/content/docs/tr/zen.mdx b/packages/web/src/content/docs/tr/zen.mdx index 9582a7b7dc..2b79bb9625 100644 --- a/packages/web/src/content/docs/tr/zen.mdx +++ b/packages/web/src/content/docs/tr/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -136,6 +137,7 @@ 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 | - | @@ -178,6 +180,19 @@ 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: diff --git a/packages/web/src/content/docs/zh-cn/zen.mdx b/packages/web/src/content/docs/zh-cn/zen.mdx index 0c6c6b9d95..098fb5e35b 100644 --- a/packages/web/src/content/docs/zh-cn/zen.mdx +++ b/packages/web/src/content/docs/zh-cn/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -136,6 +137,7 @@ 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 | - | @@ -178,6 +180,19 @@ 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 日 | + +--- + ## 隐私 我们所有的模型都托管在美国。我们的提供商遵循零保留政策,不会将你的数据用于模型训练,但以下情况除外: diff --git a/packages/web/src/content/docs/zh-tw/zen.mdx b/packages/web/src/content/docs/zh-tw/zen.mdx index c38188280b..c0ef9d03bd 100644 --- a/packages/web/src/content/docs/zh-tw/zen.mdx +++ b/packages/web/src/content/docs/zh-tw/zen.mdx @@ -55,6 +55,7 @@ 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` | @@ -136,6 +137,7 @@ 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 | - | @@ -178,6 +180,19 @@ 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 日 | + +--- + ## 隱私 我們所有的模型都託管在美國。我們的供應商遵循零保留政策,不會將你的資料用於模型訓練,但以下情況除外: From 2ba1ecabc925d2a4a83c81d7ceab2f88abb90701 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:40:19 -0600 Subject: [PATCH 36/42] fix(app): load tab on open file --- packages/app/src/pages/session.tsx | 1 + packages/app/src/pages/session/helpers.test.ts | 3 ++- packages/app/src/pages/session/helpers.ts | 11 ++++++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 9ef7cffe5b..1476e616e5 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -720,6 +720,7 @@ export default function Page() { showAllFiles, tabForPath: file.tab, openTab: tabs().open, + setActive: tabs().setActive, loadFile: file.load, }) diff --git a/packages/app/src/pages/session/helpers.test.ts b/packages/app/src/pages/session/helpers.test.ts index aaa5b932fe..9c77c34af4 100644 --- a/packages/app/src/pages/session/helpers.test.ts +++ b/packages/app/src/pages/session/helpers.test.ts @@ -11,12 +11,13 @@ 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"]) + expect(calls).toEqual(["show", "load:src/a.ts", "tab:src/a.ts", "open:file://src/a.ts", "active:file://src/a.ts"]) }) }) diff --git a/packages/app/src/pages/session/helpers.ts b/packages/app/src/pages/session/helpers.ts index 20f1d99a8b..60b26cdf47 100644 --- a/packages/app/src/pages/session/helpers.ts +++ b/packages/app/src/pages/session/helpers.ts @@ -24,15 +24,20 @@ export const createOpenReviewFile = (input: { showAllFiles: () => void tabForPath: (path: string) => string openTab: (tab: string) => void + setActive: (tab: string) => void loadFile: (path: string) => any | Promise }) => { return (path: string) => { batch(() => { input.showAllFiles() const maybePromise = input.loadFile(path) - const openTab = () => input.openTab(input.tabForPath(path)) - if (maybePromise instanceof Promise) maybePromise.then(openTab) - else openTab() + const open = () => { + const tab = input.tabForPath(path) + input.openTab(tab) + input.setActive(tab) + } + if (maybePromise instanceof Promise) maybePromise.then(open) + else open() }) } } From 76cdc668e88415ced30d2f57caeb56d21c080f19 Mon Sep 17 00:00:00 2001 From: Jun <87404676+Seungjun0906@users.noreply.github.com> Date: Fri, 6 Mar 2026 05:31:38 +0900 Subject: [PATCH 37/42] fix(console): follow-up for #13108 docs/en routing and locale cookie sync (#13608) --- packages/console/app/src/lib/language.ts | 39 ++++++++++++++++++- .../console/app/src/routes/docs/[...path].ts | 6 ++- packages/console/app/src/routes/docs/index.ts | 6 ++- packages/console/app/src/routes/s/[id].ts | 6 ++- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/packages/console/app/src/lib/language.ts b/packages/console/app/src/lib/language.ts index 54321d2343..5e80179e47 100644 --- a/packages/console/app/src/lib/language.ts +++ b/packages/console/app/src/lib/language.ts @@ -108,6 +108,26 @@ 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 + function suffix(pathname: string) { const index = pathname.search(/[?#]/) if (index === -1) { @@ -130,7 +150,12 @@ export function docs(locale: Locale, pathname: string) { return `${next.path}${next.suffix}` } - if (value === "root") 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 (next.path === "/docs") return `/docs/${value}${next.suffix}` if (next.path === "/docs/") return `/docs/${value}/${next.suffix}` @@ -154,6 +179,15 @@ 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) @@ -272,6 +306,9 @@ 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")) diff --git a/packages/console/app/src/routes/docs/[...path].ts b/packages/console/app/src/routes/docs/[...path].ts index bbe07f1f07..164bd2872e 100644 --- a/packages/console/app/src/routes/docs/[...path].ts +++ b/packages/console/app/src/routes/docs/[...path].ts @@ -1,6 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { Resource } from "@opencode-ai/console-resource" -import { docs, localeFromRequest, tag } from "~/lib/language" +import { cookie, docs, localeFromRequest, tag } from "~/lib/language" async function handler(evt: APIEvent) { const req = evt.request.clone() @@ -17,7 +17,9 @@ async function handler(evt: APIEvent) { headers, body: req.body, }) - return response + const next = new Response(response.body, response) + next.headers.append("set-cookie", cookie(locale)) + return next } export const GET = handler diff --git a/packages/console/app/src/routes/docs/index.ts b/packages/console/app/src/routes/docs/index.ts index bbe07f1f07..164bd2872e 100644 --- a/packages/console/app/src/routes/docs/index.ts +++ b/packages/console/app/src/routes/docs/index.ts @@ -1,6 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { Resource } from "@opencode-ai/console-resource" -import { docs, localeFromRequest, tag } from "~/lib/language" +import { cookie, docs, localeFromRequest, tag } from "~/lib/language" async function handler(evt: APIEvent) { const req = evt.request.clone() @@ -17,7 +17,9 @@ async function handler(evt: APIEvent) { headers, body: req.body, }) - return response + const next = new Response(response.body, response) + next.headers.append("set-cookie", cookie(locale)) + return next } export const GET = handler diff --git a/packages/console/app/src/routes/s/[id].ts b/packages/console/app/src/routes/s/[id].ts index 60f8d8ba87..374fd79ad0 100644 --- a/packages/console/app/src/routes/s/[id].ts +++ b/packages/console/app/src/routes/s/[id].ts @@ -1,6 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { Resource } from "@opencode-ai/console-resource" -import { docs, localeFromRequest, tag } from "~/lib/language" +import { cookie, docs, localeFromRequest, tag } from "~/lib/language" async function handler(evt: APIEvent) { const req = evt.request.clone() @@ -17,7 +17,9 @@ async function handler(evt: APIEvent) { headers, body: req.body, }) - return response + const next = new Response(response.body, response) + next.headers.append("set-cookie", cookie(locale)) + return next } export const GET = handler From 80c36c788c6c916692f456e62a2ab41cc4668ec0 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 5 Mar 2026 15:40:51 -0500 Subject: [PATCH 38/42] zen: gpt5.3 codex spark --- packages/web/src/content/docs/zen.mdx | 76 ++++++++++++++------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx index ad0e067276..883893a642 100644 --- a/packages/web/src/content/docs/zen.mdx +++ b/packages/web/src/content/docs/zen.mdx @@ -62,45 +62,46 @@ 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 | 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` | -| 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.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` | The [model id](/docs/config/#models) in your OpenCode config -uses the format `opencode/`. For example, for GPT 5.2 Codex, you would -use `opencode/gpt-5.2-codex` in your config. +uses the format `opencode/`. For example, for GPT 5.3 Codex, you would +use `opencode/gpt-5.3-codex` in your config. --- @@ -149,6 +150,7 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**. | 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 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 | - | From a6978167aef7fdbaa21ac329ec2a2f71ddbcb09d Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 5 Mar 2026 15:46:17 -0500 Subject: [PATCH 39/42] ci: fix --- packages/web/src/content/docs/pl/zen.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/content/docs/pl/zen.mdx b/packages/web/src/content/docs/pl/zen.mdx index 1a62e0464d..ddb7d2ff15 100644 --- a/packages/web/src/content/docs/pl/zen.mdx +++ b/packages/web/src/content/docs/pl/zen.mdx @@ -3,7 +3,7 @@ title: Zen description: Wyselekcjonowana lista modeli dostarczonych przez OpenCode. --- -import config from "../../../config.mjs" +import config from "../../../../config.mjs" export const console = config.console export const email = `mailto:${config.email}` From adaee663641e0a7e4a8f1bc3f0ca1bf1b9439a40 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 5 Mar 2026 18:39:17 -0500 Subject: [PATCH 40/42] zen: gpt 5.4 pro --- packages/web/src/content/docs/zen.mdx | 86 ++++++++++++++------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx index 883893a642..330f90014d 100644 --- a/packages/web/src/content/docs/zen.mdx +++ b/packages/web/src/content/docs/zen.mdx @@ -64,6 +64,7 @@ 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` | @@ -119,48 +120,49 @@ 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 | $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.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 | - | 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. From 39691e51741c753852a2ebdc21424075e666671b Mon Sep 17 00:00:00 2001 From: David Hill Date: Thu, 5 Mar 2026 23:43:19 +0000 Subject: [PATCH 41/42] tui: remove keyboard shortcut tooltips from new session and new workspace buttons in the sidebar --- packages/app/src/pages/layout.tsx | 34 ++++++++++--------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 2019ca4e5a..bd0315efbf 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -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, TooltipKeybind } from "@opencode-ai/ui/tooltip" +import { Tooltip } 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,20 +1937,14 @@ export default function Layout(props: ParentProps) { fallback={ <>
    - navigateWithSidebarReset(`/${base64Encode(p.worktree)}/session`)} > - - + {language.t("command.session.new")} +
    <>
    - - - +
    Date: Fri, 6 Mar 2026 01:23:48 +0100 Subject: [PATCH 42/42] fix(app): stale show (#16236) --- packages/app/src/pages/session/message-timeline.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx index 7a3b72ae4e..f320a2ebbf 100644 --- a/packages/app/src/pages/session/message-timeline.tsx +++ b/packages/app/src/pages/session/message-timeline.tsx @@ -1,4 +1,4 @@ -import { For, createEffect, createMemo, on, onCleanup, Show, startTransition, Index, type JSX } from "solid-js" +import { For, createEffect, createMemo, on, onCleanup, Show, 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) - startTransition(() => setState("count", count)) + setState("count", count) if (count >= currentTotal) { setState({ completedSession: sessionKey, activeSession: "" }) frame = undefined