Compare commits

..

52 Commits

Author SHA1 Message Date
Adam 0af9dd61d2 fix(stats): merge renamed model data (#43883) 2026-08-21 08:38:31 -05:00
opencode-agent[bot] 8ecd4c21bf chore: generate 2026-08-21 13:24:26 +00:00
opencode-agent[bot] 361a71ffad fix(opencode): route Vertex multi-regions through REP (#42648)
Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com>
Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com>
2026-08-21 15:23:05 +02:00
opencode-agent[bot] fa8f17014c chore: generate 2026-08-21 12:58:43 +00:00
Jack 813e6f3cec docs(go): add DeepSeek vision model (#43866) 2026-08-21 20:57:25 +08:00
Jack ba72a6ff2b fix(go): align Ox Alpha model ID (#43837) 2026-08-21 17:03:23 +08:00
Brendan Allan b6a1f95858 fix(app): preserve file search results while loading (#43836) 2026-08-21 08:52:45 +00:00
Nathan Thomassin f357e70779 fix(app): register archive session command in both layouts (#41741) 2026-08-21 08:28:40 +00:00
opencode a9cac91d60 sync release versions for v1.18.20 2026-08-21 08:09:28 +00:00
Aiden Cline 35fe5b7212 fix(opencode): surface subagent tool errors (#43821) 2026-08-21 02:44:44 -05:00
opencode-agent[bot] 62cb3f77bd test(opencode): remove flaky subagent test (#43819)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
2026-08-21 02:35:25 -05:00
opencode-agent[bot] e0b9e68a68 fix(opencode): retry raw network finish errors (#43813)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
2026-08-21 02:17:35 -05:00
opencode-agent[bot] 1e4c153aed chore: generate 2026-08-21 07:07:33 +00:00
Jack c9dc1a1b3d feat(go): add Ox Alpha to usage graph (#43809) 2026-08-21 15:06:23 +08:00
opencode-agent[bot] 40282c1d4d fix(opencode): retry network error variants (#43806)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
2026-08-21 01:47:20 -05:00
opencode-agent[bot] e11dbd0206 chore: generate 2026-08-21 06:25:22 +00:00
Jack 7b11ef5a5e docs(go): add Ox Alpha Free (#43798) 2026-08-21 14:24:06 +08:00
opencode-agent[bot] 2859603cbb chore: generate 2026-08-21 02:58:48 +00:00
opencode-agent[bot] c313504c82 fix(opencode): surface resumable subagent errors (#43657)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-20 21:57:33 -05:00
opencode-agent[bot] e49772a8b4 fix(opencode): preserve Cerebras completion limit (#43736)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
Co-authored-by: ryanl-cerebras <230249923+ryanl-cerebras@users.noreply.github.com>
2026-08-20 19:30:30 -05:00
opencode-agent[bot] 08faeb3893 fix(opencode): answer subagent permissions in run (#43675)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-20 19:29:32 -05:00
Frank 5e75e5e990 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-20 14:53:36 -04:00
Frank 5cc5b622f0 update muse country list 2026-08-20 14:53:34 -04:00
Jack 11e8110f9e fix(docs): align Ox Alpha free model ID (#43695) 2026-08-21 01:49:11 +08:00
Jack 82dee24302 docs(zen): add Ox Alpha free model (#43690) 2026-08-21 01:31:56 +08:00
Adam ad192a59b5 fix(stats): clarify market share providers (#43647) 2026-08-20 10:46:24 -05:00
opencode-agent[bot] 71d08e94d5 fix(opencode): retry xAI capacity stream errors (#43640)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-20 09:29:30 -05:00
opencode b155b15694 sync release versions for v1.18.19 2026-08-20 06:22:03 +00:00
Frank d06bf487a5 sync 2026-08-20 02:19:05 -04:00
Frank ccccd75328 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-20 02:08:32 -04:00
Frank 03d65f36d3 sync 2026-08-20 02:08:22 -04:00
Aiden Cline f4a89683da fix(tui): remove encrypted label from thought header (#43588) 2026-08-20 00:46:39 -05:00
Frank f715478a13 doc muse regions 2026-08-20 01:43:59 -04:00
opencode-agent[bot] e0e9bd7d5f fix(tui): show encrypted reasoning status (#43578)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2026-08-20 00:23:20 -05:00
opencode-agent[bot] 5ccb1e88e1 fix(stats): normalize routed model ids (#43582)
Co-authored-by: thdxr <thdxr@users.noreply.github.com>
2026-08-20 01:12:18 -04:00
Frank be469f328c sync 2026-08-20 00:42:47 -04:00
opencode-agent[bot] fc80874f45 chore: generate 2026-08-20 02:49:11 +00:00
Frank 3d26b12251 zen: muse spark contributor 2026-08-19 22:47:41 -04:00
Frank 1b77242d40 country check for muse spark in free 2026-08-19 22:44:35 -04:00
Adam 4c5960dc4b feat(stats): include free tier usage 2026-08-19 19:39:23 -05:00
Frank e2505d434a Revert "update go models"
This reverts commit 16af134053.
2026-08-19 15:03:41 -04:00
Frank a466a357b6 Revert "chore: generate"
This reverts commit 6386e67949.
2026-08-19 15:03:39 -04:00
opencode-agent[bot] 6386e67949 chore: generate 2026-08-19 17:11:33 +00:00
Frank 16af134053 update go models 2026-08-19 13:09:39 -04:00
Jack d545d8fba5 feat(go): promote Hy3 usage (#43429) 2026-08-19 21:36:12 +08:00
opencode-agent[bot] da4730e4a4 chore: generate 2026-08-19 06:36:52 +00:00
Frank 18fc3eea7c update zen model name 2026-08-19 02:35:19 -04:00
opencode-agent[bot] 101ff6d1a2 chore: generate 2026-08-19 04:53:24 +00:00
Jack 20ad497bc8 docs(console): end Luna usage promotion (#43351) 2026-08-19 12:52:09 +08:00
opencode-agent[bot] 1b18a50418 chore: generate 2026-08-19 03:58:10 +00:00
Frank 0a6397272c Merge branch 'muse-spark' into dev 2026-08-18 23:56:22 -04:00
bhuvankakkar 7774461bbf docs: add SCX.ai to the providers list (#42520) 2026-08-18 21:11:56 -05:00
146 changed files with 4547 additions and 3834 deletions
+28 -28
View File
@@ -29,7 +29,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@corvu/drawer": "catalog:",
"@dnd-kit/abstract": "0.5.0",
@@ -96,7 +96,7 @@
},
"packages/cli": {
"name": "@opencode-ai/cli",
"version": "1.18.18",
"version": "1.18.20",
"bin": {
"lildax": "./bin/lildax.cjs",
},
@@ -144,7 +144,7 @@
},
"packages/codemode": {
"name": "@opencode-ai/codemode",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"acorn": "8.15.0",
"effect": "catalog:",
@@ -158,7 +158,7 @@
},
"packages/console/app": {
"name": "@opencode-ai/console-app",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
@@ -194,7 +194,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
@@ -221,7 +221,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@ai-sdk/anthropic": "3.0.82",
"@ai-sdk/openai": "3.0.48",
@@ -243,7 +243,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
@@ -267,7 +267,7 @@
},
"packages/console/support": {
"name": "@opencode-ai/console-support",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@opencode-ai/console-core": "workspace:*",
@@ -287,7 +287,7 @@
},
"packages/core": {
"name": "@opencode-ai/core",
"version": "1.18.18",
"version": "1.18.20",
"bin": {
"opencode": "./bin/opencode",
},
@@ -381,7 +381,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@zip.js/zip.js": "2.7.62",
"drizzle-orm": "catalog:",
@@ -435,7 +435,7 @@
},
"packages/effect-drizzle-sqlite": {
"name": "@opencode-ai/effect-drizzle-sqlite",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"drizzle-orm": "catalog:",
"effect": "catalog:",
@@ -449,7 +449,7 @@
},
"packages/effect-sqlite-node": {
"name": "@opencode-ai/effect-sqlite-node",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"effect": "catalog:",
},
@@ -461,7 +461,7 @@
},
"packages/enterprise": {
"name": "@opencode-ai/enterprise",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@hono/standard-validator": "catalog:",
"@opencode-ai/core": "workspace:*",
@@ -493,7 +493,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "catalog:",
@@ -509,7 +509,7 @@
},
"packages/http-recorder": {
"name": "@opencode-ai/http-recorder",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@effect/platform-node": "4.0.0-beta.83",
"@effect/platform-node-shared": "4.0.0-beta.83",
@@ -540,7 +540,7 @@
},
"packages/llm": {
"name": "@opencode-ai/llm",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@opencode-ai/schema": "workspace:*",
"@smithy/eventstream-codec": "4.2.14",
@@ -559,7 +559,7 @@
},
"packages/opencode": {
"name": "opencode",
"version": "1.18.18",
"version": "1.18.20",
"bin": {
"opencode": "./bin/opencode",
},
@@ -690,7 +690,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@ai-sdk/provider": "3.0.8",
"@opencode-ai/sdk": "workspace:*",
@@ -766,7 +766,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"cross-spawn": "catalog:",
},
@@ -781,7 +781,7 @@
},
"packages/server": {
"name": "@opencode-ai/server",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@opencode-ai/core": "workspace:*",
"@opencode-ai/protocol": "workspace:*",
@@ -796,7 +796,7 @@
},
"packages/session-ui": {
"name": "@opencode-ai/session-ui",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/client": "file:../app/vendor/opencode-ai-client-1.17.13-v2.tgz",
@@ -836,7 +836,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
@@ -849,7 +849,7 @@
},
"packages/stats/app": {
"name": "@opencode-ai/stats-app",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@ibm/plex": "6.4.1",
"@kobalte/core": "catalog:",
@@ -883,7 +883,7 @@
},
"packages/stats/core": {
"name": "@opencode-ai/stats-core",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@aws-sdk/client-athena": "3.933.0",
"@planetscale/database": "1.19.0",
@@ -902,7 +902,7 @@
},
"packages/stats/server": {
"name": "@opencode-ai/stats-server",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@aws-sdk/client-firehose": "3.933.0",
"@effect/platform-node": "catalog:",
@@ -944,7 +944,7 @@
},
"packages/tui": {
"name": "@opencode-ai/tui",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@opencode-ai/core": "workspace:*",
"@opencode-ai/plugin": "workspace:*",
@@ -971,7 +971,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@kobalte/core": "catalog:",
"@pierre/diffs": "catalog:",
@@ -1022,7 +1022,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
@@ -60,6 +60,39 @@ test("keeps the file-browser sidebar mounted when switching file tabs", async ({
await expect.poll(() => viewport.evaluate((element) => element.scrollTop)).toBe(scrolled)
})
test("keeps previous file search results visible while the next search loads", async ({ page }) => {
const searchPending = Promise.withResolvers<void>()
await setup(page, async ({ query }) => {
if (query === "file-0") return ["file-00.ts"]
if (query === "file-7") {
await searchPending.promise
return ["file-79.ts"]
}
return []
})
await page.goto(`/server/${base64Encode(server)}/session/${sessionID}`)
await expectSessionTitle(page, title)
const panel = page.locator("#review-panel")
await panel.getByRole("button", { name: "Open file" }).click()
const filter = panel.getByRole("combobox", { name: "Filter files" })
await filter.fill("file-0")
await expect(panel.getByRole("option", { name: "file-00.ts" })).toBeVisible()
const nextSearch = page.waitForRequest((request) => {
const url = new URL(request.url())
return url.pathname === "/find/file" && url.searchParams.get("query") === "file-7"
})
await filter.fill("file-7")
await nextSearch
await expect(panel.getByRole("option", { name: "file-00.ts" })).toBeVisible()
searchPending.resolve()
await expect(panel.getByRole("option", { name: "file-79.ts" })).toBeVisible()
await expect(panel.getByRole("option", { name: "file-00.ts" })).toBeHidden()
})
type Probed = HTMLElement & { __e2eProbe?: string }
async function writeProbe(page: Page) {
@@ -74,7 +107,10 @@ async function readProbe(page: Page) {
.evaluate((el) => (el as Probed).__e2eProbe)
}
async function setup(page: Page) {
async function setup(
page: Page,
findFiles?: (input: { query: string; dirs?: string; limit?: number }) => unknown | Promise<unknown>,
) {
await mockOpenCodeServer(page, {
directory,
project: {
@@ -119,6 +155,7 @@ async function setup(page: Page) {
}))
},
fileContent: (path) => ({ type: "text", content: `contents:${path}` }),
findFiles,
pageMessages: () => ({ items: [] }),
})
+1 -1
View File
@@ -26,7 +26,7 @@ export interface MockServerConfig {
questions?: unknown[] | (() => unknown[])
fileList?: (path: string) => unknown | Promise<unknown>
fileContent?: (path: string) => unknown | Promise<unknown>
findFiles?: (input: { query: string; dirs?: string; limit?: number }) => unknown
findFiles?: (input: { query: string; dirs?: string; limit?: number }) => unknown | Promise<unknown>
sessionStatus?: Record<string, unknown> | (() => Record<string, unknown>)
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.18.18",
"version": "1.18.20",
"description": "",
"type": "module",
"exports": {
-11
View File
@@ -972,17 +972,6 @@ export default function LegacyLayout(props: ParentProps) {
keybind: "shift+alt+arrowdown",
onSelect: () => navigateSessionByUnseen(1),
},
{
id: "session.archive",
title: language.t("command.session.archive"),
category: language.t("command.category.session"),
keybind: "mod+shift+backspace",
disabled: !params.dir || !params.id,
onSelect: () => {
const session = currentSessions().find((s) => s.id === params.id)
if (session) void archiveSession(session)
},
},
{
id: "workspace.new",
title: language.t("workspace.new"),
@@ -0,0 +1,71 @@
import { useNavigate } from "@solidjs/router"
import { produce } from "solid-js/store"
import { notifySessionTabsRemoved } from "@/components/titlebar-session-events"
import { useLanguage } from "@/context/language"
import { useSDK } from "@/context/sdk"
import { useSync } from "@/context/sync"
import { useTabs } from "@/context/tabs"
import { errorMessage } from "@/pages/layout/helpers"
import { useSessionKey } from "@/pages/session/session-layout"
import { legacySessionHref, requireServerKey, sessionHref } from "@/utils/session-route"
import { showToast } from "@/utils/toast"
export function useSessionArchive() {
const language = useLanguage()
const navigate = useNavigate()
const sdk = useSDK()
const sync = useSync()
const tabs = useTabs()
const { params } = useSessionKey()
const navigateAfterRemoval = (sessionID: string, parentID?: string, nextSessionID?: string) => {
if (params.id !== sessionID) return
const href = (id: string) =>
params.serverKey ? sessionHref(requireServerKey(params.serverKey), id) : legacySessionHref(sdk().directory, id)
if (parentID) {
navigate(href(parentID))
return
}
if (nextSessionID) {
navigate(href(nextSessionID))
return
}
if (params.serverKey) {
tabs.newDraft({ server: requireServerKey(params.serverKey), directory: sdk().directory })
return
}
navigate(`/${params.dir}/session`)
}
const archive = async (sessionID: string) => {
const session = sync().session.get(sessionID)
if (!session) return
if ((await sdk().protocol) !== "v1") return
const sessions = sync().data.session ?? []
const index = sessions.findIndex((s) => s.id === sessionID)
const nextSession = index === -1 ? undefined : (sessions[index + 1] ?? sessions[index - 1])
await sdk()
.client.session.update({ sessionID, directory: sdk().directory, time: { archived: Date.now() } })
.then(() => {
sync().set(
produce((draft) => {
const index = draft.session.findIndex((s) => s.id === sessionID)
if (index !== -1) draft.session.splice(index, 1)
}),
)
sync().session.evict(sessionID)
navigateAfterRemoval(sessionID, session.parentID, nextSession?.id)
notifySessionTabsRemoved({ directory: sdk().directory, sessionIDs: [sessionID] })
})
.catch((err) => {
showToast({
title: language.t("common.requestFailed"),
description: errorMessage(err, language.t("common.requestFailed")),
})
})
}
return { archive, navigateAfterRemoval }
}
@@ -63,10 +63,10 @@ import { SessionContextUsage } from "@/components/session-context-usage"
import { useDialog } from "@opencode-ai/ui/context/dialog"
import { useLanguage } from "@/context/language"
import { useSessionKey } from "@/pages/session/session-layout"
import { useSessionArchive } from "@/pages/session/session-archive"
import { useServerSDK } from "@/context/server-sdk"
import { usePlatform } from "@/context/platform"
import { useSettings } from "@/context/settings"
import { useTabs } from "@/context/tabs"
import { legacySessionHref, requireServerKey, sessionHref } from "@/utils/session-route"
import { useSDK } from "@/context/sdk"
import { useSync } from "@/context/sync"
@@ -263,8 +263,8 @@ export function MessageTimeline(props: {
const sdk = useSDK()
const sync = useSync()
const settings = useSettings()
const tabs = useTabs()
const dialog = useDialog()
const sessionArchive = useSessionArchive()
const language = useLanguage()
const { params, sessionKey } = useSessionKey()
const ownerSessionKey = sessionKey()
@@ -790,25 +790,6 @@ export function MessageTimeline(props: {
titleMutation.mutate({ id, title: next })
}
const navigateAfterSessionRemoval = (sessionID: string, parentID?: string, nextSessionID?: string) => {
if (params.id !== sessionID) return
const href = (id: string) =>
params.serverKey ? sessionHref(requireServerKey(params.serverKey), id) : legacySessionHref(sdk().directory, id)
if (parentID) {
navigate(href(parentID))
return
}
if (nextSessionID) {
navigate(href(nextSessionID))
return
}
if (params.serverKey) {
tabs.newDraft({ server: requireServerKey(params.serverKey), directory: sdk().directory })
return
}
navigate(`/${params.dir}/session`)
}
const exportSession = async (sessionID: string) => {
try {
const data = await fetchSessionExport({
@@ -832,36 +813,6 @@ export function MessageTimeline(props: {
}
}
const archiveSession = async (sessionID: string) => {
const session = sync().session.get(sessionID)
if (!session) return
if ((await sdk().protocol) !== "v1") return
const sessions = sync().data.session ?? []
const index = sessions.findIndex((s) => s.id === sessionID)
const nextSession = index === -1 ? undefined : (sessions[index + 1] ?? sessions[index - 1])
await sdk()
.client.session.update({ sessionID, directory: sdk().directory, time: { archived: Date.now() } })
.then(() => {
sync().set(
produce((draft) => {
const index = draft.session.findIndex((s) => s.id === sessionID)
if (index !== -1) draft.session.splice(index, 1)
}),
)
sync().session.evict(sessionID)
navigateAfterSessionRemoval(sessionID, session.parentID, nextSession?.id)
notifySessionTabsRemoved({ directory: sdk().directory, sessionIDs: [sessionID] })
})
.catch((err) => {
showToast({
title: language.t("common.requestFailed"),
description: errorMessage(err),
})
})
}
const deleteSession = async (sessionID: string) => {
const session = sync().session.get(sessionID)
if (!session) return false
@@ -911,7 +862,7 @@ export function MessageTimeline(props: {
}
}
navigateAfterSessionRemoval(sessionID, session.parentID, nextSession?.id)
sessionArchive.navigateAfterRemoval(sessionID, session.parentID, nextSession?.id)
sync().set(
produce((draft) => {
@@ -1593,7 +1544,7 @@ export function MessageTimeline(props: {
<DropdownMenu.Item onSelect={() => exportSession(id)}>
<DropdownMenu.ItemLabel>{language.t("common.export")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item>
<DropdownMenu.Item onSelect={() => void archiveSession(id)}>
<DropdownMenu.Item onSelect={() => void sessionArchive.archive(id)}>
<DropdownMenu.ItemLabel>{language.t("common.archive")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item>
<DropdownMenu.Separator />
@@ -1667,7 +1618,7 @@ export function MessageTimeline(props: {
<MenuV2.Item onSelect={() => exportSession(id)}>
{language.t("common.export")}...
</MenuV2.Item>
<MenuV2.Item onSelect={() => void archiveSession(id)}>
<MenuV2.Item onSelect={() => void sessionArchive.archive(id)}>
{language.t("common.archive")}
</MenuV2.Item>
<MenuV2.Separator />
@@ -18,6 +18,7 @@ import { createSessionTabs } from "@/pages/session/helpers"
import { extractPromptFromParts } from "@/utils/prompt"
import { Message, Part, UserMessage } from "@opencode-ai/sdk/v2"
import { useSessionLayout } from "@/pages/session/session-layout"
import { useSessionArchive } from "@/pages/session/session-archive"
import { createSessionOwnership } from "./session-ownership"
import { useLocal } from "@/context/local"
@@ -52,6 +53,7 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
const navigate = useNavigate()
const { params, sessionKey, tabs, view } = useSessionLayout()
const sessionOwnership = createSessionOwnership(sessionKey)
const sessionArchive = useSessionArchive()
const openDialog = async <T,>(load: () => Promise<T>, show: (value: T) => void) => {
const owner = sessionOwnership.capture()
const value = await load()
@@ -497,6 +499,16 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
disabled: !params.id,
onSelect: exportSession,
}),
sessionCommand({
id: "session.archive",
title: language.t("command.session.archive"),
keybind: "mod+shift+backspace",
disabled: !params.id,
onSelect: () => {
const id = params.id
if (id) void sessionArchive.archive(id)
},
}),
]
const fileCmds = () => {
@@ -1,5 +1,5 @@
import { createMemo, createSignal, createUniqueId, Show } from "solid-js"
import { createQuery } from "@tanstack/solid-query"
import { createQuery, keepPreviousData } from "@tanstack/solid-query"
import { Icon } from "@opencode-ai/ui/icon"
import { SessionFilePanelV2, SessionFilePanelV2Empty } from "@opencode-ai/session-ui/v2/session-file-panel-v2"
import { SessionReviewV2Sidebar } from "@opencode-ai/session-ui/v2/session-review-v2"
@@ -50,6 +50,7 @@ export function SessionFileBrowserTab(props: {
queryKey: ["session-open-file", workspaceKey(), value] as const,
enabled: value.length > 0,
queryFn: ({ signal }) => file.searchFiles(value, { limit: 200, signal }),
placeholderData: keepPreviousData,
}
})
const files = createMemo(() => {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/cli",
"version": "1.18.18",
"version": "1.18.20",
"type": "module",
"license": "MIT",
"bin": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/codemode",
"version": "1.18.18",
"version": "1.18.20",
"description": "Effect-native confined code execution over schema-described tools",
"private": true,
"type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
"version": "1.18.18",
"version": "1.18.20",
"type": "module",
"license": "MIT",
"scripts": {
+4
View File
@@ -252,6 +252,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "الاستثناءات التالية",
"go.title": "OpenCode Go | نماذج برمجة منخفضة التكلفة للجميع",
"go.banner.text": "Ox Alpha Free متاح على Go لفترة محدودة",
"go.meta.description":
"يبدأ Go بسعر $5 للشهر الأول، ثم $10/شهر، مع حدود استخدام سخية ووصول موثوق إلى نماذج البرمجة الرائدة.",
"go.hero.title": "نماذج برمجة منخفضة التكلفة للجميع",
@@ -269,6 +270,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle ونماذج مجانية",
"go.graph.go": "Go",
"go.graph.label": "الطلبات كل 5 ساعات",
"go.graph.limitedRegions": "مناطق محدودة",
"go.graph.limitedTime": "لفترة محدودة",
"go.graph.usageLimits": "حدود الاستخدام",
"go.graph.aria": "الطلبات كل 5 ساعات: {{free}} مقابل {{go}}",
@@ -670,6 +673,7 @@ export const dict = {
'اختر "OpenCode Go" كمزود في إعدادات opencode الخاصة بك لاستخدام نماذج Go.',
"workspace.lite.providers.title": "المزودون",
"workspace.lite.providers.description": "تحكم في المزودين المستخدمين للتوجيه.",
"workspace.lite.providers.allowTraining": "السماح بالنماذج التي تتدرب على بيانات الطلبات",
"workspace.lite.providers.useChina": "تفعيل النماذج المستضافة في الصين",
"workspace.lite.black.message":
"أنت مشترك حاليًا في OpenCode Black أو في قائمة الانتظار. يرجى إلغاء الاشتراك أولاً إذا كنت ترغب في التبديل إلى Go.",
+4
View File
@@ -256,6 +256,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "seguintes exceções",
"go.title": "OpenCode Go | Modelos de codificação de baixo custo para todos",
"go.banner.text": "Ox Alpha Free está disponível no Go por tempo limitado",
"go.meta.description":
"O Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos de uso e acesso confiável aos principais modelos de codificação.",
"go.hero.title": "Modelos de codificação de baixo custo para todos",
@@ -273,6 +274,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle e modelos gratuitos",
"go.graph.go": "Go",
"go.graph.label": "Requisições por 5 horas",
"go.graph.limitedRegions": "regiões limitadas",
"go.graph.limitedTime": "tempo limitado",
"go.graph.usageLimits": "Limites de uso",
"go.graph.aria": "Requisições por 5h: {{free}} vs {{go}}",
@@ -681,6 +684,7 @@ export const dict = {
'Selecione "OpenCode Go" como provedor na sua configuração do opencode para usar os modelos Go.',
"workspace.lite.providers.title": "Provedores",
"workspace.lite.providers.description": "Controle quais provedores são usados para roteamento.",
"workspace.lite.providers.allowTraining": "Permitir modelos que usam dados de solicitações para treinamento",
"workspace.lite.providers.useChina": "Ativar modelos hospedados na China",
"workspace.lite.black.message":
"Você está atualmente inscrito no OpenCode Black ou na lista de espera. Por favor, cancele a assinatura primeiro se desejar mudar para o Go.",
+4
View File
@@ -254,6 +254,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "følgende undtagelser",
"go.title": "OpenCode Go | Kodningsmodeller til lav pris for alle",
"go.banner.text": "Ox Alpha Free er tilgængelig på Go i en begrænset periode",
"go.meta.description":
"Go starter ved $5 for den første måned, derefter $10/måned, med generøse brugsgrænser og pålidelig adgang til førende kodningsmodeller.",
"go.hero.title": "Kodningsmodeller til lav pris for alle",
@@ -271,6 +272,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle og gratis modeller",
"go.graph.go": "Go",
"go.graph.label": "Forespørgsler pr. 5 timer",
"go.graph.limitedRegions": "begrænsede regioner",
"go.graph.limitedTime": "begrænset periode",
"go.graph.usageLimits": "Brugsgrænser",
"go.graph.aria": "Forespørgsler pr. 5t: {{free}} vs {{go}}",
@@ -678,6 +681,7 @@ export const dict = {
'Vælg "OpenCode Go" som udbyder i din opencode-konfiguration for at bruge Go-modeller.',
"workspace.lite.providers.title": "Udbydere",
"workspace.lite.providers.description": "Styr, hvilke udbydere der bruges til routing.",
"workspace.lite.providers.allowTraining": "Tillad modeller, der træner på anmodningsdata",
"workspace.lite.providers.useChina": "Aktivér modeller hostet i Kina",
"workspace.lite.black.message":
"Du abonnerer i øjeblikket på OpenCode Black eller er på venteliste. Afmeld venligst først, hvis du vil skifte til Go.",
+4
View File
@@ -256,6 +256,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "folgenden Ausnahmen",
"go.title": "OpenCode Go | Kostengünstige Coding-Modelle für alle",
"go.banner.text": "Ox Alpha Free ist für begrenzte Zeit auf Go verfügbar",
"go.meta.description":
"Go beginnt bei $5 für deinen ersten Monat, danach $10/Monat, mit großzügigen Nutzungslimits und zuverlässigem Zugang zu führenden Coding-Modellen.",
"go.hero.title": "Kostengünstige Coding-Modelle für alle",
@@ -273,6 +274,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle und kostenlose Modelle",
"go.graph.go": "Go",
"go.graph.label": "Anfragen pro 5 Stunden",
"go.graph.limitedRegions": "begrenzte Regionen",
"go.graph.limitedTime": "begrenzte Zeit",
"go.graph.usageLimits": "Nutzungslimits",
"go.graph.aria": "Anfragen pro 5h: {{free}} vs {{go}}",
@@ -680,6 +683,7 @@ export const dict = {
'Wähle "OpenCode Go" als Anbieter in deiner opencode-Konfiguration, um Go-Modelle zu verwenden.',
"workspace.lite.providers.title": "Anbieter",
"workspace.lite.providers.description": "Steuere, welche Anbieter für das Routing verwendet werden.",
"workspace.lite.providers.allowTraining": "Modelle zulassen, die mit Anfragedaten trainieren",
"workspace.lite.providers.useChina": "In China gehostete Modelle aktivieren",
"workspace.lite.black.message":
"Du hast derzeit OpenCode Black abonniert oder stehst auf der Warteliste. Bitte kündige zuerst, wenn du zu Go wechseln möchtest.",
+3
View File
@@ -253,6 +253,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "following exceptions",
"go.title": "OpenCode Go | Low cost coding models for everyone",
"go.banner.text": "Ox Alpha Free is available on Go for a limited time",
"go.meta.description":
"Go starts at $5 for your first month, then $10/month, with generous usage limits and reliable access to leading coding models.",
"go.hero.title": "Low cost coding models for everyone",
@@ -269,6 +270,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle and free models",
"go.graph.go": "Go",
"go.graph.label": "Requests per 5 hour",
"go.graph.limitedRegions": "limited regions",
"go.graph.limitedTime": "limited time",
"go.graph.tick": "{{n}}x",
"go.graph.usageLimits": "Usage limits",
"go.graph.aria": "Requests per 5h: {{free}} vs {{go}}",
+4
View File
@@ -257,6 +257,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "siguientes excepciones",
"go.title": "OpenCode Go | Modelos de programación de bajo coste para todos",
"go.banner.text": "Ox Alpha Free está disponible en Go por tiempo limitado",
"go.meta.description":
"Go comienza en $5 el primer mes, luego 10 $/mes, con límites de uso generosos y acceso fiable a modelos de programación líderes.",
"go.hero.title": "Modelos de programación de bajo coste para todos",
@@ -274,6 +275,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle y modelos gratuitos",
"go.graph.go": "Go",
"go.graph.label": "Solicitudes por 5 horas",
"go.graph.limitedRegions": "regiones limitadas",
"go.graph.limitedTime": "tiempo limitado",
"go.graph.usageLimits": "Límites de uso",
"go.graph.aria": "Solicitudes por 5h: {{free}} vs {{go}}",
@@ -681,6 +684,7 @@ export const dict = {
'Selecciona "OpenCode Go" como proveedor en tu configuración de opencode para usar los modelos Go.',
"workspace.lite.providers.title": "Proveedores",
"workspace.lite.providers.description": "Controla qué proveedores se usan para el enrutamiento.",
"workspace.lite.providers.allowTraining": "Permitir modelos que se entrenan con los datos de las solicitudes",
"workspace.lite.providers.useChina": "Activar modelos alojados en China",
"workspace.lite.black.message":
"Actualmente estás suscrito a OpenCode Black o estás en la lista de espera. Por favor, cancela la suscripción primero si deseas cambiar a Go.",
+4
View File
@@ -258,6 +258,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "exceptions suivantes",
"go.title": "OpenCode Go | Modèles de code à faible coût pour tous",
"go.banner.text": "Ox Alpha Free est disponible sur Go pour une durée limitée",
"go.meta.description":
"Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites d'utilisation généreuses et un accès fiable aux principaux modèles de codage.",
"go.hero.title": "Modèles de code à faible coût pour tous",
@@ -275,6 +276,8 @@ export const dict = {
"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.limitedRegions": "régions limitées",
"go.graph.limitedTime": "durée limitée",
"go.graph.usageLimits": "Limites d'utilisation",
"go.graph.aria": "Requêtes par 5h : {{free}} vs {{go}}",
@@ -688,6 +691,7 @@ export const dict = {
'Sélectionnez "OpenCode Go" comme fournisseur dans votre configuration opencode pour utiliser les modèles Go.',
"workspace.lite.providers.title": "Fournisseurs",
"workspace.lite.providers.description": "Contrôlez les fournisseurs utilisés pour le routage.",
"workspace.lite.providers.allowTraining": "Autoriser les modèles qui sentraînent sur les données des requêtes",
"workspace.lite.providers.useChina": "Activer les modèles hébergés en Chine",
"workspace.lite.black.message":
"Vous êtes actuellement abonné à OpenCode Black ou sur liste d'attente. Veuillez d'abord vous désabonner si vous souhaitez passer à Go.",
+4
View File
@@ -254,6 +254,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "seguenti eccezioni",
"go.title": "OpenCode Go | Modelli di coding a basso costo per tutti",
"go.banner.text": "Ox Alpha Free è disponibile su Go per un periodo limitato",
"go.meta.description":
"Go inizia a $5 per il primo mese, poi $10/mese, con limiti di utilizzo generosi e un accesso affidabile ai principali modelli di coding.",
"go.hero.title": "Modelli di coding a basso costo per tutti",
@@ -271,6 +272,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle e modelli gratuiti",
"go.graph.go": "Go",
"go.graph.label": "Richieste ogni 5 ore",
"go.graph.limitedRegions": "regioni limitate",
"go.graph.limitedTime": "periodo limitato",
"go.graph.usageLimits": "Limiti di utilizzo",
"go.graph.aria": "Richieste ogni 5h: {{free}} vs {{go}}",
@@ -679,6 +682,7 @@ export const dict = {
'Seleziona "OpenCode Go" come provider nella tua configurazione opencode per utilizzare i modelli Go.',
"workspace.lite.providers.title": "Provider",
"workspace.lite.providers.description": "Controlla quali provider vengono usati per il routing.",
"workspace.lite.providers.allowTraining": "Consenti i modelli che si addestrano sui dati delle richieste",
"workspace.lite.providers.useChina": "Abilita modelli ospitati in Cina",
"workspace.lite.black.message":
"Attualmente sei abbonato a OpenCode Black o sei in lista d'attesa. Annulla l'iscrizione prima se desideri passare a Go.",
+4
View File
@@ -253,6 +253,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "以下の例外",
"go.title": "OpenCode Go | すべての人のための低価格なコーディングモデル",
"go.banner.text": "Ox Alpha Freeは期間限定でGoで利用できます",
"go.meta.description":
"Goは最初の月$5、その後$10/月で、主要なコーディングモデルへのゆとりある利用上限と安定したアクセスを提供します。",
"go.hero.title": "すべての人のための低価格なコーディングモデル",
@@ -270,6 +271,8 @@ export const dict = {
"go.graph.freePill": "Big Pickleと無料モデル",
"go.graph.go": "Go",
"go.graph.label": "5時間あたりのリクエスト数",
"go.graph.limitedRegions": "一部の地域に限定",
"go.graph.limitedTime": "期間限定",
"go.graph.usageLimits": "利用制限",
"go.graph.aria": "5時間あたりのリクエスト数: {{free}} 対 {{go}}",
@@ -677,6 +680,7 @@ export const dict = {
"Go モデルを使用するには、opencode の設定で「OpenCode Go」をプロバイダーとして選択してください。",
"workspace.lite.providers.title": "プロバイダー",
"workspace.lite.providers.description": "ルーティングに使用するプロバイダーを管理します。",
"workspace.lite.providers.allowTraining": "リクエストデータを学習に使用するモデルを許可",
"workspace.lite.providers.useChina": "中国でホストされているモデルを有効にする",
"workspace.lite.black.message":
"現在 OpenCode Black を購読中、またはウェイティングリストに登録されています。Go に切り替える場合は、先に登録を解除してください。",
+4
View File
@@ -250,6 +250,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "다음 예외",
"go.title": "OpenCode Go | 모두를 위한 저비용 코딩 모델",
"go.banner.text": "Ox Alpha Free가 한정된 기간 동안 Go에서 제공됩니다",
"go.meta.description":
"Go는 첫 달 $5, 이후 $10/월로 시작하며, 넉넉한 사용 한도와 주요 코딩 모델에 대한 안정적인 액세스를 제공합니다.",
"go.hero.title": "모두를 위한 저비용 코딩 모델",
@@ -267,6 +268,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle 및 무료 모델",
"go.graph.go": "Go",
"go.graph.label": "5시간당 요청 수",
"go.graph.limitedRegions": "일부 지역에서만 제공",
"go.graph.limitedTime": "한정된 기간",
"go.graph.usageLimits": "사용 한도",
"go.graph.aria": "5시간당 요청 수: {{free}} 대 {{go}}",
@@ -669,6 +672,7 @@ export const dict = {
'Go 모델을 사용하려면 opencode 설정에서 "OpenCode Go"를 공급자로 선택하세요.',
"workspace.lite.providers.title": "공급자",
"workspace.lite.providers.description": "라우팅에 사용할 공급자를 제어합니다.",
"workspace.lite.providers.allowTraining": "요청 데이터를 학습에 사용하는 모델 허용",
"workspace.lite.providers.useChina": "중국에서 호스팅되는 모델 활성화",
"workspace.lite.black.message":
"현재 OpenCode Black을 구독 중이거나 대기 명단에 등록되어 있습니다. Go로 전환하려면 먼저 구독을 취소해 주세요.",
+4
View File
@@ -254,6 +254,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "følgende unntak",
"go.title": "OpenCode Go | Rimelige kodemodeller for alle",
"go.banner.text": "Ox Alpha Free er tilgjengelig på Go i en begrenset periode",
"go.meta.description":
"Go starter på $5 for den første måneden, deretter $10/måned, med sjenerøse bruksgrenser og pålitelig tilgang til ledende kodemodeller.",
"go.hero.title": "Rimelige kodemodeller for alle",
@@ -271,6 +272,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle og gratis modeller",
"go.graph.go": "Go",
"go.graph.label": "Forespørsler per 5 timer",
"go.graph.limitedRegions": "begrensede regioner",
"go.graph.limitedTime": "begrenset periode",
"go.graph.usageLimits": "Bruksgrenser",
"go.graph.aria": "Forespørsler per 5t: {{free}} vs {{go}}",
@@ -679,6 +682,7 @@ export const dict = {
'Velg "OpenCode Go" som leverandør i opencode-konfigurasjonen din for å bruke Go-modeller.',
"workspace.lite.providers.title": "Leverandører",
"workspace.lite.providers.description": "Kontroller hvilke leverandører som brukes til ruting.",
"workspace.lite.providers.allowTraining": "Tillat modeller som trener på forespørselsdata",
"workspace.lite.providers.useChina": "Aktiver modeller hostet i Kina",
"workspace.lite.black.message":
"Du abonnerer for øyeblikket på OpenCode Black eller står på venteliste. Vennligst avslutt abonnementet først hvis du vil bytte til Go.",
+4
View File
@@ -255,6 +255,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "następującymi wyjątkami",
"go.title": "OpenCode Go | Niskokosztowe modele do kodowania dla każdego",
"go.banner.text": "Ox Alpha Free jest dostępny w Go przez ograniczony czas",
"go.meta.description":
"Go kosztuje $5 za pierwszy miesiąc, a następnie $10/miesiąc, oferując hojne limity użycia i niezawodny dostęp do wiodących modeli do kodowania.",
"go.hero.title": "Niskokosztowe modele do kodowania dla każdego",
@@ -272,6 +273,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle i darmowe modele",
"go.graph.go": "Go",
"go.graph.label": "Żądania na 5 godzin",
"go.graph.limitedRegions": "ograniczone regiony",
"go.graph.limitedTime": "ograniczony czas",
"go.graph.usageLimits": "Limity użycia",
"go.graph.aria": "Żądania na 5h: {{free}} vs {{go}}",
@@ -679,6 +682,7 @@ export const dict = {
'Wybierz "OpenCode Go" jako dostawcę w konfiguracji opencode, aby używać modeli Go.',
"workspace.lite.providers.title": "Dostawcy",
"workspace.lite.providers.description": "Kontroluj, którzy dostawcy są używani do routingu.",
"workspace.lite.providers.allowTraining": "Zezwalaj na modele wykorzystujące dane żądań do trenowania",
"workspace.lite.providers.useChina": "Włącz modele hostowane w Chinach",
"workspace.lite.black.message":
"Obecnie subskrybujesz OpenCode Black lub jesteś na liście oczekujących. Jeśli chcesz przejść na Go, najpierw anuluj subskrypcję.",
+4
View File
@@ -258,6 +258,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "следующими исключениями",
"go.title": "OpenCode Go | Недорогие модели для кодинга для всех",
"go.banner.text": "Ox Alpha Free доступна в Go в течение ограниченного времени",
"go.meta.description":
"Go стоит $5 за первый месяц, затем $10/месяц и предлагает щедрые лимиты использования и надежный доступ к ведущим моделям для кодинга.",
"go.hero.title": "Недорогие модели для кодинга для всех",
@@ -275,6 +276,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle и бесплатные модели",
"go.graph.go": "Go",
"go.graph.label": "Запросов за 5 часов",
"go.graph.limitedRegions": "доступно в отдельных регионах",
"go.graph.limitedTime": "ограниченное время",
"go.graph.usageLimits": "Лимиты использования",
"go.graph.aria": "Запросов за 5ч: {{free}} против {{go}}",
@@ -686,6 +689,7 @@ export const dict = {
'Выберите "OpenCode Go" в качестве провайдера в настройках opencode для использования моделей Go.',
"workspace.lite.providers.title": "Провайдеры",
"workspace.lite.providers.description": "Управляйте провайдерами, используемыми для маршрутизации.",
"workspace.lite.providers.allowTraining": "Разрешить модели, обучающиеся на данных запросов",
"workspace.lite.providers.useChina": "Включить модели, размещенные в Китае",
"workspace.lite.black.message":
"Вы подписаны на OpenCode Black или находитесь в списке ожидания. Пожалуйста, сначала отмените подписку, если хотите перейти на Go.",
+4
View File
@@ -253,6 +253,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "ข้อยกเว้นดังนี้",
"go.title": "OpenCode Go | โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
"go.banner.text": "Ox Alpha Free พร้อมใช้งานบน Go ในช่วงเวลาจำกัด",
"go.meta.description":
"Go เริ่มต้นที่ $5 สำหรับเดือนแรก จากนั้น $10/เดือน พร้อมขีดจำกัดการใช้งานที่เอื้อเฟื้อและการเข้าถึงโมเดลเขียนโค้ดชั้นนำอย่างเชื่อถือได้",
"go.hero.title": "โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
@@ -269,6 +270,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle และโมเดลฟรี",
"go.graph.go": "Go",
"go.graph.label": "คำขอต่อ 5 ชั่วโมง",
"go.graph.limitedRegions": "เฉพาะบางภูมิภาค",
"go.graph.limitedTime": "ช่วงเวลาจำกัด",
"go.graph.usageLimits": "ขีดจำกัดการใช้งาน",
"go.graph.aria": "คำขอต่อ 5 ชม.: {{free}} vs {{go}}",
@@ -674,6 +677,7 @@ export const dict = {
'เลือก "OpenCode Go" เป็นผู้ให้บริการในการตั้งค่า opencode ของคุณเพื่อใช้โมเดล Go',
"workspace.lite.providers.title": "ผู้ให้บริการ",
"workspace.lite.providers.description": "ควบคุมผู้ให้บริการที่ใช้สำหรับการกำหนดเส้นทาง",
"workspace.lite.providers.allowTraining": "อนุญาตโมเดลที่ฝึกด้วยข้อมูลคำขอ",
"workspace.lite.providers.useChina": "เปิดใช้โมเดลที่โฮสต์ในจีน",
"workspace.lite.black.message":
"ขณะนี้คุณสมัครสมาชิก OpenCode Black หรืออยู่ในรายการรอ โปรดยกเลิกการสมัครก่อนหากต้องการเปลี่ยนไปใช้ Go",
+4
View File
@@ -256,6 +256,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "aşağıdaki istisnalar",
"go.title": "OpenCode Go | Herkes için düşük maliyetli kodlama modelleri",
"go.banner.text": "Ox Alpha Free sınırlı bir süre için Go'da kullanılabilir",
"go.meta.description":
"Go ilk ay $5, sonrasında ayda 10$ fiyatıyla başlar; cömert kullanım limitleri ve önde gelen kodlama modellerine güvenilir erişim sunar.",
"go.hero.title": "Herkes için düşük maliyetli kodlama modelleri",
@@ -273,6 +274,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle ve ücretsiz modeller",
"go.graph.go": "Go",
"go.graph.label": "5 saat başına istekler",
"go.graph.limitedRegions": "sınırlı bölgeler",
"go.graph.limitedTime": "sınırlı süre",
"go.graph.usageLimits": "Kullanım limitleri",
"go.graph.aria": "5 saatlik istekler: {{free}} vs {{go}}",
@@ -682,6 +685,7 @@ export const dict = {
'Go modellerini kullanmak için opencode yapılandırmanızda "OpenCode Go"\'yu sağlayıcı olarak seçin.',
"workspace.lite.providers.title": "Sağlayıcılar",
"workspace.lite.providers.description": "Yönlendirme için hangi sağlayıcıların kullanılacağını kontrol edin.",
"workspace.lite.providers.allowTraining": "İstek verileriyle eğitilen modellere izin ver",
"workspace.lite.providers.useChina": "Çin'de barındırılan modelleri etkinleştir",
"workspace.lite.black.message":
"Şu anda OpenCode Black abonesisiniz veya bekleme listesindesiniz. Go'ya geçmek istiyorsanız lütfen önce aboneliğinizi iptal edin.",
+4
View File
@@ -255,6 +255,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "такими винятками",
"go.title": "OpenCode Go | Недорогі моделі кодування для всіх",
"go.banner.text": "Ox Alpha Free доступна в Go протягом обмеженого часу",
"go.meta.description":
"Go починається від $5 за перший місяць, потім $10/місяць, зі щедрими лімітами використання та надійним доступом до провідних моделей для кодування.",
"go.hero.title": "Недорогі моделі кодування для всіх",
@@ -272,6 +273,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle та безкоштовні моделі",
"go.graph.go": "Go",
"go.graph.label": "Запитів за 5 годин",
"go.graph.limitedRegions": "обмежені регіони",
"go.graph.limitedTime": "обмежений час",
"go.graph.usageLimits": "Ліміти використання",
"go.graph.aria": "Запитів за 5 год: {{free}} vs {{go}}",
@@ -677,6 +680,7 @@ export const dict = {
"workspace.lite.subscription.selectProvider": 'Виберіть "OpenCode Go" як провайдера в конфігурації opencode.',
"workspace.lite.providers.title": "Провайдери",
"workspace.lite.providers.description": "Керуйте провайдерами, які використовуються для маршрутизації.",
"workspace.lite.providers.allowTraining": "Дозволити моделі, що навчаються на даних запитів",
"workspace.lite.providers.useChina": "Увімкнути моделі, розміщені в Китаї",
"workspace.lite.black.message":
"Ви вже підписані на OpenCode Black або в списку очікування. Спочатку скасуйте підписку, якщо хочете перейти на Go.",
+4
View File
@@ -244,6 +244,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "以下例外情况除外",
"go.title": "OpenCode Go | 人人可用的低成本编程模型",
"go.banner.text": "Ox Alpha Free 限时加入 Go",
"go.meta.description": "Go 首月 $5,之后 $10/月,提供充裕的使用限额,并可可靠访问领先的编程模型。",
"go.hero.title": "人人可用的低成本编程模型",
"go.hero.body":
@@ -259,6 +260,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle 和免费模型",
"go.graph.go": "Go",
"go.graph.label": "每 5 小时请求数",
"go.graph.limitedRegions": "仅限部分地区",
"go.graph.limitedTime": "限时",
"go.graph.usageLimits": "使用限制",
"go.graph.aria": "每 5 小时请求数: {{free}} vs {{go}}",
@@ -649,6 +652,7 @@ export const dict = {
"在你的 opencode 配置中选择「OpenCode Go」作为提供商,即可使用 Go 模型。",
"workspace.lite.providers.title": "提供商",
"workspace.lite.providers.description": "控制用于路由的提供商。",
"workspace.lite.providers.allowTraining": "允许使用请求数据进行训练的模型",
"workspace.lite.providers.useChina": "启用部署在中国的模型",
"workspace.lite.black.message": "您当前已订阅 OpenCode Black 或在候补名单中。如需切换到 Go,请先取消订阅。",
"workspace.lite.other.message": "此工作区中的另一位成员已经订阅了 OpenCode Go。每个工作区只有一名成员可以订阅。",
+4
View File
@@ -244,6 +244,7 @@ export const dict = {
"zen.privacy.exceptionsLink": "以下例外情況",
"go.title": "OpenCode Go | 低成本全民編碼模型",
"go.banner.text": "Ox Alpha Free 限時加入 Go",
"go.meta.description": "Go 首月 $5,之後 $10/月,提供充裕的使用限額,並可穩定存取領先的編碼模型。",
"go.hero.title": "低成本全民編碼模型",
"go.hero.body":
@@ -259,6 +260,8 @@ export const dict = {
"go.graph.freePill": "Big Pickle 與免費模型",
"go.graph.go": "Go",
"go.graph.label": "每 5 小時請求數",
"go.graph.limitedRegions": "僅限部分地區",
"go.graph.limitedTime": "限時",
"go.graph.usageLimits": "使用限制",
"go.graph.aria": "每 5 小時請求數:{{free}} vs {{go}}",
@@ -649,6 +652,7 @@ export const dict = {
"在您的 opencode 設定中選擇「OpenCode Go」作為提供商,即可使用 Go 模型。",
"workspace.lite.providers.title": "提供商",
"workspace.lite.providers.description": "控制用於路由的提供商。",
"workspace.lite.providers.allowTraining": "允許使用請求資料進行訓練的模型",
"workspace.lite.providers.useChina": "啟用部署在中國的模型",
"workspace.lite.black.message": "您目前已訂閱 OpenCode Black 或在候補名單中。若要切換至 Go,請先取消訂閱。",
"workspace.lite.other.message": "此工作區中的另一位成員已訂閱 OpenCode Go。每個工作區只能有一位成員訂閱。",
@@ -1,65 +1,25 @@
const MUSE_SPARK_BLOCKED_COUNTRIES = new Set([
"AD",
"AF",
"AT",
"AU",
"BE",
"BG",
"BR",
"BY",
"CA",
"CH",
"CN",
"CU",
"CY",
"CZ",
"DE",
"DK",
"EE",
"EH",
"ER",
"ES",
"ET",
"FI",
"FR",
"GB",
"GR",
"HK",
"HR",
"HT",
"HU",
"IE",
"IQ",
"IR",
"IS",
"IT",
"KH",
"KP",
"KR",
"LI",
"LT",
"LU",
"LV",
"LY",
"MC",
"MM",
"MO",
"MT",
"NI",
"NL",
"NO",
"PK",
"PL",
"PT",
"RO",
"RU",
"SE",
"SI",
"SK",
"SM",
"SO",
"SY",
"VA",
"VE",
])
@@ -70,5 +30,9 @@ export function countryFromRequest(request: Request | undefined) {
}
export function isModelCountryRestricted(model: string, country: string | undefined) {
return model === "muse-spark-1.2" && country !== undefined && MUSE_SPARK_BLOCKED_COUNTRIES.has(country.toUpperCase())
return (
["muse-spark-1.2-contributor", "muse-spark-1.2-contributor-free"].includes(model) &&
country !== undefined &&
MUSE_SPARK_BLOCKED_COUNTRIES.has(country.toUpperCase())
)
}
@@ -592,6 +592,16 @@ body {
white-space: nowrap;
}
:is([data-regions], [data-limited]) {
color: var(--color-text-weak);
white-space: nowrap;
a {
color: inherit;
pointer-events: auto;
}
}
[data-value] {
color: var(--color-text-strong);
font-weight: 600;
@@ -688,6 +698,11 @@ body {
fill: color-mix(in srgb, var(--bar-go) 50%, transparent);
}
[data-item][data-infinite] [data-value] {
font-size: 18px;
line-height: 1;
}
[data-val] {
fill: var(--color-text-strong);
font-size: 13px;
+33 -12
View File
@@ -39,7 +39,7 @@ const models = [
{ name: "Qwen3.6 Plus", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "MiniMax M3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "MiniMax M2.7", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Muse Spark 1.2", training: "go.faq.a5.used", retention: "go.faq.a5.notZdr" },
{ name: "Muse Spark 1.2 Contributor", training: "go.faq.a5.used", retention: "go.faq.a5.notZdr" },
{ name: "DeepSeek V4 Pro", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "DeepSeek V4 Flash", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Hy3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
@@ -73,13 +73,14 @@ function LimitsGraph(props: { href: string }) {
{ id: "qwen3.8-max", name: "Qwen3.8 Max", req: 160, d: "90ms" },
{ id: "glm-5.2", name: "GLM-5.2", req: 880, d: "100ms" },
{ id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", req: 1050, d: "150ms" },
{ id: "gpt-5.6-luna", name: "GPT 5.6 Luna", req: 2050, d: "290ms" },
{ id: "minimax-m3", name: "MiniMax M3", req: 3200, d: "210ms" },
{ id: "gpt-5.6-luna", name: "GPT 5.6 Luna", req: 4100, baseReq: 2050, d: "290ms" },
{ id: "qwen3.7-plus", name: "Qwen3.7 Plus", req: 4300, d: "300ms" },
{ id: "hy3", name: "Hy3", req: 4300, d: "320ms" },
{ id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", req: 7600, d: "330ms" },
{ id: "mimo-v2.5", name: "MiMo-V2.5", req: 30100, d: "340ms" },
{ id: "muse-spark-1.2", name: "Muse Spark 1.2", req: 45300, edge: true, d: "360ms" },
{ id: "hy3", name: "Hy3", req: 34400, baseReq: 4300, d: "320ms" },
{ id: "muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", req: 45300, edge: true, d: "360ms" },
{ id: "ox-alpha-free", name: "Ox Alpha Free", req: Infinity, infinite: true, edge: true, d: "400ms" },
]
const w = 1040
@@ -89,9 +90,10 @@ function LimitsGraph(props: { href: string }) {
const top = 18
const bottom = 44
const plot = chartW - left - right
const infiniteX = w - 180
const ratio = (n: number) => n / baseline
const rmax = Math.max(1, ...graph.map((m) => ratio(m.req)))
const rmax = Math.max(1, ...graph.filter((m) => !("infinite" in m)).map((m) => ratio(m.req)))
const log = (n: number) => Math.log10(Math.max(n, 1))
const base = 24
const p = 2.2
@@ -153,10 +155,10 @@ function LimitsGraph(props: { href: string }) {
<rect
x={left}
y={gy(i()) - bh / 2}
width={Math.max(0, x(ratio(m.baseReq ?? m.req)) - left)}
width={Math.max(0, ("infinite" in m ? infiniteX : x(ratio(m.baseReq ?? m.req))) - left)}
height={bh}
data-bar
data-kind="go"
data-kind={"infinite" in m ? "infinite" : "go"}
data-model={m.id}
/>
{m.baseReq && (
@@ -192,7 +194,7 @@ function LimitsGraph(props: { href: string }) {
</For>
</div>
<div data-slot="pills" aria-hidden="true">
<div data-slot="pills">
<For each={graph}>
{(m, i) => (
<span
@@ -200,11 +202,24 @@ function LimitsGraph(props: { href: string }) {
data-kind="go"
data-model={m.id}
data-edge={"edge" in m ? "" : undefined}
style={{ "--x": px(x(ratio(m.req))), "--y": py(gy(i())), "--d": m.d } as any}
data-infinite={"infinite" in m ? "" : undefined}
style={
{ "--x": px("infinite" in m ? infiniteX : x(ratio(m.req))), "--y": py(gy(i())), "--d": m.d } as any
}
>
<span data-value>{m.req.toLocaleString()}</span>
<span data-value>{"infinite" in m ? "∞" : m.req.toLocaleString()}</span>
<span data-name>{m.name}</span>
{m.baseReq && <span data-bonus>2x usage</span>}
{m.id === "muse-spark-1.2-contributor" && (
<span data-regions>
(
<a href="https://ai.developer.meta.com/legal/geographic-use-policy">
{i18n.t("go.graph.limitedRegions")}
</a>
)
</span>
)}
{"infinite" in m && <span data-limited>({i18n.t("go.graph.limitedTime")})</span>}
{m.baseReq && <span data-bonus>8x usage</span>}
</span>
)}
</For>
@@ -254,6 +269,12 @@ export default function Home() {
<div data-component="content">
<section data-component="hero">
<div data-component="desktop-app-banner">
<span data-slot="badge">{i18n.t("home.banner.badge")}</span>
<div data-slot="content">
<span data-slot="text">{i18n.t("go.banner.text")}</span>
</div>
</div>
<div data-slot="hero-copy">
<img data-slot="zen logo light" src={goLogoLight} alt="" />
<img data-slot="zen logo dark" src={goLogoDark} alt="" />
@@ -508,7 +529,7 @@ export default function Home() {
.
</p>
<p>
<strong>Muse Spark 1.2:</strong> {i18n.t("go.faq.a5.museRetention")}{" "}
<strong>Muse Spark 1.2 Contributor:</strong> {i18n.t("go.faq.a5.museRetention")}{" "}
<a href="https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier">
{i18n.t("go.faq.a5.learnMore")}
</a>
@@ -349,15 +349,18 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
<li>Kimi K2.6</li>
<li>MiniMax M3</li>
<li>MiniMax M2.7</li>
<li>Muse Spark 1.2 Contributor</li>
<li>Qwen3.8 Max</li>
<li>Qwen3.7 Max</li>
<li>Qwen3.7 Plus</li>
<li>Qwen3.6 Plus</li>
<li>DeepSeek V4 Pro</li>
<li>DeepSeek V4 Flash</li>
<li>DeepSeek V4 Flash Vision Exp</li>
<li>MiMo-V2.5</li>
<li>MiMo-V2.5-Pro</li>
<li>Hy3</li>
<li>Ox Alpha Free</li>
</ul>
<p data-slot="promo-description">{i18n.t("workspace.lite.promo.footer")}</p>
<div data-slot="subscribe-actions">
@@ -131,7 +131,12 @@ export async function handler(
: createKeyRateLimiter(modelInfo.id, modelInfo.rateLimit, zenApiKey, input.request)
await rateLimiter?.check()
const authInfo = await authenticate(modelInfo, zenApiKey)
if (authInfo && opts.modelList === "lite" && modelInfo.id === "muse-spark-1.2" && !authInfo.allowTraining)
if (
authInfo &&
opts.modelList === "lite" &&
modelInfo.id === "muse-spark-1.2-contributor" &&
!authInfo.allowTraining
)
throw new DataPolicyError(
t("zen.api.error.trainingNotAllowed", {
consoleGoUrl: `https://opencode.ai/workspace/${authInfo.workspaceID}/go`,
@@ -2,9 +2,7 @@
"version": "6",
"dialect": "mysql",
"id": "39a41b57-a092-4356-a8ed-2a51cde2da1d",
"prevIds": [
"2752a0ba-95b5-492a-83fd-3dfe7fa77734"
],
"prevIds": ["2752a0ba-95b5-492a-83fd-3dfe7fa77734"],
"ddl": [
{
"name": "account",
@@ -2689,201 +2687,139 @@
"table": "workspace"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "account",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "auth",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "benchmark",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "billing",
"entityType": "pks"
},
{
"columns": [
"email",
"type"
],
"columns": ["email", "type"],
"name": "PRIMARY",
"table": "coupon",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "lite",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "payment",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "subscription",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "usage",
"entityType": "pks"
},
{
"columns": [
"ip",
"interval"
],
"columns": ["ip", "interval"],
"name": "PRIMARY",
"table": "ip_rate_limit",
"entityType": "pks"
},
{
"columns": [
"ip"
],
"columns": ["ip"],
"name": "PRIMARY",
"table": "ip",
"entityType": "pks"
},
{
"columns": [
"key",
"interval"
],
"columns": ["key", "interval"],
"name": "PRIMARY",
"table": "key_rate_limit",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "model_sticky_provider",
"entityType": "pks"
},
{
"columns": [
"id",
"interval"
],
"columns": ["id", "interval"],
"name": "PRIMARY",
"table": "model_tpm_rate_limit",
"entityType": "pks"
},
{
"columns": [
"id",
"interval"
],
"columns": ["id", "interval"],
"name": "PRIMARY",
"table": "model_tps_rate_limit",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "key",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "model",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "provider",
"entityType": "pks"
},
{
"columns": [
"workspace_id"
],
"columns": ["workspace_id"],
"name": "PRIMARY",
"table": "referral_code",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"referral_id"
],
"columns": ["workspace_id", "referral_id"],
"name": "PRIMARY",
"table": "referral_reward",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "referral",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "user",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "workspace",
"entityType": "pks"
@@ -2,9 +2,7 @@
"version": "6",
"dialect": "mysql",
"id": "e365c1d7-fb02-44ad-b681-87bb51d01964",
"prevIds": [
"39a41b57-a092-4356-a8ed-2a51cde2da1d"
],
"prevIds": ["39a41b57-a092-4356-a8ed-2a51cde2da1d"],
"ddl": [
{
"name": "account",
@@ -2689,201 +2687,139 @@
"table": "workspace"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "account",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "auth",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "benchmark",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "billing",
"entityType": "pks"
},
{
"columns": [
"email",
"type"
],
"columns": ["email", "type"],
"name": "PRIMARY",
"table": "coupon",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "lite",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "payment",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "subscription",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "usage",
"entityType": "pks"
},
{
"columns": [
"ip",
"interval"
],
"columns": ["ip", "interval"],
"name": "PRIMARY",
"table": "ip_rate_limit",
"entityType": "pks"
},
{
"columns": [
"ip"
],
"columns": ["ip"],
"name": "PRIMARY",
"table": "ip",
"entityType": "pks"
},
{
"columns": [
"key",
"interval"
],
"columns": ["key", "interval"],
"name": "PRIMARY",
"table": "key_rate_limit",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "model_sticky_provider",
"entityType": "pks"
},
{
"columns": [
"id",
"interval"
],
"columns": ["id", "interval"],
"name": "PRIMARY",
"table": "model_tpm_rate_limit",
"entityType": "pks"
},
{
"columns": [
"id",
"interval"
],
"columns": ["id", "interval"],
"name": "PRIMARY",
"table": "model_tps_rate_limit",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "key",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "model",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "provider",
"entityType": "pks"
},
{
"columns": [
"workspace_id"
],
"columns": ["workspace_id"],
"name": "PRIMARY",
"table": "referral_code",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"referral_id"
],
"columns": ["workspace_id", "referral_id"],
"name": "PRIMARY",
"table": "referral_reward",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "referral",
"entityType": "pks"
},
{
"columns": [
"workspace_id",
"id"
],
"columns": ["workspace_id", "id"],
"name": "PRIMARY",
"table": "user",
"entityType": "pks"
},
{
"columns": [
"id"
],
"columns": ["id"],
"name": "PRIMARY",
"table": "workspace",
"entityType": "pks"
@@ -3242,4 +3178,4 @@
}
],
"renames": []
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core",
"version": "1.18.18",
"version": "1.18.20",
"private": true,
"type": "module",
"license": "MIT",
@@ -31,5 +31,8 @@ export const ReferralRewardTable = mysqlTable(
amount: bigint("amount", { mode: "number" }).notNull(),
timeApplied: utc("time_applied"),
},
(table) => [primaryKey({ columns: [table.workspaceID, table.referralID] }), index("referral_id").on(table.referralID)],
(table) => [
primaryKey({ columns: [table.workspaceID, table.referralID] }),
index("referral_id").on(table.referralID),
],
)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-function",
"version": "1.18.18",
"version": "1.18.20",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-mail",
"version": "1.18.18",
"version": "1.18.20",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-support",
"version": "1.18.18",
"version": "1.18.20",
"type": "module",
"license": "MIT",
"scripts": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.18.18",
"version": "1.18.20",
"name": "@opencode-ai/core",
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop",
"private": true,
"version": "1.18.18",
"version": "1.18.20",
"type": "module",
"license": "MIT",
"homepage": "https://opencode.ai",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.18.18",
"version": "1.18.20",
"name": "@opencode-ai/effect-drizzle-sqlite",
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.18.18",
"version": "1.18.20",
"name": "@opencode-ai/effect-sqlite-node",
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/enterprise",
"version": "1.18.18",
"version": "1.18.20",
"private": true,
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/function",
"version": "1.18.18",
"version": "1.18.20",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.18.18",
"version": "1.18.20",
"name": "@opencode-ai/http-recorder",
"description": "Record and replay Effect HTTP client traffic with deterministic cassettes",
"type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.18.18",
"version": "1.18.20",
"name": "@opencode-ai/llm",
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.18.18",
"version": "1.18.20",
"name": "opencode",
"type": "module",
"license": "MIT",
+6 -1
View File
@@ -696,9 +696,14 @@ export const RunCommand = effectCmd({
// created, and replies issued from inside the loop must use that client.
async function loop(client: OpencodeClient, events: Awaited<ReturnType<typeof sdk.event.subscribe>>) {
const toggles = new Map<string, boolean>()
const sessions = new Set([sessionID])
let error: string | undefined
for await (const event of events.stream) {
if (event.type === "session.created" && event.properties.info.parentID) {
if (sessions.has(event.properties.info.parentID)) sessions.add(event.properties.info.id)
}
if (
event.type === "message.updated" &&
event.properties.sessionID === sessionID &&
@@ -795,7 +800,7 @@ export const RunCommand = effectCmd({
if (event.type === "permission.asked") {
const permission = event.properties
if (permission.sessionID !== sessionID) continue
if (!sessions.has(permission.sessionID)) continue
if (auto) {
await client.permission.reply({
+11
View File
@@ -0,0 +1,11 @@
import type { Hooks, PluginInput } from "@opencode-ai/plugin"
export async function CerebrasPlugin(_input: PluginInput): Promise<Hooks> {
return {
"chat.params": async (input, output) => {
if (input.model.api.npm !== "@ai-sdk/cerebras") return
if (output.options.max_completion_tokens === undefined) return
output.maxOutputTokens = undefined
},
}
}
+2
View File
@@ -20,6 +20,7 @@ import { CloudflareAIGatewayAuthPlugin, CloudflareWorkersAuthPlugin } from "./cl
import { AzureAuthPlugin } from "./azure"
import { DigitalOceanAuthPlugin } from "./digitalocean"
import { XaiAuthPlugin } from "./xai"
import { CerebrasPlugin } from "./cerebras"
import { SnowflakeCortexAuthPlugin } from "./snowflake-cortex"
import { Effect, Layer, Context } from "effect"
import { EffectBridge } from "@/effect/bridge"
@@ -80,6 +81,7 @@ function internalPlugins(flags: RuntimeFlags.Info): PluginInstance[] {
DigitalOceanAuthPlugin,
SnowflakeCortexAuthPlugin,
XaiAuthPlugin,
CerebrasPlugin,
]
}
+7
View File
@@ -144,6 +144,13 @@ export function parseStreamError(input: unknown): ParsedStreamError | undefined
responseBody,
}
}
return {
type: "api_error",
message: typeof body?.error?.message === "string" ? body.error.message : "Server error.",
isRetryable: true,
responseBody,
}
}
export type ParsedAPICallError =
+7 -2
View File
@@ -98,6 +98,12 @@ function googleVertexAnthropicBaseURL(project: string | undefined, location: str
return `https://aiplatform.${location}.rep.googleapis.com/v1/projects/${project}/locations/${location}/publishers/anthropic/models`
}
function googleVertexEndpoint(location: string) {
if (location === "global") return "aiplatform.googleapis.com"
if (location === "eu" || location === "us") return `aiplatform.${location}.rep.googleapis.com`
return `${location}-aiplatform.googleapis.com`
}
type BundledSDK = {
languageModel(modelId: string): LanguageModelV3
chat?: (modelId: string) => LanguageModelV3
@@ -519,11 +525,10 @@ function custom(dep: CustomDep): Record<string, CustomLoader> {
return {
autoload: true,
vars(_options: Record<string, any>) {
const endpoint = location === "global" ? "aiplatform.googleapis.com" : `${location}-aiplatform.googleapis.com`
return {
...(project && { GOOGLE_VERTEX_PROJECT: project }),
GOOGLE_VERTEX_LOCATION: location,
GOOGLE_VERTEX_ENDPOINT: endpoint,
GOOGLE_VERTEX_ENDPOINT: googleVertexEndpoint(location),
}
},
options: {
@@ -2,6 +2,7 @@ import { FinishReason, LLMEvent, ProviderMetadata, ToolResultValue } from "@open
import { Effect, Schema } from "effect"
import { type streamText } from "ai"
import { errorMessage } from "@/util/error"
import { ProviderError } from "@/provider/error"
type Result = Awaited<ReturnType<typeof streamText>>
type AISDKEvent = Result["fullStream"] extends AsyncIterable<infer T> ? T : never
@@ -85,6 +86,8 @@ export function toLLMEvents(
return Effect.succeed([LLMEvent.stepStart({ index: state.step })])
case "finish-step":
if (event.rawFinishReason === "network_error")
return Effect.fail(new ProviderError.ResponseStreamError("Provider finish_reason: network_error"))
return Effect.sync(() => {
const original = providerMetadata(event.providerMetadata)
const metadata =
+2 -1
View File
@@ -34,9 +34,10 @@ const RETRYABLE_MESSAGE_PATTERNS = [
/429|500|502|503|504|524/i,
/rate increased too quickly|rate limit|rate-limit|rate_limit|too many requests/i,
/overloaded|service unavailable|service_unavailable|service-unavailable|internal error|internal_error|internal server error|server error|server_error|server-error|provider returned error|provider_returned_error|provider-returned-error/i,
/terminated|fetch failed|failed to fetch|network error|upstream connect|connection error|connection refused|connection lost|socket connection was closed|socket hang up|reset before headers|getaddrinfo|enotfound|eai_again|econnrefused|econnreset|etimedout/i,
/terminated|fetch failed|failed to fetch|network[-_\s]error|upstream connect|connection error|connection refused|connection lost|socket connection was closed|socket hang up|reset before headers|getaddrinfo|enotfound|eai_again|econnrefused|econnreset|etimedout/i,
/^timeout$|\b(?:request|response|connection|network|stream|read) (?:timeout|timed out|time out)\b/i,
/try your request again|retry your request|resource exhausted|resource_exhausted/i,
/\btry again (?:later|in\b)|\b(?:currently|temporarily) at capacity\b/i,
]
function cap(ms: number) {
+11
View File
@@ -210,6 +210,17 @@ export const TaskTool = Tool.define(
agent: next.name,
parts,
})
if (result.info.role === "assistant" && result.info.error) {
const message =
"message" in result.info.error.data && typeof result.info.error.data.message === "string"
? result.info.error.data.message
: result.info.error.name
return yield* Effect.fail(new Error(`Subagent failed (task_id: ${nextSession.id}): ${message}`))
}
const failed = result.parts.findLast((item) => item.type === "tool" && item.state.status === "error")
if (failed?.type === "tool" && failed.state.status === "error") {
return yield* Effect.fail(new Error(`Subagent failed (task_id: ${nextSession.id}): ${failed.state.error}`))
}
return result.parts.findLast((item) => item.type === "text")?.text ?? ""
})
@@ -0,0 +1,47 @@
import { describe, expect, test } from "bun:test"
import type { Hooks, PluginInput } from "@opencode-ai/plugin"
import { CerebrasPlugin } from "../../src/plugin/cerebras"
type ChatParams = NonNullable<Hooks["chat.params"]>
function input(npm: string) {
return {
model: { api: { npm } },
} as Parameters<ChatParams>[0]
}
function output(options: Record<string, unknown>) {
return {
maxOutputTokens: 32_000,
options,
} as Parameters<ChatParams>[1]
}
describe("CerebrasPlugin", () => {
test("omits the generic output cap when max_completion_tokens is configured", async () => {
const hook = (await CerebrasPlugin({} as PluginInput))["chat.params"]!
const params = output({ max_completion_tokens: 64 })
await hook(input("@ai-sdk/cerebras"), params)
expect(params.maxOutputTokens).toBeUndefined()
})
test("preserves the generic output cap without max_completion_tokens", async () => {
const hook = (await CerebrasPlugin({} as PluginInput))["chat.params"]!
const params = output({})
await hook(input("@ai-sdk/cerebras"), params)
expect(params.maxOutputTokens).toBe(32_000)
})
test("does not change other providers", async () => {
const hook = (await CerebrasPlugin({} as PluginInput))["chat.params"]!
const params = output({ max_completion_tokens: 64 })
await hook(input("@ai-sdk/openai"), params)
expect(params.maxOutputTokens).toBe(32_000)
})
})
@@ -0,0 +1,24 @@
import { describe, expect, test } from "bun:test"
import { ProviderError } from "@/provider/error"
describe("provider stream errors", () => {
test("retries provider stream errors without a code", () => {
const messages = [
"The model is currently at capacity due to high demand. Please try again in a few minutes, or use a higher service tier for priority processing: https://docs.x.ai/developers/advanced-api-usage/priority-processing",
"The model is temporarily unavailable.",
]
for (const message of messages)
expect(
ProviderError.parseStreamError({
type: "error",
error: { message },
}),
).toEqual({
type: "api_error",
message,
isRetryable: true,
responseBody: JSON.stringify({ type: "error", error: { message } }),
})
})
})
@@ -1909,6 +1909,32 @@ it.instance("Google Vertex: keeps regional Claude endpoints unchanged", () =>
}),
)
it.instance("Google Vertex: uses REP endpoint for Gemini continental multi-regions", () =>
Effect.gen(function* () {
yield* set("GOOGLE_CLOUD_PROJECT", "test-project")
yield* set("VERTEX_LOCATION", "eu")
const provider = yield* Provider.Service
const model = yield* provider.getModel(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini-3.5-flash"))
const language = yield* provider.getLanguage(model)
expect(languageBaseURL(language)).toBe(
"https://aiplatform.eu.rep.googleapis.com/v1beta1/projects/test-project/locations/eu/publishers/google",
)
}),
)
it.instance("Google Vertex: keeps regional Gemini endpoints unchanged", () =>
Effect.gen(function* () {
yield* set("GOOGLE_CLOUD_PROJECT", "test-project")
yield* set("VERTEX_LOCATION", "europe-west1")
const provider = yield* Provider.Service
const model = yield* provider.getModel(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini-3.5-flash"))
const language = yield* provider.getLanguage(model)
expect(languageBaseURL(language)).toBe(
"https://europe-west1-aiplatform.googleapis.com/v1beta1/projects/test-project/locations/europe-west1/publishers/google",
)
}),
)
it.instance("cloudflare-ai-gateway loads with env variables", () =>
Effect.gen(function* () {
yield* set("CLOUDFLARE_ACCOUNT_ID", "test-account")
@@ -27,6 +27,7 @@ import { ModelV2 } from "@opencode-ai/core/model"
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
import { LayerNodePlatform } from "@opencode-ai/core/effect/app-node-platform"
import { ProviderError } from "@/provider/error"
type ConfigModel = NonNullable<NonNullable<ConfigV1.Info["provider"]>[string]["models"]>[string]
@@ -832,6 +833,70 @@ describe("session.llm.stream", () => {
},
)
it.instance(
"surfaces network_error finish reasons as retryable stream failures",
() =>
Effect.gen(function* () {
const fixture = loadFixture(vivgridFixture.providerID, vivgridFixture.modelID)
const request = waitRequest(
"/chat/completions",
createEventResponse(
[
{
id: "chatcmpl-network-error",
object: "chat.completion.chunk",
choices: [{ index: 0, delta: { role: "assistant", content: "" }, finish_reason: "network_error" }],
},
],
true,
),
)
const resolved = yield* Provider.use.getModel(
ProviderV2.ID.make(vivgridFixture.providerID),
ModelV2.ID.make(fixture.model.id),
)
const sessionID = SessionID.make("session-test-network-error")
const agent = {
name: "test",
mode: "primary",
options: {},
permission: [{ permission: "*", pattern: "*", action: "allow" }],
} satisfies Agent.Info
const user = {
id: MessageID.make("msg_user-network-error"),
sessionID,
role: "user",
time: { created: Date.now() },
agent: agent.name,
model: { providerID: ProviderV2.ID.make(vivgridFixture.providerID), modelID: resolved.id },
} satisfies SessionV1.User
const error = yield* drain({
user,
sessionID,
model: resolved,
agent,
system: ["You are a helpful assistant."],
messages: [{ role: "user", content: "Hello" }],
tools: {},
}).pipe(Effect.flip)
yield* Effect.promise(() => request)
if (!(error instanceof ProviderError.ResponseStreamError)) throw error
expect(error.message).toBe("Provider finish_reason: network_error")
}),
{
config: () => ({
enabled_providers: [vivgridFixture.providerID],
provider: {
[vivgridFixture.providerID]: {
options: { apiKey: "test-key", baseURL: `${state.server!.url.origin}/v1` },
},
},
}),
},
)
const cerebrasFixture = { providerID: "cerebras", modelID: "gpt-oss-120b" }
it.instance(
"replays Cerebras assistant reasoning using the provider-supported field",
@@ -651,6 +651,63 @@ it.live("session.processor effect tests retry OpenAI-compatible midstream server
),
)
it.live("session.processor effect tests retry network_error finish reasons", () =>
provideTmpdirServer(
({ dir, llm }) =>
Effect.gen(function* () {
const { processors, session, provider } = yield* boot()
yield* llm.push(
raw({
chunks: [
{
id: "chatcmpl-network-error",
object: "chat.completion.chunk",
choices: [{ index: 0, delta: { role: "assistant", content: "" }, finish_reason: "network_error" }],
},
],
}),
)
yield* llm.text("after retry")
const chat = yield* session.create({})
const parent = yield* user(chat.id, "retry network error")
const msg = yield* assistant(chat.id, parent.id, path.resolve(dir))
const mdl = yield* provider.getModel(ref.providerID, ref.modelID)
const handle = yield* processors.create({
assistantMessage: msg,
sessionID: chat.id,
model: mdl,
})
const value = yield* handle.process({
user: {
id: parent.id,
sessionID: chat.id,
role: "user",
time: parent.time,
agent: parent.agent,
model: { providerID: ref.providerID, modelID: ref.modelID },
} satisfies SessionV1.User,
sessionID: chat.id,
model: mdl,
agent: agent(),
system: [],
messages: [{ role: "user", content: "retry network error" }],
tools: {},
})
const parts = yield* MessageV2.parts(msg.id)
expect(value).toBe("continue")
expect(yield* llm.calls).toBe(2)
expect(parts.some((part) => part.type === "text" && part.text === "after retry")).toBe(true)
expect(handle.message.error).toBeUndefined()
}),
{ config: (url) => providerCfg(url) },
),
)
it.live("session.processor effect tests publish retry status updates", () =>
provideTmpdirServer(
({ dir, llm }) =>
@@ -207,6 +207,9 @@ describe("session.retry.retryable", () => {
"provider-returned-error",
"terminated",
"fetch failed",
"network error",
"network-error",
"network_error",
"connection refused",
"connect ECONNREFUSED",
"request ETIMEDOUT",
@@ -215,6 +218,9 @@ describe("session.retry.retryable", () => {
"response timed out",
"Please retry your request",
"try your request again",
"Please try again in a few minutes",
"The model is currently at capacity due to high demand",
"The service is temporarily at capacity",
"upstream returned status 524",
])("retries matching API error text: %s", (message) => {
expect(SessionRetry.retryable(wrap(message), retryProvider)).toEqual({ message })
+120 -4
View File
@@ -3,7 +3,7 @@ import { SessionV1 } from "@opencode-ai/core/v1/session"
import { Database } from "@opencode-ai/core/database/database"
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
import { SessionProjector } from "@opencode-ai/core/session/projector"
import { Deferred, Effect, Exit, Fiber, Layer } from "effect"
import { Cause, Deferred, Effect, Exit, Fiber, Layer } from "effect"
import { Agent } from "../../src/agent/agent"
import { BackgroundJob } from "@/background/job"
import { EventV2Bridge } from "@/event-v2-bridge"
@@ -96,19 +96,29 @@ const seed = Effect.fn("TaskToolTest.seed")(function* (title = "Pinned") {
return { chat, assistant }
})
function stubOps(opts?: { onPrompt?: (input: SessionPrompt.PromptInput) => void; text?: string }): TaskPromptOps {
function stubOps(opts?: {
onPrompt?: (input: SessionPrompt.PromptInput) => void
text?: string
error?: NonNullable<SessionV1.Assistant["error"]>
toolError?: string
}): TaskPromptOps {
return {
cancel: () => Effect.void,
resolvePromptParts: (template) => Effect.succeed([{ type: "text" as const, text: template }]),
prompt: (input) =>
Effect.sync(() => {
opts?.onPrompt?.(input)
return reply(input, opts?.text ?? "done")
return reply(input, opts?.text ?? "done", opts?.error, opts?.toolError)
}),
}
}
function reply(input: SessionPrompt.PromptInput, text: string): SessionV1.WithParts {
function reply(
input: SessionPrompt.PromptInput,
text: string,
error?: NonNullable<SessionV1.Assistant["error"]>,
toolError?: string,
): SessionV1.WithParts {
const id = MessageID.ascending()
return {
info: {
@@ -125,6 +135,7 @@ function reply(input: SessionPrompt.PromptInput, text: string): SessionV1.WithPa
providerID: input.model?.providerID ?? ref.providerID,
time: { created: Date.now() },
finish: "stop",
error,
},
parts: [
{
@@ -134,6 +145,24 @@ function reply(input: SessionPrompt.PromptInput, text: string): SessionV1.WithPa
type: "text",
text,
},
...(toolError
? [
{
id: PartID.ascending(),
messageID: id,
sessionID: input.sessionID,
type: "tool" as const,
tool: "read",
callID: "call-1",
state: {
status: "error" as const,
input: { filePath: "/external" },
error: toolError,
time: { start: Date.now(), end: Date.now() },
},
},
]
: []),
],
}
}
@@ -255,6 +284,93 @@ describe("tool.task", () => {
}),
)
it.instance("execute surfaces child errors with a resumable task_id", () =>
Effect.gen(function* () {
const sessions = yield* Session.Service
const { chat, assistant } = yield* seed()
const tool = yield* TaskTool
const def = yield* tool.init()
const exit = yield* def
.execute(
{
description: "inspect bug",
prompt: "look into the cache key path",
subagent_type: "general",
},
{
sessionID: chat.id,
messageID: assistant.id,
agent: "build",
abort: new AbortController().signal,
extra: {
promptOps: stubOps({
text: "",
error: new SessionV1.APIError({ message: "Network connection lost", isRetryable: false }).toObject(),
}),
},
messages: [],
metadata: () => Effect.void,
ask: () => Effect.void,
},
)
.pipe(Effect.exit)
expect(Exit.isFailure(exit)).toBe(true)
if (Exit.isSuccess(exit)) throw new Error("expected task failure")
const child = (yield* sessions.children(chat.id))[0]
expect(child).toBeDefined()
const failure = Cause.squash(exit.cause)
expect(failure).toBeInstanceOf(Error)
if (!(failure instanceof Error)) throw new Error("expected Error defect")
expect(failure.message).toBe(`Subagent failed (task_id: ${child?.id}): Network connection lost`)
}),
)
it.instance("execute surfaces terminal child tool errors with a resumable task_id", () =>
Effect.gen(function* () {
const sessions = yield* Session.Service
const { chat, assistant } = yield* seed()
const tool = yield* TaskTool
const def = yield* tool.init()
const exit = yield* def
.execute(
{
description: "inspect external directory",
prompt: "read the external directory",
subagent_type: "general",
},
{
sessionID: chat.id,
messageID: assistant.id,
agent: "build",
abort: new AbortController().signal,
extra: {
promptOps: stubOps({
text: "I will inspect the directory.",
toolError: "The user rejected permission to use this specific tool call.",
}),
},
messages: [],
metadata: () => Effect.void,
ask: () => Effect.void,
},
)
.pipe(Effect.exit)
expect(Exit.isFailure(exit)).toBe(true)
if (Exit.isSuccess(exit)) throw new Error("expected task failure")
const child = (yield* sessions.children(chat.id))[0]
const failure = Cause.squash(exit.cause)
expect(failure).toBeInstanceOf(Error)
if (!(failure instanceof Error)) throw new Error("expected Error defect")
expect(failure.message).toBe(
`Subagent failed (task_id: ${child?.id}): The user rejected permission to use this specific tool call.`,
)
}),
)
it.instance("execute asks by default and skips checks when bypassed", () =>
Effect.gen(function* () {
const { chat, assistant } = yield* seed()
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/plugin",
"version": "1.18.18",
"version": "1.18.20",
"type": "module",
"license": "MIT",
"scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/sdk",
"version": "1.18.18",
"version": "1.18.20",
"type": "module",
"license": "MIT",
"scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/server",
"version": "1.18.18",
"version": "1.18.20",
"private": true,
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/session-ui",
"version": "1.18.18",
"version": "1.18.20",
"private": true,
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/slack",
"version": "1.18.18",
"version": "1.18.20",
"type": "module",
"license": "MIT",
"scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/stats-app",
"version": "1.18.18",
"version": "1.18.20",
"private": true,
"type": "module",
"license": "MIT",
+13 -13
View File
@@ -20,7 +20,7 @@ import { dict as zht } from "./i18n/zht"
const en = {
"app.title": "AI Model Usage Rankings | OpenCode Data",
"app.description":
"Explore OpenCode Go usage across AI models, including token volume, rankings, market share, token pricing, session cost, cache ratio, and geo breakdowns.",
"Explore OpenCode usage across AI models, including token volume, rankings, market share, token pricing, session cost, cache ratio, and geo breakdowns.",
"app.unfurlAlt": "OpenCode Data wordmark on a dark patterned background",
"nav.dataHome": "Data Home",
"nav.topModels": "Top Models",
@@ -104,7 +104,7 @@ const en = {
"home.loadingTitle": "Loading data",
"home.loadingDescription": "Reading model aggregates.",
"home.usageTitle": "Usage",
"home.topModelsDescription": "Usage of models across OpenCode Go.",
"home.topModelsDescription": "Usage of models across OpenCode.",
"home.noUsageTitle": "No usage data",
"home.noUsageDescription": "No model rows matched this product and range.",
"home.noLeaderboardTitle": "No leaderboard data",
@@ -116,7 +116,7 @@ const en = {
"home.modelUsers": "model users",
"home.new": "New",
"home.uniqueUsersTitle": "Unique Users",
"home.uniqueUsersDescription": "Daily unique OpenCode Go users by model.",
"home.uniqueUsersDescription": "Daily unique OpenCode users by model.",
"home.noUserDataTitle": "No user data",
"home.noUserDataDescription": "No user-bearing model rows matched this window.",
"home.uniqueUsersChart": "Stacked unique user chart by model",
@@ -148,7 +148,7 @@ const en = {
"home.costSession": "Cost/Session",
"lab.title": "{{lab}} AI Model Usage & Rankings | OpenCode Data",
"lab.description":
"Compare {{lab}} models used in OpenCode Go, including token usage, model rankings, context windows, release dates, costs, and model-specific data.",
"Compare {{lab}} models used in OpenCode, including token usage, model rankings, context windows, release dates, costs, and model-specific data.",
"lab.loadingTitle": "Model Lab",
"lab.loadingDescription": "Reading model availability and recent OpenCode usage.",
"lab.notFound": "No models matched this lab.",
@@ -174,7 +174,7 @@ const en = {
"lab.share": "Share",
"model.title": "{{model}} Usage, Cost & Rank | OpenCode Data",
"model.description":
"View {{model}} OpenCode Go usage data, including token volume, weekly rank, token mix, costs, cache ratio, sessions, geo breakdowns, and peer models.",
"View {{model}} OpenCode usage data, including token volume, weekly rank, token mix, costs, cache ratio, sessions, geo breakdowns, and peer models.",
"model.loadingTitle": "Model Data",
"model.loadingDescription": "Reading model aggregates.",
"model.loadingProfile": "Reading the model profile.",
@@ -183,15 +183,15 @@ const en = {
"model.noMatched": "No model facts or usage rows matched {{id}}.",
"model.fallback": "Model",
"model.catalogFallback":
"Model facts from the shared model index. OpenCode Go usage appears once this model has activity.",
"model.unranked": "Unranked across last week's OpenCode Go usage",
"model.ranked": "Ranked #{{rank}} across last week's OpenCode Go usage",
"Model facts from the shared model index. OpenCode usage appears once this model has activity.",
"model.unranked": "Unranked across last week's OpenCode usage",
"model.ranked": "Ranked #{{rank}} across last week's OpenCode usage",
"model.observedVolume": "with {{share}} of observed 2M volume.",
"model.weights": "Model weights: {{label}}",
"model.rank": "7D Rank",
"model.profile": "Model Profile",
"model.listed": "Listed",
"model.noCurrentUsage": "No OpenCode Go usage in the current data window.",
"model.noCurrentUsage": "No OpenCode usage in the current data window.",
"model.facts": "Model facts",
"model.context": "Context",
"model.output": "Output",
@@ -200,7 +200,7 @@ const en = {
"model.inputs": "Inputs",
"model.overviewDescription": "Recent tokens, unique users, and market position.",
"model.noSummaryTitle": "No usage summary",
"model.noSummaryDescription": "This model has no OpenCode Go usage rows yet.",
"model.noSummaryDescription": "This model has no OpenCode usage rows yet.",
"model.tokens": "Tokens",
"model.uniqueUsers": "Unique Users",
"model.lastTwoMonths": "last two months",
@@ -236,11 +236,11 @@ const en = {
"model.averageTokensSession": "Average tokens / session",
"model.cacheRatio": "Cache Ratio",
"model.inputTokens": "input tokens",
"model.geoDescription": "OpenCode Go model tokens used by country.",
"model.geoDescription": "OpenCode model tokens used by country.",
"model.noGeoTitle": "No geo data",
"model.noGeoDescription": "No OpenCode Go geo rows matched this model.",
"model.noGeoDescription": "No OpenCode geo rows matched this model.",
"model.worldMap": "World map of model token usage by country",
"model.peersDescription": "Nearby models by recent OpenCode Go token volume.",
"model.peersDescription": "Nearby models by recent OpenCode token volume.",
"model.noPeersTitle": "No peers",
"model.noPeersDescription": "Peer rankings appear after usage lands.",
"model.noUsageLastWeek": "No usage last week",
+17 -18
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "ترتيب استخدام نماذج الذكاء الاصطناعي | OpenCode Data",
"app.description":
"استكشف استخدام OpenCode Go عبر نماذج الذكاء الاصطناعي، بما في ذلك حجم الرموز، والترتيب، وحصة السوق، وتسعير الرموز، وتكلفة الجلسة، ونسبة التخزين المؤقت، والتوزيع الجغرافي.",
"استكشف استخدام OpenCode عبر نماذج الذكاء الاصطناعي، بما في ذلك حجم الرموز، والترتيب، وحصة السوق، وتسعير الرموز، وتكلفة الجلسة، ونسبة التخزين المؤقت، والتوزيع الجغرافي.",
"app.unfurlAlt": "شعار OpenCode Data على خلفية داكنة مزخرفة",
"nav.dataHome": "صفحة البيانات الرئيسية",
"nav.topModels": "أهم النماذج",
@@ -85,7 +85,7 @@ export const dict = {
"home.loadingTitle": "تحميل البيانات",
"home.loadingDescription": "قراءة تجميعات النماذج.",
"home.usageTitle": "الاستخدام",
"home.topModelsDescription": "استخدام النماذج عبر OpenCode Go.",
"home.topModelsDescription": "استخدام النماذج عبر OpenCode.",
"home.noUsageTitle": "لا توجد بيانات استخدام",
"home.noUsageDescription": "لم تطابق أي صفوف نماذج هذا المنتج وهذا النطاق.",
"home.noLeaderboardTitle": "لا توجد بيانات ترتيب",
@@ -97,7 +97,7 @@ export const dict = {
"home.modelUsers": "مستخدمو النموذج",
"home.new": "جديد",
"home.uniqueUsersTitle": "المستخدمون الفريدون",
"home.uniqueUsersDescription": "المستخدمون اليوميون الفريدون لـ OpenCode Go حسب النموذج.",
"home.uniqueUsersDescription": "المستخدمون اليوميون الفريدون لـ OpenCode حسب النموذج.",
"home.noUserDataTitle": "لا توجد بيانات مستخدمين",
"home.noUserDataDescription": "لم تطابق أي صفوف نماذج تحتوي على مستخدمين هذه النافذة.",
"home.uniqueUsersChart": "مخطط مكدس للمستخدمين الفريدين حسب النموذج",
@@ -129,7 +129,7 @@ export const dict = {
"home.costSession": "التكلفة/الجلسة",
"lab.title": "استخدام وترتيب نماذج {{lab}} للذكاء الاصطناعي | OpenCode Data",
"lab.description":
"قارن نماذج {{lab}} المستخدمة في OpenCode Go، بما في ذلك استخدام الرموز، وترتيب النماذج، ونوافذ السياق، وتواريخ الإصدار، والتكاليف، والبيانات الخاصة بكل نموذج.",
"قارن نماذج {{lab}} المستخدمة في OpenCode، بما في ذلك استخدام الرموز، وترتيب النماذج، ونوافذ السياق، وتواريخ الإصدار، والتكاليف، والبيانات الخاصة بكل نموذج.",
"lab.loadingTitle": "مختبر النماذج",
"lab.loadingDescription": "قراءة توفر النماذج واستخدام OpenCode الأخير.",
"lab.notFound": "لم تطابق أي نماذج هذا المختبر.",
@@ -155,7 +155,7 @@ export const dict = {
"lab.share": "الحصة",
"model.title": "استخدام {{model}} وتكلفته وترتيبه | OpenCode Data",
"model.description":
"اعرض بيانات استخدام {{model}} في OpenCode Go، بما في ذلك حجم الرموز، والترتيب الأسبوعي، ومزيج الرموز، والتكاليف، ونسبة التخزين المؤقت، والجلسات، والتوزيع الجغرافي، والنماذج المشابهة.",
"اعرض بيانات استخدام {{model}} في OpenCode، بما في ذلك حجم الرموز، والترتيب الأسبوعي، ومزيج الرموز، والتكاليف، ونسبة التخزين المؤقت، والجلسات، والتوزيع الجغرافي، والنماذج المشابهة.",
"model.loadingTitle": "بيانات النموذج",
"model.loadingDescription": "قراءة تجميعات النماذج.",
"model.loadingProfile": "قراءة ملف النموذج.",
@@ -163,25 +163,24 @@ export const dict = {
"model.noDataDescription": "جرّب فتح نموذج من لوحة الترتيب.",
"model.noMatched": "لم تطابق أي حقائق نموذج أو صفوف استخدام {{id}}.",
"model.fallback": "نموذج",
"model.catalogFallback":
"حقائق النموذج من فهرس النماذج المشترك. يظهر استخدام OpenCode Go عندما يصبح لهذا النموذج نشاط.",
"model.unranked": "غير مصنف ضمن استخدام OpenCode Go للأسبوع الماضي",
"model.ranked": "مصنف رقم {{rank}} ضمن استخدام OpenCode Go للأسبوع الماضي",
"model.catalogFallback": "حقائق النموذج من فهرس النماذج المشترك. يظهر استخدام OpenCode عندما يصبح لهذا النموذج نشاط.",
"model.unranked": "غير مصنف ضمن استخدام OpenCode للأسبوع الماضي",
"model.ranked": "مصنف رقم {{rank}} ضمن استخدام OpenCode للأسبوع الماضي",
"model.observedVolume": "مع {{share}} من حجم 2M المرصود.",
"model.weights": "أوزان النموذج: {{label}}",
"model.rank": "ترتيب 7 أيام",
"model.profile": "ملف النموذج",
"model.listed": "مدرج",
"model.noCurrentUsage": "لا يوجد استخدام لـ OpenCode Go في نافذة البيانات الحالية.",
"model.noCurrentUsage": "لا يوجد استخدام لـ OpenCode في نافذة البيانات الحالية.",
"model.facts": "حقائق النموذج",
"model.context": "السياق",
"model.output": "الإخراج",
"model.knowledge": "المعرفة",
"model.release": "الإصدار",
"model.inputs": "المدخلات",
"model.overviewDescription": "رموز OpenCode Go الأخيرة، والمستخدمون الفريدون، وموقع السوق.",
"model.overviewDescription": "رموز OpenCode الأخيرة، والمستخدمون الفريدون، وموقع السوق.",
"model.noSummaryTitle": "لا يوجد ملخص استخدام",
"model.noSummaryDescription": "لا يحتوي هذا النموذج على صفوف استخدام OpenCode Go بعد.",
"model.noSummaryDescription": "لا يحتوي هذا النموذج على صفوف استخدام OpenCode بعد.",
"model.tokens": "الرموز",
"model.uniqueUsers": "المستخدمون الفريدون",
"model.lastTwoMonths": "آخر شهرين",
@@ -191,15 +190,15 @@ export const dict = {
"model.totalModels": "{{count}} نموذجًا",
"model.momentum": "الزخم",
"model.vsPreviousWindow": "مقارنة بالنافذة السابقة",
"model.usageDescription": "حجم رموز OpenCode Go اليومي خلال نافذة الشهرين الأخيرة.",
"model.usageDescription": "حجم رموز OpenCode اليومي خلال نافذة الشهرين الأخيرة.",
"model.noUsageTitle": "لا يوجد استخدام",
"model.noUsageDescription": "لم يصل أي استخدام في النافذة الحالية.",
"model.dailyTokenChart": "مخطط استخدام الرموز اليومي",
"model.usersDescription": "المستخدمون اليوميون الفريدون لـ OpenCode Go خلال نافذة الشهرين الأخيرة.",
"model.usersDescription": "المستخدمون اليوميون الفريدون لـ OpenCode خلال نافذة الشهرين الأخيرة.",
"model.noUsersTitle": "لا توجد بيانات مستخدمين",
"model.noUsersDescription": "لم تصل أي صفوف تحتوي على مستخدمين في النافذة الحالية.",
"model.dailyUserChart": "مخطط المستخدمين الفريدين اليومي",
"model.efficiencyDescription": "التكلفة، وسلوك التخزين المؤقت، ومتوسط شكل جلسة OpenCode Go.",
"model.efficiencyDescription": "التكلفة، وسلوك التخزين المؤقت، ومتوسط شكل جلسة OpenCode.",
"model.noEfficiencyTitle": "لا توجد بيانات كفاءة",
"model.noEfficiencyDescription": "تظهر بيانات الكفاءة بعد وصول الاستخدام.",
"model.totalSpendLabel": "Total spend",
@@ -217,11 +216,11 @@ export const dict = {
"model.tokensSession": "الرموز / الجلسة",
"model.cacheRatio": "نسبة التخزين المؤقت",
"model.inputTokens": "رموز الإدخال",
"model.geoDescription": "رموز نموذج OpenCode Go المستخدمة حسب البلد.",
"model.geoDescription": "رموز نموذج OpenCode المستخدمة حسب البلد.",
"model.noGeoTitle": "لا توجد بيانات جغرافية",
"model.noGeoDescription": "لم تطابق أي صفوف جغرافية في OpenCode Go هذا النموذج.",
"model.noGeoDescription": "لم تطابق أي صفوف جغرافية في OpenCode هذا النموذج.",
"model.worldMap": "خريطة عالمية لاستخدام رموز النموذج حسب البلد",
"model.peersDescription": "نماذج قريبة حسب حجم رموز OpenCode Go الأخير.",
"model.peersDescription": "نماذج قريبة حسب حجم رموز OpenCode الأخير.",
"model.noPeersTitle": "لا توجد نماذج مشابهة",
"model.noPeersDescription": "تظهر ترتيبات النماذج المشابهة بعد وصول الاستخدام.",
"model.noUsageLastWeek": "لا يوجد استخدام الأسبوع الماضي",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Ranking de uso de modelos de IA | OpenCode Data",
"app.description":
"Explore o uso do OpenCode Go em modelos de IA, incluindo volume de tokens, rankings, participação de mercado, preço por token, custo por sessão, taxa de cache e distribuição geográfica.",
"Explore o uso do OpenCode em modelos de IA, incluindo volume de tokens, rankings, participação de mercado, preço por token, custo por sessão, taxa de cache e distribuição geográfica.",
"app.unfurlAlt": "Logotipo do OpenCode Data sobre um fundo escuro padronizado",
"nav.dataHome": "Início dos dados",
"nav.topModels": "Principais modelos",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Carregando dados",
"home.loadingDescription": "Lendo agregados de modelos.",
"home.usageTitle": "Uso",
"home.topModelsDescription": "Uso de modelos no OpenCode Go.",
"home.topModelsDescription": "Uso de modelos no OpenCode.",
"home.noUsageTitle": "Sem dados de uso",
"home.noUsageDescription": "Nenhuma linha de modelo correspondeu a este produto e intervalo.",
"home.noLeaderboardTitle": "Sem dados de classificação",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "usuários do modelo",
"home.new": "Novo",
"home.uniqueUsersTitle": "Usuários únicos",
"home.uniqueUsersDescription": "Usuários únicos diários do OpenCode Go por modelo.",
"home.uniqueUsersDescription": "Usuários únicos diários do OpenCode por modelo.",
"home.noUserDataTitle": "Sem dados de usuários",
"home.noUserDataDescription": "Nenhuma linha de modelo com usuários correspondeu a esta janela.",
"home.uniqueUsersChart": "Gráfico empilhado de usuários únicos por modelo",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Custo/sessão",
"lab.title": "Uso e ranking de modelos de IA da {{lab}} | OpenCode Data",
"lab.description":
"Compare modelos da {{lab}} usados no OpenCode Go, incluindo uso de tokens, ranking de modelos, janelas de contexto, datas de lançamento, custos e dados específicos de cada modelo.",
"Compare modelos da {{lab}} usados no OpenCode, incluindo uso de tokens, ranking de modelos, janelas de contexto, datas de lançamento, custos e dados específicos de cada modelo.",
"lab.loadingTitle": "Laboratório de modelos",
"lab.loadingDescription": "Lendo disponibilidade de modelos e uso recente do OpenCode.",
"lab.notFound": "Nenhum modelo correspondeu a este laboratório.",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "Participação",
"model.title": "Uso, custo e posição de {{model}} | OpenCode Data",
"model.description":
"Veja dados de uso de {{model}} no OpenCode Go, incluindo volume de tokens, ranking semanal, combinação de tokens, custos, taxa de cache, sessões, distribuição geográfica e modelos pares.",
"Veja dados de uso de {{model}} no OpenCode, incluindo volume de tokens, ranking semanal, combinação de tokens, custos, taxa de cache, sessões, distribuição geográfica e modelos pares.",
"model.loadingTitle": "Dados do modelo",
"model.loadingDescription": "Lendo agregados de modelos.",
"model.loadingProfile": "Lendo o perfil do modelo.",
@@ -166,24 +166,24 @@ export const dict = {
"model.noMatched": "Nenhum fato do modelo ou linha de uso correspondeu a {{id}}.",
"model.fallback": "Modelo",
"model.catalogFallback":
"Fatos do modelo do índice compartilhado de modelos. O uso no OpenCode Go aparece quando este modelo tiver atividade.",
"model.unranked": "Sem classificação no uso do OpenCode Go da última semana",
"model.ranked": "Classificado em #{{rank}} no uso do OpenCode Go da última semana",
"Fatos do modelo do índice compartilhado de modelos. O uso no OpenCode aparece quando este modelo tiver atividade.",
"model.unranked": "Sem classificação no uso do OpenCode da última semana",
"model.ranked": "Classificado em #{{rank}} no uso do OpenCode da última semana",
"model.observedVolume": "com {{share}} do volume observado de 2M.",
"model.weights": "Pesos do modelo: {{label}}",
"model.rank": "Ranking 7D",
"model.profile": "Perfil do modelo",
"model.listed": "Listado",
"model.noCurrentUsage": "Sem uso do OpenCode Go na janela de dados atual.",
"model.noCurrentUsage": "Sem uso do OpenCode na janela de dados atual.",
"model.facts": "Fatos do modelo",
"model.context": "Contexto",
"model.output": "Saída",
"model.knowledge": "Conhecimento",
"model.release": "Lançamento",
"model.inputs": "Entradas",
"model.overviewDescription": "Tokens recentes do OpenCode Go, usuários únicos e posição de mercado.",
"model.overviewDescription": "Tokens recentes do OpenCode, usuários únicos e posição de mercado.",
"model.noSummaryTitle": "Sem resumo de uso",
"model.noSummaryDescription": "Este modelo ainda não tem linhas de uso do OpenCode Go.",
"model.noSummaryDescription": "Este modelo ainda não tem linhas de uso do OpenCode.",
"model.tokens": "Tokens",
"model.uniqueUsers": "Usuários únicos",
"model.lastTwoMonths": "últimos dois meses",
@@ -193,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}} modelos",
"model.momentum": "Momento",
"model.vsPreviousWindow": "vs janela anterior",
"model.usageDescription": "Volume diário de tokens do OpenCode Go na janela recente de dois meses.",
"model.usageDescription": "Volume diário de tokens do OpenCode na janela recente de dois meses.",
"model.noUsageTitle": "Sem uso",
"model.noUsageDescription": "Nenhum uso chegou na janela atual.",
"model.dailyTokenChart": "Gráfico diário de uso de tokens",
"model.usersDescription": "Usuários únicos diários do OpenCode Go na janela recente de dois meses.",
"model.usersDescription": "Usuários únicos diários do OpenCode na janela recente de dois meses.",
"model.noUsersTitle": "Sem dados de usuários",
"model.noUsersDescription": "Nenhuma linha com usuários chegou na janela atual.",
"model.dailyUserChart": "Gráfico diário de usuários únicos",
"model.efficiencyDescription": "Custo, comportamento de cache e formato médio da sessão do OpenCode Go.",
"model.efficiencyDescription": "Custo, comportamento de cache e formato médio da sessão do OpenCode.",
"model.noEfficiencyTitle": "Sem dados de eficiência",
"model.noEfficiencyDescription": "Os dados de eficiência aparecem depois que o uso chega.",
"model.totalSpendLabel": "Total spend",
@@ -219,11 +219,11 @@ export const dict = {
"model.tokensSession": "Tokens / sessão",
"model.cacheRatio": "Taxa de cache",
"model.inputTokens": "tokens de entrada",
"model.geoDescription": "Tokens do modelo OpenCode Go usados por país.",
"model.geoDescription": "Tokens do modelo OpenCode usados por país.",
"model.noGeoTitle": "Sem dados geográficos",
"model.noGeoDescription": "Nenhuma linha geográfica do OpenCode Go correspondeu a este modelo.",
"model.noGeoDescription": "Nenhuma linha geográfica do OpenCode correspondeu a este modelo.",
"model.worldMap": "Mapa-múndi do uso de tokens do modelo por país",
"model.peersDescription": "Modelos próximos por volume recente de tokens do OpenCode Go.",
"model.peersDescription": "Modelos próximos por volume recente de tokens do OpenCode.",
"model.noPeersTitle": "Sem pares",
"model.noPeersDescription": "Os rankings de pares aparecem depois que o uso chega.",
"model.noUsageLastWeek": "Sem uso na semana passada",
+17 -18
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Ranglister for brug af AI-modeller | OpenCode Data",
"app.description":
"Udforsk brugen af OpenCode Go på tværs af AI-modeller, inklusive tokenvolumen, ranglister, markedsandel, tokenpriser, sessionsomkostning, cacheandel og geografiske opdelinger.",
"Udforsk brugen af OpenCode på tværs af AI-modeller, inklusive tokenvolumen, ranglister, markedsandel, tokenpriser, sessionsomkostning, cacheandel og geografiske opdelinger.",
"app.unfurlAlt": "OpenCode Data-ordmærke på en mørk mønstret baggrund",
"nav.dataHome": "Dataforside",
"nav.topModels": "Topmodeller",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Indlæser data",
"home.loadingDescription": "Læser modelaggregater.",
"home.usageTitle": "Brug",
"home.topModelsDescription": "Brug af modeller på tværs af OpenCode Go.",
"home.topModelsDescription": "Brug af modeller på tværs af OpenCode.",
"home.noUsageTitle": "Ingen brugsdata",
"home.noUsageDescription": "Ingen modelrækker matchede dette produkt og interval.",
"home.noLeaderboardTitle": "Ingen ranglistedata",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "modelbrugere",
"home.new": "Ny",
"home.uniqueUsersTitle": "Unikke brugere",
"home.uniqueUsersDescription": "Daglige unikke OpenCode Go-brugere efter model.",
"home.uniqueUsersDescription": "Daglige unikke OpenCode-brugere efter model.",
"home.noUserDataTitle": "Ingen brugerdata",
"home.noUserDataDescription": "Ingen modelrækker med brugere matchede dette vindue.",
"home.uniqueUsersChart": "Stablet diagram over unikke brugere efter model",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Omkostning/session",
"lab.title": "{{lab}} AI-modelbrug og ranglister | OpenCode Data",
"lab.description":
"Sammenlign {{lab}}-modeller brugt i OpenCode Go, inklusive tokenbrug, modelranglister, kontekstvinduer, udgivelsesdatoer, omkostninger og modelspecifikke data.",
"Sammenlign {{lab}}-modeller brugt i OpenCode, inklusive tokenbrug, modelranglister, kontekstvinduer, udgivelsesdatoer, omkostninger og modelspecifikke data.",
"lab.loadingTitle": "Modellab",
"lab.loadingDescription": "Læser modeltilgængelighed og seneste OpenCode-brug.",
"lab.notFound": "Ingen modeller matchede dette lab.",
@@ -156,7 +156,7 @@ export const dict = {
"lab.share": "Andel",
"model.title": "{{model}} brug, omkostning og rang | OpenCode Data",
"model.description":
"Se OpenCode Go-brugsdata for {{model}}, inklusive tokenvolumen, ugentlig rang, tokenmix, omkostninger, cacheandel, sessioner, geografiske opdelinger og lignende modeller.",
"Se OpenCode-brugsdata for {{model}}, inklusive tokenvolumen, ugentlig rang, tokenmix, omkostninger, cacheandel, sessioner, geografiske opdelinger og lignende modeller.",
"model.loadingTitle": "Modeldata",
"model.loadingDescription": "Læser modelaggregater.",
"model.loadingProfile": "Læser modelprofilen.",
@@ -164,25 +164,24 @@ export const dict = {
"model.noDataDescription": "Prøv at åbne en model fra ranglisten.",
"model.noMatched": "Ingen modelfakta eller brugsrækker matchede {{id}}.",
"model.fallback": "Model",
"model.catalogFallback":
"Modelfakta fra det fælles modelindeks. OpenCode Go-brug vises, når denne model har aktivitet.",
"model.unranked": "Ikke rangeret i sidste uges OpenCode Go-brug",
"model.ranked": "Rangeret #{{rank}} i sidste uges OpenCode Go-brug",
"model.catalogFallback": "Modelfakta fra det fælles modelindeks. OpenCode-brug vises, når denne model har aktivitet.",
"model.unranked": "Ikke rangeret i sidste uges OpenCode-brug",
"model.ranked": "Rangeret #{{rank}} i sidste uges OpenCode-brug",
"model.observedVolume": "med {{share}} af observeret 2M-volumen.",
"model.weights": "Modelvægte: {{label}}",
"model.rank": "7D-rang",
"model.profile": "Modelprofil",
"model.listed": "Opført",
"model.noCurrentUsage": "Ingen OpenCode Go-brug i det aktuelle datavindue.",
"model.noCurrentUsage": "Ingen OpenCode-brug i det aktuelle datavindue.",
"model.facts": "Modelfakta",
"model.context": "Kontekst",
"model.output": "Output",
"model.knowledge": "Viden",
"model.release": "Udgivelse",
"model.inputs": "Input",
"model.overviewDescription": "Seneste OpenCode Go-tokens, unikke brugere og markedsposition.",
"model.overviewDescription": "Seneste OpenCode-tokens, unikke brugere og markedsposition.",
"model.noSummaryTitle": "Ingen brugsoversigt",
"model.noSummaryDescription": "Denne model har endnu ingen OpenCode Go-brugsrækker.",
"model.noSummaryDescription": "Denne model har endnu ingen OpenCode-brugsrækker.",
"model.tokens": "Tokens",
"model.uniqueUsers": "Unikke brugere",
"model.lastTwoMonths": "sidste to måneder",
@@ -192,15 +191,15 @@ export const dict = {
"model.totalModels": "{{count}} modeller",
"model.momentum": "Momentum",
"model.vsPreviousWindow": "vs forrige vindue",
"model.usageDescription": "Daglig OpenCode Go-tokenvolumen i det seneste tomånedersvindue.",
"model.usageDescription": "Daglig OpenCode-tokenvolumen i det seneste tomånedersvindue.",
"model.noUsageTitle": "Ingen brug",
"model.noUsageDescription": "Ingen brug landede i det aktuelle vindue.",
"model.dailyTokenChart": "Dagligt diagram over tokenbrug",
"model.usersDescription": "Daglige unikke OpenCode Go-brugere i det seneste tomånedersvindue.",
"model.usersDescription": "Daglige unikke OpenCode-brugere i det seneste tomånedersvindue.",
"model.noUsersTitle": "Ingen brugerdata",
"model.noUsersDescription": "Ingen rækker med brugere landede i det aktuelle vindue.",
"model.dailyUserChart": "Dagligt diagram over unikke brugere",
"model.efficiencyDescription": "Omkostning, cacheadfærd og gennemsnitlig OpenCode Go-sessionsform.",
"model.efficiencyDescription": "Omkostning, cacheadfærd og gennemsnitlig OpenCode-sessionsform.",
"model.noEfficiencyTitle": "Ingen effektivitetsdata",
"model.noEfficiencyDescription": "Effektivitetsdata vises, når brug lander.",
"model.totalSpendLabel": "Total spend",
@@ -218,11 +217,11 @@ export const dict = {
"model.tokensSession": "Tokens / session",
"model.cacheRatio": "Cacheandel",
"model.inputTokens": "inputtokens",
"model.geoDescription": "OpenCode Go-modeltokens brugt efter land.",
"model.geoDescription": "OpenCode-modeltokens brugt efter land.",
"model.noGeoTitle": "Ingen geodata",
"model.noGeoDescription": "Ingen OpenCode Go-georækker matchede denne model.",
"model.noGeoDescription": "Ingen OpenCode-georækker matchede denne model.",
"model.worldMap": "Verdenskort over modeltokenbrug efter land",
"model.peersDescription": "Nærliggende modeller efter seneste OpenCode Go-tokenvolumen.",
"model.peersDescription": "Nærliggende modeller efter seneste OpenCode-tokenvolumen.",
"model.noPeersTitle": "Ingen lignende modeller",
"model.noPeersDescription": "Ranglister over lignende modeller vises, når brug lander.",
"model.noUsageLastWeek": "Ingen brug sidste uge",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "KI-Modellnutzungs-Rankings | OpenCode Data",
"app.description":
"Erkunde die OpenCode Go-Nutzung über KI-Modelle hinweg, einschließlich Tokenvolumen, Rankings, Marktanteil, Tokenpreisen, Sitzungskosten, Cache-Anteil und geografischen Aufschlüsselungen.",
"Erkunde die OpenCode-Nutzung über KI-Modelle hinweg, einschließlich Tokenvolumen, Rankings, Marktanteil, Tokenpreisen, Sitzungskosten, Cache-Anteil und geografischen Aufschlüsselungen.",
"app.unfurlAlt": "OpenCode Data-Wortmarke auf dunklem gemustertem Hintergrund",
"nav.dataHome": "Daten-Startseite",
"nav.topModels": "Top-Modelle",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Daten werden geladen",
"home.loadingDescription": "Modellaggregate werden gelesen.",
"home.usageTitle": "Nutzung",
"home.topModelsDescription": "Nutzung von Modellen in OpenCode Go.",
"home.topModelsDescription": "Nutzung von Modellen in OpenCode.",
"home.noUsageTitle": "Keine Nutzungsdaten",
"home.noUsageDescription": "Keine Modellzeilen passten zu diesem Produkt und Zeitraum.",
"home.noLeaderboardTitle": "Keine Bestenlistendaten",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "Modellnutzer",
"home.new": "Neu",
"home.uniqueUsersTitle": "Eindeutige Nutzer",
"home.uniqueUsersDescription": "Täglich eindeutige OpenCode Go-Nutzer nach Modell.",
"home.uniqueUsersDescription": "Täglich eindeutige OpenCode-Nutzer nach Modell.",
"home.noUserDataTitle": "Keine Nutzerdaten",
"home.noUserDataDescription": "Keine Modellzeilen mit Nutzern passten zu diesem Zeitraum.",
"home.uniqueUsersChart": "Gestapeltes Diagramm eindeutiger Nutzer nach Modell",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Kosten/Sitzung",
"lab.title": "{{lab}} KI-Modellnutzung und Rankings | OpenCode Data",
"lab.description":
"Vergleiche {{lab}}-Modelle, die in OpenCode Go verwendet werden, einschließlich Tokennutzung, Modellrankings, Kontextfenstern, Veröffentlichungsdaten, Kosten und modellspezifischen Daten.",
"Vergleiche {{lab}}-Modelle, die in OpenCode verwendet werden, einschließlich Tokennutzung, Modellrankings, Kontextfenstern, Veröffentlichungsdaten, Kosten und modellspezifischen Daten.",
"lab.loadingTitle": "Modelllabor",
"lab.loadingDescription": "Modellverfügbarkeit und aktuelle OpenCode-Nutzung werden gelesen.",
"lab.notFound": "Keine Modelle passten zu diesem Lab.",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "Anteil",
"model.title": "{{model}} Nutzung, Kosten und Rang | OpenCode Data",
"model.description":
"Sieh dir OpenCode Go-Nutzungsdaten für {{model}} an, einschließlich Tokenvolumen, Wochenrang, Tokenmix, Kosten, Cache-Anteil, Sitzungen, geografischer Aufschlüsselung und Vergleichsmodellen.",
"Sieh dir OpenCode-Nutzungsdaten für {{model}} an, einschließlich Tokenvolumen, Wochenrang, Tokenmix, Kosten, Cache-Anteil, Sitzungen, geografischer Aufschlüsselung und Vergleichsmodellen.",
"model.loadingTitle": "Modelldaten",
"model.loadingDescription": "Modellaggregate werden gelesen.",
"model.loadingProfile": "Modellprofil wird gelesen.",
@@ -166,24 +166,24 @@ export const dict = {
"model.noMatched": "Keine Modellfakten oder Nutzungszeilen passten zu {{id}}.",
"model.fallback": "Modell",
"model.catalogFallback":
"Modellfakten aus dem gemeinsamen Modellindex. OpenCode Go-Nutzung erscheint, sobald dieses Modell Aktivität hat.",
"model.unranked": "In der OpenCode Go-Nutzung der letzten Woche nicht platziert",
"model.ranked": "Rang #{{rank}} in der OpenCode Go-Nutzung der letzten Woche",
"Modellfakten aus dem gemeinsamen Modellindex. OpenCode-Nutzung erscheint, sobald dieses Modell Aktivität hat.",
"model.unranked": "In der OpenCode-Nutzung der letzten Woche nicht platziert",
"model.ranked": "Rang #{{rank}} in der OpenCode-Nutzung der letzten Woche",
"model.observedVolume": "mit {{share}} des beobachteten 2M-Volumens.",
"model.weights": "Modellgewichte: {{label}}",
"model.rank": "7T-Rang",
"model.profile": "Modellprofil",
"model.listed": "Gelistet",
"model.noCurrentUsage": "Keine OpenCode Go-Nutzung im aktuellen Datenfenster.",
"model.noCurrentUsage": "Keine OpenCode-Nutzung im aktuellen Datenfenster.",
"model.facts": "Modellfakten",
"model.context": "Kontext",
"model.output": "Ausgabe",
"model.knowledge": "Wissensstand",
"model.release": "Veröffentlichung",
"model.inputs": "Eingaben",
"model.overviewDescription": "Aktuelle OpenCode Go-Tokens, eindeutige Nutzer und Marktposition.",
"model.overviewDescription": "Aktuelle OpenCode-Tokens, eindeutige Nutzer und Marktposition.",
"model.noSummaryTitle": "Keine Nutzungsübersicht",
"model.noSummaryDescription": "Dieses Modell hat noch keine OpenCode Go-Nutzungszeilen.",
"model.noSummaryDescription": "Dieses Modell hat noch keine OpenCode-Nutzungszeilen.",
"model.tokens": "Tokens",
"model.uniqueUsers": "Eindeutige Nutzer",
"model.lastTwoMonths": "letzte zwei Monate",
@@ -193,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}} Modelle",
"model.momentum": "Momentum",
"model.vsPreviousWindow": "ggü. vorherigem Fenster",
"model.usageDescription": "Tägliches OpenCode Go-Tokenvolumen im aktuellen Zwei-Monats-Fenster.",
"model.usageDescription": "Tägliches OpenCode-Tokenvolumen im aktuellen Zwei-Monats-Fenster.",
"model.noUsageTitle": "Keine Nutzung",
"model.noUsageDescription": "Im aktuellen Fenster ist keine Nutzung eingegangen.",
"model.dailyTokenChart": "Diagramm der täglichen Tokennutzung",
"model.usersDescription": "Täglich eindeutige OpenCode Go-Nutzer im aktuellen Zwei-Monats-Fenster.",
"model.usersDescription": "Täglich eindeutige OpenCode-Nutzer im aktuellen Zwei-Monats-Fenster.",
"model.noUsersTitle": "Keine Nutzerdaten",
"model.noUsersDescription": "Im aktuellen Fenster sind keine Zeilen mit Nutzern eingegangen.",
"model.dailyUserChart": "Diagramm der täglich eindeutigen Nutzer",
"model.efficiencyDescription": "Kosten, Cache-Verhalten und durchschnittliche OpenCode Go-Sitzungsform.",
"model.efficiencyDescription": "Kosten, Cache-Verhalten und durchschnittliche OpenCode-Sitzungsform.",
"model.noEfficiencyTitle": "Keine Effizienzdaten",
"model.noEfficiencyDescription": "Effizienzdaten erscheinen, nachdem Nutzung eingegangen ist.",
"model.totalSpendLabel": "Total spend",
@@ -219,11 +219,11 @@ export const dict = {
"model.tokensSession": "Tokens / Sitzung",
"model.cacheRatio": "Cache-Anteil",
"model.inputTokens": "Eingabetokens",
"model.geoDescription": "OpenCode Go-Modelltokens nach Land.",
"model.geoDescription": "OpenCode-Modelltokens nach Land.",
"model.noGeoTitle": "Keine Geodaten",
"model.noGeoDescription": "Keine OpenCode Go-Geozeilen passten zu diesem Modell.",
"model.noGeoDescription": "Keine OpenCode-Geozeilen passten zu diesem Modell.",
"model.worldMap": "Weltkarte der Modelltokennutzung nach Land",
"model.peersDescription": "Nahe Modelle nach aktuellem OpenCode Go-Tokenvolumen.",
"model.peersDescription": "Nahe Modelle nach aktuellem OpenCode-Tokenvolumen.",
"model.noPeersTitle": "Keine Vergleichsmodelle",
"model.noPeersDescription": "Vergleichsrankings erscheinen, nachdem Nutzung eingegangen ist.",
"model.noUsageLastWeek": "Keine Nutzung letzte Woche",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Clasificaciones de uso de modelos de IA | OpenCode Data",
"app.description":
"Explora el uso de OpenCode Go en modelos de IA, incluido el volumen de tokens, clasificaciones, cuota de mercado, precios de tokens, coste por sesión, ratio de caché y desgloses geográficos.",
"Explora el uso de OpenCode en modelos de IA, incluido el volumen de tokens, clasificaciones, cuota de mercado, precios de tokens, coste por sesión, ratio de caché y desgloses geográficos.",
"app.unfurlAlt": "Logotipo textual de OpenCode Data sobre un fondo oscuro con patrón",
"nav.dataHome": "Inicio de datos",
"nav.topModels": "Modelos principales",
@@ -85,7 +85,7 @@ export const dict = {
"home.loadingTitle": "Cargando datos",
"home.loadingDescription": "Leyendo agregados de modelos.",
"home.usageTitle": "Uso",
"home.topModelsDescription": "Uso de modelos en OpenCode Go.",
"home.topModelsDescription": "Uso de modelos en OpenCode.",
"home.noUsageTitle": "Sin datos de uso",
"home.noUsageDescription": "Ninguna fila de modelo coincidió con este producto y rango.",
"home.noLeaderboardTitle": "Sin datos de clasificación",
@@ -97,7 +97,7 @@ export const dict = {
"home.modelUsers": "usuarios del modelo",
"home.new": "Nuevo",
"home.uniqueUsersTitle": "Usuarios únicos",
"home.uniqueUsersDescription": "Usuarios únicos diarios de OpenCode Go por modelo.",
"home.uniqueUsersDescription": "Usuarios únicos diarios de OpenCode por modelo.",
"home.noUserDataTitle": "Sin datos de usuarios",
"home.noUserDataDescription": "Ninguna fila de modelo con usuarios coincidió con esta ventana.",
"home.uniqueUsersChart": "Gráfico apilado de usuarios únicos por modelo",
@@ -129,7 +129,7 @@ export const dict = {
"home.costSession": "Coste/sesión",
"lab.title": "Uso y clasificaciones de modelos de IA de {{lab}} | OpenCode Data",
"lab.description":
"Compara modelos de {{lab}} usados en OpenCode Go, incluido uso de tokens, clasificaciones de modelos, ventanas de contexto, fechas de lanzamiento, costes y datos específicos del modelo.",
"Compara modelos de {{lab}} usados en OpenCode, incluido uso de tokens, clasificaciones de modelos, ventanas de contexto, fechas de lanzamiento, costes y datos específicos del modelo.",
"lab.loadingTitle": "Laboratorio de modelos",
"lab.loadingDescription": "Leyendo disponibilidad de modelos y uso reciente de OpenCode.",
"lab.notFound": "Ningún modelo coincidió con este laboratorio.",
@@ -156,7 +156,7 @@ export const dict = {
"lab.share": "Cuota",
"model.title": "Uso, coste y posición de {{model}} | OpenCode Data",
"model.description":
"Consulta datos de uso de {{model}} en OpenCode Go, incluido volumen de tokens, posición semanal, mezcla de tokens, costes, ratio de caché, sesiones, desgloses geográficos y modelos similares.",
"Consulta datos de uso de {{model}} en OpenCode, incluido volumen de tokens, posición semanal, mezcla de tokens, costes, ratio de caché, sesiones, desgloses geográficos y modelos similares.",
"model.loadingTitle": "Datos del modelo",
"model.loadingDescription": "Leyendo agregados del modelo.",
"model.loadingProfile": "Leyendo el perfil del modelo.",
@@ -165,24 +165,24 @@ export const dict = {
"model.noMatched": "Ningún dato del modelo ni fila de uso coincidió con {{id}}.",
"model.fallback": "Modelo",
"model.catalogFallback":
"Datos del modelo desde el índice compartido de modelos. El uso de OpenCode Go aparecerá cuando este modelo tenga actividad.",
"model.unranked": "Sin clasificación en el uso de OpenCode Go de la semana pasada",
"model.ranked": "Clasificado #{{rank}} en el uso de OpenCode Go de la semana pasada",
"Datos del modelo desde el índice compartido de modelos. El uso de OpenCode aparecerá cuando este modelo tenga actividad.",
"model.unranked": "Sin clasificación en el uso de OpenCode de la semana pasada",
"model.ranked": "Clasificado #{{rank}} en el uso de OpenCode de la semana pasada",
"model.observedVolume": "con {{share}} del volumen 2M observado.",
"model.weights": "Pesos del modelo: {{label}}",
"model.rank": "Posición 7D",
"model.profile": "Perfil del modelo",
"model.listed": "Listado",
"model.noCurrentUsage": "Sin uso de OpenCode Go en la ventana de datos actual.",
"model.noCurrentUsage": "Sin uso de OpenCode en la ventana de datos actual.",
"model.facts": "Datos del modelo",
"model.context": "Contexto",
"model.output": "Salida",
"model.knowledge": "Conocimiento",
"model.release": "Lanzamiento",
"model.inputs": "Entradas",
"model.overviewDescription": "Tokens recientes de OpenCode Go, usuarios únicos y posición de mercado.",
"model.overviewDescription": "Tokens recientes de OpenCode, usuarios únicos y posición de mercado.",
"model.noSummaryTitle": "Sin resumen de uso",
"model.noSummaryDescription": "Este modelo aún no tiene filas de uso de OpenCode Go.",
"model.noSummaryDescription": "Este modelo aún no tiene filas de uso de OpenCode.",
"model.tokens": "Tokens",
"model.uniqueUsers": "Usuarios únicos",
"model.lastTwoMonths": "últimos dos meses",
@@ -192,15 +192,15 @@ export const dict = {
"model.totalModels": "{{count}} modelos",
"model.momentum": "Impulso",
"model.vsPreviousWindow": "vs ventana anterior",
"model.usageDescription": "Volumen diario de tokens de OpenCode Go durante la ventana reciente de dos meses.",
"model.usageDescription": "Volumen diario de tokens de OpenCode durante la ventana reciente de dos meses.",
"model.noUsageTitle": "Sin uso",
"model.noUsageDescription": "No llegó uso en la ventana actual.",
"model.dailyTokenChart": "Gráfico de uso diario de tokens",
"model.usersDescription": "Usuarios únicos diarios de OpenCode Go durante la ventana reciente de dos meses.",
"model.usersDescription": "Usuarios únicos diarios de OpenCode durante la ventana reciente de dos meses.",
"model.noUsersTitle": "Sin datos de usuarios",
"model.noUsersDescription": "No llegaron filas con usuarios en la ventana actual.",
"model.dailyUserChart": "Gráfico diario de usuarios únicos",
"model.efficiencyDescription": "Coste, comportamiento de caché y forma media de sesión de OpenCode Go.",
"model.efficiencyDescription": "Coste, comportamiento de caché y forma media de sesión de OpenCode.",
"model.noEfficiencyTitle": "Sin datos de eficiencia",
"model.noEfficiencyDescription": "Los datos de eficiencia aparecen después de que llegue uso.",
"model.totalSpendLabel": "Total spend",
@@ -218,11 +218,11 @@ export const dict = {
"model.tokensSession": "Tokens / sesión",
"model.cacheRatio": "Ratio de caché",
"model.inputTokens": "tokens de entrada",
"model.geoDescription": "Tokens del modelo de OpenCode Go usados por país.",
"model.geoDescription": "Tokens del modelo de OpenCode usados por país.",
"model.noGeoTitle": "Sin datos geográficos",
"model.noGeoDescription": "Ninguna fila geográfica de OpenCode Go coincidió con este modelo.",
"model.noGeoDescription": "Ninguna fila geográfica de OpenCode coincidió con este modelo.",
"model.worldMap": "Mapa mundial del uso de tokens del modelo por país",
"model.peersDescription": "Modelos cercanos por volumen reciente de tokens de OpenCode Go.",
"model.peersDescription": "Modelos cercanos por volumen reciente de tokens de OpenCode.",
"model.noPeersTitle": "Sin modelos similares",
"model.noPeersDescription": "Las clasificaciones de modelos similares aparecen después de que llegue uso.",
"model.noUsageLastWeek": "Sin uso la semana pasada",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Classements d'utilisation des modèles d'IA | OpenCode Data",
"app.description":
"Explorez l'utilisation d'OpenCode Go par modèle d'IA, avec le volume de tokens, les classements, la part de marché, le prix des tokens, le coût par session, le taux de cache et les répartitions géographiques.",
"Explorez l'utilisation d'OpenCode par modèle d'IA, avec le volume de tokens, les classements, la part de marché, le prix des tokens, le coût par session, le taux de cache et les répartitions géographiques.",
"app.unfurlAlt": "Logo textuel OpenCode Data sur un fond sombre à motif",
"nav.dataHome": "Accueil des données",
"nav.topModels": "Meilleurs modèles",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Chargement des données",
"home.loadingDescription": "Lecture des agrégats de modèles.",
"home.usageTitle": "Utilisation",
"home.topModelsDescription": "Utilisation des modèles dans OpenCode Go.",
"home.topModelsDescription": "Utilisation des modèles dans OpenCode.",
"home.noUsageTitle": "Aucune donnée d'utilisation",
"home.noUsageDescription": "Aucune ligne de modèle ne correspondait à ce produit et à cette période.",
"home.noLeaderboardTitle": "Aucune donnée de classement",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "utilisateurs du modèle",
"home.new": "Nouveau",
"home.uniqueUsersTitle": "Utilisateurs uniques",
"home.uniqueUsersDescription": "Utilisateurs uniques quotidiens d'OpenCode Go par modèle.",
"home.uniqueUsersDescription": "Utilisateurs uniques quotidiens d'OpenCode par modèle.",
"home.noUserDataTitle": "Aucune donnée utilisateur",
"home.noUserDataDescription": "Aucune ligne de modèle avec utilisateurs ne correspondait à cette fenêtre.",
"home.uniqueUsersChart": "Graphique empilé des utilisateurs uniques par modèle",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Coût/session",
"lab.title": "Utilisation et classements des modèles d'IA {{lab}} | OpenCode Data",
"lab.description":
"Comparez les modèles {{lab}} utilisés dans OpenCode Go, avec l'utilisation des tokens, les classements de modèles, les fenêtres de contexte, les dates de sortie, les coûts et les données propres aux modèles.",
"Comparez les modèles {{lab}} utilisés dans OpenCode, avec l'utilisation des tokens, les classements de modèles, les fenêtres de contexte, les dates de sortie, les coûts et les données propres aux modèles.",
"lab.loadingTitle": "Laboratoire de modèles",
"lab.loadingDescription": "Lecture de la disponibilité des modèles et de l'utilisation récente d'OpenCode.",
"lab.notFound": "Aucun modèle ne correspondait à ce laboratoire.",
@@ -158,7 +158,7 @@ export const dict = {
"lab.share": "Part",
"model.title": "Utilisation, coût et rang de {{model}} | OpenCode Data",
"model.description":
"Consultez les données d'utilisation OpenCode Go de {{model}}, avec le volume de tokens, le rang hebdomadaire, la répartition des tokens, les coûts, le taux de cache, les sessions, les répartitions géographiques et les modèles proches.",
"Consultez les données d'utilisation OpenCode de {{model}}, avec le volume de tokens, le rang hebdomadaire, la répartition des tokens, les coûts, le taux de cache, les sessions, les répartitions géographiques et les modèles proches.",
"model.loadingTitle": "Données du modèle",
"model.loadingDescription": "Lecture des agrégats du modèle.",
"model.loadingProfile": "Lecture du profil du modèle.",
@@ -167,24 +167,24 @@ export const dict = {
"model.noMatched": "Aucun fait de modèle ni aucune ligne d'utilisation ne correspondait à {{id}}.",
"model.fallback": "Modèle",
"model.catalogFallback":
"Faits du modèle issus de l'index partagé des modèles. L'utilisation OpenCode Go apparaîtra dès que ce modèle aura de l'activité.",
"model.unranked": "Non classé dans l'utilisation OpenCode Go de la semaine dernière",
"model.ranked": "Classé #{{rank}} dans l'utilisation OpenCode Go de la semaine dernière",
"Faits du modèle issus de l'index partagé des modèles. L'utilisation OpenCode apparaîtra dès que ce modèle aura de l'activité.",
"model.unranked": "Non classé dans l'utilisation OpenCode de la semaine dernière",
"model.ranked": "Classé #{{rank}} dans l'utilisation OpenCode de la semaine dernière",
"model.observedVolume": "avec {{share}} du volume 2M observé.",
"model.weights": "Poids du modèle : {{label}}",
"model.rank": "Rang 7 j",
"model.profile": "Profil du modèle",
"model.listed": "Répertorié",
"model.noCurrentUsage": "Aucune utilisation OpenCode Go dans la fenêtre de données actuelle.",
"model.noCurrentUsage": "Aucune utilisation OpenCode dans la fenêtre de données actuelle.",
"model.facts": "Faits du modèle",
"model.context": "Contexte",
"model.output": "Sortie",
"model.knowledge": "Connaissances",
"model.release": "Sortie",
"model.inputs": "Entrées",
"model.overviewDescription": "Tokens OpenCode Go récents, utilisateurs uniques et position sur le marché.",
"model.overviewDescription": "Tokens OpenCode récents, utilisateurs uniques et position sur le marché.",
"model.noSummaryTitle": "Aucun résumé d'utilisation",
"model.noSummaryDescription": "Ce modèle n'a pas encore de lignes d'utilisation OpenCode Go.",
"model.noSummaryDescription": "Ce modèle n'a pas encore de lignes d'utilisation OpenCode.",
"model.tokens": "Tokens",
"model.uniqueUsers": "Utilisateurs uniques",
"model.lastTwoMonths": "deux derniers mois",
@@ -194,15 +194,15 @@ export const dict = {
"model.totalModels": "{{count}} modèles",
"model.momentum": "Dynamique",
"model.vsPreviousWindow": "vs fenêtre précédente",
"model.usageDescription": "Volume quotidien de tokens OpenCode Go sur la fenêtre récente de deux mois.",
"model.usageDescription": "Volume quotidien de tokens OpenCode sur la fenêtre récente de deux mois.",
"model.noUsageTitle": "Aucune utilisation",
"model.noUsageDescription": "Aucune utilisation n'est arrivée dans la fenêtre actuelle.",
"model.dailyTokenChart": "Graphique quotidien d'utilisation des tokens",
"model.usersDescription": "Utilisateurs uniques quotidiens d'OpenCode Go sur la fenêtre récente de deux mois.",
"model.usersDescription": "Utilisateurs uniques quotidiens d'OpenCode sur la fenêtre récente de deux mois.",
"model.noUsersTitle": "Aucune donnée utilisateur",
"model.noUsersDescription": "Aucune ligne avec utilisateurs n'est arrivée dans la fenêtre actuelle.",
"model.dailyUserChart": "Graphique quotidien des utilisateurs uniques",
"model.efficiencyDescription": "Coût, comportement du cache et forme moyenne des sessions OpenCode Go.",
"model.efficiencyDescription": "Coût, comportement du cache et forme moyenne des sessions OpenCode.",
"model.noEfficiencyTitle": "Aucune donnée d'efficacité",
"model.noEfficiencyDescription": "Les données d'efficacité apparaissent après l'arrivée de l'utilisation.",
"model.totalSpendLabel": "Total spend",
@@ -220,11 +220,11 @@ export const dict = {
"model.tokensSession": "Tokens / session",
"model.cacheRatio": "Taux de cache",
"model.inputTokens": "tokens d'entrée",
"model.geoDescription": "Tokens du modèle OpenCode Go utilisés par pays.",
"model.geoDescription": "Tokens du modèle OpenCode utilisés par pays.",
"model.noGeoTitle": "Aucune donnée géographique",
"model.noGeoDescription": "Aucune ligne géographique OpenCode Go ne correspondait à ce modèle.",
"model.noGeoDescription": "Aucune ligne géographique OpenCode ne correspondait à ce modèle.",
"model.worldMap": "Carte mondiale de l'utilisation des tokens du modèle par pays",
"model.peersDescription": "Modèles proches par volume récent de tokens OpenCode Go.",
"model.peersDescription": "Modèles proches par volume récent de tokens OpenCode.",
"model.noPeersTitle": "Aucun modèle proche",
"model.noPeersDescription": "Les classements de modèles proches apparaissent après l'arrivée de l'utilisation.",
"model.noUsageLastWeek": "Aucune utilisation la semaine dernière",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Classifiche di utilizzo dei modelli IA | OpenCode Data",
"app.description":
"Esplora l'utilizzo di OpenCode Go nei modelli IA, inclusi volume di token, classifiche, quota di mercato, prezzi dei token, costo per sessione, rapporto cache e ripartizioni geografiche.",
"Esplora l'utilizzo di OpenCode nei modelli IA, inclusi volume di token, classifiche, quota di mercato, prezzi dei token, costo per sessione, rapporto cache e ripartizioni geografiche.",
"app.unfurlAlt": "Logotipo OpenCode Data su uno sfondo scuro con motivo",
"nav.dataHome": "Home dati",
"nav.topModels": "Modelli principali",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Caricamento dati",
"home.loadingDescription": "Lettura degli aggregati dei modelli.",
"home.usageTitle": "Utilizzo",
"home.topModelsDescription": "Utilizzo dei modelli in OpenCode Go.",
"home.topModelsDescription": "Utilizzo dei modelli in OpenCode.",
"home.noUsageTitle": "Nessun dato di utilizzo",
"home.noUsageDescription": "Nessuna riga modello corrispondeva a questo prodotto e intervallo.",
"home.noLeaderboardTitle": "Nessun dato di classifica",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "utenti del modello",
"home.new": "Nuovo",
"home.uniqueUsersTitle": "Utenti unici",
"home.uniqueUsersDescription": "Utenti unici giornalieri di OpenCode Go per modello.",
"home.uniqueUsersDescription": "Utenti unici giornalieri di OpenCode per modello.",
"home.noUserDataTitle": "Nessun dato utente",
"home.noUserDataDescription": "Nessuna riga modello con utenti corrispondeva a questa finestra.",
"home.uniqueUsersChart": "Grafico impilato degli utenti unici per modello",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Costo/sessione",
"lab.title": "Utilizzo e classifiche dei modelli IA {{lab}} | OpenCode Data",
"lab.description":
"Confronta i modelli {{lab}} usati in OpenCode Go, inclusi utilizzo dei token, classifiche dei modelli, finestre di contesto, date di rilascio, costi e dati specifici del modello.",
"Confronta i modelli {{lab}} usati in OpenCode, inclusi utilizzo dei token, classifiche dei modelli, finestre di contesto, date di rilascio, costi e dati specifici del modello.",
"lab.loadingTitle": "Laboratorio modelli",
"lab.loadingDescription": "Lettura della disponibilità dei modelli e dell'utilizzo recente di OpenCode.",
"lab.notFound": "Nessun modello corrispondeva a questo laboratorio.",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "Quota",
"model.title": "Utilizzo, costo e posizione di {{model}} | OpenCode Data",
"model.description":
"Visualizza i dati di utilizzo di {{model}} in OpenCode Go, inclusi volume di token, rango settimanale, mix di token, costi, rapporto cache, sessioni, ripartizioni geografiche e modelli simili.",
"Visualizza i dati di utilizzo di {{model}} in OpenCode, inclusi volume di token, rango settimanale, mix di token, costi, rapporto cache, sessioni, ripartizioni geografiche e modelli simili.",
"model.loadingTitle": "Dati modello",
"model.loadingDescription": "Lettura degli aggregati del modello.",
"model.loadingProfile": "Lettura del profilo del modello.",
@@ -166,24 +166,24 @@ export const dict = {
"model.noMatched": "Nessun fatto modello o riga di utilizzo corrispondeva a {{id}}.",
"model.fallback": "Modello",
"model.catalogFallback":
"Fatti del modello dall'indice condiviso dei modelli. L'utilizzo di OpenCode Go appare quando questo modello ha attività.",
"model.unranked": "Non classificato nell'utilizzo OpenCode Go della scorsa settimana",
"model.ranked": "Posizione #{{rank}} nell'utilizzo OpenCode Go della scorsa settimana",
"Fatti del modello dall'indice condiviso dei modelli. L'utilizzo di OpenCode appare quando questo modello ha attività.",
"model.unranked": "Non classificato nell'utilizzo OpenCode della scorsa settimana",
"model.ranked": "Posizione #{{rank}} nell'utilizzo OpenCode della scorsa settimana",
"model.observedVolume": "con {{share}} del volume 2M osservato.",
"model.weights": "Pesi del modello: {{label}}",
"model.rank": "Posizione 7G",
"model.profile": "Profilo modello",
"model.listed": "Elencato",
"model.noCurrentUsage": "Nessun utilizzo di OpenCode Go nella finestra dati attuale.",
"model.noCurrentUsage": "Nessun utilizzo di OpenCode nella finestra dati attuale.",
"model.facts": "Fatti del modello",
"model.context": "Contesto",
"model.output": "Output",
"model.knowledge": "Conoscenza",
"model.release": "Versione",
"model.inputs": "Input",
"model.overviewDescription": "Token recenti di OpenCode Go, utenti unici e posizione di mercato.",
"model.overviewDescription": "Token recenti di OpenCode, utenti unici e posizione di mercato.",
"model.noSummaryTitle": "Nessun riepilogo di utilizzo",
"model.noSummaryDescription": "Questo modello non ha ancora righe di utilizzo di OpenCode Go.",
"model.noSummaryDescription": "Questo modello non ha ancora righe di utilizzo di OpenCode.",
"model.tokens": "Token",
"model.uniqueUsers": "Utenti unici",
"model.lastTwoMonths": "ultimi due mesi",
@@ -193,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}} modelli",
"model.momentum": "Slancio",
"model.vsPreviousWindow": "vs finestra precedente",
"model.usageDescription": "Volume giornaliero di token OpenCode Go nella recente finestra di due mesi.",
"model.usageDescription": "Volume giornaliero di token OpenCode nella recente finestra di due mesi.",
"model.noUsageTitle": "Nessun utilizzo",
"model.noUsageDescription": "Nessun utilizzo è arrivato nella finestra attuale.",
"model.dailyTokenChart": "Grafico giornaliero di utilizzo dei token",
"model.usersDescription": "Utenti unici giornalieri di OpenCode Go nella recente finestra di due mesi.",
"model.usersDescription": "Utenti unici giornalieri di OpenCode nella recente finestra di due mesi.",
"model.noUsersTitle": "Nessun dato utente",
"model.noUsersDescription": "Nessuna riga con utenti è arrivata nella finestra attuale.",
"model.dailyUserChart": "Grafico giornaliero degli utenti unici",
"model.efficiencyDescription": "Costi, comportamento della cache e forma media della sessione OpenCode Go.",
"model.efficiencyDescription": "Costi, comportamento della cache e forma media della sessione OpenCode.",
"model.noEfficiencyTitle": "Nessun dato di efficienza",
"model.noEfficiencyDescription": "I dati di efficienza appaiono dopo l'arrivo dell'utilizzo.",
"model.totalSpendLabel": "Total spend",
@@ -219,11 +219,11 @@ export const dict = {
"model.tokensSession": "Token / sessione",
"model.cacheRatio": "Rapporto cache",
"model.inputTokens": "token di input",
"model.geoDescription": "Token del modello OpenCode Go usati per paese.",
"model.geoDescription": "Token del modello OpenCode usati per paese.",
"model.noGeoTitle": "Nessun dato geografico",
"model.noGeoDescription": "Nessuna riga geografica OpenCode Go corrispondeva a questo modello.",
"model.noGeoDescription": "Nessuna riga geografica OpenCode corrispondeva a questo modello.",
"model.worldMap": "Mappa mondiale dell'utilizzo dei token del modello per paese",
"model.peersDescription": "Modelli vicini per volume recente di token OpenCode Go.",
"model.peersDescription": "Modelli vicini per volume recente di token OpenCode.",
"model.noPeersTitle": "Nessun modello simile",
"model.noPeersDescription": "Le classifiche dei modelli simili appaiono dopo l'arrivo dell'utilizzo.",
"model.noUsageLastWeek": "Nessun utilizzo la scorsa settimana",
+17 -17
View File
@@ -3,7 +3,7 @@ import type { Key } from "../i18n"
export const dict = {
"app.title": "AIモデル使用ランキング | OpenCodeデータ",
"app.description":
"OpenCode GoでのAIモデル利用状況を、トークン量、ランキング、マーケットシェア、トークン価格、セッションコスト、キャッシュ比率、地域別内訳まで確認できます。",
"OpenCodeでのAIモデル利用状況を、トークン量、ランキング、マーケットシェア、トークン価格、セッションコスト、キャッシュ比率、地域別内訳まで確認できます。",
"app.unfurlAlt": "暗いパターン背景上のOpenCode Dataワードマーク",
"nav.dataHome": "データホーム",
"nav.topModels": "上位モデル",
@@ -88,7 +88,7 @@ export const dict = {
"home.loadingTitle": "データを読み込み中",
"home.loadingDescription": "モデル集計を読み込んでいます。",
"home.usageTitle": "使用量",
"home.topModelsDescription": "OpenCode Goにおけるモデルの使用状況。",
"home.topModelsDescription": "OpenCodeにおけるモデルの使用状況。",
"home.noUsageTitle": "使用データがありません",
"home.noUsageDescription": "このプロダクトと期間に一致するモデル行はありません。",
"home.noLeaderboardTitle": "ランキングデータがありません",
@@ -100,7 +100,7 @@ export const dict = {
"home.modelUsers": "モデルユーザー",
"home.new": "新規",
"home.uniqueUsersTitle": "ユニークユーザー",
"home.uniqueUsersDescription": "モデル別のOpenCode Go日次ユニークユーザー。",
"home.uniqueUsersDescription": "モデル別のOpenCode日次ユニークユーザー。",
"home.noUserDataTitle": "ユーザーデータがありません",
"home.noUserDataDescription": "この期間に一致するユーザー付きモデル行はありません。",
"home.uniqueUsersChart": "モデル別ユニークユーザーの積み上げグラフ",
@@ -132,7 +132,7 @@ export const dict = {
"home.costSession": "コスト/セッション",
"lab.title": "{{lab}} AIモデル使用量とランキング | OpenCodeデータ",
"lab.description":
"OpenCode Goで使用されている{{lab}}モデルを、トークン使用量、モデルランキング、コンテキストウィンドウ、リリース日、コスト、モデル別データで比較できます。",
"OpenCodeで使用されている{{lab}}モデルを、トークン使用量、モデルランキング、コンテキストウィンドウ、リリース日、コスト、モデル別データで比較できます。",
"lab.loadingTitle": "モデルラボ",
"lab.loadingDescription": "モデルの利用可否と最近のOpenCode使用状況を読み込んでいます。",
"lab.notFound": "このラボに一致するモデルはありません。",
@@ -158,7 +158,7 @@ export const dict = {
"lab.share": "シェア",
"model.title": "{{model}}の使用量、コスト、ランク | OpenCodeデータ",
"model.description":
"{{model}}のOpenCode Go使用データを、トークン量、週間ランク、トークン構成、コスト、キャッシュ比率、セッション、地域別内訳、類似モデルまで確認できます。",
"{{model}}のOpenCode使用データを、トークン量、週間ランク、トークン構成、コスト、キャッシュ比率、セッション、地域別内訳、類似モデルまで確認できます。",
"model.loadingTitle": "モデルデータ",
"model.loadingDescription": "モデル集計を読み込んでいます。",
"model.loadingProfile": "モデルプロフィールを読み込んでいます。",
@@ -167,24 +167,24 @@ export const dict = {
"model.noMatched": "{{id}}に一致するモデル情報または使用行はありません。",
"model.fallback": "モデル",
"model.catalogFallback":
"共有モデルインデックスのモデル情報です。このモデルにアクティビティが発生するとOpenCode Go使用量が表示されます。",
"model.unranked": "先週のOpenCode Go使用量では未ランク",
"model.ranked": "先週のOpenCode Go使用量で#{{rank}}位",
"共有モデルインデックスのモデル情報です。このモデルにアクティビティが発生するとOpenCode使用量が表示されます。",
"model.unranked": "先週のOpenCode使用量では未ランク",
"model.ranked": "先週のOpenCode使用量で#{{rank}}位",
"model.observedVolume": "観測された2M量の{{share}}。",
"model.weights": "モデル重み: {{label}}",
"model.rank": "7日ランク",
"model.profile": "モデルプロフィール",
"model.listed": "掲載日",
"model.noCurrentUsage": "現在のデータ期間にはOpenCode Go使用量がありません。",
"model.noCurrentUsage": "現在のデータ期間にはOpenCode使用量がありません。",
"model.facts": "モデル情報",
"model.context": "コンテキスト",
"model.output": "出力",
"model.knowledge": "知識",
"model.release": "リリース",
"model.inputs": "入力",
"model.overviewDescription": "最近のOpenCode Goトークン、ユニークユーザー、市場での位置。",
"model.overviewDescription": "最近のOpenCodeトークン、ユニークユーザー、市場での位置。",
"model.noSummaryTitle": "使用概要がありません",
"model.noSummaryDescription": "このモデルにはまだOpenCode Goの使用行がありません。",
"model.noSummaryDescription": "このモデルにはまだOpenCodeの使用行がありません。",
"model.tokens": "トークン",
"model.uniqueUsers": "ユニークユーザー",
"model.lastTwoMonths": "過去2か月",
@@ -194,15 +194,15 @@ export const dict = {
"model.totalModels": "{{count}}件のモデル",
"model.momentum": "勢い",
"model.vsPreviousWindow": "前の期間比",
"model.usageDescription": "直近2か月の期間におけるOpenCode Goの日次トークン量。",
"model.usageDescription": "直近2か月の期間におけるOpenCodeの日次トークン量。",
"model.noUsageTitle": "使用量がありません",
"model.noUsageDescription": "現在の期間には使用量がありません。",
"model.dailyTokenChart": "日次トークン使用量グラフ",
"model.usersDescription": "直近2か月の期間におけるOpenCode Goの日次ユニークユーザー。",
"model.usersDescription": "直近2か月の期間におけるOpenCodeの日次ユニークユーザー。",
"model.noUsersTitle": "ユーザーデータがありません",
"model.noUsersDescription": "現在の期間にはユーザー付き行がありません。",
"model.dailyUserChart": "日次ユニークユーザーグラフ",
"model.efficiencyDescription": "コスト、キャッシュ動作、平均的なOpenCode Goセッションの形。",
"model.efficiencyDescription": "コスト、キャッシュ動作、平均的なOpenCodeセッションの形。",
"model.noEfficiencyTitle": "効率データがありません",
"model.noEfficiencyDescription": "使用量が届くと効率データが表示されます。",
"model.totalSpendLabel": "Total spend",
@@ -220,11 +220,11 @@ export const dict = {
"model.tokensSession": "トークン / セッション",
"model.cacheRatio": "キャッシュ比率",
"model.inputTokens": "入力トークン",
"model.geoDescription": "国別のOpenCode Goモデルのトークン使用量。",
"model.geoDescription": "国別のOpenCodeモデルのトークン使用量。",
"model.noGeoTitle": "地域データがありません",
"model.noGeoDescription": "このモデルに一致するOpenCode Go地域行はありません。",
"model.noGeoDescription": "このモデルに一致するOpenCode地域行はありません。",
"model.worldMap": "国別モデル別トークン使用量の世界地図",
"model.peersDescription": "最近のOpenCode Goトークン量が近いモデル。",
"model.peersDescription": "最近のOpenCodeトークン量が近いモデル。",
"model.noPeersTitle": "類似モデルがありません",
"model.noPeersDescription": "使用量が届くと類似モデルのランキングが表示されます。",
"model.noUsageLastWeek": "先週の使用量なし",
+17 -18
View File
@@ -3,7 +3,7 @@ import type { Key } from "../i18n"
export const dict = {
"app.title": "AI 모델 사용 순위 | OpenCode 데이터",
"app.description":
"OpenCode Go에서 AI 모델이 어떻게 사용되는지 토큰 볼륨, 순위, 시장 점유율, 토큰 가격, 세션 비용, 캐시 비율, 지역별 분포까지 살펴보세요.",
"OpenCode에서 AI 모델이 어떻게 사용되는지 토큰 볼륨, 순위, 시장 점유율, 토큰 가격, 세션 비용, 캐시 비율, 지역별 분포까지 살펴보세요.",
"app.unfurlAlt": "어두운 패턴 배경 위의 OpenCode Data 워드마크",
"nav.dataHome": "데이터 홈",
"nav.topModels": "상위 모델",
@@ -88,7 +88,7 @@ export const dict = {
"home.loadingTitle": "데이터 로딩 중",
"home.loadingDescription": "모델 집계를 읽는 중입니다.",
"home.usageTitle": "사용량",
"home.topModelsDescription": "OpenCode Go 전반의 모델 사용량입니다.",
"home.topModelsDescription": "OpenCode 전반의 모델 사용량입니다.",
"home.noUsageTitle": "사용 데이터 없음",
"home.noUsageDescription": "이 제품과 범위에 맞는 모델 행이 없습니다.",
"home.noLeaderboardTitle": "리더보드 데이터 없음",
@@ -100,7 +100,7 @@ export const dict = {
"home.modelUsers": "모델 사용자",
"home.new": "신규",
"home.uniqueUsersTitle": "순 사용자",
"home.uniqueUsersDescription": "모델별 일간 OpenCode Go 순 사용자입니다.",
"home.uniqueUsersDescription": "모델별 일간 OpenCode 순 사용자입니다.",
"home.noUserDataTitle": "사용자 데이터 없음",
"home.noUserDataDescription": "이 기간에 맞는 사용자 포함 모델 행이 없습니다.",
"home.uniqueUsersChart": "모델별 순 사용자 누적 차트",
@@ -132,7 +132,7 @@ export const dict = {
"home.costSession": "비용/세션",
"lab.title": "{{lab}} AI 모델 사용량 및 순위 | OpenCode 데이터",
"lab.description":
"OpenCode Go에서 사용되는 {{lab}} 모델을 토큰 사용량, 모델 순위, 컨텍스트 창, 출시일, 비용, 모델별 데이터까지 비교하세요.",
"OpenCode에서 사용되는 {{lab}} 모델을 토큰 사용량, 모델 순위, 컨텍스트 창, 출시일, 비용, 모델별 데이터까지 비교하세요.",
"lab.loadingTitle": "모델 랩",
"lab.loadingDescription": "모델 가용성과 최근 OpenCode 사용량을 읽는 중입니다.",
"lab.notFound": "이 랩과 일치하는 모델이 없습니다.",
@@ -158,7 +158,7 @@ export const dict = {
"lab.share": "점유율",
"model.title": "{{model}} 사용량, 비용 및 순위 | OpenCode 데이터",
"model.description":
"{{model}}의 OpenCode Go 사용 데이터를 토큰 볼륨, 주간 순위, 토큰 구성, 비용, 캐시 비율, 세션, 지역별 분포, 비슷한 모델까지 확인하세요.",
"{{model}}의 OpenCode 사용 데이터를 토큰 볼륨, 주간 순위, 토큰 구성, 비용, 캐시 비율, 세션, 지역별 분포, 비슷한 모델까지 확인하세요.",
"model.loadingTitle": "모델 데이터",
"model.loadingDescription": "모델 집계를 읽는 중입니다.",
"model.loadingProfile": "모델 프로필을 읽는 중입니다.",
@@ -166,25 +166,24 @@ export const dict = {
"model.noDataDescription": "리더보드에서 모델을 열어보세요.",
"model.noMatched": "{{id}}와 일치하는 모델 정보나 사용 행이 없습니다.",
"model.fallback": "모델",
"model.catalogFallback":
"공유 모델 인덱스의 모델 정보입니다. 이 모델에 활동이 생기면 OpenCode Go 사용량이 표시됩니다.",
"model.unranked": "지난주 OpenCode Go 사용량에서 순위 없음",
"model.ranked": "지난주 OpenCode Go 사용량에서 #{{rank}}위",
"model.catalogFallback": "공유 모델 인덱스의 모델 정보입니다. 이 모델에 활동이 생기면 OpenCode 사용량이 표시됩니다.",
"model.unranked": "지난주 OpenCode 사용량에서 순위 없음",
"model.ranked": "지난주 OpenCode 사용량에서 #{{rank}}위",
"model.observedVolume": "관측된 2M 볼륨의 {{share}}.",
"model.weights": "모델 가중치: {{label}}",
"model.rank": "7일 순위",
"model.profile": "모델 프로필",
"model.listed": "등록됨",
"model.noCurrentUsage": "현재 데이터 기간에는 OpenCode Go 사용량이 없습니다.",
"model.noCurrentUsage": "현재 데이터 기간에는 OpenCode 사용량이 없습니다.",
"model.facts": "모델 정보",
"model.context": "컨텍스트",
"model.output": "출력",
"model.knowledge": "지식",
"model.release": "출시",
"model.inputs": "입력",
"model.overviewDescription": "최근 OpenCode Go 토큰, 순 사용자, 시장 위치입니다.",
"model.overviewDescription": "최근 OpenCode 토큰, 순 사용자, 시장 위치입니다.",
"model.noSummaryTitle": "사용 요약 없음",
"model.noSummaryDescription": "이 모델에는 아직 OpenCode Go 사용 행이 없습니다.",
"model.noSummaryDescription": "이 모델에는 아직 OpenCode 사용 행이 없습니다.",
"model.tokens": "토큰",
"model.uniqueUsers": "순 사용자",
"model.lastTwoMonths": "지난 두 달",
@@ -194,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}}개 모델",
"model.momentum": "모멘텀",
"model.vsPreviousWindow": "이전 기간 대비",
"model.usageDescription": "최근 두 달 기간의 일간 OpenCode Go 토큰 볼륨입니다.",
"model.usageDescription": "최근 두 달 기간의 일간 OpenCode 토큰 볼륨입니다.",
"model.noUsageTitle": "사용량 없음",
"model.noUsageDescription": "현재 기간에는 사용량이 없습니다.",
"model.dailyTokenChart": "일간 토큰 사용량 차트",
"model.usersDescription": "최근 두 달 기간의 일간 OpenCode Go 순 사용자입니다.",
"model.usersDescription": "최근 두 달 기간의 일간 OpenCode 순 사용자입니다.",
"model.noUsersTitle": "사용자 데이터 없음",
"model.noUsersDescription": "현재 기간에는 사용자 포함 행이 없습니다.",
"model.dailyUserChart": "일간 순 사용자 차트",
"model.efficiencyDescription": "비용, 캐시 동작, 평균 OpenCode Go 세션 형태입니다.",
"model.efficiencyDescription": "비용, 캐시 동작, 평균 OpenCode 세션 형태입니다.",
"model.noEfficiencyTitle": "효율 데이터 없음",
"model.noEfficiencyDescription": "사용량이 들어오면 효율 데이터가 표시됩니다.",
"model.totalSpendLabel": "Total spend",
@@ -220,11 +219,11 @@ export const dict = {
"model.tokensSession": "토큰 / 세션",
"model.cacheRatio": "캐시 비율",
"model.inputTokens": "입력 토큰",
"model.geoDescription": "국가별 OpenCode Go 모델 토큰 사용량입니다.",
"model.geoDescription": "국가별 OpenCode 모델 토큰 사용량입니다.",
"model.noGeoTitle": "지역 데이터 없음",
"model.noGeoDescription": "이 모델과 일치하는 OpenCode Go 지역 행이 없습니다.",
"model.noGeoDescription": "이 모델과 일치하는 OpenCode 지역 행이 없습니다.",
"model.worldMap": "국가별 모델 토큰 사용량 세계 지도",
"model.peersDescription": "최근 OpenCode Go 토큰 볼륨이 가까운 모델입니다.",
"model.peersDescription": "최근 OpenCode 토큰 볼륨이 가까운 모델입니다.",
"model.noPeersTitle": "비슷한 모델 없음",
"model.noPeersDescription": "사용량이 들어오면 비슷한 모델 순위가 표시됩니다.",
"model.noUsageLastWeek": "지난주 사용량 없음",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Rangeringer for bruk av AI-modeller | OpenCode Data",
"app.description":
"Utforsk bruk av OpenCode Go på tvers av AI-modeller, inkludert tokenvolum, rangeringer, markedsandel, tokenpriser, øktkostnad, cacheandel og geografiske fordelinger.",
"Utforsk bruk av OpenCode på tvers av AI-modeller, inkludert tokenvolum, rangeringer, markedsandel, tokenpriser, øktkostnad, cacheandel og geografiske fordelinger.",
"app.unfurlAlt": "OpenCode Data-ordmerke på en mørk mønstret bakgrunn",
"nav.dataHome": "Dataforside",
"nav.topModels": "Toppmodeller",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Laster data",
"home.loadingDescription": "Leser modellaggregater.",
"home.usageTitle": "Bruk",
"home.topModelsDescription": "Bruk av modeller på tvers av OpenCode Go.",
"home.topModelsDescription": "Bruk av modeller på tvers av OpenCode.",
"home.noUsageTitle": "Ingen bruksdata",
"home.noUsageDescription": "Ingen modellrader matchet dette produktet og intervallet.",
"home.noLeaderboardTitle": "Ingen rangeringsdata",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "modellbrukere",
"home.new": "Ny",
"home.uniqueUsersTitle": "Unike brukere",
"home.uniqueUsersDescription": "Daglige unike OpenCode Go-brukere etter modell.",
"home.uniqueUsersDescription": "Daglige unike OpenCode-brukere etter modell.",
"home.noUserDataTitle": "Ingen brukerdata",
"home.noUserDataDescription": "Ingen modellrader med brukere matchet dette vinduet.",
"home.uniqueUsersChart": "Stablet diagram over unike brukere etter modell",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Kostnad/økt",
"lab.title": "{{lab}} AI-modellbruk og rangeringer | OpenCode Data",
"lab.description":
"Sammenlign {{lab}}-modeller brukt i OpenCode Go, inkludert tokenbruk, modellrangeringer, kontekstvinduer, utgivelsesdatoer, kostnader og modellspesifikke data.",
"Sammenlign {{lab}}-modeller brukt i OpenCode, inkludert tokenbruk, modellrangeringer, kontekstvinduer, utgivelsesdatoer, kostnader og modellspesifikke data.",
"lab.loadingTitle": "Modellab",
"lab.loadingDescription": "Leser modelltilgjengelighet og nylig OpenCode-bruk.",
"lab.notFound": "Ingen modeller matchet dette laben.",
@@ -156,7 +156,7 @@ export const dict = {
"lab.share": "Andel",
"model.title": "{{model}} bruk, kostnad og rangering | OpenCode Data",
"model.description":
"Se OpenCode Go-bruksdata for {{model}}, inkludert tokenvolum, ukentlig rangering, tokenmiks, kostnader, cacheandel, økter, geografiske fordelinger og lignende modeller.",
"Se OpenCode-bruksdata for {{model}}, inkludert tokenvolum, ukentlig rangering, tokenmiks, kostnader, cacheandel, økter, geografiske fordelinger og lignende modeller.",
"model.loadingTitle": "Modelldata",
"model.loadingDescription": "Leser modellaggregater.",
"model.loadingProfile": "Leser modellprofilen.",
@@ -165,24 +165,24 @@ export const dict = {
"model.noMatched": "Ingen modellfakta eller bruksrader matchet {{id}}.",
"model.fallback": "Modell",
"model.catalogFallback":
"Modellfakta fra den delte modellindeksen. OpenCode Go-bruk vises når denne modellen har aktivitet.",
"model.unranked": "Ikke rangert i forrige ukes OpenCode Go-bruk",
"model.ranked": "Rangert #{{rank}} i forrige ukes OpenCode Go-bruk",
"Modellfakta fra den delte modellindeksen. OpenCode-bruk vises når denne modellen har aktivitet.",
"model.unranked": "Ikke rangert i forrige ukes OpenCode-bruk",
"model.ranked": "Rangert #{{rank}} i forrige ukes OpenCode-bruk",
"model.observedVolume": "med {{share}} av observert 2M-volum.",
"model.weights": "Modellvekter: {{label}}",
"model.rank": "7D-rangering",
"model.profile": "Modellprofil",
"model.listed": "Oppført",
"model.noCurrentUsage": "Ingen OpenCode Go-bruk i gjeldende datavindu.",
"model.noCurrentUsage": "Ingen OpenCode-bruk i gjeldende datavindu.",
"model.facts": "Modellfakta",
"model.context": "Kontekst",
"model.output": "Utdata",
"model.knowledge": "Kunnskap",
"model.release": "Utgivelse",
"model.inputs": "Inndata",
"model.overviewDescription": "Nylige OpenCode Go-tokens, unike brukere og markedsposisjon.",
"model.overviewDescription": "Nylige OpenCode-tokens, unike brukere og markedsposisjon.",
"model.noSummaryTitle": "Ingen bruksoversikt",
"model.noSummaryDescription": "Denne modellen har ingen OpenCode Go-bruksrader ennå.",
"model.noSummaryDescription": "Denne modellen har ingen OpenCode-bruksrader ennå.",
"model.tokens": "Tokens",
"model.uniqueUsers": "Unike brukere",
"model.lastTwoMonths": "siste to måneder",
@@ -192,15 +192,15 @@ export const dict = {
"model.totalModels": "{{count}} modeller",
"model.momentum": "Momentum",
"model.vsPreviousWindow": "mot forrige vindu",
"model.usageDescription": "Daglig OpenCode Go-tokenvolum i det nylige tomånedersvinduet.",
"model.usageDescription": "Daglig OpenCode-tokenvolum i det nylige tomånedersvinduet.",
"model.noUsageTitle": "Ingen bruk",
"model.noUsageDescription": "Ingen bruk landet i gjeldende vindu.",
"model.dailyTokenChart": "Daglig diagram over tokenbruk",
"model.usersDescription": "Daglige unike OpenCode Go-brukere i det nylige tomånedersvinduet.",
"model.usersDescription": "Daglige unike OpenCode-brukere i det nylige tomånedersvinduet.",
"model.noUsersTitle": "Ingen brukerdata",
"model.noUsersDescription": "Ingen rader med brukere landet i gjeldende vindu.",
"model.dailyUserChart": "Daglig diagram over unike brukere",
"model.efficiencyDescription": "Kostnad, cacheatferd og gjennomsnittlig OpenCode Go-øktform.",
"model.efficiencyDescription": "Kostnad, cacheatferd og gjennomsnittlig OpenCode-øktform.",
"model.noEfficiencyTitle": "Ingen effektivitetsdata",
"model.noEfficiencyDescription": "Effektivitetsdata vises etter at bruk lander.",
"model.totalSpendLabel": "Total spend",
@@ -218,11 +218,11 @@ export const dict = {
"model.tokensSession": "Tokens / økt",
"model.cacheRatio": "Cacheandel",
"model.inputTokens": "inndata-tokens",
"model.geoDescription": "OpenCode Go-modelltokens brukt etter land.",
"model.geoDescription": "OpenCode-modelltokens brukt etter land.",
"model.noGeoTitle": "Ingen geodata",
"model.noGeoDescription": "Ingen OpenCode Go-georader matchet denne modellen.",
"model.noGeoDescription": "Ingen OpenCode-georader matchet denne modellen.",
"model.worldMap": "Verdenskart over modelltokenbruk etter land",
"model.peersDescription": "Nærliggende modeller etter nylig OpenCode Go-tokenvolum.",
"model.peersDescription": "Nærliggende modeller etter nylig OpenCode-tokenvolum.",
"model.noPeersTitle": "Ingen lignende modeller",
"model.noPeersDescription": "Rangeringer for lignende modeller vises etter at bruk lander.",
"model.noUsageLastWeek": "Ingen bruk forrige uke",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Rankingi użycia modeli AI | OpenCode Data",
"app.description":
"Przeglądaj użycie OpenCode Go w modelach AI, w tym wolumen tokenów, rankingi, udział w rynku, ceny tokenów, koszt sesji, współczynnik cache i podziały geograficzne.",
"Przeglądaj użycie OpenCode w modelach AI, w tym wolumen tokenów, rankingi, udział w rynku, ceny tokenów, koszt sesji, współczynnik cache i podziały geograficzne.",
"app.unfurlAlt": "Znak słowny OpenCode Data na ciemnym wzorzystym tle",
"nav.dataHome": "Strona danych",
"nav.topModels": "Najlepsze modele",
@@ -85,7 +85,7 @@ export const dict = {
"home.loadingTitle": "Ładowanie danych",
"home.loadingDescription": "Odczytywanie agregatów modeli.",
"home.usageTitle": "Użycie",
"home.topModelsDescription": "Użycie modeli w OpenCode Go.",
"home.topModelsDescription": "Użycie modeli w OpenCode.",
"home.noUsageTitle": "Brak danych użycia",
"home.noUsageDescription": "Żadne wiersze modeli nie pasowały do tego produktu i zakresu.",
"home.noLeaderboardTitle": "Brak danych rankingu",
@@ -97,7 +97,7 @@ export const dict = {
"home.modelUsers": "użytkownicy modelu",
"home.new": "Nowy",
"home.uniqueUsersTitle": "Unikalni użytkownicy",
"home.uniqueUsersDescription": "Dzienni unikalni użytkownicy OpenCode Go według modelu.",
"home.uniqueUsersDescription": "Dzienni unikalni użytkownicy OpenCode według modelu.",
"home.noUserDataTitle": "Brak danych użytkowników",
"home.noUserDataDescription": "Żadne wiersze modeli z użytkownikami nie pasowały do tego okna.",
"home.uniqueUsersChart": "Skumulowany wykres unikalnych użytkowników według modelu",
@@ -129,7 +129,7 @@ export const dict = {
"home.costSession": "Koszt/sesja",
"lab.title": "Użycie i rankingi modeli AI {{lab}} | OpenCode Data",
"lab.description":
"Porównaj modele {{lab}} używane w OpenCode Go, w tym użycie tokenów, rankingi modeli, okna kontekstu, daty wydań, koszty i dane specyficzne dla modeli.",
"Porównaj modele {{lab}} używane w OpenCode, w tym użycie tokenów, rankingi modeli, okna kontekstu, daty wydań, koszty i dane specyficzne dla modeli.",
"lab.loadingTitle": "Laboratorium modeli",
"lab.loadingDescription": "Odczytywanie dostępności modeli i ostatniego użycia OpenCode.",
"lab.notFound": "Żadne modele nie pasowały do tego laboratorium.",
@@ -155,7 +155,7 @@ export const dict = {
"lab.share": "Udział",
"model.title": "Użycie, koszt i pozycja {{model}} | OpenCode Data",
"model.description":
"Zobacz dane użycia {{model}} w OpenCode Go, w tym wolumen tokenów, tygodniową pozycję, miks tokenów, koszty, współczynnik cache, sesje, podziały geograficzne i podobne modele.",
"Zobacz dane użycia {{model}} w OpenCode, w tym wolumen tokenów, tygodniową pozycję, miks tokenów, koszty, współczynnik cache, sesje, podziały geograficzne i podobne modele.",
"model.loadingTitle": "Dane modelu",
"model.loadingDescription": "Odczytywanie agregatów modelu.",
"model.loadingProfile": "Odczytywanie profilu modelu.",
@@ -164,24 +164,24 @@ export const dict = {
"model.noMatched": "Żadne fakty modelu ani wiersze użycia nie pasowały do {{id}}.",
"model.fallback": "Model",
"model.catalogFallback":
"Fakty modelu ze wspólnego indeksu modeli. Użycie OpenCode Go pojawi się, gdy ten model będzie mieć aktywność.",
"model.unranked": "Bez pozycji w użyciu OpenCode Go z zeszłego tygodnia",
"model.ranked": "Pozycja #{{rank}} w użyciu OpenCode Go z zeszłego tygodnia",
"Fakty modelu ze wspólnego indeksu modeli. Użycie OpenCode pojawi się, gdy ten model będzie mieć aktywność.",
"model.unranked": "Bez pozycji w użyciu OpenCode z zeszłego tygodnia",
"model.ranked": "Pozycja #{{rank}} w użyciu OpenCode z zeszłego tygodnia",
"model.observedVolume": "z {{share}} obserwowanego wolumenu 2M.",
"model.weights": "Wagi modelu: {{label}}",
"model.rank": "Pozycja 7D",
"model.profile": "Profil modelu",
"model.listed": "W katalogu",
"model.noCurrentUsage": "Brak użycia OpenCode Go w bieżącym oknie danych.",
"model.noCurrentUsage": "Brak użycia OpenCode w bieżącym oknie danych.",
"model.facts": "Fakty modelu",
"model.context": "Kontekst",
"model.output": "Wyjście",
"model.knowledge": "Wiedza",
"model.release": "Wydanie",
"model.inputs": "Wejścia",
"model.overviewDescription": "Ostatnie tokeny OpenCode Go, unikalni użytkownicy i pozycja rynkowa.",
"model.overviewDescription": "Ostatnie tokeny OpenCode, unikalni użytkownicy i pozycja rynkowa.",
"model.noSummaryTitle": "Brak podsumowania użycia",
"model.noSummaryDescription": "Ten model nie ma jeszcze wierszy użycia OpenCode Go.",
"model.noSummaryDescription": "Ten model nie ma jeszcze wierszy użycia OpenCode.",
"model.tokens": "Tokeny",
"model.uniqueUsers": "Unikalni użytkownicy",
"model.lastTwoMonths": "ostatnie dwa miesiące",
@@ -191,15 +191,15 @@ export const dict = {
"model.totalModels": "{{count}} modeli",
"model.momentum": "Momentum",
"model.vsPreviousWindow": "vs poprzednie okno",
"model.usageDescription": "Dzienny wolumen tokenów OpenCode Go w ostatnim dwumiesięcznym oknie.",
"model.usageDescription": "Dzienny wolumen tokenów OpenCode w ostatnim dwumiesięcznym oknie.",
"model.noUsageTitle": "Brak użycia",
"model.noUsageDescription": "W bieżącym oknie nie pojawiło się użycie.",
"model.dailyTokenChart": "Dzienny wykres użycia tokenów",
"model.usersDescription": "Dzienni unikalni użytkownicy OpenCode Go w ostatnim dwumiesięcznym oknie.",
"model.usersDescription": "Dzienni unikalni użytkownicy OpenCode w ostatnim dwumiesięcznym oknie.",
"model.noUsersTitle": "Brak danych użytkowników",
"model.noUsersDescription": "W bieżącym oknie nie pojawiły się wiersze z użytkownikami.",
"model.dailyUserChart": "Dzienny wykres unikalnych użytkowników",
"model.efficiencyDescription": "Koszt, zachowanie cache i średni kształt sesji OpenCode Go.",
"model.efficiencyDescription": "Koszt, zachowanie cache i średni kształt sesji OpenCode.",
"model.noEfficiencyTitle": "Brak danych wydajności",
"model.noEfficiencyDescription": "Dane wydajności pojawią się po nadejściu użycia.",
"model.totalSpendLabel": "Total spend",
@@ -217,11 +217,11 @@ export const dict = {
"model.tokensSession": "Tokeny / sesja",
"model.cacheRatio": "Współczynnik cache",
"model.inputTokens": "tokeny wejściowe",
"model.geoDescription": "Tokeny modelu OpenCode Go użyte według kraju.",
"model.geoDescription": "Tokeny modelu OpenCode użyte według kraju.",
"model.noGeoTitle": "Brak danych geograficznych",
"model.noGeoDescription": "Żadne wiersze geograficzne OpenCode Go nie pasowały do tego modelu.",
"model.noGeoDescription": "Żadne wiersze geograficzne OpenCode nie pasowały do tego modelu.",
"model.worldMap": "Mapa świata użycia tokenów modelu według kraju",
"model.peersDescription": "Pobliskie modele według ostatniego wolumenu tokenów OpenCode Go.",
"model.peersDescription": "Pobliskie modele według ostatniego wolumenu tokenów OpenCode.",
"model.noPeersTitle": "Brak podobnych modeli",
"model.noPeersDescription": "Rankingi podobnych modeli pojawią się po nadejściu użycia.",
"model.noUsageLastWeek": "Brak użycia w zeszłym tygodniu",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Рейтинги использования ИИ-моделей | OpenCode Data",
"app.description":
"Изучайте использование OpenCode Go по ИИ-моделям: объем токенов, рейтинги, долю рынка, цены токенов, стоимость сеанса, долю кэша и географические разрезы.",
"Изучайте использование OpenCode по ИИ-моделям: объем токенов, рейтинги, долю рынка, цены токенов, стоимость сеанса, долю кэша и географические разрезы.",
"app.unfurlAlt": "Словесный знак OpenCode Data на темном узорном фоне",
"nav.dataHome": "Главная данных",
"nav.topModels": "Лучшие модели",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Загрузка данных",
"home.loadingDescription": "Читаем агрегаты моделей.",
"home.usageTitle": "Использование",
"home.topModelsDescription": "Использование моделей в OpenCode Go.",
"home.topModelsDescription": "Использование моделей в OpenCode.",
"home.noUsageTitle": "Нет данных использования",
"home.noUsageDescription": "Нет строк моделей для этого продукта и диапазона.",
"home.noLeaderboardTitle": "Нет данных рейтинга",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "пользователи модели",
"home.new": "Новая",
"home.uniqueUsersTitle": "Уникальные пользователи",
"home.uniqueUsersDescription": "Ежедневные уникальные пользователи OpenCode Go по моделям.",
"home.uniqueUsersDescription": "Ежедневные уникальные пользователи OpenCode по моделям.",
"home.noUserDataTitle": "Нет данных пользователей",
"home.noUserDataDescription": "Нет строк моделей с пользователями для этого окна.",
"home.uniqueUsersChart": "Составной график уникальных пользователей по моделям",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Стоимость/сеанс",
"lab.title": "Использование и рейтинги ИИ-моделей {{lab}} | OpenCode Data",
"lab.description":
"Сравните модели {{lab}}, используемые в OpenCode Go: использование токенов, рейтинги моделей, контекстные окна, даты релизов, стоимость и данные конкретных моделей.",
"Сравните модели {{lab}}, используемые в OpenCode: использование токенов, рейтинги моделей, контекстные окна, даты релизов, стоимость и данные конкретных моделей.",
"lab.loadingTitle": "Лаборатория моделей",
"lab.loadingDescription": "Читаем доступность моделей и недавнее использование OpenCode.",
"lab.notFound": "Нет моделей, соответствующих этой лаборатории.",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "Доля",
"model.title": "Использование, стоимость и ранг {{model}} | OpenCode Data",
"model.description":
"Посмотрите данные использования {{model}} в OpenCode Go: объем токенов, недельный ранг, состав токенов, стоимость, долю кэша, сеансы, географические разрезы и похожие модели.",
"Посмотрите данные использования {{model}} в OpenCode: объем токенов, недельный ранг, состав токенов, стоимость, долю кэша, сеансы, географические разрезы и похожие модели.",
"model.loadingTitle": "Данные модели",
"model.loadingDescription": "Читаем агрегаты модели.",
"model.loadingProfile": "Читаем профиль модели.",
@@ -166,24 +166,24 @@ export const dict = {
"model.noMatched": "Нет фактов модели или строк использования для {{id}}.",
"model.fallback": "Модель",
"model.catalogFallback":
"Факты модели из общего индекса моделей. Использование OpenCode Go появится, когда у этой модели будет активность.",
"model.unranked": "Нет рейтинга по использованию OpenCode Go за прошлую неделю",
"model.ranked": "Ранг #{{rank}} по использованию OpenCode Go за прошлую неделю",
"Факты модели из общего индекса моделей. Использование OpenCode появится, когда у этой модели будет активность.",
"model.unranked": "Нет рейтинга по использованию OpenCode за прошлую неделю",
"model.ranked": "Ранг #{{rank}} по использованию OpenCode за прошлую неделю",
"model.observedVolume": "с {{share}} наблюдаемого объема 2M.",
"model.weights": "Веса модели: {{label}}",
"model.rank": "Ранг за 7 дн.",
"model.profile": "Профиль модели",
"model.listed": "В каталоге",
"model.noCurrentUsage": "Нет использования OpenCode Go в текущем окне данных.",
"model.noCurrentUsage": "Нет использования OpenCode в текущем окне данных.",
"model.facts": "Факты модели",
"model.context": "Контекст",
"model.output": "Вывод",
"model.knowledge": "Знания",
"model.release": "Релиз",
"model.inputs": "Входы",
"model.overviewDescription": "Недавние токены OpenCode Go, уникальные пользователи и рыночная позиция.",
"model.overviewDescription": "Недавние токены OpenCode, уникальные пользователи и рыночная позиция.",
"model.noSummaryTitle": "Нет сводки использования",
"model.noSummaryDescription": "У этой модели пока нет строк использования OpenCode Go.",
"model.noSummaryDescription": "У этой модели пока нет строк использования OpenCode.",
"model.tokens": "Токены",
"model.uniqueUsers": "Уникальные пользователи",
"model.lastTwoMonths": "последние два месяца",
@@ -193,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}} моделей",
"model.momentum": "Динамика",
"model.vsPreviousWindow": "к предыдущему окну",
"model.usageDescription": "Ежедневный объем токенов OpenCode Go за недавнее двухмесячное окно.",
"model.usageDescription": "Ежедневный объем токенов OpenCode за недавнее двухмесячное окно.",
"model.noUsageTitle": "Нет использования",
"model.noUsageDescription": "В текущем окне использование не появилось.",
"model.dailyTokenChart": "Ежедневный график использования токенов",
"model.usersDescription": "Ежедневные уникальные пользователи OpenCode Go за недавнее двухмесячное окно.",
"model.usersDescription": "Ежедневные уникальные пользователи OpenCode за недавнее двухмесячное окно.",
"model.noUsersTitle": "Нет данных пользователей",
"model.noUsersDescription": "В текущем окне нет строк с пользователями.",
"model.dailyUserChart": "Ежедневный график уникальных пользователей",
"model.efficiencyDescription": "Стоимость, поведение кэша и средняя форма сеанса OpenCode Go.",
"model.efficiencyDescription": "Стоимость, поведение кэша и средняя форма сеанса OpenCode.",
"model.noEfficiencyTitle": "Нет данных эффективности",
"model.noEfficiencyDescription": "Данные эффективности появятся после использования.",
"model.totalSpendLabel": "Total spend",
@@ -219,11 +219,11 @@ export const dict = {
"model.tokensSession": "Токены / сеанс",
"model.cacheRatio": "Доля кэша",
"model.inputTokens": "входные токены",
"model.geoDescription": "Токены модели OpenCode Go, использованные по странам.",
"model.geoDescription": "Токены модели OpenCode, использованные по странам.",
"model.noGeoTitle": "Нет геоданных",
"model.noGeoDescription": "Нет географических строк OpenCode Go для этой модели.",
"model.noGeoDescription": "Нет географических строк OpenCode для этой модели.",
"model.worldMap": "Карта мира использования токенов модели по странам",
"model.peersDescription": "Близкие модели по недавнему объему токенов OpenCode Go.",
"model.peersDescription": "Близкие модели по недавнему объему токенов OpenCode.",
"model.noPeersTitle": "Нет похожих моделей",
"model.noPeersDescription": "Рейтинги похожих моделей появятся после использования.",
"model.noUsageLastWeek": "Нет использования на прошлой неделе",
+17 -17
View File
@@ -3,7 +3,7 @@ import type { Key } from "../i18n"
export const dict = {
"app.title": "อันดับการใช้งานโมเดล AI | ข้อมูล OpenCode",
"app.description":
"สำรวจการใช้งาน OpenCode Go ในโมเดล AI ต่างๆ รวมถึงปริมาณ token อันดับ ส่วนแบ่งตลาด ราคา token ต้นทุนต่อเซสชัน อัตราแคช และข้อมูลแยกตามภูมิศาสตร์",
"สำรวจการใช้งาน OpenCode ในโมเดล AI ต่างๆ รวมถึงปริมาณ token อันดับ ส่วนแบ่งตลาด ราคา token ต้นทุนต่อเซสชัน อัตราแคช และข้อมูลแยกตามภูมิศาสตร์",
"app.unfurlAlt": "เวิร์ดมาร์ก OpenCode Data บนพื้นหลังลวดลายสีเข้ม",
"nav.dataHome": "หน้าหลักข้อมูล",
"nav.topModels": "โมเดลยอดนิยม",
@@ -87,7 +87,7 @@ export const dict = {
"home.loadingTitle": "กำลังโหลดข้อมูล",
"home.loadingDescription": "กำลังอ่านข้อมูลสรุปของโมเดล",
"home.usageTitle": "การใช้งาน",
"home.topModelsDescription": "การใช้งานโมเดลบน OpenCode Go",
"home.topModelsDescription": "การใช้งานโมเดลบน OpenCode",
"home.noUsageTitle": "ไม่มีข้อมูลการใช้งาน",
"home.noUsageDescription": "ไม่มีแถวโมเดลที่ตรงกับผลิตภัณฑ์และช่วงเวลานี้",
"home.noLeaderboardTitle": "ไม่มีข้อมูลลีดเดอร์บอร์ด",
@@ -99,7 +99,7 @@ export const dict = {
"home.modelUsers": "ผู้ใช้โมเดล",
"home.new": "ใหม่",
"home.uniqueUsersTitle": "ผู้ใช้ไม่ซ้ำ",
"home.uniqueUsersDescription": "ผู้ใช้ OpenCode Go ไม่ซ้ำรายวัน แยกตามโมเดล",
"home.uniqueUsersDescription": "ผู้ใช้ OpenCode ไม่ซ้ำรายวัน แยกตามโมเดล",
"home.noUserDataTitle": "ไม่มีข้อมูลผู้ใช้",
"home.noUserDataDescription": "ไม่มีแถวโมเดลที่มีข้อมูลผู้ใช้ตรงกับช่วงเวลานี้",
"home.uniqueUsersChart": "กราฟซ้อนผู้ใช้ไม่ซ้ำแยกตามโมเดล",
@@ -131,7 +131,7 @@ export const dict = {
"home.costSession": "ต้นทุน/เซสชัน",
"lab.title": "การใช้งานและอันดับโมเดล AI ของ {{lab}} | ข้อมูล OpenCode",
"lab.description":
"เปรียบเทียบโมเดล {{lab}} ที่ใช้ใน OpenCode Go รวมถึงการใช้ token อันดับโมเดล หน้าต่างบริบท วันที่ปล่อย ต้นทุน และข้อมูลเฉพาะโมเดล",
"เปรียบเทียบโมเดล {{lab}} ที่ใช้ใน OpenCode รวมถึงการใช้ token อันดับโมเดล หน้าต่างบริบท วันที่ปล่อย ต้นทุน และข้อมูลเฉพาะโมเดล",
"lab.loadingTitle": "แล็บโมเดล",
"lab.loadingDescription": "กำลังอ่านความพร้อมของโมเดลและการใช้งาน OpenCode ล่าสุด",
"lab.notFound": "ไม่มีโมเดลที่ตรงกับแล็บนี้",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "ส่วนแบ่ง",
"model.title": "การใช้งาน ต้นทุน และอันดับของ {{model}} | ข้อมูล OpenCode",
"model.description":
"ดูข้อมูลการใช้งาน OpenCode Go ของ {{model}} รวมถึงปริมาณ token อันดับรายสัปดาห์ ส่วนผสม token ต้นทุน อัตราแคช เซสชัน ข้อมูลแยกตามภูมิศาสตร์ และโมเดลใกล้เคียง",
"ดูข้อมูลการใช้งาน OpenCode ของ {{model}} รวมถึงปริมาณ token อันดับรายสัปดาห์ ส่วนผสม token ต้นทุน อัตราแคช เซสชัน ข้อมูลแยกตามภูมิศาสตร์ และโมเดลใกล้เคียง",
"model.loadingTitle": "ข้อมูลโมเดล",
"model.loadingDescription": "กำลังอ่านข้อมูลสรุปของโมเดล",
"model.loadingProfile": "กำลังอ่านโปรไฟล์โมเดล",
@@ -166,24 +166,24 @@ export const dict = {
"model.noMatched": "ไม่มีข้อเท็จจริงของโมเดลหรือแถวการใช้งานที่ตรงกับ {{id}}",
"model.fallback": "โมเดล",
"model.catalogFallback":
"ข้อเท็จจริงของโมเดลจากดัชนีโมเดลที่ใช้ร่วมกัน การใช้งาน OpenCode Go จะแสดงเมื่อโมเดลนี้มีกิจกรรม",
"model.unranked": "ไม่มีอันดับในการใช้งาน OpenCode Go ของสัปดาห์ที่แล้ว",
"model.ranked": "อันดับ #{{rank}} ในการใช้งาน OpenCode Go ของสัปดาห์ที่แล้ว",
"ข้อเท็จจริงของโมเดลจากดัชนีโมเดลที่ใช้ร่วมกัน การใช้งาน OpenCode จะแสดงเมื่อโมเดลนี้มีกิจกรรม",
"model.unranked": "ไม่มีอันดับในการใช้งาน OpenCode ของสัปดาห์ที่แล้ว",
"model.ranked": "อันดับ #{{rank}} ในการใช้งาน OpenCode ของสัปดาห์ที่แล้ว",
"model.observedVolume": "พร้อม {{share}} ของปริมาณ 2M ที่สังเกตได้",
"model.weights": "น้ำหนักโมเดล: {{label}}",
"model.rank": "อันดับ 7 วัน",
"model.profile": "โปรไฟล์โมเดล",
"model.listed": "อยู่ในรายการ",
"model.noCurrentUsage": "ไม่มีการใช้งาน OpenCode Go ในช่วงข้อมูลปัจจุบัน",
"model.noCurrentUsage": "ไม่มีการใช้งาน OpenCode ในช่วงข้อมูลปัจจุบัน",
"model.facts": "ข้อเท็จจริงของโมเดล",
"model.context": "บริบท",
"model.output": "เอาต์พุต",
"model.knowledge": "ความรู้",
"model.release": "รุ่น",
"model.inputs": "อินพุต",
"model.overviewDescription": "token ล่าสุดของ OpenCode Go ผู้ใช้ไม่ซ้ำ และตำแหน่งในตลาด",
"model.overviewDescription": "token ล่าสุดของ OpenCode ผู้ใช้ไม่ซ้ำ และตำแหน่งในตลาด",
"model.noSummaryTitle": "ไม่มีสรุปการใช้งาน",
"model.noSummaryDescription": "โมเดลนี้ยังไม่มีแถวการใช้งาน OpenCode Go",
"model.noSummaryDescription": "โมเดลนี้ยังไม่มีแถวการใช้งาน OpenCode",
"model.tokens": "Token",
"model.uniqueUsers": "ผู้ใช้ไม่ซ้ำ",
"model.lastTwoMonths": "สองเดือนล่าสุด",
@@ -193,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}} โมเดล",
"model.momentum": "โมเมนตัม",
"model.vsPreviousWindow": "เทียบกับช่วงก่อนหน้า",
"model.usageDescription": "ปริมาณ token รายวันของ OpenCode Go ในช่วงสองเดือนล่าสุด",
"model.usageDescription": "ปริมาณ token รายวันของ OpenCode ในช่วงสองเดือนล่าสุด",
"model.noUsageTitle": "ไม่มีการใช้งาน",
"model.noUsageDescription": "ไม่มีการใช้งานในช่วงปัจจุบัน",
"model.dailyTokenChart": "กราฟการใช้ token รายวัน",
"model.usersDescription": "ผู้ใช้ OpenCode Go ไม่ซ้ำรายวันในช่วงสองเดือนล่าสุด",
"model.usersDescription": "ผู้ใช้ OpenCode ไม่ซ้ำรายวันในช่วงสองเดือนล่าสุด",
"model.noUsersTitle": "ไม่มีข้อมูลผู้ใช้",
"model.noUsersDescription": "ไม่มีแถวที่มีข้อมูลผู้ใช้ในช่วงปัจจุบัน",
"model.dailyUserChart": "กราฟผู้ใช้ไม่ซ้ำรายวัน",
"model.efficiencyDescription": "ต้นทุน พฤติกรรมแคช และรูปแบบเซสชัน OpenCode Go โดยเฉลี่ย",
"model.efficiencyDescription": "ต้นทุน พฤติกรรมแคช และรูปแบบเซสชัน OpenCode โดยเฉลี่ย",
"model.noEfficiencyTitle": "ไม่มีข้อมูลประสิทธิภาพ",
"model.noEfficiencyDescription": "ข้อมูลประสิทธิภาพจะแสดงหลังจากมีการใช้งานเข้ามา",
"model.totalSpendLabel": "Total spend",
@@ -219,11 +219,11 @@ export const dict = {
"model.tokensSession": "Token / เซสชัน",
"model.cacheRatio": "อัตราแคช",
"model.inputTokens": "input token",
"model.geoDescription": "token ของโมเดล OpenCode Go ที่ใช้แยกตามประเทศ",
"model.geoDescription": "token ของโมเดล OpenCode ที่ใช้แยกตามประเทศ",
"model.noGeoTitle": "ไม่มีข้อมูลภูมิศาสตร์",
"model.noGeoDescription": "ไม่มีแถวภูมิศาสตร์ของ OpenCode Go ที่ตรงกับโมเดลนี้",
"model.noGeoDescription": "ไม่มีแถวภูมิศาสตร์ของ OpenCode ที่ตรงกับโมเดลนี้",
"model.worldMap": "แผนที่โลกของการใช้ token ของโมเดลแยกตามประเทศ",
"model.peersDescription": "โมเดลใกล้เคียงตามปริมาณ token ล่าสุดของ OpenCode Go",
"model.peersDescription": "โมเดลใกล้เคียงตามปริมาณ token ล่าสุดของ OpenCode",
"model.noPeersTitle": "ไม่มีโมเดลใกล้เคียง",
"model.noPeersDescription": "อันดับโมเดลใกล้เคียงจะแสดงหลังจากมีการใช้งานเข้ามา",
"model.noUsageLastWeek": "ไม่มีการใช้งานเมื่อสัปดาห์ที่แล้ว",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Yapay Zeka Model Kullanım Sıralamaları | OpenCode Data",
"app.description":
"OpenCode Go kullanımını yapay zeka modelleri genelinde keşfedin: token hacmi, sıralamalar, pazar payı, token fiyatlandırması, oturum maliyeti, önbellek oranı ve coğrafi dağılımlar.",
"OpenCode kullanımını yapay zeka modelleri genelinde keşfedin: token hacmi, sıralamalar, pazar payı, token fiyatlandırması, oturum maliyeti, önbellek oranı ve coğrafi dağılımlar.",
"app.unfurlAlt": "Koyu desenli arka plan üzerinde OpenCode Data logosu",
"nav.dataHome": "Veri Ana Sayfası",
"nav.topModels": "En İyi Modeller",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Veriler yükleniyor",
"home.loadingDescription": "Model toplamları okunuyor.",
"home.usageTitle": "Kullanım",
"home.topModelsDescription": "OpenCode Go genelinde model kullanımı.",
"home.topModelsDescription": "OpenCode genelinde model kullanımı.",
"home.noUsageTitle": "Kullanım verisi yok",
"home.noUsageDescription": "Bu ürün ve aralıkla eşleşen model satırı yok.",
"home.noLeaderboardTitle": "Sıralama verisi yok",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "model kullanıcıları",
"home.new": "Yeni",
"home.uniqueUsersTitle": "Benzersiz Kullanıcılar",
"home.uniqueUsersDescription": "Modele göre günlük benzersiz OpenCode Go kullanıcıları.",
"home.uniqueUsersDescription": "Modele göre günlük benzersiz OpenCode kullanıcıları.",
"home.noUserDataTitle": "Kullanıcı verisi yok",
"home.noUserDataDescription": "Bu pencereyle eşleşen kullanıcı içeren model satırı yok.",
"home.uniqueUsersChart": "Modele göre yığılmış benzersiz kullanıcı grafiği",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Maliyet/Oturum",
"lab.title": "{{lab}} Yapay Zeka Model Kullanımı ve Sıralamaları | OpenCode Data",
"lab.description":
"OpenCode Go'da kullanılan {{lab}} modellerini karşılaştırın: token kullanımı, model sıralamaları, bağlam pencereleri, yayın tarihleri, maliyetler ve modele özel veriler.",
"OpenCode'da kullanılan {{lab}} modellerini karşılaştırın: token kullanımı, model sıralamaları, bağlam pencereleri, yayın tarihleri, maliyetler ve modele özel veriler.",
"lab.loadingTitle": "Model Laboratuvarı",
"lab.loadingDescription": "Model kullanılabilirliği ve son OpenCode kullanımı okunuyor.",
"lab.notFound": "Bu laboratuvarla eşleşen model yok.",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "Pay",
"model.title": "{{model}} Kullanımı, Maliyeti ve Sırası | OpenCode Data",
"model.description":
"{{model}} için OpenCode Go kullanım verilerini görüntüleyin: token hacmi, haftalık sıra, token karışımı, maliyetler, önbellek oranı, oturumlar, coğrafi dağılımlar ve benzer modeller.",
"{{model}} için OpenCode kullanım verilerini görüntüleyin: token hacmi, haftalık sıra, token karışımı, maliyetler, önbellek oranı, oturumlar, coğrafi dağılımlar ve benzer modeller.",
"model.loadingTitle": "Model Verileri",
"model.loadingDescription": "Model toplamları okunuyor.",
"model.loadingProfile": "Model profili okunuyor.",
@@ -166,24 +166,24 @@ export const dict = {
"model.noMatched": "{{id}} ile eşleşen model bilgisi veya kullanım satırı yok.",
"model.fallback": "Model",
"model.catalogFallback":
"Paylaşılan model dizininden model bilgileri. Bu modelde etkinlik olduğunda OpenCode Go kullanımı görünür.",
"model.unranked": "Geçen haftaki OpenCode Go kullanımında sıralanmamış",
"model.ranked": "Geçen haftaki OpenCode Go kullanımında #{{rank}} sırada",
"Paylaşılan model dizininden model bilgileri. Bu modelde etkinlik olduğunda OpenCode kullanımı görünür.",
"model.unranked": "Geçen haftaki OpenCode kullanımında sıralanmamış",
"model.ranked": "Geçen haftaki OpenCode kullanımında #{{rank}} sırada",
"model.observedVolume": "gözlemlenen 2M hacmin {{share}} payıyla.",
"model.weights": "Model ağırlıkları: {{label}}",
"model.rank": "7G Sıra",
"model.profile": "Model Profili",
"model.listed": "Listelendi",
"model.noCurrentUsage": "Geçerli veri penceresinde OpenCode Go kullanımı yok.",
"model.noCurrentUsage": "Geçerli veri penceresinde OpenCode kullanımı yok.",
"model.facts": "Model bilgileri",
"model.context": "Bağlam",
"model.output": "Çıktı",
"model.knowledge": "Bilgi",
"model.release": "Yayın",
"model.inputs": "Girdiler",
"model.overviewDescription": "Son OpenCode Go tokenları, benzersiz kullanıcılar ve pazar konumu.",
"model.overviewDescription": "Son OpenCode tokenları, benzersiz kullanıcılar ve pazar konumu.",
"model.noSummaryTitle": "Kullanım özeti yok",
"model.noSummaryDescription": "Bu modelde henüz OpenCode Go kullanım satırı yok.",
"model.noSummaryDescription": "Bu modelde henüz OpenCode kullanım satırı yok.",
"model.tokens": "Tokenlar",
"model.uniqueUsers": "Benzersiz Kullanıcılar",
"model.lastTwoMonths": "son iki ay",
@@ -193,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}} model",
"model.momentum": "İvme",
"model.vsPreviousWindow": "önceki pencereye göre",
"model.usageDescription": "Son iki aylık pencerede günlük OpenCode Go token hacmi.",
"model.usageDescription": "Son iki aylık pencerede günlük OpenCode token hacmi.",
"model.noUsageTitle": "Kullanım yok",
"model.noUsageDescription": "Geçerli pencereye kullanım gelmedi.",
"model.dailyTokenChart": "Günlük token kullanım grafiği",
"model.usersDescription": "Son iki aylık pencerede günlük benzersiz OpenCode Go kullanıcıları.",
"model.usersDescription": "Son iki aylık pencerede günlük benzersiz OpenCode kullanıcıları.",
"model.noUsersTitle": "Kullanıcı verisi yok",
"model.noUsersDescription": "Geçerli pencereye kullanıcı içeren satır gelmedi.",
"model.dailyUserChart": "Günlük benzersiz kullanıcı grafiği",
"model.efficiencyDescription": "Maliyet, önbellek davranışı ve ortalama OpenCode Go oturum yapısı.",
"model.efficiencyDescription": "Maliyet, önbellek davranışı ve ortalama OpenCode oturum yapısı.",
"model.noEfficiencyTitle": "Verimlilik verisi yok",
"model.noEfficiencyDescription": "Verimlilik verileri kullanım geldikten sonra görünür.",
"model.totalSpendLabel": "Total spend",
@@ -219,11 +219,11 @@ export const dict = {
"model.tokensSession": "Token / Oturum",
"model.cacheRatio": "Önbellek Oranı",
"model.inputTokens": "giriş tokenları",
"model.geoDescription": "Ülkeye göre kullanılan OpenCode Go model tokenları.",
"model.geoDescription": "Ülkeye göre kullanılan OpenCode model tokenları.",
"model.noGeoTitle": "Coğrafi veri yok",
"model.noGeoDescription": "Bu modelle eşleşen OpenCode Go coğrafi satırı yok.",
"model.noGeoDescription": "Bu modelle eşleşen OpenCode coğrafi satırı yok.",
"model.worldMap": "Ülkeye göre model token kullanımının dünya haritası",
"model.peersDescription": "Son OpenCode Go token hacmine göre yakındaki modeller.",
"model.peersDescription": "Son OpenCode token hacmine göre yakındaki modeller.",
"model.noPeersTitle": "Benzer yok",
"model.noPeersDescription": "Benzer model sıralamaları kullanım geldikten sonra görünür.",
"model.noUsageLastWeek": "Geçen hafta kullanım yok",
+17 -17
View File
@@ -1,7 +1,7 @@
export const dict = {
"app.title": "Рейтинги використання моделей ШІ | OpenCode Data",
"app.description":
"Досліджуйте використання OpenCode Go серед моделей ШІ, зокрема обсяг токенів, рейтинги, частку ринку, ціни токенів, вартість сеансу, частку кешу та географічні розрізи.",
"Досліджуйте використання OpenCode серед моделей ШІ, зокрема обсяг токенів, рейтинги, частку ринку, ціни токенів, вартість сеансу, частку кешу та географічні розрізи.",
"app.unfurlAlt": "Словесний знак OpenCode Data на темному візерунковому тлі",
"nav.dataHome": "Головна даних",
"nav.topModels": "Найкращі моделі",
@@ -86,7 +86,7 @@ export const dict = {
"home.loadingTitle": "Завантаження даних",
"home.loadingDescription": "Читаємо агрегати моделей.",
"home.usageTitle": "Використання",
"home.topModelsDescription": "Використання моделей в OpenCode Go.",
"home.topModelsDescription": "Використання моделей в OpenCode.",
"home.noUsageTitle": "Немає даних використання",
"home.noUsageDescription": "Жодні рядки моделей не відповідали цьому продукту й діапазону.",
"home.noLeaderboardTitle": "Немає даних рейтингу",
@@ -98,7 +98,7 @@ export const dict = {
"home.modelUsers": "користувачі моделі",
"home.new": "Нова",
"home.uniqueUsersTitle": "Унікальні користувачі",
"home.uniqueUsersDescription": "Щоденні унікальні користувачі OpenCode Go за моделлю.",
"home.uniqueUsersDescription": "Щоденні унікальні користувачі OpenCode за моделлю.",
"home.noUserDataTitle": "Немає даних користувачів",
"home.noUserDataDescription": "Жодні рядки моделей із користувачами не відповідали цьому вікну.",
"home.uniqueUsersChart": "Складена діаграма унікальних користувачів за моделлю",
@@ -130,7 +130,7 @@ export const dict = {
"home.costSession": "Вартість/сеанс",
"lab.title": "Використання та рейтинги моделей ШІ {{lab}} | OpenCode Data",
"lab.description":
"Порівняйте моделі {{lab}}, які використовуються в OpenCode Go, зокрема використання токенів, рейтинги моделей, контекстні вікна, дати релізів, вартість і дані конкретних моделей.",
"Порівняйте моделі {{lab}}, які використовуються в OpenCode, зокрема використання токенів, рейтинги моделей, контекстні вікна, дати релізів, вартість і дані конкретних моделей.",
"lab.loadingTitle": "Лабораторія моделей",
"lab.loadingDescription": "Читаємо доступність моделей і нещодавнє використання OpenCode.",
"lab.notFound": "Жодна модель не відповідала цій лабораторії.",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "Частка",
"model.title": "Використання, вартість і ранг {{model}} | OpenCode Data",
"model.description":
"Перегляньте дані використання {{model}} в OpenCode Go, зокрема обсяг токенів, тижневий ранг, мікс токенів, вартість, частку кешу, сеанси, географічні розрізи та схожі моделі.",
"Перегляньте дані використання {{model}} в OpenCode, зокрема обсяг токенів, тижневий ранг, мікс токенів, вартість, частку кешу, сеанси, географічні розрізи та схожі моделі.",
"model.loadingTitle": "Дані моделі",
"model.loadingDescription": "Читаємо агрегати моделі.",
"model.loadingProfile": "Читаємо профіль моделі.",
@@ -166,24 +166,24 @@ export const dict = {
"model.noMatched": "Жодні факти моделі або рядки використання не відповідали {{id}}.",
"model.fallback": "Модель",
"model.catalogFallback":
"Факти моделі зі спільного індексу моделей. Використання OpenCode Go з'явиться, коли ця модель матиме активність.",
"model.unranked": "Без рейтингу у використанні OpenCode Go за минулий тиждень",
"model.ranked": "Ранг #{{rank}} у використанні OpenCode Go за минулий тиждень",
"Факти моделі зі спільного індексу моделей. Використання OpenCode з'явиться, коли ця модель матиме активність.",
"model.unranked": "Без рейтингу у використанні OpenCode за минулий тиждень",
"model.ranked": "Ранг #{{rank}} у використанні OpenCode за минулий тиждень",
"model.observedVolume": "з {{share}} спостережуваного обсягу 2M.",
"model.weights": "Ваги моделі: {{label}}",
"model.rank": "Ранг за 7 дн.",
"model.profile": "Профіль моделі",
"model.listed": "У каталозі",
"model.noCurrentUsage": "Немає використання OpenCode Go в поточному вікні даних.",
"model.noCurrentUsage": "Немає використання OpenCode в поточному вікні даних.",
"model.facts": "Факти моделі",
"model.context": "Контекст",
"model.output": "Вихід",
"model.knowledge": "Знання",
"model.release": "Реліз",
"model.inputs": "Входи",
"model.overviewDescription": "Нещодавні токени OpenCode Go, унікальні користувачі та ринкова позиція.",
"model.overviewDescription": "Нещодавні токени OpenCode, унікальні користувачі та ринкова позиція.",
"model.noSummaryTitle": "Немає підсумку використання",
"model.noSummaryDescription": "Ця модель ще не має рядків використання OpenCode Go.",
"model.noSummaryDescription": "Ця модель ще не має рядків використання OpenCode.",
"model.tokens": "Токени",
"model.uniqueUsers": "Унікальні користувачі",
"model.lastTwoMonths": "останні два місяці",
@@ -193,15 +193,15 @@ export const dict = {
"model.totalModels": "{{count}} моделей",
"model.momentum": "Динаміка",
"model.vsPreviousWindow": "до попереднього вікна",
"model.usageDescription": "Щоденний обсяг токенів OpenCode Go за нещодавнє двомісячне вікно.",
"model.usageDescription": "Щоденний обсяг токенів OpenCode за нещодавнє двомісячне вікно.",
"model.noUsageTitle": "Немає використання",
"model.noUsageDescription": "У поточному вікні використання не з'явилося.",
"model.dailyTokenChart": "Щоденна діаграма використання токенів",
"model.usersDescription": "Щоденні унікальні користувачі OpenCode Go за нещодавнє двомісячне вікно.",
"model.usersDescription": "Щоденні унікальні користувачі OpenCode за нещодавнє двомісячне вікно.",
"model.noUsersTitle": "Немає даних користувачів",
"model.noUsersDescription": "У поточному вікні немає рядків із користувачами.",
"model.dailyUserChart": "Щоденна діаграма унікальних користувачів",
"model.efficiencyDescription": "Вартість, поведінка кешу та середня форма сеансу OpenCode Go.",
"model.efficiencyDescription": "Вартість, поведінка кешу та середня форма сеансу OpenCode.",
"model.noEfficiencyTitle": "Немає даних ефективності",
"model.noEfficiencyDescription": "Дані ефективності з'являться після використання.",
"model.totalSpendLabel": "Total spend",
@@ -219,11 +219,11 @@ export const dict = {
"model.tokensSession": "Токени / сеанс",
"model.cacheRatio": "Частка кешу",
"model.inputTokens": "вхідні токени",
"model.geoDescription": "Токени моделі OpenCode Go, використані за країнами.",
"model.geoDescription": "Токени моделі OpenCode, використані за країнами.",
"model.noGeoTitle": "Немає геоданих",
"model.noGeoDescription": "Жодні географічні рядки OpenCode Go не відповідали цій моделі.",
"model.noGeoDescription": "Жодні географічні рядки OpenCode не відповідали цій моделі.",
"model.worldMap": "Карта світу використання токенів моделі за країнами",
"model.peersDescription": "Близькі моделі за нещодавнім обсягом токенів OpenCode Go.",
"model.peersDescription": "Близькі моделі за нещодавнім обсягом токенів OpenCode.",
"model.noPeersTitle": "Немає схожих моделей",
"model.noPeersDescription": "Рейтинги схожих моделей з'являться після використання.",
"model.noUsageLastWeek": "Немає використання минулого тижня",
+17 -17
View File
@@ -3,7 +3,7 @@ import type { Key } from "../i18n"
export const dict = {
"app.title": "AI 模型使用排名 | OpenCode 数据",
"app.description":
"探索 OpenCode Go 在各 AI 模型上的使用情况,包括 token 用量、排名、市场份额、token 价格、会话成本、缓存比例和地理分布。",
"探索 OpenCode 在各 AI 模型上的使用情况,包括 token 用量、排名、市场份额、token 价格、会话成本、缓存比例和地理分布。",
"app.unfurlAlt": "深色纹理背景上的 OpenCode Data 字标",
"nav.dataHome": "数据首页",
"nav.topModels": "热门模型",
@@ -87,7 +87,7 @@ export const dict = {
"home.loadingTitle": "正在加载数据",
"home.loadingDescription": "正在读取模型汇总。",
"home.usageTitle": "用量",
"home.topModelsDescription": "OpenCode Go 中各模型的使用情况。",
"home.topModelsDescription": "OpenCode 中各模型的使用情况。",
"home.noUsageTitle": "无使用数据",
"home.noUsageDescription": "没有符合该产品和时间范围的模型行。",
"home.noLeaderboardTitle": "无排行榜数据",
@@ -99,7 +99,7 @@ export const dict = {
"home.modelUsers": "模型用户",
"home.new": "新",
"home.uniqueUsersTitle": "独立用户",
"home.uniqueUsersDescription": "按模型显示的每日 OpenCode Go 独立用户。",
"home.uniqueUsersDescription": "按模型显示的每日 OpenCode 独立用户。",
"home.noUserDataTitle": "无用户数据",
"home.noUserDataDescription": "没有符合该窗口且包含用户的模型行。",
"home.uniqueUsersChart": "按模型显示的独立用户堆叠图",
@@ -131,7 +131,7 @@ export const dict = {
"home.costSession": "成本/会话",
"lab.title": "{{lab}} AI 模型使用量与排名 | OpenCode 数据",
"lab.description":
"比较在 OpenCode Go 中使用的 {{lab}} 模型,包括 token 用量、模型排名、上下文窗口、发布日期、成本和模型专属数据。",
"比较在 OpenCode 中使用的 {{lab}} 模型,包括 token 用量、模型排名、上下文窗口、发布日期、成本和模型专属数据。",
"lab.loadingTitle": "模型实验室",
"lab.loadingDescription": "正在读取模型可用性和近期 OpenCode 使用情况。",
"lab.notFound": "没有匹配此实验室的模型。",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "份额",
"model.title": "{{model}} 使用量、成本与排名 | OpenCode 数据",
"model.description":
"查看 {{model}} 的 OpenCode Go 使用数据,包括 token 用量、周排名、token 组合、成本、缓存比例、会话、地理分布和同类模型。",
"查看 {{model}} 的 OpenCode 使用数据,包括 token 用量、周排名、token 组合、成本、缓存比例、会话、地理分布和同类模型。",
"model.loadingTitle": "模型数据",
"model.loadingDescription": "正在读取模型汇总。",
"model.loadingProfile": "正在读取模型档案。",
@@ -165,24 +165,24 @@ export const dict = {
"model.noDataDescription": "请尝试从排行榜打开一个模型。",
"model.noMatched": "没有匹配 {{id}} 的模型事实或使用行。",
"model.fallback": "模型",
"model.catalogFallback": "来自共享模型索引的模型事实。此模型产生活动后会显示 OpenCode Go 使用量。",
"model.unranked": "未进入上周 OpenCode Go 使用量排名",
"model.ranked": "在上周 OpenCode Go 使用量中排名 #{{rank}}",
"model.catalogFallback": "来自共享模型索引的模型事实。此模型产生活动后会显示 OpenCode 使用量。",
"model.unranked": "未进入上周 OpenCode 使用量排名",
"model.ranked": "在上周 OpenCode 使用量中排名 #{{rank}}",
"model.observedVolume": "占观测到的 2M 用量的 {{share}}。",
"model.weights": "模型权重:{{label}}",
"model.rank": "7 日排名",
"model.profile": "模型档案",
"model.listed": "已列出",
"model.noCurrentUsage": "当前数据窗口中没有 OpenCode Go 使用量。",
"model.noCurrentUsage": "当前数据窗口中没有 OpenCode 使用量。",
"model.facts": "模型事实",
"model.context": "上下文",
"model.output": "输出",
"model.knowledge": "知识",
"model.release": "发布",
"model.inputs": "输入",
"model.overviewDescription": "近期 OpenCode Go token、独立用户和市场位置。",
"model.overviewDescription": "近期 OpenCode token、独立用户和市场位置。",
"model.noSummaryTitle": "无使用摘要",
"model.noSummaryDescription": "此模型尚无 OpenCode Go 使用行。",
"model.noSummaryDescription": "此模型尚无 OpenCode 使用行。",
"model.tokens": "Token",
"model.uniqueUsers": "独立用户",
"model.lastTwoMonths": "过去两个月",
@@ -192,15 +192,15 @@ export const dict = {
"model.totalModels": "{{count}} 个模型",
"model.momentum": "趋势",
"model.vsPreviousWindow": "相较上一窗口",
"model.usageDescription": "近期两个月窗口内的每日 OpenCode Go token 用量。",
"model.usageDescription": "近期两个月窗口内的每日 OpenCode token 用量。",
"model.noUsageTitle": "无使用量",
"model.noUsageDescription": "当前窗口中没有使用量。",
"model.dailyTokenChart": "每日 token 用量图",
"model.usersDescription": "近期两个月窗口内的每日 OpenCode Go 独立用户。",
"model.usersDescription": "近期两个月窗口内的每日 OpenCode 独立用户。",
"model.noUsersTitle": "无用户数据",
"model.noUsersDescription": "当前窗口中没有包含用户的行。",
"model.dailyUserChart": "每日独立用户图",
"model.efficiencyDescription": "成本、缓存行为和平均 OpenCode Go 会话形态。",
"model.efficiencyDescription": "成本、缓存行为和平均 OpenCode 会话形态。",
"model.noEfficiencyTitle": "无效率数据",
"model.noEfficiencyDescription": "使用量到达后会显示效率数据。",
"model.totalSpendLabel": "Total spend",
@@ -218,11 +218,11 @@ export const dict = {
"model.tokensSession": "Token / 会话",
"model.cacheRatio": "缓存比例",
"model.inputTokens": "输入 token",
"model.geoDescription": "按国家/地区统计的 OpenCode Go 模型 token 使用量。",
"model.geoDescription": "按国家/地区统计的 OpenCode 模型 token 使用量。",
"model.noGeoTitle": "无地理数据",
"model.noGeoDescription": "没有符合此模型的 OpenCode Go 地理行。",
"model.noGeoDescription": "没有符合此模型的 OpenCode 地理行。",
"model.worldMap": "按国家/地区显示模型 token 使用量的世界地图",
"model.peersDescription": "按近期 OpenCode Go token 用量排列的相近模型。",
"model.peersDescription": "按近期 OpenCode token 用量排列的相近模型。",
"model.noPeersTitle": "无同类模型",
"model.noPeersDescription": "使用量到达后会显示同类模型排名。",
"model.noUsageLastWeek": "上周无使用量",
+17 -17
View File
@@ -3,7 +3,7 @@ import type { Key } from "../i18n"
export const dict = {
"app.title": "AI 模型使用排名 | OpenCode 數據",
"app.description":
"探索 OpenCode Go 在各 AI 模型上的使用情況,包括 token 用量、排名、市場佔有率、token 價格、工作階段成本、快取比例和地理分布。",
"探索 OpenCode 在各 AI 模型上的使用情況,包括 token 用量、排名、市場佔有率、token 價格、工作階段成本、快取比例和地理分布。",
"app.unfurlAlt": "深色紋理背景上的 OpenCode Data 字標",
"nav.dataHome": "數據首頁",
"nav.topModels": "熱門模型",
@@ -87,7 +87,7 @@ export const dict = {
"home.loadingTitle": "正在載入數據",
"home.loadingDescription": "正在讀取模型彙總。",
"home.usageTitle": "用量",
"home.topModelsDescription": "OpenCode Go 中各模型的使用情況。",
"home.topModelsDescription": "OpenCode 中各模型的使用情況。",
"home.noUsageTitle": "無使用數據",
"home.noUsageDescription": "沒有符合該產品和時間範圍的模型列。",
"home.noLeaderboardTitle": "無排行榜數據",
@@ -99,7 +99,7 @@ export const dict = {
"home.modelUsers": "模型使用者",
"home.new": "新",
"home.uniqueUsersTitle": "不重複使用者",
"home.uniqueUsersDescription": "按模型顯示的每日 OpenCode Go 不重複使用者。",
"home.uniqueUsersDescription": "按模型顯示的每日 OpenCode 不重複使用者。",
"home.noUserDataTitle": "無使用者數據",
"home.noUserDataDescription": "沒有符合該視窗且包含使用者的模型列。",
"home.uniqueUsersChart": "按模型顯示的不重複使用者堆疊圖",
@@ -131,7 +131,7 @@ export const dict = {
"home.costSession": "成本/工作階段",
"lab.title": "{{lab}} AI 模型使用量與排名 | OpenCode 數據",
"lab.description":
"比較在 OpenCode Go 中使用的 {{lab}} 模型,包括 token 用量、模型排名、上下文視窗、發布日期、成本和模型專屬數據。",
"比較在 OpenCode 中使用的 {{lab}} 模型,包括 token 用量、模型排名、上下文視窗、發布日期、成本和模型專屬數據。",
"lab.loadingTitle": "模型實驗室",
"lab.loadingDescription": "正在讀取模型可用性和近期 OpenCode 使用情況。",
"lab.notFound": "沒有符合此實驗室的模型。",
@@ -157,7 +157,7 @@ export const dict = {
"lab.share": "佔比",
"model.title": "{{model}} 使用量、成本與排名 | OpenCode 數據",
"model.description":
"查看 {{model}} 的 OpenCode Go 使用數據,包括 token 用量、週排名、token 組合、成本、快取比例、工作階段、地理分布和同類模型。",
"查看 {{model}} 的 OpenCode 使用數據,包括 token 用量、週排名、token 組合、成本、快取比例、工作階段、地理分布和同類模型。",
"model.loadingTitle": "模型數據",
"model.loadingDescription": "正在讀取模型彙總。",
"model.loadingProfile": "正在讀取模型檔案。",
@@ -165,24 +165,24 @@ export const dict = {
"model.noDataDescription": "請嘗試從排行榜開啟一個模型。",
"model.noMatched": "沒有符合 {{id}} 的模型事實或使用列。",
"model.fallback": "模型",
"model.catalogFallback": "來自共享模型索引的模型事實。此模型產生活動後會顯示 OpenCode Go 使用量。",
"model.unranked": "未進入上週 OpenCode Go 使用量排名",
"model.ranked": "在上週 OpenCode Go 使用量中排名 #{{rank}}",
"model.catalogFallback": "來自共享模型索引的模型事實。此模型產生活動後會顯示 OpenCode 使用量。",
"model.unranked": "未進入上週 OpenCode 使用量排名",
"model.ranked": "在上週 OpenCode 使用量中排名 #{{rank}}",
"model.observedVolume": "佔觀測到的 2M 用量的 {{share}}。",
"model.weights": "模型權重:{{label}}",
"model.rank": "7 日排名",
"model.profile": "模型檔案",
"model.listed": "已列出",
"model.noCurrentUsage": "目前數據視窗中沒有 OpenCode Go 使用量。",
"model.noCurrentUsage": "目前數據視窗中沒有 OpenCode 使用量。",
"model.facts": "模型事實",
"model.context": "上下文",
"model.output": "輸出",
"model.knowledge": "知識",
"model.release": "發布",
"model.inputs": "輸入",
"model.overviewDescription": "近期 OpenCode Go token、不重複使用者和市場位置。",
"model.overviewDescription": "近期 OpenCode token、不重複使用者和市場位置。",
"model.noSummaryTitle": "無使用摘要",
"model.noSummaryDescription": "此模型尚無 OpenCode Go 使用列。",
"model.noSummaryDescription": "此模型尚無 OpenCode 使用列。",
"model.tokens": "Token",
"model.uniqueUsers": "不重複使用者",
"model.lastTwoMonths": "過去兩個月",
@@ -192,15 +192,15 @@ export const dict = {
"model.totalModels": "{{count}} 個模型",
"model.momentum": "趨勢",
"model.vsPreviousWindow": "相較上一視窗",
"model.usageDescription": "近期兩個月視窗內的每日 OpenCode Go token 用量。",
"model.usageDescription": "近期兩個月視窗內的每日 OpenCode token 用量。",
"model.noUsageTitle": "無使用量",
"model.noUsageDescription": "目前視窗中沒有使用量。",
"model.dailyTokenChart": "每日 token 用量圖",
"model.usersDescription": "近期兩個月視窗內的每日 OpenCode Go 不重複使用者。",
"model.usersDescription": "近期兩個月視窗內的每日 OpenCode 不重複使用者。",
"model.noUsersTitle": "無使用者數據",
"model.noUsersDescription": "目前視窗中沒有包含使用者的列。",
"model.dailyUserChart": "每日不重複使用者圖",
"model.efficiencyDescription": "成本、快取行為和平均 OpenCode Go 工作階段形態。",
"model.efficiencyDescription": "成本、快取行為和平均 OpenCode 工作階段形態。",
"model.noEfficiencyTitle": "無效率數據",
"model.noEfficiencyDescription": "使用量到達後會顯示效率數據。",
"model.totalSpendLabel": "Total spend",
@@ -218,11 +218,11 @@ export const dict = {
"model.tokensSession": "Token / 工作階段",
"model.cacheRatio": "快取比例",
"model.inputTokens": "輸入 token",
"model.geoDescription": "按國家/地區統計的 OpenCode Go 模型 token 使用量。",
"model.geoDescription": "按國家/地區統計的 OpenCode 模型 token 使用量。",
"model.noGeoTitle": "無地理數據",
"model.noGeoDescription": "沒有符合此模型的 OpenCode Go 地理列。",
"model.noGeoDescription": "沒有符合此模型的 OpenCode 地理列。",
"model.worldMap": "按國家/地區顯示模型 token 使用量的世界地圖",
"model.peersDescription": "按近期 OpenCode Go token 用量排列的相近模型。",
"model.peersDescription": "按近期 OpenCode token 用量排列的相近模型。",
"model.noPeersTitle": "無同類模型",
"model.noPeersDescription": "使用量到達後會顯示同類模型排名。",
"model.noUsageLastWeek": "上週無使用量",
@@ -350,7 +350,7 @@ function ModelHero(props: {
<ModelHeroSparkline data={data()} />
</span>
<span>across last week's</span>
<span data-slot="model-hero-pill">OpenCode Go</span>
<span data-slot="model-hero-pill">OpenCode</span>
<span>usage with</span>
<span data-slot="model-hero-pill">{formatPercent(data().tokenShare)}</span>
<span>of observed</span>
@@ -651,7 +651,7 @@ function LabModelTooltip(props: { state: LabModelTooltipState }) {
</span>
<strong>{props.state.model.name}</strong>
</div>
<p>{props.state.model.description ?? "Recent OpenCode Go usage, share, context, and output limits."}</p>
<p>{props.state.model.description ?? "Recent OpenCode usage, share, context, and output limits."}</p>
</div>
<div data-slot="tooltip-divider" />
<div data-slot="lab-model-tooltip-metrics">
+1
View File
@@ -2170,6 +2170,7 @@ body {
font: inherit;
font-size: 11px;
line-height: 1;
text-align: left;
cursor: pointer;
outline: none;
text-decoration: none;
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/stats-core",
"version": "1.18.18",
"version": "1.18.20",
"private": true,
"type": "module",
"license": "MIT",
+2 -1
View File
@@ -7,6 +7,7 @@ import { RETIRED_STAT_MODELS, RETIRED_STAT_PROVIDERS } from "./model-normalizati
import {
chunks,
collapseRows,
DATA_SITE_TIERS,
inserted,
isMissingUniqueUsersColumn,
omitUniqueUsers,
@@ -93,7 +94,7 @@ export class GeoStatRepo extends Context.Service<GeoStatRepo, GeoStatRepo.Servic
eq(geoStat.grain, "day"),
eq(geoStat.client, "all"),
eq(geoStat.source, "all"),
inArray(geoStat.tier, ["Go", "go"]),
inArray(geoStat.tier, DATA_SITE_TIERS),
scope,
),
)
+32 -68
View File
@@ -4,7 +4,8 @@ import { Resource } from "sst/resource"
import { DatabaseError } from "../database"
import type { GeoStatMetric } from "./geo"
import { ModelStatRepo, type ModelStatMetric } from "./model"
import type { ProviderStatMetric } from "./provider"
import { statProvider } from "./model-normalization"
import { DATA_SITE_TIERS, normalizeTier } from "./stat"
export type UsageProduct = "All Users" | "Zen" | "Go" | "Enterprise"
export type TokenProduct = "Zen" | "Go" | "Enterprise"
@@ -129,7 +130,9 @@ const TOKEN_SCALE = 1_000_000
const DOLLARS_PER_MICROCENT = 1 / 100_000_000
const METRIC_MODEL_LIMIT = 10
const TOP_MODEL_SEGMENT_LIMIT = 9
// Preserve the response shape while the public site presents Go and Free as one cohort.
const SITE_PRODUCT = "Go"
const SITE_TIER_PLACEHOLDERS = DATA_SITE_TIERS.map(() => "?").join(", ")
const LEADERBOARD_CHANGE_MIN_MULTIPLE = 10
const months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"] as const
@@ -137,10 +140,6 @@ type StatMetricRow = Omit<ModelStatMetric, "updatedAt"> & {
periodStart: number
updatedAt: number
}
type ProviderMetricRow = Omit<ProviderStatMetric, "updatedAt"> & {
periodStart: number
updatedAt: number
}
type GeoMetricRow = Omit<GeoStatMetric, "updatedAt"> & {
periodStart: number
updatedAt: number
@@ -168,12 +167,8 @@ type RawRow = Record<string, unknown>
export function getStatsHomeData(): Effect.Effect<StatsHomeData, StatsDataError> {
return Effect.tryPromise({
try: async () => {
const [modelRows, providerRows, geoRows] = await Promise.all([
listModelDaily(),
listProviderDaily(),
listGeoDaily(),
])
return buildStatsHomeData(modelRows, providerRows, geoRows)
const [modelRows, geoRows] = await Promise.all([listModelDaily(), listGeoDaily()])
return buildStatsHomeData(modelRows, geoRows)
},
catch: (cause) => new StatsDataError(cause),
})
@@ -212,10 +207,13 @@ export function getStatsLabData(provider: string): Effect.Effect<StatsLabData |
async function listModelDaily(): Promise<ModelStatMetric[]> {
return (
await queryRows(`select period_key, updated_at, tier, provider, model, sessions, unique_users, input_tokens,
await queryRows(
`select period_key, updated_at, tier, provider, model, sessions, unique_users, input_tokens,
output_tokens, reasoning_tokens, cache_read_tokens, total_tokens, input_cost_microcents, output_cost_microcents,
total_cost_microcents from model_stat where grain = 'day' and client = 'all' and source = 'all'
and tier in ('Go', 'go') order by period_key`)
and tier in (${SITE_TIER_PLACEHOLDERS}) order by period_key`,
DATA_SITE_TIERS,
)
).map((row) => ({
periodKey: stringValue(row.period_key),
updatedAt: dateValue(row.updated_at),
@@ -235,19 +233,6 @@ async function listModelDaily(): Promise<ModelStatMetric[]> {
}))
}
async function listProviderDaily(): Promise<ProviderStatMetric[]> {
return (
await queryRows(`select period_key, updated_at, tier, provider, total_tokens from provider_stat
where grain = 'day' and client = 'all' and source = 'all' and tier in ('Go', 'go') order by period_key`)
).map((row) => ({
periodKey: stringValue(row.period_key),
updatedAt: dateValue(row.updated_at),
tier: stringValue(row.tier),
provider: stringValue(row.provider),
totalTokens: numberValue(row.total_tokens),
}))
}
async function listGeoDaily(opts?: { provider?: string; model?: string }): Promise<GeoStatMetric[]> {
const scope =
opts?.model && opts.provider
@@ -259,8 +244,9 @@ async function listGeoDaily(opts?: { provider?: string; model?: string }): Promi
return (
await queryRows(
`select period_key, updated_at, tier, provider, model, country, continent, total_tokens from geo_stat
where grain = 'day' and client = 'all' and source = 'all' and tier in ('Go', 'go') ${scope} order by period_key`,
params,
where grain = 'day' and client = 'all' and source = 'all'
and tier in (${SITE_TIER_PLACEHOLDERS}) ${scope} order by period_key`,
[...DATA_SITE_TIERS, ...params],
)
).map((row) => ({
periodKey: stringValue(row.period_key),
@@ -323,15 +309,10 @@ export const getStatsModelComparisonData = (
{ provider: secondProvider, model: secondModel },
])
function buildStatsHomeData(
modelRows: ModelStatMetric[],
providerRows: ProviderStatMetric[],
geoRows: GeoStatMetric[],
): StatsHomeData {
function buildStatsHomeData(modelRows: ModelStatMetric[], geoRows: GeoStatMetric[]): StatsHomeData {
const normalized = modelRows.flatMap(normalizeStatRow)
const providers = providerRows.flatMap(normalizeProviderRow)
const geo = geoRows.flatMap(normalizeGeoRow)
const periods = [...normalized, ...providers, ...geo]
const periods = [...normalized, ...geo]
if (periods.length === 0) return emptyStatsHomeData()
const earliest = Math.min(...periods.map((row) => row.periodStart))
@@ -366,7 +347,7 @@ function buildStatsHomeData(
leaderboard: createUsageProductRecord((product) =>
createRangeRecord((range) => buildLeaderboard(normalized, product, getWindow("1W", earliest, latest))),
),
market: createRangeRecord((range) => buildMarketShare(providers, "Go", range, getWindow(range, earliest, latest))),
market: createRangeRecord((range) => buildMarketShare(normalized, "Go", range, getWindow(range, earliest, latest))),
tokenCost: createTokenProductRecord((product) =>
buildTokenCost(normalized, product, getWindow("1W", earliest, latest)),
),
@@ -591,15 +572,20 @@ function buildLeaderboard(rows: StatMetricRow[], product: UsageProduct, rankWind
}))
}
function buildMarketShare(rows: ProviderMetricRow[], product: UsageProduct, range: UsageRange, window: DateWindow) {
function buildMarketShare(rows: StatMetricRow[], product: UsageProduct, range: UsageRange, window: DateWindow) {
const providerOrder = aggregateByProvider(rowsForProduct(rows, product, window.start, window.end))
.filter((item) => item.provider !== "unknown")
.toSorted((a, b) => b.tokens - a.tokens || a.provider.localeCompare(b.provider))
.slice(0, 8)
.map((item) => item.provider)
return createBuckets(window, range).flatMap((bucket) => {
const total = aggregateByProvider(rowsForProduct(rows, product, bucket.start, bucket.end)).toSorted(
(a, b) => b.tokens - a.tokens,
)
const total = aggregateByProvider(rowsForProduct(rows, product, bucket.start, bucket.end))
const totalTokens = total.reduce((sum, item) => sum + item.tokens, 0)
if (totalTokens === 0) return []
const authors = total.slice(0, 8)
const byProvider = new Map(total.map((item) => [item.provider, item.tokens]))
const authors = providerOrder.map((provider) => ({ provider, tokens: byProvider.get(provider) ?? 0 }))
const knownTokens = authors.reduce((sum, item) => sum + item.tokens, 0)
const withOther = [...authors, { provider: "Other", tokens: Math.max(totalTokens - knownTokens, 0) }].filter(
(item) => item.tokens > 0,
@@ -735,6 +721,7 @@ function rowsForProduct<T extends { periodStart: number; tier: string }>(
end: number,
) {
const windowRows = rows.filter((row) => row.periodStart >= start && row.periodStart < end)
if (product === SITE_PRODUCT) return windowRows.filter((row) => row.tier === "Go" || row.tier === "Free")
if (product !== "All Users") return windowRows.filter((row) => row.tier === product)
const allRows = windowRows.filter((row) => row.tier === "all")
@@ -761,7 +748,7 @@ function aggregateByModelName(rows: StatMetricRow[]) {
)
}
function aggregateByProvider(rows: ProviderMetricRow[]) {
function aggregateByProvider(rows: { provider: string; totalTokens: number }[]) {
return Object.values(
rows.reduce<Record<string, { provider: string; tokens: number }>>((result, row) => {
result[row.provider] = {
@@ -905,27 +892,12 @@ function normalizeStatRow(row: ModelStatMetric): StatMetricRow[] {
periodStart,
updatedAt,
tier: normalizeTier(row.tier),
provider: row.provider || "unknown",
provider: statProvider(row.model, undefined, row.provider) || "unknown",
model: row.model || "unknown",
},
]
}
function normalizeProviderRow(row: ProviderStatMetric): ProviderMetricRow[] {
const periodStart = periodKeyTime(row.periodKey)
const updatedAt = dateTime(row.updatedAt)
if (!Number.isFinite(periodStart) || !Number.isFinite(updatedAt)) return []
return [
{
...row,
periodStart,
updatedAt,
tier: normalizeTier(row.tier),
provider: row.provider || "unknown",
},
]
}
function normalizeGeoRow(row: GeoStatMetric): GeoMetricRow[] {
const periodStart = periodKeyTime(row.periodKey)
const updatedAt = dateTime(row.updatedAt)
@@ -936,7 +908,7 @@ function normalizeGeoRow(row: GeoStatMetric): GeoMetricRow[] {
periodStart,
updatedAt,
tier: normalizeTier(row.tier),
provider: row.provider || "all",
provider: row.provider === "all" ? "all" : statProvider(row.model, undefined, row.provider) || "unknown",
model: row.model || "all",
country: row.country || "ZZ",
continent: row.continent || "",
@@ -944,15 +916,6 @@ function normalizeGeoRow(row: GeoStatMetric): GeoMetricRow[] {
]
}
function normalizeTier(value: string) {
const normalized = value.toLowerCase()
if (normalized === "paid" || normalized === "zen") return "Zen"
if (normalized === "go") return "Go"
if (normalized === "enterprise") return "Enterprise"
if (normalized === "all") return "all"
return value
}
function dateTime(value: Date | string) {
return (value instanceof Date ? value : new Date(value)).getTime()
}
@@ -984,6 +947,7 @@ function formatProvider(provider: string) {
deepseek: "DeepSeek",
google: "Google",
minimax: "MiniMax",
meta: "Meta",
moonshot: "Moonshot",
moonshotai: "Moonshot",
nvidia: "NVIDIA",
@@ -9,6 +9,7 @@ describe("inference stat normalization", () => {
expect(normalizeInferenceModel("mimo-v2.5-free")).toBe("mimo-v2.5")
expect(normalizeInferenceModel("nemotron-3-super-free")).toBe("nemotron-3-super")
expect(normalizeInferenceModel("mimo-v2.5-free:global")).toBe("mimo-v2.5")
expect(normalizeInferenceModel("hy3-preview:free")).toBe("hy3-preview")
})
test("maps normalized model ids to public authors", () => {
@@ -23,6 +24,7 @@ describe("inference stat normalization", () => {
expect(modelAuthor("kimi-k2.6")).toBe("moonshot")
expect(modelAuthor("mimo-v2-omni")).toBe("xiaomi")
expect(modelAuthor("minimax-m2.7")).toBe("minimax")
expect(modelAuthor("muse-spark-1.2-contributor")).toBe("meta")
expect(modelAuthor("nemotron-3-super-free")).toBe("nvidia")
expect(modelAuthor("qwen3.7-max")).toBe("qwen")
expect(modelAuthor("alpha-gpt-next")).toBeUndefined()
@@ -31,6 +33,7 @@ describe("inference stat normalization", () => {
test("uses provider.model to resolve opencode route providers", () => {
expect(statModel("big-pickle", "claude-sonnet-4-5")).toBe("claude-sonnet-4-5")
expect(statModel("big-pickle", "gpt-5-free")).toBe("gpt-5")
expect(statModel("big-pickle", "xiaomi/mimo-v2.5")).toBe("mimo-v2.5")
expect(statModel("big-pickle", "")).toBe("unknown")
expect(statProvider("big-pickle", "claude-sonnet-4-5", "opencode")).toBe("anthropic")
expect(statProvider("big-pickle", "gpt-5", "opencode")).toBe("openai")
@@ -38,6 +41,17 @@ describe("inference stat normalization", () => {
expect(statProvider("unknown", "", "custom-provider")).toBe("custom-provider")
})
test("merges renamed models under their current name", () => {
expect(statModel("x-preview-f", "")).toBe("ox-alpha")
expect(statModel("xiaomi/mimo-v2.5", "")).toBe("mimo-v2.5")
expect(toModelAggregate(aggregate("x-preview-f", "openai"))).toMatchObject([
{
provider: "openai",
model: "ox-alpha",
},
])
})
test("model aggregates prefer provider.model and use normalized model", () => {
expect(toModelAggregate(aggregate("alpha-gpt-next", "openai"))).toEqual([])
@@ -65,6 +79,9 @@ describe("inference stat normalization", () => {
{ provider: "openai" },
])
expect(toProviderAggregate(aggregate("big-pickle", "opencode"))).toMatchObject([{ provider: "unknown" }])
expect(toProviderAggregate(aggregate("muse-spark-1.2-contributor", "unknown"))).toMatchObject([
{ provider: "meta" },
])
})
test("geo aggregates never keep opencode or big-pickle dimensions", () => {
@@ -97,7 +114,13 @@ describe("inference stat normalization", () => {
expect(queries[6]).toContain("'2026-08-12' AS period_key")
expect(queries[0]).toContain('FROM "inference"."generation"')
expect(queries[0]).toContain("event_type = 'generation.completed'")
expect(queries[0]).toContain("product = 'go'")
expect(queries[0]).toContain("AND (product = 'go' OR (lower(COALESCE(model_tier, '')) = 'free'")
expect(queries[0]).toContain("COALESCE(NULLIF(lower(model_tier), ''), '') AS raw_tier")
expect(queries[0]).toContain("WHEN lower(COALESCE(raw_tier, '')) = 'free'")
expect(queries[0]).toContain("regexp_replace(NULLIF(route_model, ''), '^.*/', '')")
expect(queries[0]).toContain("OR lower(raw_model) IN ('gpt-5-nano', 'grok-code', 'big-pickle')")
expect(queries[0]).toContain("OR lower(raw_model) LIKE '%-free'")
expect(queries[0]).toContain("THEN 'Free'")
expect(queries[0]).toContain("LIMIT 10000")
expect(queries[0]).toContain("approx_distinct(session) AS sessions")
expect(queries[1]).toContain("'geo_model' ELSE 'geo'")
+22 -4
View File
@@ -4,7 +4,9 @@ import type { GeoStatAggregate } from "./geo"
import type { ModelStatAggregate } from "./model"
import {
EXCLUDED_MODELS,
FREE_MODELS,
MODEL_AUTHOR_RULES,
MODEL_NAME_ALIASES,
RETIRED_STAT_PROVIDERS,
statModel,
statProvider,
@@ -53,6 +55,7 @@ function buildStatsQuery(
const periodEndValue = sqlString(period.end.toISOString())
const ingestEndValue = sqlString(new Date(period.end.getTime() + DAY_MS).toISOString())
const sourceTable = [source.namespace, source.table].map(sqlIdentifier).join(".")
const sourceFreeTier = freeTierSql("model_tier", "model_requested")
const dimensions =
family === "usage"
? `CASE WHEN grouping(model) = 0 THEN 'model' ELSE 'provider' END AS dimension,
@@ -107,6 +110,7 @@ function buildStatsQuery(
WITH normalized AS (
SELECT
model_requested AS raw_model,
COALESCE(NULLIF(lower(model_tier), ''), '') AS raw_tier,
${statModelSql("model_requested", "route_model")} AS model,
COALESCE(NULLIF(route_model, ''), '') AS provider_model,
COALESCE(NULLIF(provider_id, ''), '') AS raw_provider,
@@ -138,7 +142,7 @@ WITH normalized AS (
(source = 'inference-legacy' AND started_at < ${sqlString(LIVE_SOURCE_START)})
OR (source = 'inference' AND started_at >= ${sqlString(LIVE_SOURCE_START)})
)
AND product = 'go'
AND (product = 'go' OR (${sourceFreeTier}))
AND model_requested IS NOT NULL
AND model_requested <> ''
AND __ingest_ts >= ${periodStartValue}
@@ -147,7 +151,11 @@ WITH normalized AS (
AND started_at < ${periodEndValue}
), filtered AS (
SELECT
'Go' AS tier,
CASE
WHEN ${freeTierSql("raw_tier", "raw_model")}
THEN 'Free'
ELSE 'Go'
END AS tier,
${statProviderSql("model", "provider_model", "raw_provider")} AS provider,
provider_model,
model,
@@ -294,9 +302,19 @@ function statPeriods(grain: "day" | "week", periodStart: Date, periodEnd: Date)
function statModelSql(model: string, providerModel: string) {
return `COALESCE(NULLIF(regexp_replace(CASE
WHEN lower(${model}) = 'big-pickle' THEN NULLIF(${providerModel}, '')
WHEN lower(${model}) = 'big-pickle' THEN regexp_replace(NULLIF(${providerModel}, ''), '^.*/', '')
${Object.entries(MODEL_NAME_ALIASES)
.map(([from, to]) => ` WHEN lower(${model}) = ${sqlString(from)} THEN ${sqlString(to)}`)
.join("\n")}
ELSE ${model}
END, '(-free|:global)+$', ''), ''), 'unknown')`
END, '(-free|:free|:global)+$', ''), ''), 'unknown')`
}
function freeTierSql(tier: string, model: string) {
return `lower(COALESCE(${tier}, '')) = 'free'
OR lower(${model}) IN (${[...FREE_MODELS].map(sqlString).join(", ")})
OR lower(${model}) LIKE '%-free'
OR lower(${model}) LIKE '%-free:global'`
}
function statProviderSql(model: string, providerModel: string, provider: string) {
@@ -9,15 +9,21 @@ export const MODEL_AUTHOR_RULES = [
{ match: "kimi", author: "moonshot" },
{ match: "mimo", author: "xiaomi" },
{ match: "minimax", author: "minimax" },
{ match: "muse-spark", author: "meta" },
{ match: "nemotron", author: "nvidia" },
{ match: "qwen", author: "qwen" },
] as const
export const EXCLUDED_MODELS = new Set(["alpha-gpt-next"])
export const RETIRED_STAT_MODELS = ["big-pickle"]
export const FREE_MODELS = new Set(["gpt-5-nano", "grok-code", "big-pickle"])
export const MODEL_NAME_ALIASES: Record<string, string> = {
"x-preview-f": "ox-alpha",
"xiaomi/mimo-v2.5": "mimo-v2.5",
}
export const RETIRED_STAT_MODELS = ["big-pickle", ...Object.keys(MODEL_NAME_ALIASES)]
export const RETIRED_STAT_PROVIDERS = ["opencode"]
export function normalizeInferenceModel(value: string | undefined) {
return (value || "unknown").replace(/(-free|:global)+$/, "") || "unknown"
return (value || "unknown").replace(/(-free|:free|:global)+$/, "") || "unknown"
}
export function modelAuthor(value: string | undefined) {
@@ -29,7 +35,10 @@ export function modelAuthor(value: string | undefined) {
export function statModel(model: string | undefined, providerModel: string | undefined) {
const normalized = normalizeInferenceModel(model)
if (RETIRED_STAT_MODELS.includes(normalized.toLowerCase())) return normalizeInferenceModel(providerModel)
const alias = MODEL_NAME_ALIASES[normalized.toLowerCase()]
if (alias) return alias
if (RETIRED_STAT_MODELS.includes(normalized.toLowerCase()))
return normalizeInferenceModel(providerModel?.split("/").at(-1))
return normalized
}
+2 -1
View File
@@ -7,6 +7,7 @@ import { RETIRED_STAT_MODELS, RETIRED_STAT_PROVIDERS } from "./model-normalizati
import {
chunks,
collapseRows,
DATA_SITE_TIERS,
inserted,
isMissingUniqueUsersColumn,
omitUniqueUsers,
@@ -211,7 +212,7 @@ function modelDailyScope() {
eq(modelStat.grain, "day"),
eq(modelStat.client, "all"),
eq(modelStat.source, "all"),
inArray(modelStat.tier, ["Go", "go"]),
inArray(modelStat.tier, DATA_SITE_TIERS),
)
}

Some files were not shown because too many files have changed in this diff Show More