mirror of
https://github.com/anomalyco/opencode.git
synced 2026-08-27 16:51:59 +00:00
Merge branch 'dev' of github.com:anomalyco/opencode into dev
This commit is contained in:
commit
13c27598d3
88 changed files with 1136 additions and 748 deletions
56
bun.lock
56
bun.lock
|
|
@ -29,7 +29,7 @@
|
|||
},
|
||||
"packages/app": {
|
||||
"name": "@opencode-ai/app",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@corvu/drawer": "catalog:",
|
||||
"@dnd-kit/abstract": "0.5.0",
|
||||
|
|
@ -96,7 +96,7 @@
|
|||
},
|
||||
"packages/cli": {
|
||||
"name": "@opencode-ai/cli",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"bin": {
|
||||
"lildax": "./bin/lildax.cjs",
|
||||
},
|
||||
|
|
@ -144,7 +144,7 @@
|
|||
},
|
||||
"packages/codemode": {
|
||||
"name": "@opencode-ai/codemode",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"acorn": "8.15.0",
|
||||
"effect": "catalog:",
|
||||
|
|
@ -158,7 +158,7 @@
|
|||
},
|
||||
"packages/console/app": {
|
||||
"name": "@opencode-ai/console-app",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"bin": {
|
||||
"opencode": "./bin/opencode",
|
||||
},
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
},
|
||||
"packages/desktop": {
|
||||
"name": "@opencode-ai/desktop",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"drizzle-orm": "catalog:",
|
||||
"effect": "catalog:",
|
||||
|
|
@ -449,7 +449,7 @@
|
|||
},
|
||||
"packages/effect-sqlite-node": {
|
||||
"name": "@opencode-ai/effect-sqlite-node",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"effect": "catalog:",
|
||||
},
|
||||
|
|
@ -461,7 +461,7 @@
|
|||
},
|
||||
"packages/enterprise": {
|
||||
"name": "@opencode-ai/enterprise",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@hono/standard-validator": "catalog:",
|
||||
"@opencode-ai/core": "workspace:*",
|
||||
|
|
@ -493,7 +493,7 @@
|
|||
},
|
||||
"packages/function": {
|
||||
"name": "@opencode-ai/function",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@opencode-ai/schema": "workspace:*",
|
||||
"@smithy/eventstream-codec": "4.2.14",
|
||||
|
|
@ -559,7 +559,7 @@
|
|||
},
|
||||
"packages/opencode": {
|
||||
"name": "opencode",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"bin": {
|
||||
"opencode": "./bin/opencode",
|
||||
},
|
||||
|
|
@ -690,7 +690,7 @@
|
|||
},
|
||||
"packages/plugin": {
|
||||
"name": "@opencode-ai/plugin",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"cross-spawn": "catalog:",
|
||||
},
|
||||
|
|
@ -781,7 +781,7 @@
|
|||
},
|
||||
"packages/server": {
|
||||
"name": "@opencode-ai/server",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@opencode-ai/core": "workspace:*",
|
||||
"@opencode-ai/protocol": "workspace:*",
|
||||
|
|
@ -796,7 +796,7 @@
|
|||
},
|
||||
"packages/session-ui": {
|
||||
"name": "@opencode-ai/session-ui",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@ibm/plex": "6.4.1",
|
||||
"@kobalte/core": "catalog:",
|
||||
|
|
@ -883,7 +883,7 @@
|
|||
},
|
||||
"packages/stats/core": {
|
||||
"name": "@opencode-ai/stats-core",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"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.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@opencode-ai/core": "workspace:*",
|
||||
"@opencode-ai/plugin": "workspace:*",
|
||||
|
|
@ -971,7 +971,7 @@
|
|||
},
|
||||
"packages/ui": {
|
||||
"name": "@opencode-ai/ui",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@kobalte/core": "catalog:",
|
||||
"@pierre/diffs": "catalog:",
|
||||
|
|
@ -1022,7 +1022,7 @@
|
|||
},
|
||||
"packages/web": {
|
||||
"name": "@opencode-ai/web",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@astrojs/cloudflare": "12.6.3",
|
||||
"@astrojs/markdown-remark": "6.3.1",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/app",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"description": "",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import { describe, expect, test } from "bun:test"
|
||||
import type { SessionV2Info } from "@opencode-ai/sdk/v2/client"
|
||||
import { QueryClient } from "@tanstack/solid-query"
|
||||
import type { Session, SessionV2Info } from "@opencode-ai/sdk/v2/client"
|
||||
import {
|
||||
applyHomeSessionEvent,
|
||||
appendHomeSessionEvent,
|
||||
createHomeSessionIndexCache,
|
||||
HOME_V2_SESSION_PAGE_LIMIT,
|
||||
loadHomeSessionIndex,
|
||||
homeSessionIndexSessions,
|
||||
|
|
@ -151,4 +153,33 @@ describe("Home V2 session index", () => {
|
|||
expect(homeSessionIndexRefresh("global.disposed", true).refetch).toBe(true)
|
||||
expect(homeSessionIndexRefresh("session.next.moved", true).refetch).toBe(true)
|
||||
})
|
||||
|
||||
test("removes a session from the loaded Home index", () => {
|
||||
const queryClient = new QueryClient()
|
||||
const cache = createHomeSessionIndexCache(queryClient, "server")
|
||||
const sessions = [
|
||||
{ id: "a", time: { created: 1, updated: 1 } },
|
||||
{ id: "b", time: { created: 1, updated: 1 } },
|
||||
] as Session[]
|
||||
queryClient.setQueryData(cache.indexKey, { sessions, eventSequence: 0 })
|
||||
|
||||
cache.remove("a")
|
||||
|
||||
const index = queryClient.getQueryData<{ sessions: Session[] }>(cache.indexKey)
|
||||
expect(index?.sessions.map((item) => item.id)).toEqual(["b"])
|
||||
})
|
||||
|
||||
test("keeps the session out of the Home list when the index is not mounted", () => {
|
||||
const queryClient = new QueryClient()
|
||||
const cache = createHomeSessionIndexCache(queryClient, "server")
|
||||
const sessions = [
|
||||
{ id: "a", time: { created: 1, updated: 1 } },
|
||||
{ id: "b", time: { created: 1, updated: 1 } },
|
||||
] as Session[]
|
||||
|
||||
cache.remove("a")
|
||||
|
||||
expect(queryClient.getQueryData(cache.indexKey)).toBeUndefined()
|
||||
expect(cache.sessions({ sessions, eventSequence: 0 }, undefined).map((item) => item.id)).toEqual(["b"])
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -85,6 +85,7 @@ export function createHomeSessionIndexCache(queryClient: QueryClient, server: st
|
|||
const indexKey = homeSessionIndexKey(server)
|
||||
const eventsKey = homeSessionEventsKey(server)
|
||||
let connected = false
|
||||
const removed = new Set<string>()
|
||||
|
||||
return {
|
||||
indexKey,
|
||||
|
|
@ -97,7 +98,8 @@ export function createHomeSessionIndexCache(queryClient: QueryClient, server: st
|
|||
queryClient.setQueryData<HomeSessionEvents>(eventsKey, (current) => trimHomeSessionEvents(current, sequence))
|
||||
},
|
||||
sessions(index: HomeSessionIndex | undefined, events: HomeSessionEvents | undefined) {
|
||||
return homeSessionIndexSessions(index, events)
|
||||
const sessions = homeSessionIndexSessions(index, events)
|
||||
return removed.size === 0 ? sessions : sessions.filter((session) => !removed.has(session.id))
|
||||
},
|
||||
apply(event: HomeSessionEvent) {
|
||||
if (!queryClient.getQueryState(indexKey)) return
|
||||
|
|
@ -116,6 +118,16 @@ export function createHomeSessionIndexCache(queryClient: QueryClient, server: st
|
|||
}
|
||||
queryClient.setQueryData<HomeSessionEvents>(eventsKey, { sequence: next.sequence, entries: [] })
|
||||
},
|
||||
remove(sessionID: string) {
|
||||
removed.add(sessionID)
|
||||
if (!queryClient.getQueryState(indexKey)) return
|
||||
queryClient.setQueryData<HomeSessionIndex>(indexKey, (index) => {
|
||||
if (!index) return index
|
||||
const at = index.sessions.findIndex((session) => session.id === sessionID)
|
||||
if (at === -1) return index
|
||||
return { ...index, sessions: index.sessions.toSpliced(at, 1) }
|
||||
})
|
||||
},
|
||||
refresh(event: Event["type"]) {
|
||||
const result = homeSessionIndexRefresh(event, connected)
|
||||
connected = result.connected
|
||||
|
|
|
|||
|
|
@ -219,13 +219,15 @@ export function createHomeSessionsController(home: HomeController) {
|
|||
directory: session.directory,
|
||||
time: { archived: Date.now() },
|
||||
}),
|
||||
remove: () =>
|
||||
remove: () => {
|
||||
setStore(
|
||||
produce((draft) => {
|
||||
const match = Binary.search(draft.session, session.id, (item) => item.id)
|
||||
if (match.found) draft.session.splice(match.index, 1)
|
||||
}),
|
||||
),
|
||||
)
|
||||
homeSessions().remove(session.id)
|
||||
},
|
||||
onError: (cause) =>
|
||||
showToast({
|
||||
title: language.t("common.requestFailed"),
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import { produce } from "solid-js/store"
|
|||
import { notifySessionTabsRemoved } from "@/components/titlebar-session-events"
|
||||
import { useLanguage } from "@/context/language"
|
||||
import { useSDK } from "@/context/sdk"
|
||||
import { useServerSync } from "@/context/server-sync"
|
||||
import { useSync } from "@/context/sync"
|
||||
import { useTabs } from "@/context/tabs"
|
||||
import { errorMessage } from "@/pages/layout/helpers"
|
||||
|
|
@ -15,6 +16,7 @@ export function useSessionArchive() {
|
|||
const navigate = useNavigate()
|
||||
const sdk = useSDK()
|
||||
const sync = useSync()
|
||||
const serverSync = useServerSync()
|
||||
const tabs = useTabs()
|
||||
const { params } = useSessionKey()
|
||||
|
||||
|
|
@ -56,6 +58,7 @@ export function useSessionArchive() {
|
|||
}),
|
||||
)
|
||||
sync().session.evict(sessionID)
|
||||
serverSync().homeSessions.remove(sessionID)
|
||||
navigateAfterRemoval(sessionID, session.parentID, nextSession?.id)
|
||||
notifySessionTabsRemoved({ directory: sdk().directory, sessionIDs: [sessionID] })
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/cli",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/codemode",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"description": "Effect-native confined code execution over schema-described tools",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/console-app",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -661,10 +661,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "بضع ثوان",
|
||||
"workspace.lite.subscription.message": "أنت مشترك في OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "إدارة الاشتراك",
|
||||
"workspace.lite.subscription.rollingUsage": "الاستخدام المتجدد",
|
||||
"workspace.lite.subscription.rollingUsage": "الاستخدام خلال 5 ساعات",
|
||||
"workspace.lite.subscription.rollingQuota": "الحصة خلال 5 ساعات",
|
||||
"workspace.lite.subscription.weeklyUsage": "الاستخدام الأسبوعي",
|
||||
"workspace.lite.subscription.weeklyQuota": "الحصة الأسبوعية",
|
||||
"workspace.lite.subscription.monthlyUsage": "الاستخدام الشهري",
|
||||
"workspace.lite.subscription.monthlyQuota": "الحصة الشهرية",
|
||||
"workspace.lite.subscription.resetsIn": "إعادة تعيين في",
|
||||
"workspace.lite.subscription.showDetails": "إظهار التفاصيل",
|
||||
"workspace.lite.subscription.hideDetails": "إخفاء التفاصيل",
|
||||
"workspace.lite.subscription.model": "النموذج",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "الإجمالي",
|
||||
"workspace.lite.subscription.useBalance": "استخدم رصيدك المتوفر بعد الوصول إلى حدود الاستخدام",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'اختر "OpenCode Go" كمزود في إعدادات opencode الخاصة بك لاستخدام نماذج Go.',
|
||||
|
|
|
|||
|
|
@ -673,10 +673,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "alguns segundos",
|
||||
"workspace.lite.subscription.message": "Você assina o OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Gerenciar Assinatura",
|
||||
"workspace.lite.subscription.rollingUsage": "Uso Contínuo",
|
||||
"workspace.lite.subscription.rollingUsage": "Uso de 5 horas",
|
||||
"workspace.lite.subscription.rollingQuota": "Cota de 5 horas",
|
||||
"workspace.lite.subscription.weeklyUsage": "Uso Semanal",
|
||||
"workspace.lite.subscription.weeklyQuota": "Cota Semanal",
|
||||
"workspace.lite.subscription.monthlyUsage": "Uso Mensal",
|
||||
"workspace.lite.subscription.monthlyQuota": "Cota Mensal",
|
||||
"workspace.lite.subscription.resetsIn": "Reinicia em",
|
||||
"workspace.lite.subscription.showDetails": "Mostrar detalhes",
|
||||
"workspace.lite.subscription.hideDetails": "Ocultar detalhes",
|
||||
"workspace.lite.subscription.model": "Modelo",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Total",
|
||||
"workspace.lite.subscription.useBalance": "Use seu saldo disponível após atingir os limites de uso",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Selecione "OpenCode Go" como provedor na sua configuração do opencode para usar os modelos Go.',
|
||||
|
|
|
|||
|
|
@ -669,10 +669,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "et par sekunder",
|
||||
"workspace.lite.subscription.message": "Du abonnerer på OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Administrer abonnement",
|
||||
"workspace.lite.subscription.rollingUsage": "Løbende forbrug",
|
||||
"workspace.lite.subscription.rollingUsage": "5-timers forbrug",
|
||||
"workspace.lite.subscription.rollingQuota": "5-timers kvote",
|
||||
"workspace.lite.subscription.weeklyUsage": "Ugentligt forbrug",
|
||||
"workspace.lite.subscription.weeklyQuota": "Ugentlig kvote",
|
||||
"workspace.lite.subscription.monthlyUsage": "Månedligt forbrug",
|
||||
"workspace.lite.subscription.monthlyQuota": "Månedlig kvote",
|
||||
"workspace.lite.subscription.resetsIn": "Nulstiller i",
|
||||
"workspace.lite.subscription.showDetails": "Vis detaljer",
|
||||
"workspace.lite.subscription.hideDetails": "Skjul detaljer",
|
||||
"workspace.lite.subscription.model": "Model",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "I alt",
|
||||
"workspace.lite.subscription.useBalance": "Brug din tilgængelige saldo, når du har nået forbrugsgrænserne",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Vælg "OpenCode Go" som udbyder i din opencode-konfiguration for at bruge Go-modeller.',
|
||||
|
|
|
|||
|
|
@ -671,10 +671,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "einige Sekunden",
|
||||
"workspace.lite.subscription.message": "Du hast OpenCode Go abonniert.",
|
||||
"workspace.lite.subscription.manage": "Abo verwalten",
|
||||
"workspace.lite.subscription.rollingUsage": "Fortlaufende Nutzung",
|
||||
"workspace.lite.subscription.rollingUsage": "5-Stunden-Nutzung",
|
||||
"workspace.lite.subscription.rollingQuota": "5-Stunden-Kontingent",
|
||||
"workspace.lite.subscription.weeklyUsage": "Wöchentliche Nutzung",
|
||||
"workspace.lite.subscription.weeklyQuota": "Wöchentliches Kontingent",
|
||||
"workspace.lite.subscription.monthlyUsage": "Monatliche Nutzung",
|
||||
"workspace.lite.subscription.monthlyQuota": "Monatliches Kontingent",
|
||||
"workspace.lite.subscription.resetsIn": "Setzt zurück in",
|
||||
"workspace.lite.subscription.showDetails": "Details anzeigen",
|
||||
"workspace.lite.subscription.hideDetails": "Details ausblenden",
|
||||
"workspace.lite.subscription.model": "Modell",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Gesamt",
|
||||
"workspace.lite.subscription.useBalance": "Nutze dein verfügbares Guthaben, nachdem die Nutzungslimits erreicht sind",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Wähle "OpenCode Go" als Anbieter in deiner opencode-Konfiguration, um Go-Modelle zu verwenden.',
|
||||
|
|
|
|||
|
|
@ -669,10 +669,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "a few seconds",
|
||||
"workspace.lite.subscription.message": "You are subscribed to OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Manage Subscription",
|
||||
"workspace.lite.subscription.rollingUsage": "Rolling Usage",
|
||||
"workspace.lite.subscription.rollingUsage": "5-hour Usage",
|
||||
"workspace.lite.subscription.rollingQuota": "5-hour Quota",
|
||||
"workspace.lite.subscription.weeklyUsage": "Weekly Usage",
|
||||
"workspace.lite.subscription.weeklyQuota": "Weekly Quota",
|
||||
"workspace.lite.subscription.monthlyUsage": "Monthly Usage",
|
||||
"workspace.lite.subscription.monthlyQuota": "Monthly Quota",
|
||||
"workspace.lite.subscription.resetsIn": "Resets in",
|
||||
"workspace.lite.subscription.showDetails": "Show details",
|
||||
"workspace.lite.subscription.hideDetails": "Hide details",
|
||||
"workspace.lite.subscription.model": "Model",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Total",
|
||||
"workspace.lite.subscription.useBalance": "Use your available balance after reaching the usage limits",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Select "OpenCode Go" as the provider in your opencode configuration to use Go models.',
|
||||
|
|
|
|||
|
|
@ -674,10 +674,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "unos pocos segundos",
|
||||
"workspace.lite.subscription.message": "Estás suscrito a OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Gestionar Suscripción",
|
||||
"workspace.lite.subscription.rollingUsage": "Uso Continuo",
|
||||
"workspace.lite.subscription.rollingUsage": "Uso de 5 horas",
|
||||
"workspace.lite.subscription.rollingQuota": "Cuota de 5 horas",
|
||||
"workspace.lite.subscription.weeklyUsage": "Uso Semanal",
|
||||
"workspace.lite.subscription.weeklyQuota": "Cuota Semanal",
|
||||
"workspace.lite.subscription.monthlyUsage": "Uso Mensual",
|
||||
"workspace.lite.subscription.monthlyQuota": "Cuota Mensual",
|
||||
"workspace.lite.subscription.resetsIn": "Se reinicia en",
|
||||
"workspace.lite.subscription.showDetails": "Mostrar detalles",
|
||||
"workspace.lite.subscription.hideDetails": "Ocultar detalles",
|
||||
"workspace.lite.subscription.model": "Modelo",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Total",
|
||||
"workspace.lite.subscription.useBalance": "Usa tu saldo disponible después de alcanzar los límites de uso",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Selecciona "OpenCode Go" como proveedor en tu configuración de opencode para usar los modelos Go.',
|
||||
|
|
|
|||
|
|
@ -679,10 +679,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "quelques secondes",
|
||||
"workspace.lite.subscription.message": "Vous êtes abonné à OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Gérer l'abonnement",
|
||||
"workspace.lite.subscription.rollingUsage": "Utilisation glissante",
|
||||
"workspace.lite.subscription.rollingUsage": "Utilisation sur 5 heures",
|
||||
"workspace.lite.subscription.rollingQuota": "Quota sur 5 heures",
|
||||
"workspace.lite.subscription.weeklyUsage": "Utilisation hebdomadaire",
|
||||
"workspace.lite.subscription.weeklyQuota": "Quota hebdomadaire",
|
||||
"workspace.lite.subscription.monthlyUsage": "Utilisation mensuelle",
|
||||
"workspace.lite.subscription.monthlyQuota": "Quota mensuel",
|
||||
"workspace.lite.subscription.resetsIn": "Réinitialisation dans",
|
||||
"workspace.lite.subscription.showDetails": "Afficher les détails",
|
||||
"workspace.lite.subscription.hideDetails": "Masquer les détails",
|
||||
"workspace.lite.subscription.model": "Modèle",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Total",
|
||||
"workspace.lite.subscription.useBalance":
|
||||
"Utilisez votre solde disponible après avoir atteint les limites d'utilisation",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
|
|
|
|||
|
|
@ -672,10 +672,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "pochi secondi",
|
||||
"workspace.lite.subscription.message": "Sei abbonato a OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Gestisci Abbonamento",
|
||||
"workspace.lite.subscription.rollingUsage": "Utilizzo Continuativo",
|
||||
"workspace.lite.subscription.rollingUsage": "Utilizzo su 5 ore",
|
||||
"workspace.lite.subscription.rollingQuota": "Quota su 5 ore",
|
||||
"workspace.lite.subscription.weeklyUsage": "Utilizzo Settimanale",
|
||||
"workspace.lite.subscription.weeklyQuota": "Quota Settimanale",
|
||||
"workspace.lite.subscription.monthlyUsage": "Utilizzo Mensile",
|
||||
"workspace.lite.subscription.monthlyQuota": "Quota Mensile",
|
||||
"workspace.lite.subscription.resetsIn": "Si resetta tra",
|
||||
"workspace.lite.subscription.showDetails": "Mostra dettagli",
|
||||
"workspace.lite.subscription.hideDetails": "Nascondi dettagli",
|
||||
"workspace.lite.subscription.model": "Modello",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Totale",
|
||||
"workspace.lite.subscription.useBalance": "Usa il tuo saldo disponibile dopo aver raggiunto i limiti di utilizzo",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Seleziona "OpenCode Go" come provider nella tua configurazione opencode per utilizzare i modelli Go.',
|
||||
|
|
|
|||
|
|
@ -670,10 +670,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "数秒",
|
||||
"workspace.lite.subscription.message": "あなたは OpenCode Go を購読しています。",
|
||||
"workspace.lite.subscription.manage": "サブスクリプションの管理",
|
||||
"workspace.lite.subscription.rollingUsage": "ローリング利用量",
|
||||
"workspace.lite.subscription.rollingUsage": "5時間利用量",
|
||||
"workspace.lite.subscription.rollingQuota": "5時間上限",
|
||||
"workspace.lite.subscription.weeklyUsage": "週間利用量",
|
||||
"workspace.lite.subscription.weeklyQuota": "週間上限",
|
||||
"workspace.lite.subscription.monthlyUsage": "月間利用量",
|
||||
"workspace.lite.subscription.monthlyQuota": "月間上限",
|
||||
"workspace.lite.subscription.resetsIn": "リセットまで",
|
||||
"workspace.lite.subscription.showDetails": "詳細を表示",
|
||||
"workspace.lite.subscription.hideDetails": "詳細を非表示",
|
||||
"workspace.lite.subscription.model": "モデル",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "合計",
|
||||
"workspace.lite.subscription.useBalance": "利用限度額に達したら利用可能な残高を使用する",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
"Go モデルを使用するには、opencode の設定で「OpenCode Go」をプロバイダーとして選択してください。",
|
||||
|
|
|
|||
|
|
@ -661,10 +661,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "몇 초",
|
||||
"workspace.lite.subscription.message": "현재 OpenCode Go를 구독 중입니다.",
|
||||
"workspace.lite.subscription.manage": "구독 관리",
|
||||
"workspace.lite.subscription.rollingUsage": "롤링 사용량",
|
||||
"workspace.lite.subscription.rollingUsage": "5시간 사용량",
|
||||
"workspace.lite.subscription.rollingQuota": "5시간 할당량",
|
||||
"workspace.lite.subscription.weeklyUsage": "주간 사용량",
|
||||
"workspace.lite.subscription.weeklyQuota": "주간 할당량",
|
||||
"workspace.lite.subscription.monthlyUsage": "월간 사용량",
|
||||
"workspace.lite.subscription.monthlyQuota": "월간 할당량",
|
||||
"workspace.lite.subscription.resetsIn": "초기화까지 남은 시간:",
|
||||
"workspace.lite.subscription.showDetails": "상세 정보 보기",
|
||||
"workspace.lite.subscription.hideDetails": "상세 정보 숨기기",
|
||||
"workspace.lite.subscription.model": "모델",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "합계",
|
||||
"workspace.lite.subscription.useBalance": "사용 한도 도달 후에는 보유 잔액 사용",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Go 모델을 사용하려면 opencode 설정에서 "OpenCode Go"를 공급자로 선택하세요.',
|
||||
|
|
|
|||
|
|
@ -670,10 +670,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "noen få sekunder",
|
||||
"workspace.lite.subscription.message": "Du abonnerer på OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Administrer abonnement",
|
||||
"workspace.lite.subscription.rollingUsage": "Løpende bruk",
|
||||
"workspace.lite.subscription.rollingUsage": "5-timers bruk",
|
||||
"workspace.lite.subscription.rollingQuota": "5-timers kvote",
|
||||
"workspace.lite.subscription.weeklyUsage": "Ukentlig bruk",
|
||||
"workspace.lite.subscription.weeklyQuota": "Ukentlig kvote",
|
||||
"workspace.lite.subscription.monthlyUsage": "Månedlig bruk",
|
||||
"workspace.lite.subscription.monthlyQuota": "Månedlig kvote",
|
||||
"workspace.lite.subscription.resetsIn": "Nullstilles om",
|
||||
"workspace.lite.subscription.showDetails": "Vis detaljer",
|
||||
"workspace.lite.subscription.hideDetails": "Skjul detaljer",
|
||||
"workspace.lite.subscription.model": "Modell",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Totalt",
|
||||
"workspace.lite.subscription.useBalance": "Bruk din tilgjengelige saldo etter å ha nådd bruksgrensene",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Velg "OpenCode Go" som leverandør i opencode-konfigurasjonen din for å bruke Go-modeller.',
|
||||
|
|
|
|||
|
|
@ -671,10 +671,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "kilka sekund",
|
||||
"workspace.lite.subscription.message": "Subskrybujesz OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Zarządzaj subskrypcją",
|
||||
"workspace.lite.subscription.rollingUsage": "Użycie kroczące",
|
||||
"workspace.lite.subscription.rollingUsage": "Użycie w ciągu 5 godzin",
|
||||
"workspace.lite.subscription.rollingQuota": "Limit 5-godzinny",
|
||||
"workspace.lite.subscription.weeklyUsage": "Użycie tygodniowe",
|
||||
"workspace.lite.subscription.weeklyQuota": "Limit tygodniowy",
|
||||
"workspace.lite.subscription.monthlyUsage": "Użycie miesięczne",
|
||||
"workspace.lite.subscription.monthlyQuota": "Limit miesięczny",
|
||||
"workspace.lite.subscription.resetsIn": "Resetuje się za",
|
||||
"workspace.lite.subscription.showDetails": "Pokaż szczegóły",
|
||||
"workspace.lite.subscription.hideDetails": "Ukryj szczegóły",
|
||||
"workspace.lite.subscription.model": "Model",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Łącznie",
|
||||
"workspace.lite.subscription.useBalance": "Użyj dostępnego salda po osiągnięciu limitów użycia",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Wybierz "OpenCode Go" jako dostawcę w konfiguracji opencode, aby używać modeli Go.',
|
||||
|
|
|
|||
|
|
@ -678,10 +678,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "несколько секунд",
|
||||
"workspace.lite.subscription.message": "Вы подписаны на OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Управление подпиской",
|
||||
"workspace.lite.subscription.rollingUsage": "Скользящее использование",
|
||||
"workspace.lite.subscription.rollingUsage": "Использование за 5 часов",
|
||||
"workspace.lite.subscription.rollingQuota": "Квота на 5 часов",
|
||||
"workspace.lite.subscription.weeklyUsage": "Недельное использование",
|
||||
"workspace.lite.subscription.weeklyQuota": "Недельная квота",
|
||||
"workspace.lite.subscription.monthlyUsage": "Ежемесячное использование",
|
||||
"workspace.lite.subscription.monthlyQuota": "Ежемесячная квота",
|
||||
"workspace.lite.subscription.resetsIn": "Сброс через",
|
||||
"workspace.lite.subscription.showDetails": "Показать подробности",
|
||||
"workspace.lite.subscription.hideDetails": "Скрыть подробности",
|
||||
"workspace.lite.subscription.model": "Модель",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Итого",
|
||||
"workspace.lite.subscription.useBalance": "Использовать доступный баланс после достижения лимитов",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Выберите "OpenCode Go" в качестве провайдера в настройках opencode для использования моделей Go.',
|
||||
|
|
|
|||
|
|
@ -667,10 +667,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "ไม่กี่วินาที",
|
||||
"workspace.lite.subscription.message": "คุณได้สมัครสมาชิก OpenCode Go แล้ว",
|
||||
"workspace.lite.subscription.manage": "จัดการการสมัครสมาชิก",
|
||||
"workspace.lite.subscription.rollingUsage": "การใช้งานแบบหมุนเวียน",
|
||||
"workspace.lite.subscription.rollingUsage": "การใช้งานใน 5 ชั่วโมง",
|
||||
"workspace.lite.subscription.rollingQuota": "โควตา 5 ชั่วโมง",
|
||||
"workspace.lite.subscription.weeklyUsage": "การใช้งานรายสัปดาห์",
|
||||
"workspace.lite.subscription.weeklyQuota": "โควตารายสัปดาห์",
|
||||
"workspace.lite.subscription.monthlyUsage": "การใช้งานรายเดือน",
|
||||
"workspace.lite.subscription.monthlyQuota": "โควตารายเดือน",
|
||||
"workspace.lite.subscription.resetsIn": "รีเซ็ตใน",
|
||||
"workspace.lite.subscription.showDetails": "แสดงรายละเอียด",
|
||||
"workspace.lite.subscription.hideDetails": "ซ่อนรายละเอียด",
|
||||
"workspace.lite.subscription.model": "โมเดล",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "รวม",
|
||||
"workspace.lite.subscription.useBalance": "ใช้ยอดคงเหลือของคุณหลังจากถึงขีดจำกัดการใช้งาน",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'เลือก "OpenCode Go" เป็นผู้ให้บริการในการตั้งค่า opencode ของคุณเพื่อใช้โมเดล Go',
|
||||
|
|
|
|||
|
|
@ -673,10 +673,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "birkaç saniye",
|
||||
"workspace.lite.subscription.message": "OpenCode Go abonesisiniz.",
|
||||
"workspace.lite.subscription.manage": "Aboneliği Yönet",
|
||||
"workspace.lite.subscription.rollingUsage": "Devam Eden Kullanım",
|
||||
"workspace.lite.subscription.rollingUsage": "5 Saatlik Kullanım",
|
||||
"workspace.lite.subscription.rollingQuota": "5 Saatlik Kota",
|
||||
"workspace.lite.subscription.weeklyUsage": "Haftalık Kullanım",
|
||||
"workspace.lite.subscription.weeklyQuota": "Haftalık Kota",
|
||||
"workspace.lite.subscription.monthlyUsage": "Aylık Kullanım",
|
||||
"workspace.lite.subscription.monthlyQuota": "Aylık Kota",
|
||||
"workspace.lite.subscription.resetsIn": "Sıfırlama süresi",
|
||||
"workspace.lite.subscription.showDetails": "Ayrıntıları göster",
|
||||
"workspace.lite.subscription.hideDetails": "Ayrıntıları gizle",
|
||||
"workspace.lite.subscription.model": "Model",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Toplam",
|
||||
"workspace.lite.subscription.useBalance": "Kullanım limitlerine ulaştıktan sonra mevcut bakiyenizi kullanın",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
'Go modellerini kullanmak için opencode yapılandırmanızda "OpenCode Go"\'yu sağlayıcı olarak seçin.',
|
||||
|
|
|
|||
|
|
@ -669,10 +669,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "кілька секунд",
|
||||
"workspace.lite.subscription.message": "Ви підписані на OpenCode Go.",
|
||||
"workspace.lite.subscription.manage": "Керувати підпискою",
|
||||
"workspace.lite.subscription.rollingUsage": "Ковзне використання",
|
||||
"workspace.lite.subscription.rollingUsage": "Використання за 5 годин",
|
||||
"workspace.lite.subscription.rollingQuota": "Квота на 5 годин",
|
||||
"workspace.lite.subscription.weeklyUsage": "Тижневе використання",
|
||||
"workspace.lite.subscription.weeklyQuota": "Тижнева квота",
|
||||
"workspace.lite.subscription.monthlyUsage": "Місячне використання",
|
||||
"workspace.lite.subscription.monthlyQuota": "Місячна квота",
|
||||
"workspace.lite.subscription.resetsIn": "Скидається через",
|
||||
"workspace.lite.subscription.showDetails": "Показати подробиці",
|
||||
"workspace.lite.subscription.hideDetails": "Приховати подробиці",
|
||||
"workspace.lite.subscription.model": "Модель",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "Усього",
|
||||
"workspace.lite.subscription.useBalance": "Використовуйте доступний баланс після досягнення лімітів",
|
||||
"workspace.lite.subscription.selectProvider": 'Виберіть "OpenCode Go" як провайдера в конфігурації opencode.',
|
||||
"workspace.lite.providers.title": "Провайдери",
|
||||
|
|
|
|||
|
|
@ -642,10 +642,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "几秒钟",
|
||||
"workspace.lite.subscription.message": "您已订阅 OpenCode Go。",
|
||||
"workspace.lite.subscription.manage": "管理订阅",
|
||||
"workspace.lite.subscription.rollingUsage": "滚动用量",
|
||||
"workspace.lite.subscription.rollingUsage": "5 小时用量",
|
||||
"workspace.lite.subscription.rollingQuota": "5 小时配额",
|
||||
"workspace.lite.subscription.weeklyUsage": "每周用量",
|
||||
"workspace.lite.subscription.weeklyQuota": "每周配额",
|
||||
"workspace.lite.subscription.monthlyUsage": "每月用量",
|
||||
"workspace.lite.subscription.monthlyQuota": "每月配额",
|
||||
"workspace.lite.subscription.resetsIn": "重置于",
|
||||
"workspace.lite.subscription.showDetails": "显示详情",
|
||||
"workspace.lite.subscription.hideDetails": "隐藏详情",
|
||||
"workspace.lite.subscription.model": "模型",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "总计",
|
||||
"workspace.lite.subscription.useBalance": "达到使用限额后使用您的可用余额",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
"在你的 opencode 配置中选择「OpenCode Go」作为提供商,即可使用 Go 模型。",
|
||||
|
|
|
|||
|
|
@ -642,10 +642,18 @@ export const dict = {
|
|||
"workspace.lite.time.fewSeconds": "幾秒",
|
||||
"workspace.lite.subscription.message": "您已訂閱 OpenCode Go。",
|
||||
"workspace.lite.subscription.manage": "管理訂閱",
|
||||
"workspace.lite.subscription.rollingUsage": "滾動使用量",
|
||||
"workspace.lite.subscription.rollingUsage": "5 小時使用量",
|
||||
"workspace.lite.subscription.rollingQuota": "5 小時配額",
|
||||
"workspace.lite.subscription.weeklyUsage": "每週使用量",
|
||||
"workspace.lite.subscription.weeklyQuota": "每週配額",
|
||||
"workspace.lite.subscription.monthlyUsage": "每月使用量",
|
||||
"workspace.lite.subscription.monthlyQuota": "每月配額",
|
||||
"workspace.lite.subscription.resetsIn": "重置時間:",
|
||||
"workspace.lite.subscription.showDetails": "顯示詳情",
|
||||
"workspace.lite.subscription.hideDetails": "隱藏詳情",
|
||||
"workspace.lite.subscription.model": "模型",
|
||||
"workspace.lite.subscription.contribution": "%",
|
||||
"workspace.lite.subscription.total": "總計",
|
||||
"workspace.lite.subscription.useBalance": "達到使用限制後使用您的可用餘額",
|
||||
"workspace.lite.subscription.selectProvider":
|
||||
"在您的 opencode 設定中選擇「OpenCode Go」作為提供商,即可使用 Go 模型。",
|
||||
|
|
|
|||
60
packages/console/app/src/lib/lite-usage.ts
Normal file
60
packages/console/app/src/lib/lite-usage.ts
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
export type LiteUsageBreakdownSource = {
|
||||
model: string
|
||||
name: string
|
||||
cost: number
|
||||
quotaCost: number
|
||||
multiplier?: number
|
||||
estimated: boolean
|
||||
}
|
||||
|
||||
export type LiteUsageBreakdownItem = {
|
||||
model: string
|
||||
name: string
|
||||
cost?: number
|
||||
multiplier?: number
|
||||
quotaCost: number
|
||||
contributionPercent: number
|
||||
estimated: boolean
|
||||
}
|
||||
|
||||
export function buildLiteUsageBreakdown(input: { usage: number; limit: number; sources: LiteUsageBreakdownSource[] }) {
|
||||
const rows: LiteUsageBreakdownItem[] = input.sources
|
||||
.filter((item) => item.cost !== 0 || item.quotaCost !== 0)
|
||||
.sort((a, b) => b.quotaCost - a.quotaCost)
|
||||
.map((item) => ({
|
||||
...item,
|
||||
contributionPercent: 0,
|
||||
}))
|
||||
|
||||
const usagePercent = getUsagePercent(input.usage, input.limit)
|
||||
const target = Math.max(0, Math.round(usagePercent * 10))
|
||||
const totalQuota = rows.reduce((total, item) => total + Math.max(0, item.quotaCost), 0)
|
||||
const units = rows.map((item) => {
|
||||
const exact = totalQuota === 0 ? 0 : (Math.max(0, item.quotaCost) / totalQuota) * target
|
||||
const value = Math.floor(exact)
|
||||
return { item, exact, value }
|
||||
})
|
||||
const remaining = target - units.reduce((total, item) => total + item.value, 0)
|
||||
const ranked = units.toSorted((a, b) => b.exact - b.value - (a.exact - a.value))
|
||||
Array.from({ length: ranked.length === 0 ? 0 : remaining }).forEach((_, index) => {
|
||||
ranked[index % ranked.length].value += 1
|
||||
})
|
||||
units.forEach((unit) => (unit.item.contributionPercent = unit.value / 10))
|
||||
|
||||
return {
|
||||
usage: input.usage,
|
||||
limit: input.limit,
|
||||
usagePercent,
|
||||
rows,
|
||||
}
|
||||
}
|
||||
|
||||
export function getModelQuotaLimit(limit: number, multiplier?: number) {
|
||||
if (multiplier === undefined || multiplier <= 0) return
|
||||
return limit / multiplier
|
||||
}
|
||||
|
||||
export function getUsagePercent(amount: number, limit: number) {
|
||||
if (limit === 0) return 0
|
||||
return Math.round((amount / limit) * 1000) / 10
|
||||
}
|
||||
|
|
@ -103,9 +103,6 @@ export default function Black() {
|
|||
<button type="button" onClick={() => cancel()} data-slot="cancel">
|
||||
{i18n.t("common.cancel")}
|
||||
</button>
|
||||
<a href={`/black/subscribe/${plan().id}`} data-slot="continue">
|
||||
{i18n.t("black.action.continue")}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,489 +0,0 @@
|
|||
import { A, createAsync, query, redirect, useParams } from "@solidjs/router"
|
||||
import { Title } from "@solidjs/meta"
|
||||
import { createEffect, createSignal, For, Match, Show, Switch } from "solid-js"
|
||||
import { type Stripe, type PaymentMethod, loadStripe } from "@stripe/stripe-js"
|
||||
import { Elements, PaymentElement, useStripe, useElements, AddressElement } from "solid-stripe"
|
||||
import { PlanID, plans } from "../common"
|
||||
import { getActor, useAuthSession } from "~/context/auth"
|
||||
import { withActor } from "~/context/auth.withActor"
|
||||
import { Actor } from "@opencode-ai/console-core/actor.js"
|
||||
import { and, Database, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js"
|
||||
import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
|
||||
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
|
||||
import { createList } from "solid-list"
|
||||
import { Modal } from "~/component/modal"
|
||||
import { BillingTable } from "@opencode-ai/console-core/schema/billing.sql.js"
|
||||
import { Billing } from "@opencode-ai/console-core/billing.js"
|
||||
import { useI18n } from "~/context/i18n"
|
||||
import { useLanguage } from "~/context/language"
|
||||
import { formError } from "~/lib/form-error"
|
||||
import { Resource } from "@opencode-ai/console-resource"
|
||||
|
||||
const getEnabled = query(async () => {
|
||||
"use server"
|
||||
return Resource.App.stage !== "production"
|
||||
}, "black.subscribe.enabled")
|
||||
|
||||
const plansMap = Object.fromEntries(plans.map((p) => [p.id, p])) as Record<PlanID, (typeof plans)[number]>
|
||||
const stripePromise = loadStripe(import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY!)
|
||||
|
||||
const getWorkspaces = query(async (plan: string) => {
|
||||
"use server"
|
||||
const actor = await getActor()
|
||||
if (actor.type === "public") throw redirect("/auth/authorize?continue=/black/subscribe/" + plan)
|
||||
return withActor(async () => {
|
||||
return Database.use((tx) =>
|
||||
tx
|
||||
.select({
|
||||
id: WorkspaceTable.id,
|
||||
name: WorkspaceTable.name,
|
||||
slug: WorkspaceTable.slug,
|
||||
billing: {
|
||||
customerID: BillingTable.customerID,
|
||||
paymentMethodID: BillingTable.paymentMethodID,
|
||||
paymentMethodType: BillingTable.paymentMethodType,
|
||||
paymentMethodLast4: BillingTable.paymentMethodLast4,
|
||||
subscriptionID: BillingTable.subscriptionID,
|
||||
timeSubscriptionBooked: BillingTable.timeSubscriptionBooked,
|
||||
},
|
||||
})
|
||||
.from(UserTable)
|
||||
.innerJoin(WorkspaceTable, eq(UserTable.workspaceID, WorkspaceTable.id))
|
||||
.innerJoin(BillingTable, eq(WorkspaceTable.id, BillingTable.workspaceID))
|
||||
.where(
|
||||
and(
|
||||
eq(UserTable.accountID, Actor.account()),
|
||||
isNull(WorkspaceTable.timeDeleted),
|
||||
isNull(UserTable.timeDeleted),
|
||||
),
|
||||
),
|
||||
)
|
||||
})
|
||||
}, "black.subscribe.workspaces")
|
||||
|
||||
const createSetupIntent = async (input: { plan: string; workspaceID: string }) => {
|
||||
"use server"
|
||||
const { plan, workspaceID } = input
|
||||
|
||||
if (!plan || !["20", "100", "200"].includes(plan)) return { error: formError.invalidPlan }
|
||||
if (!workspaceID) return { error: formError.workspaceRequired }
|
||||
|
||||
return withActor(async () => {
|
||||
const session = await useAuthSession()
|
||||
const account = session.data.account?.[session.data.current ?? ""]
|
||||
const email = account?.email
|
||||
|
||||
const customer = await Database.use((tx) =>
|
||||
tx
|
||||
.select({
|
||||
customerID: BillingTable.customerID,
|
||||
subscriptionID: BillingTable.subscriptionID,
|
||||
})
|
||||
.from(BillingTable)
|
||||
.where(eq(BillingTable.workspaceID, workspaceID))
|
||||
.then((rows) => rows[0]),
|
||||
)
|
||||
if (customer?.subscriptionID) {
|
||||
return { error: formError.alreadySubscribed }
|
||||
}
|
||||
|
||||
let customerID = customer?.customerID
|
||||
if (!customerID) {
|
||||
const customer = await Billing.stripe().customers.create({
|
||||
email,
|
||||
metadata: {
|
||||
workspaceID,
|
||||
},
|
||||
})
|
||||
customerID = customer.id
|
||||
await Database.use((tx) =>
|
||||
tx
|
||||
.update(BillingTable)
|
||||
.set({
|
||||
customerID,
|
||||
})
|
||||
.where(eq(BillingTable.workspaceID, workspaceID)),
|
||||
)
|
||||
}
|
||||
|
||||
const intent = await Billing.stripe().setupIntents.create({
|
||||
customer: customerID,
|
||||
payment_method_types: ["card"],
|
||||
metadata: {
|
||||
workspaceID,
|
||||
},
|
||||
})
|
||||
|
||||
return { clientSecret: intent.client_secret ?? undefined }
|
||||
}, workspaceID)
|
||||
}
|
||||
|
||||
const bookSubscription = async (input: {
|
||||
workspaceID: string
|
||||
plan: PlanID
|
||||
paymentMethodID: string
|
||||
paymentMethodType: string
|
||||
paymentMethodLast4?: string
|
||||
}) => {
|
||||
"use server"
|
||||
return withActor(
|
||||
() =>
|
||||
Database.use((tx) =>
|
||||
tx
|
||||
.update(BillingTable)
|
||||
.set({
|
||||
paymentMethodID: input.paymentMethodID,
|
||||
paymentMethodType: input.paymentMethodType,
|
||||
paymentMethodLast4: input.paymentMethodLast4,
|
||||
subscriptionPlan: input.plan,
|
||||
timeSubscriptionBooked: new Date(),
|
||||
})
|
||||
.where(eq(BillingTable.workspaceID, input.workspaceID)),
|
||||
),
|
||||
input.workspaceID,
|
||||
)
|
||||
}
|
||||
|
||||
interface SuccessData {
|
||||
plan: string
|
||||
paymentMethodType: string
|
||||
paymentMethodLast4?: string
|
||||
}
|
||||
|
||||
function Failure(props: { message: string }) {
|
||||
const i18n = useI18n()
|
||||
|
||||
return (
|
||||
<div data-slot="failure">
|
||||
<p data-slot="message">
|
||||
{i18n.t("black.subscribe.failurePrefix")} {props.message}
|
||||
</p>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function Success(props: SuccessData) {
|
||||
const i18n = useI18n()
|
||||
|
||||
return (
|
||||
<div data-slot="success">
|
||||
<p data-slot="title">{i18n.t("black.subscribe.success.title")}</p>
|
||||
<dl data-slot="details">
|
||||
<div>
|
||||
<dt>{i18n.t("black.subscribe.success.subscriptionPlan")}</dt>
|
||||
<dd>{i18n.t("black.subscribe.success.planName", { plan: props.plan })}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>{i18n.t("black.subscribe.success.amount")}</dt>
|
||||
<dd>{i18n.t("black.subscribe.success.amountValue", { plan: props.plan })}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>{i18n.t("black.subscribe.success.paymentMethod")}</dt>
|
||||
<dd>
|
||||
<Show when={props.paymentMethodLast4} fallback={<span>{props.paymentMethodType}</span>}>
|
||||
<span>
|
||||
{props.paymentMethodType} - {props.paymentMethodLast4}
|
||||
</span>
|
||||
</Show>
|
||||
</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>{i18n.t("black.subscribe.success.dateJoined")}</dt>
|
||||
<dd>{new Date().toLocaleDateString(undefined, { month: "short", day: "numeric", year: "numeric" })}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
<p data-slot="charge-notice">{i18n.t("black.subscribe.success.chargeNotice")}</p>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function IntentForm(props: { plan: PlanID; workspaceID: string; onSuccess: (data: SuccessData) => void }) {
|
||||
const i18n = useI18n()
|
||||
const stripe = useStripe()
|
||||
const elements = useElements()
|
||||
const [error, setError] = createSignal<string | undefined>(undefined)
|
||||
const [loading, setLoading] = createSignal(false)
|
||||
|
||||
const handleSubmit = async (e: Event) => {
|
||||
e.preventDefault()
|
||||
if (!stripe() || !elements()) return
|
||||
|
||||
setLoading(true)
|
||||
setError(undefined)
|
||||
|
||||
const result = await elements()!.submit()
|
||||
if (result.error) {
|
||||
setError(result.error.message ?? i18n.t("black.subscribe.error.generic"))
|
||||
setLoading(false)
|
||||
return
|
||||
}
|
||||
|
||||
const { error: confirmError, setupIntent } = await stripe()!.confirmSetup({
|
||||
elements: elements()!,
|
||||
confirmParams: {
|
||||
expand: ["payment_method"],
|
||||
payment_method_data: {
|
||||
allow_redisplay: "always",
|
||||
},
|
||||
},
|
||||
redirect: "if_required",
|
||||
})
|
||||
|
||||
if (confirmError) {
|
||||
setError(confirmError.message ?? i18n.t("black.subscribe.error.generic"))
|
||||
setLoading(false)
|
||||
return
|
||||
}
|
||||
|
||||
if (setupIntent?.status === "succeeded") {
|
||||
const pm = setupIntent.payment_method as PaymentMethod
|
||||
|
||||
await bookSubscription({
|
||||
workspaceID: props.workspaceID,
|
||||
plan: props.plan,
|
||||
paymentMethodID: pm.id,
|
||||
paymentMethodType: pm.type,
|
||||
paymentMethodLast4: pm.card?.last4,
|
||||
})
|
||||
|
||||
props.onSuccess({
|
||||
plan: props.plan,
|
||||
paymentMethodType: pm.type,
|
||||
paymentMethodLast4: pm.card?.last4,
|
||||
})
|
||||
}
|
||||
|
||||
setLoading(false)
|
||||
}
|
||||
|
||||
return (
|
||||
<form onSubmit={handleSubmit} data-slot="checkout-form">
|
||||
<PaymentElement />
|
||||
<AddressElement options={{ mode: "billing" }} />
|
||||
<Show when={error()}>
|
||||
<p data-slot="error">{error()}</p>
|
||||
</Show>
|
||||
<button type="submit" disabled={loading() || !stripe() || !elements()} data-slot="submit-button">
|
||||
{loading() ? i18n.t("black.subscribe.processing") : i18n.t("black.subscribe.submit", { plan: props.plan })}
|
||||
</button>
|
||||
<p data-slot="charge-notice">{i18n.t("black.subscribe.form.chargeNotice")}</p>
|
||||
</form>
|
||||
)
|
||||
}
|
||||
|
||||
export default function BlackSubscribe() {
|
||||
const params = useParams()
|
||||
const i18n = useI18n()
|
||||
const language = useLanguage()
|
||||
const enabled = createAsync(() => getEnabled())
|
||||
const planData = plansMap[(params.plan as PlanID) ?? "20"] ?? plansMap["20"]
|
||||
const plan = planData.id
|
||||
|
||||
const workspaces = createAsync(() => getWorkspaces(plan))
|
||||
const [selectedWorkspace, setSelectedWorkspace] = createSignal<string | undefined>(undefined)
|
||||
const [success, setSuccess] = createSignal<SuccessData | undefined>(undefined)
|
||||
const [failure, setFailure] = createSignal<string | undefined>(undefined)
|
||||
const [clientSecret, setClientSecret] = createSignal<string | undefined>(undefined)
|
||||
const [stripe, setStripe] = createSignal<Stripe | undefined>(undefined)
|
||||
|
||||
const formatError = (error: string) => {
|
||||
if (error === formError.invalidPlan) return i18n.t("black.subscribe.error.invalidPlan")
|
||||
if (error === formError.workspaceRequired) return i18n.t("black.subscribe.error.workspaceRequired")
|
||||
if (error === formError.alreadySubscribed) return i18n.t("black.subscribe.error.alreadySubscribed")
|
||||
if (error === "Invalid plan") return i18n.t("black.subscribe.error.invalidPlan")
|
||||
if (error === "Workspace ID is required") return i18n.t("black.subscribe.error.workspaceRequired")
|
||||
if (error === "This workspace already has a subscription") return i18n.t("black.subscribe.error.alreadySubscribed")
|
||||
return error
|
||||
}
|
||||
|
||||
// Resolve stripe promise once
|
||||
createEffect(() => {
|
||||
void stripePromise.then((s) => {
|
||||
if (s) setStripe(s)
|
||||
})
|
||||
})
|
||||
|
||||
// Auto-select if only one workspace
|
||||
createEffect(() => {
|
||||
const ws = workspaces()
|
||||
if (ws?.length === 1 && !selectedWorkspace()) {
|
||||
setSelectedWorkspace(ws[0].id)
|
||||
}
|
||||
})
|
||||
|
||||
// Fetch setup intent when workspace is selected (unless workspace already has payment method)
|
||||
createEffect(async () => {
|
||||
const id = selectedWorkspace()
|
||||
if (!id) return
|
||||
|
||||
const ws = workspaces()?.find((w) => w.id === id)
|
||||
if (ws?.billing?.subscriptionID) {
|
||||
setFailure(i18n.t("black.subscribe.error.alreadySubscribed"))
|
||||
return
|
||||
}
|
||||
if (ws?.billing?.paymentMethodID) {
|
||||
if (!ws?.billing?.timeSubscriptionBooked) {
|
||||
await bookSubscription({
|
||||
workspaceID: id,
|
||||
plan: planData.id,
|
||||
paymentMethodID: ws.billing.paymentMethodID!,
|
||||
paymentMethodType: ws.billing.paymentMethodType!,
|
||||
paymentMethodLast4: ws.billing.paymentMethodLast4 ?? undefined,
|
||||
})
|
||||
}
|
||||
setSuccess({
|
||||
plan: planData.id,
|
||||
paymentMethodType: ws.billing.paymentMethodType!,
|
||||
paymentMethodLast4: ws.billing.paymentMethodLast4 ?? undefined,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
const result = await createSetupIntent({ plan, workspaceID: id })
|
||||
if (result.error) {
|
||||
setFailure(formatError(result.error))
|
||||
} else if ("clientSecret" in result) {
|
||||
setClientSecret(result.clientSecret)
|
||||
}
|
||||
})
|
||||
|
||||
// Keyboard navigation for workspace picker
|
||||
const { active, setActive, onKeyDown } = createList({
|
||||
items: () => workspaces()?.map((w) => w.id) ?? [],
|
||||
initialActive: null,
|
||||
})
|
||||
|
||||
const handleSelectWorkspace = (id: string) => {
|
||||
setSelectedWorkspace(id)
|
||||
}
|
||||
|
||||
let listRef: HTMLUListElement | undefined
|
||||
|
||||
// Show workspace picker if multiple workspaces and none selected
|
||||
const showWorkspacePicker = () => {
|
||||
const ws = workspaces()
|
||||
return ws && ws.length > 1 && !selectedWorkspace()
|
||||
}
|
||||
|
||||
return (
|
||||
<Show when={enabled()}>
|
||||
<Title>{i18n.t("black.subscribe.title")}</Title>
|
||||
<section data-slot="subscribe-form">
|
||||
<div data-slot="form-card">
|
||||
<Switch>
|
||||
<Match when={success()}>{(data) => <Success {...data()} />}</Match>
|
||||
<Match when={failure()}>{(data) => <Failure message={data()} />}</Match>
|
||||
<Match when={true}>
|
||||
<>
|
||||
<div data-slot="plan-header">
|
||||
<p data-slot="title">{i18n.t("black.subscribe.title")}</p>
|
||||
<p data-slot="price">
|
||||
<span data-slot="amount">${planData.id}</span>{" "}
|
||||
<span data-slot="period">{i18n.t("black.price.perMonth")}</span>
|
||||
<Show when={planData.multiplier}>
|
||||
{(multiplier) => <span data-slot="multiplier">{i18n.t(multiplier())}</span>}
|
||||
</Show>
|
||||
</p>
|
||||
</div>
|
||||
<div data-slot="divider" />
|
||||
<p data-slot="section-title">{i18n.t("black.subscribe.paymentMethod")}</p>
|
||||
|
||||
<Show
|
||||
when={clientSecret() && selectedWorkspace() && stripe()}
|
||||
fallback={
|
||||
<div data-slot="loading">
|
||||
<p>
|
||||
{selectedWorkspace()
|
||||
? i18n.t("black.subscribe.loadingPaymentForm")
|
||||
: i18n.t("black.subscribe.selectWorkspaceToContinue")}
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<Elements
|
||||
stripe={stripe()!}
|
||||
options={{
|
||||
clientSecret: clientSecret()!,
|
||||
appearance: {
|
||||
theme: "night",
|
||||
variables: {
|
||||
colorPrimary: "#ffffff",
|
||||
colorBackground: "#1a1a1a",
|
||||
colorText: "#ffffff",
|
||||
colorTextSecondary: "#999999",
|
||||
colorDanger: "#ff6b6b",
|
||||
fontFamily: "JetBrains Mono, monospace",
|
||||
borderRadius: "4px",
|
||||
spacingUnit: "4px",
|
||||
},
|
||||
rules: {
|
||||
".Input": {
|
||||
backgroundColor: "#1a1a1a",
|
||||
border: "1px solid rgba(255, 255, 255, 0.17)",
|
||||
color: "#ffffff",
|
||||
},
|
||||
".Input:focus": {
|
||||
borderColor: "rgba(255, 255, 255, 0.35)",
|
||||
boxShadow: "none",
|
||||
},
|
||||
".Label": {
|
||||
color: "rgba(255, 255, 255, 0.59)",
|
||||
fontSize: "14px",
|
||||
marginBottom: "8px",
|
||||
},
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
<IntentForm plan={plan} workspaceID={selectedWorkspace()!} onSuccess={setSuccess} />
|
||||
</Elements>
|
||||
</Show>
|
||||
</>
|
||||
</Match>
|
||||
</Switch>
|
||||
</div>
|
||||
|
||||
{/* Workspace picker modal */}
|
||||
<Modal
|
||||
open={showWorkspacePicker() ?? false}
|
||||
onClose={() => {}}
|
||||
title={i18n.t("black.workspace.selectPlan")}
|
||||
variant="black"
|
||||
>
|
||||
<div data-component="black-workspace-picker-modal" data-slot="workspace-picker">
|
||||
<ul
|
||||
ref={listRef}
|
||||
data-slot="workspace-list"
|
||||
tabIndex={0}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === "Enter" && active()) {
|
||||
handleSelectWorkspace(active()!)
|
||||
} else {
|
||||
onKeyDown(e)
|
||||
}
|
||||
}}
|
||||
>
|
||||
<For each={workspaces()}>
|
||||
{(workspace) => (
|
||||
<li
|
||||
data-slot="workspace-item"
|
||||
data-active={active() === workspace.id}
|
||||
onMouseEnter={() => setActive(workspace.id)}
|
||||
onClick={() => handleSelectWorkspace(workspace.id)}
|
||||
>
|
||||
<span data-slot="selected-icon">[*]</span>
|
||||
<span>{workspace.name || workspace.slug}</span>
|
||||
</li>
|
||||
)}
|
||||
</For>
|
||||
</ul>
|
||||
</div>
|
||||
</Modal>
|
||||
<p data-slot="fine-print">
|
||||
{i18n.t("black.finePrint.beforeTerms")} ·{" "}
|
||||
<A href={language.route("/legal/terms-of-service")}>{i18n.t("black.finePrint.terms")}</A>
|
||||
</p>
|
||||
</section>
|
||||
</Show>
|
||||
)
|
||||
}
|
||||
|
|
@ -23,7 +23,7 @@ const checkLoggedIn = query(async () => {
|
|||
}, "checkLoggedIn.get")
|
||||
|
||||
const models = [
|
||||
{ name: "Grok 4.5", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention30" },
|
||||
{ name: "Grok 4.6", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention30" },
|
||||
{ name: "GPT 5.6 Luna", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention30" },
|
||||
{ name: "GLM-5.3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
|
||||
{ name: "GLM-5.2", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
|
||||
|
|
@ -70,8 +70,8 @@ function LimitsGraph(props: { href: string }) {
|
|||
const baseline = 100
|
||||
const graph = [
|
||||
{ id: "kimi-k3", name: "Kimi K3", req: 110, d: "50ms" },
|
||||
{ id: "grok-4.5", name: "Grok 4.5", req: 120, d: "75ms" },
|
||||
{ id: "qwen3.8-max", name: "Qwen3.8 Max", req: 160, d: "90ms" },
|
||||
{ id: "grok-4.6", name: "Grok 4.6", req: 169, d: "75ms" },
|
||||
{ id: "glm-5.2", name: "GLM-5.2", req: 880, d: "100ms" },
|
||||
{ id: "gpt-5.6-luna", name: "GPT 5.6 Luna", req: 2050, d: "290ms" },
|
||||
{ id: "minimax-m3", name: "MiniMax M3", req: 3200, d: "210ms" },
|
||||
|
|
@ -511,7 +511,7 @@ export default function Home() {
|
|||
</div>
|
||||
<div data-slot="faq-retention-notes">
|
||||
<p>
|
||||
<strong>Grok 4.5:</strong> {i18n.t("go.faq.a5.grokRetention")}{" "}
|
||||
<strong>Grok 4.6:</strong> {i18n.t("go.faq.a5.grokRetention")}{" "}
|
||||
<a href="https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr">
|
||||
{i18n.t("go.faq.a5.learnMore")}
|
||||
</a>
|
||||
|
|
|
|||
|
|
@ -205,6 +205,13 @@ export async function POST(input: APIEvent) {
|
|||
} else if (productID === BlackData.productID()) {
|
||||
await Billing.unsubscribeBlack({ subscriptionID })
|
||||
}
|
||||
|
||||
const latestInvoice = body.data.object.latest_invoice
|
||||
const invoiceID = typeof latestInvoice === "string" ? latestInvoice : latestInvoice?.id
|
||||
if (invoiceID) {
|
||||
const invoice = await Billing.stripe().invoices.retrieve(invoiceID)
|
||||
if (invoice.status === "open") await Billing.stripe().invoices.voidInvoice(invoiceID)
|
||||
}
|
||||
}
|
||||
if (body.type === "invoice.payment_succeeded") {
|
||||
if (
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
[data-slot="usage-item"] {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-2);
|
||||
|
|
@ -60,6 +61,119 @@
|
|||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
[data-slot="usage-details"] {
|
||||
margin-top: var(--space-1);
|
||||
}
|
||||
|
||||
[data-slot="usage-details-trigger"] {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
width: fit-content;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background-color: transparent;
|
||||
color: var(--color-text-secondary);
|
||||
font-size: var(--font-size-sm);
|
||||
cursor: pointer;
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background-color: transparent;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
svg {
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
&[aria-expanded="true"] svg {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
[data-slot="hide-details"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&[aria-expanded="true"] [data-slot="show-details"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&[aria-expanded="true"] [data-slot="hide-details"] {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
|
||||
[data-slot="usage-details-content"] {
|
||||
width: 100%;
|
||||
margin-top: var(--space-3);
|
||||
}
|
||||
|
||||
[data-slot="usage-details-loading"] {
|
||||
width: 100%;
|
||||
margin-top: var(--space-3);
|
||||
color: var(--color-text-muted);
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
[data-slot="usage-details-empty"] {
|
||||
margin: 0;
|
||||
color: var(--color-text-muted);
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
[data-slot="usage-details-table"] {
|
||||
overflow-x: auto;
|
||||
border: 1px solid var(--color-border-muted);
|
||||
border-radius: var(--border-radius-sm);
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
min-width: 28rem;
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
font-size: var(--font-size-sm);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
th,
|
||||
td {
|
||||
width: 25%;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
border-bottom: 1px solid var(--color-border-muted);
|
||||
text-align: end;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
|
||||
th {
|
||||
color: var(--color-text-muted);
|
||||
font-size: var(--font-size-xs);
|
||||
font-weight: 500;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
th:first-child,
|
||||
td:first-child {
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
td:first-child {
|
||||
max-width: 13rem;
|
||||
overflow: hidden;
|
||||
color: var(--color-text);
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
tbody tr:last-child td {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
[data-slot="usage-total"] td {
|
||||
border-top: 1px solid var(--color-border);
|
||||
color: var(--color-text);
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
|
||||
[data-slot="setting-row"] {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
|||
|
|
@ -1,15 +1,19 @@
|
|||
import { action, useParams, useAction, useSubmission, json, query, createAsync } from "@solidjs/router"
|
||||
import { createStore } from "solid-js/store"
|
||||
import { createMemo, For, Show } from "solid-js"
|
||||
import { createMemo, createSignal, For, Show } from "solid-js"
|
||||
import { Modal } from "~/component/modal"
|
||||
import { Billing } from "@opencode-ai/console-core/billing.js"
|
||||
import { Database, eq, and, isNull } from "@opencode-ai/console-core/drizzle/index.js"
|
||||
import { BillingTable, LiteTable } from "@opencode-ai/console-core/schema/billing.sql.js"
|
||||
import { Database, eq, and, gte, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js"
|
||||
import { BillingTable, LiteTable, UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js"
|
||||
import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
|
||||
import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
|
||||
import { Actor } from "@opencode-ai/console-core/actor.js"
|
||||
import { Workspace } from "@opencode-ai/console-core/workspace.js"
|
||||
import { Subscription } from "@opencode-ai/console-core/subscription.js"
|
||||
import { LiteData } from "@opencode-ai/console-core/lite.js"
|
||||
import { ZenData } from "@opencode-ai/console-core/model.js"
|
||||
import { getMonthlyBounds, getWeekBounds } from "@opencode-ai/console-core/util/date.js"
|
||||
import { centsToMicroCents } from "@opencode-ai/console-core/util/price.js"
|
||||
import { withActor } from "~/context/auth.withActor"
|
||||
import { queryBillingInfo } from "../../common"
|
||||
import styles from "./lite-section.module.css"
|
||||
|
|
@ -20,8 +24,12 @@ import { formatResetTime, liteResetTimeKeys } from "~/lib/format-reset-time"
|
|||
import { createReferralFromCookie } from "~/lib/referral-invite"
|
||||
import { getRequestEvent } from "solid-js/web"
|
||||
import { countryFromRequest } from "~/lib/request-country"
|
||||
import { checkCheckoutRateLimit } from "~/routes/zen/util/redis"
|
||||
|
||||
import { IconAlipay, IconUpi } from "~/component/icon"
|
||||
import { IconAlipay, IconChevron, IconUpi } from "~/component/icon"
|
||||
import { buildLiteUsageBreakdown, getModelQuotaLimit, getUsagePercent } from "~/lib/lite-usage"
|
||||
|
||||
type LiteUsageWindow = "rolling" | "weekly" | "monthly"
|
||||
|
||||
export const queryLiteSubscription = query(async (workspaceID: string) => {
|
||||
"use server"
|
||||
|
|
@ -51,6 +59,33 @@ export const queryLiteSubscription = query(async (workspaceID: string) => {
|
|||
|
||||
const limits = LiteData.getLimits()
|
||||
const mine = row.userID === Actor.userID()
|
||||
const now = new Date()
|
||||
const rollingCutoff = new Date(now.getTime() - limits.rollingWindow * 3600 * 1000)
|
||||
const week = getWeekBounds(now)
|
||||
const month = getMonthlyBounds(now, row.timeCreated)
|
||||
const rollingActive = !!row.timeRollingUpdated && row.timeRollingUpdated >= rollingCutoff
|
||||
const weeklyActive = !!row.timeWeeklyUpdated && row.timeWeeklyUpdated >= week.start
|
||||
const monthlyActive = !!row.timeMonthlyUpdated && row.timeMonthlyUpdated >= month.start
|
||||
const rollingLimit = centsToMicroCents(limits.rollingLimit * 100)
|
||||
const weeklyLimit = centsToMicroCents(limits.weeklyLimit * 100)
|
||||
const monthlyLimit = centsToMicroCents(limits.monthlyLimit * 100)
|
||||
const rollingUsage = Subscription.analyzeRollingUsage({
|
||||
limit: limits.rollingLimit,
|
||||
window: limits.rollingWindow,
|
||||
usage: row.rollingUsage ?? 0,
|
||||
timeUpdated: row.timeRollingUpdated ?? now,
|
||||
})
|
||||
const weeklyUsage = Subscription.analyzeWeeklyUsage({
|
||||
limit: limits.weeklyLimit,
|
||||
usage: row.weeklyUsage ?? 0,
|
||||
timeUpdated: row.timeWeeklyUpdated ?? now,
|
||||
})
|
||||
const monthlyUsage = Subscription.analyzeMonthlyUsage({
|
||||
limit: limits.monthlyLimit,
|
||||
usage: row.monthlyUsage ?? 0,
|
||||
timeUpdated: row.timeMonthlyUpdated ?? now,
|
||||
timeSubscribed: row.timeCreated,
|
||||
})
|
||||
|
||||
return {
|
||||
mine,
|
||||
|
|
@ -58,27 +93,126 @@ export const queryLiteSubscription = query(async (workspaceID: string) => {
|
|||
allowTraining: row.allowTraining ?? false,
|
||||
region:
|
||||
row.region ?? (await Workspace.setDefaultRegion({ country: countryFromRequest(getRequestEvent()?.request) })),
|
||||
rollingUsage: Subscription.analyzeRollingUsage({
|
||||
limit: limits.rollingLimit,
|
||||
window: limits.rollingWindow,
|
||||
usage: row.rollingUsage ?? 0,
|
||||
timeUpdated: row.timeRollingUpdated ?? new Date(),
|
||||
}),
|
||||
weeklyUsage: Subscription.analyzeWeeklyUsage({
|
||||
limit: limits.weeklyLimit,
|
||||
usage: row.weeklyUsage ?? 0,
|
||||
timeUpdated: row.timeWeeklyUpdated ?? new Date(),
|
||||
}),
|
||||
monthlyUsage: Subscription.analyzeMonthlyUsage({
|
||||
limit: limits.monthlyLimit,
|
||||
usage: row.monthlyUsage ?? 0,
|
||||
timeUpdated: row.timeMonthlyUpdated ?? new Date(),
|
||||
timeSubscribed: row.timeCreated,
|
||||
}),
|
||||
rollingUsage: {
|
||||
...rollingUsage,
|
||||
usage: rollingActive ? (row.rollingUsage ?? 0) : 0,
|
||||
limit: rollingLimit,
|
||||
usagePercent: getUsagePercent(rollingActive ? (row.rollingUsage ?? 0) : 0, rollingLimit),
|
||||
},
|
||||
weeklyUsage: {
|
||||
...weeklyUsage,
|
||||
usage: weeklyActive ? (row.weeklyUsage ?? 0) : 0,
|
||||
limit: weeklyLimit,
|
||||
usagePercent: getUsagePercent(weeklyActive ? (row.weeklyUsage ?? 0) : 0, weeklyLimit),
|
||||
},
|
||||
monthlyUsage: {
|
||||
...monthlyUsage,
|
||||
usage: monthlyActive ? (row.monthlyUsage ?? 0) : 0,
|
||||
limit: monthlyLimit,
|
||||
usagePercent: getUsagePercent(monthlyActive ? (row.monthlyUsage ?? 0) : 0, monthlyLimit),
|
||||
},
|
||||
}
|
||||
}, workspaceID)
|
||||
}, "lite.subscription.get")
|
||||
|
||||
export const queryLiteUsageDetails = query(async (workspaceID: string, window: LiteUsageWindow) => {
|
||||
"use server"
|
||||
return withActor(async () => {
|
||||
if (window !== "rolling" && window !== "weekly" && window !== "monthly") return null
|
||||
const row = await Database.use((tx) =>
|
||||
tx
|
||||
.select({
|
||||
userID: LiteTable.userID,
|
||||
rollingUsage: LiteTable.rollingUsage,
|
||||
weeklyUsage: LiteTable.weeklyUsage,
|
||||
monthlyUsage: LiteTable.monthlyUsage,
|
||||
timeRollingUpdated: LiteTable.timeRollingUpdated,
|
||||
timeWeeklyUpdated: LiteTable.timeWeeklyUpdated,
|
||||
timeMonthlyUpdated: LiteTable.timeMonthlyUpdated,
|
||||
timeCreated: LiteTable.timeCreated,
|
||||
})
|
||||
.from(LiteTable)
|
||||
.where(and(eq(LiteTable.workspaceID, Actor.workspace()), isNull(LiteTable.timeDeleted)))
|
||||
.then((result) => result[0]),
|
||||
)
|
||||
if (!row || row.userID !== Actor.userID()) return null
|
||||
|
||||
const limits = LiteData.getLimits()
|
||||
const now = new Date()
|
||||
const detail = (() => {
|
||||
if (window === "rolling") {
|
||||
const active =
|
||||
!!row.timeRollingUpdated &&
|
||||
row.timeRollingUpdated >= new Date(now.getTime() - limits.rollingWindow * 3600 * 1000)
|
||||
return {
|
||||
start: active ? row.timeRollingUpdated! : now,
|
||||
usage: active ? (row.rollingUsage ?? 0) : 0,
|
||||
limit: centsToMicroCents(limits.rollingLimit * 100),
|
||||
}
|
||||
}
|
||||
if (window === "weekly") {
|
||||
const start = getWeekBounds(now).start
|
||||
return {
|
||||
start,
|
||||
usage: row.timeWeeklyUpdated && row.timeWeeklyUpdated >= start ? (row.weeklyUsage ?? 0) : 0,
|
||||
limit: centsToMicroCents(limits.weeklyLimit * 100),
|
||||
}
|
||||
}
|
||||
const start = getMonthlyBounds(now, row.timeCreated).start
|
||||
return {
|
||||
start,
|
||||
usage: row.timeMonthlyUpdated && row.timeMonthlyUpdated >= start ? (row.monthlyUsage ?? 0) : 0,
|
||||
limit: centsToMicroCents(limits.monthlyLimit * 100),
|
||||
}
|
||||
})()
|
||||
const modelData = Object.fromEntries(
|
||||
Object.entries(ZenData.list("lite").models).map(([id, value]) => {
|
||||
const models = Array.isArray(value) ? value : [value]
|
||||
const multipliers = new Set(models.map((model) => model.costMultiplier))
|
||||
return [id, { name: models[0].name, multiplier: multipliers.size === 1 ? models[0].costMultiplier : undefined }]
|
||||
}),
|
||||
)
|
||||
const usageRows = await Database.use((tx) =>
|
||||
tx
|
||||
.select({
|
||||
model: UsageTable.model,
|
||||
multiplier: sql<string | null>`JSON_UNQUOTE(JSON_EXTRACT(${UsageTable.enrichment}, '$.costMultiplier'))`,
|
||||
cost: sql<string>`SUM(${UsageTable.cost})`,
|
||||
quotaCost: sql<string>`SUM(CASE WHEN JSON_EXTRACT(${UsageTable.enrichment}, '$.costMultiplier') IS NOT NULL THEN ROUND(${UsageTable.cost} * CAST(JSON_UNQUOTE(JSON_EXTRACT(${UsageTable.enrichment}, '$.costMultiplier')) AS DECIMAL(20, 8))) ELSE 0 END)`,
|
||||
})
|
||||
.from(UsageTable)
|
||||
.innerJoin(KeyTable, and(eq(KeyTable.id, UsageTable.keyID), eq(KeyTable.workspaceID, UsageTable.workspaceID)))
|
||||
.where(
|
||||
and(
|
||||
eq(UsageTable.workspaceID, Actor.workspace()),
|
||||
eq(KeyTable.userID, row.userID),
|
||||
gte(UsageTable.timeCreated, detail.start),
|
||||
sql`JSON_UNQUOTE(JSON_EXTRACT(${UsageTable.enrichment}, '$.plan')) = 'lite'`,
|
||||
),
|
||||
)
|
||||
.groupBy(UsageTable.model, sql`JSON_UNQUOTE(JSON_EXTRACT(${UsageTable.enrichment}, '$.costMultiplier'))`),
|
||||
)
|
||||
|
||||
return buildLiteUsageBreakdown({
|
||||
usage: detail.usage,
|
||||
limit: detail.limit,
|
||||
sources: usageRows.map((usage) => {
|
||||
const cost = Number(usage.cost)
|
||||
const info = modelData[usage.model]
|
||||
const multiplier = usage.multiplier === null ? info?.multiplier : Number(usage.multiplier)
|
||||
return {
|
||||
model: usage.model,
|
||||
name: info?.name ?? usage.model,
|
||||
cost,
|
||||
quotaCost: usage.multiplier === null ? Math.round(cost * (multiplier ?? 1)) : Number(usage.quotaCost),
|
||||
multiplier,
|
||||
estimated: usage.multiplier === null,
|
||||
}
|
||||
}),
|
||||
})
|
||||
}, workspaceID)
|
||||
}, "lite.subscription.usage")
|
||||
|
||||
type LiteSubscription = Awaited<ReturnType<typeof queryLiteSubscription>>
|
||||
|
||||
const createLiteCheckoutUrl = action(
|
||||
|
|
@ -86,6 +220,7 @@ const createLiteCheckoutUrl = action(
|
|||
"use server"
|
||||
return json(
|
||||
await withActor(async () => {
|
||||
await checkCheckoutRateLimit(Actor.account())
|
||||
const data = await Billing.generateLiteCheckoutUrl({ successUrl, cancelUrl, method })
|
||||
await createReferralFromCookie()
|
||||
return { error: undefined, data }
|
||||
|
|
@ -174,7 +309,16 @@ const setGoAllowTraining = action(async (form: FormData) => {
|
|||
)
|
||||
}, "go.allowTraining.set")
|
||||
|
||||
function LiteUsageItem(props: { label: string; usage: { usagePercent: number; resetInSec: number } }) {
|
||||
type LiteUsage = NonNullable<LiteSubscription>["rollingUsage"]
|
||||
type LiteUsageDetailsData = NonNullable<Awaited<ReturnType<typeof queryLiteUsageDetails>>>
|
||||
|
||||
function LiteUsageItem(props: {
|
||||
id: LiteUsageWindow
|
||||
label: string
|
||||
usage: LiteUsage
|
||||
open: boolean
|
||||
onToggle: () => void
|
||||
}) {
|
||||
const i18n = useI18n()
|
||||
|
||||
return (
|
||||
|
|
@ -183,17 +327,178 @@ function LiteUsageItem(props: { label: string; usage: { usagePercent: number; re
|
|||
<span data-slot="usage-label">{props.label}</span>
|
||||
<span data-slot="usage-value">{props.usage.usagePercent}%</span>
|
||||
</div>
|
||||
<div data-slot="progress">
|
||||
<div data-slot="progress-bar" style={{ width: `${props.usage.usagePercent}%` }} />
|
||||
<div
|
||||
data-slot="progress"
|
||||
role="progressbar"
|
||||
aria-label={props.label}
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100"
|
||||
aria-valuenow={Math.min(100, props.usage.usagePercent)}
|
||||
>
|
||||
<div data-slot="progress-bar" style={{ width: `${Math.min(100, props.usage.usagePercent)}%` }} />
|
||||
</div>
|
||||
<span data-slot="reset-time">
|
||||
{i18n.t("workspace.lite.subscription.resetsIn")}{" "}
|
||||
{formatResetTime(props.usage.resetInSec, i18n, liteResetTimeKeys)}
|
||||
</span>
|
||||
<Show when={props.usage.usage > 0}>
|
||||
<div data-slot="usage-details">
|
||||
<button
|
||||
type="button"
|
||||
data-slot="usage-details-trigger"
|
||||
aria-expanded={props.open}
|
||||
aria-controls={`usage-details-${props.id}`}
|
||||
onClick={props.onToggle}
|
||||
>
|
||||
<span data-slot="show-details">{i18n.t("workspace.lite.subscription.showDetails")}</span>
|
||||
<span data-slot="hide-details">{i18n.t("workspace.lite.subscription.hideDetails")}</span>
|
||||
<IconChevron />
|
||||
</button>
|
||||
</div>
|
||||
</Show>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function LiteUsageDetails(props: {
|
||||
id: LiteUsageWindow
|
||||
label: string
|
||||
quotaLabel: string
|
||||
usage: LiteUsageDetailsData
|
||||
}) {
|
||||
const i18n = useI18n()
|
||||
const language = useLanguage()
|
||||
const money = (amount: number) =>
|
||||
new Intl.NumberFormat(language.tag(language.locale()), {
|
||||
style: "currency",
|
||||
currency: "USD",
|
||||
minimumFractionDigits: 2,
|
||||
maximumFractionDigits: 4,
|
||||
}).format(amount / 100_000_000)
|
||||
const totalPercentage = () =>
|
||||
Number(props.usage.rows.reduce((total, row) => total + row.contributionPercent, 0).toFixed(1))
|
||||
|
||||
return (
|
||||
<div id={`usage-details-${props.id}`} data-slot="usage-details-content" role="region" aria-label={props.label}>
|
||||
<div data-slot="usage-details-table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{i18n.t("workspace.lite.subscription.model")}</th>
|
||||
<th>{props.label}</th>
|
||||
<th>{props.quotaLabel}</th>
|
||||
<th>{i18n.t("workspace.lite.subscription.contribution")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<For each={props.usage.rows}>
|
||||
{(row) => {
|
||||
const quota = getModelQuotaLimit(props.usage.limit, row.multiplier)
|
||||
return (
|
||||
<tr>
|
||||
<td>
|
||||
<bdi dir="auto">{row.name}</bdi>
|
||||
</td>
|
||||
<td>{row.cost === undefined ? "-" : money(row.cost)}</td>
|
||||
<td>{quota === undefined ? "-" : money(quota)}</td>
|
||||
<td>{row.contributionPercent}%</td>
|
||||
</tr>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
<tr data-slot="usage-total">
|
||||
<td colSpan={3}>{i18n.t("workspace.lite.subscription.total")}</td>
|
||||
<td>{totalPercentage()}%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function LiteUsageGroup(props: { lite: NonNullable<LiteSubscription> }) {
|
||||
const params = useParams()
|
||||
const i18n = useI18n()
|
||||
const [open, setOpen] = createSignal<LiteUsageWindow>()
|
||||
const [store, setStore] = createStore({
|
||||
details: {} as Partial<Record<LiteUsageWindow, LiteUsageDetailsData | null>>,
|
||||
loading: undefined as LiteUsageWindow | undefined,
|
||||
})
|
||||
const items = () =>
|
||||
[
|
||||
{
|
||||
id: "rolling",
|
||||
label: i18n.t("workspace.lite.subscription.rollingUsage"),
|
||||
quotaLabel: i18n.t("workspace.lite.subscription.rollingQuota"),
|
||||
usage: props.lite.rollingUsage,
|
||||
},
|
||||
{
|
||||
id: "weekly",
|
||||
label: i18n.t("workspace.lite.subscription.weeklyUsage"),
|
||||
quotaLabel: i18n.t("workspace.lite.subscription.weeklyQuota"),
|
||||
usage: props.lite.weeklyUsage,
|
||||
},
|
||||
{
|
||||
id: "monthly",
|
||||
label: i18n.t("workspace.lite.subscription.monthlyUsage"),
|
||||
quotaLabel: i18n.t("workspace.lite.subscription.monthlyQuota"),
|
||||
usage: props.lite.monthlyUsage,
|
||||
},
|
||||
] as const
|
||||
const selected = createMemo(() => items().find((item) => item.id === open()))
|
||||
|
||||
async function toggle(id: LiteUsageWindow) {
|
||||
if (open() === id) {
|
||||
setOpen()
|
||||
return
|
||||
}
|
||||
setOpen(id)
|
||||
if (store.details[id] !== undefined) return
|
||||
setStore("loading", id)
|
||||
const details = await queryLiteUsageDetails(params.id!, id).catch(() => null)
|
||||
setStore("details", id, details)
|
||||
setStore("loading", (current) => (current === id ? undefined : current))
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div data-slot="usage">
|
||||
<For each={items()}>
|
||||
{(item) => (
|
||||
<LiteUsageItem
|
||||
id={item.id}
|
||||
label={item.label}
|
||||
usage={item.usage}
|
||||
open={open() === item.id}
|
||||
onToggle={() => toggle(item.id)}
|
||||
/>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
<Show when={selected()}>
|
||||
{(item) => {
|
||||
const details = () => store.details[item().id]
|
||||
return (
|
||||
<Show
|
||||
when={details()}
|
||||
fallback={
|
||||
<Show when={store.loading === item().id}>
|
||||
<div data-slot="usage-details-loading">{i18n.t("workspace.lite.loading")}</div>
|
||||
</Show>
|
||||
}
|
||||
>
|
||||
{(usage) => (
|
||||
<LiteUsageDetails id={item().id} label={item().label} quotaLabel={item().quotaLabel} usage={usage()} />
|
||||
)}
|
||||
</Show>
|
||||
)
|
||||
}}
|
||||
</Show>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export function LiteSection(props: { lite: LiteSubscription | undefined }) {
|
||||
const params = useParams()
|
||||
const i18n = useI18n()
|
||||
|
|
@ -261,11 +566,7 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
|
|||
</a>
|
||||
.
|
||||
</div>
|
||||
<div data-slot="usage">
|
||||
<LiteUsageItem label={i18n.t("workspace.lite.subscription.rollingUsage")} usage={sub().rollingUsage} />
|
||||
<LiteUsageItem label={i18n.t("workspace.lite.subscription.weeklyUsage")} usage={sub().weeklyUsage} />
|
||||
<LiteUsageItem label={i18n.t("workspace.lite.subscription.monthlyUsage")} usage={sub().monthlyUsage} />
|
||||
</div>
|
||||
<LiteUsageGroup lite={sub()} />
|
||||
<form action={setLiteUseBalance} method="post" data-slot="setting-row">
|
||||
<p>{i18n.t("workspace.lite.subscription.useBalance")}</p>
|
||||
<input type="hidden" name="workspaceID" value={params.id} />
|
||||
|
|
@ -339,7 +640,7 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
|
|||
</p>
|
||||
<h3 data-slot="promo-models-title">{i18n.t("workspace.lite.promo.modelsTitle")}</h3>
|
||||
<ul data-slot="promo-models">
|
||||
<li>Grok 4.5</li>
|
||||
<li>Grok 4.6</li>
|
||||
<li>GPT 5.6 Luna</li>
|
||||
<li>GLM-5.3</li>
|
||||
<li>GLM-5.2</li>
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import { Billing } from "@opencode-ai/console-core/billing.js"
|
|||
import { and, Database, desc, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js"
|
||||
import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
|
||||
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
|
||||
import { checkCheckoutRateLimit } from "~/routes/zen/util/redis"
|
||||
|
||||
export function formatDateForTable(date: Date) {
|
||||
const options: Intl.DateTimeFormatOptions = {
|
||||
|
|
@ -77,7 +78,8 @@ export const createCheckoutUrl = action(
|
|||
return json(
|
||||
await withActor(
|
||||
() =>
|
||||
Billing.generateCheckoutUrl({ amount, successUrl, cancelUrl })
|
||||
checkCheckoutRateLimit(Actor.account())
|
||||
.then(() => Billing.generateCheckoutUrl({ amount, successUrl, cancelUrl }))
|
||||
.then((data) => ({ error: undefined, data }))
|
||||
.catch((e) => ({
|
||||
error: e.message as string,
|
||||
|
|
|
|||
|
|
@ -234,12 +234,18 @@ export async function handler(
|
|||
}
|
||||
headers.set(k, v)
|
||||
})
|
||||
if (isNewInference) {
|
||||
headers.set("x-zen-model", model)
|
||||
}
|
||||
headers.delete("host")
|
||||
headers.delete("content-length")
|
||||
headers.delete("x-opencode-request")
|
||||
if (!isNewInference) headers.delete("x-opencode-session")
|
||||
headers.delete("x-opencode-project")
|
||||
headers.delete("x-opencode-client")
|
||||
if (!isNewInference) {
|
||||
headers.delete("x-opencode-session")
|
||||
headers.delete("x-opencode-project")
|
||||
headers.delete("x-opencode-client")
|
||||
headers.delete("x-opencode-request")
|
||||
headers.delete("x-zen-model")
|
||||
}
|
||||
return headers
|
||||
})(),
|
||||
body: reqBody,
|
||||
|
|
@ -1108,7 +1114,7 @@ export async function handler(
|
|||
enrichment: (() => {
|
||||
if (billingSource === "subscription") return { plan: "sub" }
|
||||
if (billingSource === "byok") return { plan: "byok" }
|
||||
if (billingSource === "lite") return { plan: "lite" }
|
||||
if (billingSource === "lite") return { plan: "lite", costMultiplier: modelInfo.costMultiplier }
|
||||
return undefined
|
||||
})(),
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -16,3 +16,11 @@ export function getRedis() {
|
|||
export function buildRateLimitKey(kind: string, identifier: string, interval?: string) {
|
||||
return `${Resource.App.stage}:ratelimit:${kind}:${identifier}${interval ? `:${interval}` : ""}`
|
||||
}
|
||||
|
||||
export async function checkCheckoutRateLimit(accountID: string) {
|
||||
const redis = getRedis()
|
||||
const key = buildRateLimitKey("checkout", accountID)
|
||||
const count = await redis.incr(key)
|
||||
if (count === 1) await redis.expire(key, 60 * 60)
|
||||
if (count > 5) throw new Error("Too many payment attempts. Please try again later.")
|
||||
}
|
||||
|
|
|
|||
75
packages/console/app/test/liteUsage.test.ts
Normal file
75
packages/console/app/test/liteUsage.test.ts
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
import { describe, expect, test } from "bun:test"
|
||||
import { buildLiteUsageBreakdown, getModelQuotaLimit } from "../src/lib/lite-usage"
|
||||
|
||||
describe("Go usage breakdown", () => {
|
||||
test("derives the model quota from the window limit and multiplier", () => {
|
||||
expect(getModelQuotaLimit(30, 1)).toBe(30)
|
||||
expect(getModelQuotaLimit(30, 2)).toBe(15)
|
||||
expect(getModelQuotaLimit(30, 4)).toBe(7.5)
|
||||
})
|
||||
|
||||
test("groups model quota usage into the percentage of the limit", () => {
|
||||
const result = buildLiteUsageBreakdown({
|
||||
usage: 416,
|
||||
limit: 1_200,
|
||||
sources: [
|
||||
{ model: "glm", name: "GLM", cost: 200, quotaCost: 300, multiplier: 1.5, estimated: false },
|
||||
{ model: "kimi", name: "Kimi", cost: 116, quotaCost: 116, multiplier: 1, estimated: false },
|
||||
],
|
||||
})
|
||||
|
||||
expect(result.usagePercent).toBe(34.7)
|
||||
expect(result.rows[0]).toMatchObject({ name: "GLM", multiplier: 1.5, contributionPercent: 25 })
|
||||
expect(result.rows.reduce((total, row) => total + row.contributionPercent, 0)).toBeCloseTo(result.usagePercent)
|
||||
})
|
||||
|
||||
test("distributes credits across the model contributions", () => {
|
||||
const result = buildLiteUsageBreakdown({
|
||||
usage: 366,
|
||||
limit: 1_200,
|
||||
sources: [
|
||||
{ model: "glm", name: "GLM", cost: 200, quotaCost: 300, multiplier: 1.5, estimated: false },
|
||||
{ model: "kimi", name: "Kimi", cost: 116, quotaCost: 116, multiplier: 1, estimated: true },
|
||||
],
|
||||
})
|
||||
|
||||
expect(result.rows).toHaveLength(2)
|
||||
expect(result.rows.every((row) => row.contributionPercent >= 0)).toBe(true)
|
||||
expect(result.rows.reduce((total, row) => total + row.contributionPercent, 0)).toBeCloseTo(result.usagePercent)
|
||||
})
|
||||
|
||||
test("does not synthesize a row when request history is unavailable", () => {
|
||||
const result = buildLiteUsageBreakdown({ usage: 120, limit: 1_200, sources: [] })
|
||||
|
||||
expect(result.rows).toEqual([])
|
||||
})
|
||||
|
||||
test("allocates rounded percentages without making positive rows negative", () => {
|
||||
const sources = Array.from({ length: 20 }, (_, index) => ({
|
||||
model: `model-${index}`,
|
||||
name: `Model ${index}`,
|
||||
cost: 4,
|
||||
quotaCost: 4,
|
||||
multiplier: 1,
|
||||
estimated: false,
|
||||
}))
|
||||
const result = buildLiteUsageBreakdown({ usage: 80, limit: 10_000, sources })
|
||||
|
||||
expect(result.rows.every((row) => row.contributionPercent >= 0)).toBe(true)
|
||||
expect(result.rows.reduce((total, row) => total + row.contributionPercent, 0)).toBeCloseTo(result.usagePercent)
|
||||
})
|
||||
|
||||
test("keeps multiplier changes for the same model as separate rows", () => {
|
||||
const result = buildLiteUsageBreakdown({
|
||||
usage: 500,
|
||||
limit: 1_000,
|
||||
sources: [
|
||||
{ model: "glm", name: "GLM", cost: 100, quotaCost: 100, multiplier: 1, estimated: false },
|
||||
{ model: "glm", name: "GLM", cost: 200, quotaCost: 400, multiplier: 2, estimated: false },
|
||||
],
|
||||
})
|
||||
|
||||
expect(result.rows.map((row) => row.multiplier)).toEqual([2, 1])
|
||||
expect(result.rows.map((row) => row.contributionPercent)).toEqual([40, 10])
|
||||
})
|
||||
})
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/console-core",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ export const UsageTable = mysqlTable(
|
|||
sessionID: varchar("session_id", { length: 30 }),
|
||||
enrichment: json("enrichment").$type<{
|
||||
plan: "sub" | "byok" | "lite"
|
||||
costMultiplier?: number
|
||||
}>(),
|
||||
},
|
||||
(table) => [...workspaceIndexes(table), index("usage_time_created").on(table.workspaceID, table.timeCreated)],
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/console-function",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/console-mail",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"dependencies": {
|
||||
"@jsx-email/all": "2.2.3",
|
||||
"@jsx-email/cli": "1.4.3",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/console-support",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"name": "@opencode-ai/core",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -54,12 +54,39 @@ export function applyOnly(db: Database, input: Migration[]) {
|
|||
if (
|
||||
yield* db.get(sql`SELECT name FROM sqlite_master WHERE type = 'table' AND name = ${"__drizzle_migrations"}`)
|
||||
) {
|
||||
yield* db.run(sql`
|
||||
INSERT OR IGNORE INTO ${sql.identifier("migration")} (id, time_completed)
|
||||
SELECT name, ${Date.now()}
|
||||
FROM ${sql.identifier("__drizzle_migrations")}
|
||||
WHERE name IS NOT NULL
|
||||
`)
|
||||
const named = (yield* db.all<{ name: string }>(
|
||||
sql`SELECT name FROM pragma_table_info('__drizzle_migrations')`,
|
||||
)).some((column) => column.name === "name")
|
||||
|
||||
if (named) {
|
||||
yield* db.run(sql`
|
||||
INSERT OR IGNORE INTO ${sql.identifier("migration")} (id, time_completed)
|
||||
SELECT name, ${Date.now()}
|
||||
FROM ${sql.identifier("__drizzle_migrations")}
|
||||
WHERE name IS NOT NULL
|
||||
`)
|
||||
}
|
||||
|
||||
if (!named) {
|
||||
const entries = yield* db.all<{ created_at: number; prefix: string | null }>(sql`
|
||||
SELECT created_at, strftime('%Y%m%d%H%M%S', created_at / 1000, 'unixepoch') AS prefix
|
||||
FROM ${sql.identifier("__drizzle_migrations")}
|
||||
WHERE created_at IS NOT NULL
|
||||
`)
|
||||
|
||||
for (const entry of entries) {
|
||||
const migration = input.find((item) => item.id.startsWith(`${entry.prefix}_`))
|
||||
if (!migration) {
|
||||
return yield* Effect.die(
|
||||
new Error(`Legacy migration timestamp ${entry.created_at} does not match any known migration`),
|
||||
)
|
||||
}
|
||||
yield* db.run(sql`
|
||||
INSERT OR IGNORE INTO ${sql.identifier("migration")} (id, time_completed)
|
||||
VALUES (${migration.id}, ${Date.now()})
|
||||
`)
|
||||
}
|
||||
}
|
||||
completed = new Set(
|
||||
(yield* db.all<{ id: string }>(sql`SELECT id FROM ${sql.identifier("migration")}`)).map((row) => row.id),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@ export default {
|
|||
id: "20260410174513_workspace-name",
|
||||
up(tx) {
|
||||
return Effect.gen(function* () {
|
||||
const columns = yield* tx.all<{ name: string }>(`PRAGMA table_info(\`workspace\`)`)
|
||||
const name = columns.some((column) => column.name === "name") ? "`name`" : "''"
|
||||
|
||||
yield* tx.run(`PRAGMA foreign_keys=OFF;`)
|
||||
yield* tx.run(`
|
||||
CREATE TABLE \`__new_workspace\` (
|
||||
|
|
@ -19,7 +22,7 @@ export default {
|
|||
);
|
||||
`)
|
||||
yield* tx.run(
|
||||
`INSERT INTO \`__new_workspace\`(\`id\`, \`type\`, \`branch\`, \`name\`, \`directory\`, \`extra\`, \`project_id\`) SELECT \`id\`, \`type\`, \`branch\`, \`name\`, \`directory\`, \`extra\`, \`project_id\` FROM \`workspace\`;`,
|
||||
`INSERT INTO \`__new_workspace\`(\`id\`, \`type\`, \`branch\`, \`name\`, \`directory\`, \`extra\`, \`project_id\`) SELECT \`id\`, \`type\`, \`branch\`, ${name}, \`directory\`, \`extra\`, \`project_id\` FROM \`workspace\`;`,
|
||||
)
|
||||
yield* tx.run(`DROP TABLE \`workspace\`;`)
|
||||
yield* tx.run(`ALTER TABLE \`__new_workspace\` RENAME TO \`workspace\`;`)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import { Effect, Layer } from "effect"
|
|||
import { eq, inArray, sql } from "drizzle-orm"
|
||||
import { DatabaseMigration } from "@opencode-ai/core/database/migration"
|
||||
import { migrations } from "@opencode-ai/core/database/migration.gen"
|
||||
import workspaceNameMigration from "@opencode-ai/core/database/migration/20260410174513_workspace-name"
|
||||
import sessionUsageMigration from "@opencode-ai/core/database/migration/20260510033149_session_usage"
|
||||
import normalizeStoragePathsMigration from "@opencode-ai/core/database/migration/20260601010001_normalize_storage_paths"
|
||||
import sessionMessageProjectionOrderMigration from "@opencode-ai/core/database/migration/20260603040000_session_message_projection_order"
|
||||
|
|
@ -38,6 +39,68 @@ const run = <A, E>(effect: Effect.Effect<A, E, SqlClientService>) =>
|
|||
const makeDb = EffectDrizzleSqlite.makeWithDefaults()
|
||||
|
||||
describe("DatabaseMigration", () => {
|
||||
test("defaults missing workspace names while preserving legacy workspace data", async () => {
|
||||
await run(
|
||||
Effect.gen(function* () {
|
||||
const db = yield* makeDb
|
||||
yield* db.run(sql`
|
||||
CREATE TABLE workspace (
|
||||
id text PRIMARY KEY,
|
||||
type text NOT NULL,
|
||||
branch text,
|
||||
directory text,
|
||||
extra text,
|
||||
project_id text NOT NULL
|
||||
)
|
||||
`)
|
||||
yield* db.run(sql`
|
||||
INSERT INTO workspace (id, type, branch, directory, extra, project_id)
|
||||
VALUES ('wrk_legacy', 'remote', 'main', '/repo', '{}', 'proj_legacy')
|
||||
`)
|
||||
|
||||
yield* DatabaseMigration.applyOnly(db, [workspaceNameMigration])
|
||||
|
||||
expect(yield* db.get(sql`SELECT id, name, branch, directory, extra FROM workspace`)).toEqual({
|
||||
id: "wrk_legacy",
|
||||
name: "",
|
||||
branch: "main",
|
||||
directory: "/repo",
|
||||
extra: "{}",
|
||||
})
|
||||
}),
|
||||
)
|
||||
})
|
||||
|
||||
test("imports unnamed legacy Drizzle journal entries by their actual migration timestamps", async () => {
|
||||
await run(
|
||||
Effect.gen(function* () {
|
||||
const db = yield* makeDb
|
||||
yield* db.run(sql`CREATE TABLE __drizzle_migrations (id integer PRIMARY KEY, hash text, created_at integer)`)
|
||||
yield* db.run(sql`
|
||||
INSERT INTO __drizzle_migrations (hash, created_at)
|
||||
VALUES ('', ${Date.UTC(2026, 3, 10, 17, 45, 13)})
|
||||
`)
|
||||
|
||||
yield* DatabaseMigration.applyOnly(db, [workspaceNameMigration])
|
||||
|
||||
expect(yield* db.all(sql`SELECT id FROM migration`)).toEqual([{ id: "20260410174513_workspace-name" }])
|
||||
}),
|
||||
)
|
||||
})
|
||||
|
||||
test("rejects unknown legacy Drizzle journal timestamps instead of guessing completed migrations", async () => {
|
||||
await expect(
|
||||
run(
|
||||
Effect.gen(function* () {
|
||||
const db = yield* makeDb
|
||||
yield* db.run(sql`CREATE TABLE __drizzle_migrations (id integer PRIMARY KEY, hash text, created_at integer)`)
|
||||
yield* db.run(sql`INSERT INTO __drizzle_migrations (hash, created_at) VALUES ('', 1234567890000)`)
|
||||
yield* DatabaseMigration.applyOnly(db, [workspaceNameMigration])
|
||||
}),
|
||||
),
|
||||
).rejects.toThrow("does not match any known migration")
|
||||
})
|
||||
|
||||
test("serializes concurrent embedded initialization for one database path", async () => {
|
||||
await using tmp = await tmpdir()
|
||||
const filename = path.join(tmp.path, "embedded.sqlite")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@opencode-ai/desktop",
|
||||
"private": true,
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"homepage": "https://opencode.ai",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"name": "@opencode-ai/effect-drizzle-sqlite",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"name": "@opencode-ai/effect-sqlite-node",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/enterprise",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/function",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"name": "@opencode-ai/http-recorder",
|
||||
"description": "Record and replay Effect HTTP client traffic with deterministic cassettes",
|
||||
"type": "module",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"name": "@opencode-ai/llm",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"name": "opencode",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/plugin",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/sdk",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/server",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/session-ui",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/slack",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/stats-app",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/stats-core",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/stats-server",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@opencode-ai/tui",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@opencode-ai/ui",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
|
|
|
|||
|
|
@ -88,10 +88,10 @@ function init() {
|
|||
setClosing = setClosingSignal
|
||||
return (
|
||||
<Kobalte
|
||||
modal
|
||||
modal={stack().at(-1)?.id === id}
|
||||
open={!closing()}
|
||||
onOpenChange={(open: boolean) => {
|
||||
if (open) return
|
||||
if (open || stack().at(-1)?.id !== id) return
|
||||
close(id)
|
||||
}}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"name": "@opencode-ai/web",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev",
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
|||
|
||||
تشمل قائمة النماذج الحالية:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
|||
|
||||
| Model | الطلبات لكل 5 ساعات | الطلبات في الأسبوع | الطلبات في الشهر |
|
||||
| ---------------------------- | ------------------- | ------------------ | ---------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
|||
|
||||
تستند التقديرات إلى أنماط الطلبات المرصودة:
|
||||
|
||||
- Grok 4.5 — 1,100 input، و71,500 cached، و220 output tokens لكل طلب
|
||||
- Grok 4.6 — 390 input، و32,500 cached، و120 output tokens لكل طلب
|
||||
- GLM-5.3/5.2/5.1 — 700 input، و52,000 cached، و150 output tokens لكل طلب
|
||||
- GPT 5.6 Luna — 1,000 توكن إدخال، و50,000 توكن مخزّن مؤقتًا، و220 توكن إخراج لكل طلب
|
||||
- Kimi K3 — 1,050 input، و76,500 cached، و300 output tokens لكل طلب
|
||||
|
|
@ -141,7 +141,8 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
|||
|
||||
| النموذج | الإدخال | الإخراج | القراءة المخزنة | الكتابة المخزنة | الاستخدام |
|
||||
| --------------------------------------- | ------- | ------- | --------------- | --------------- | --------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
|||
|
||||
| Model | Model ID | Endpoint | AI SDK Package |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| النموذج | تدريب النموذج | الاحتفاظ بالبيانات |
|
||||
| ---------------------------- | ------------- | ------------------ |
|
||||
| Grok 4.5 | غير مستخدَمة | 30 يومًا |
|
||||
| Grok 4.6 | غير مستخدَمة | 30 يومًا |
|
||||
| GPT 5.6 Luna | غير مستخدَمة | 30 يومًا |
|
||||
| GLM-5.3 | غير مستخدَمة | 0 أيام |
|
||||
| GLM-5.2 | غير مستخدَمة | 0 أيام |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | غير مستخدَمة | 0 أيام |
|
||||
| Ox Alpha Free | غير مستخدَمة | 0 أيام |
|
||||
|
||||
- **Grok 4.5:** تعطّل ZDR ميزات API مهمة تعتمد على البيانات المخزنة، بما في ذلك Responses API ذات الحالة، وFiles and Collections، وBatch API. [اعرف المزيد](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** تعطّل ZDR ميزات API مهمة تعتمد على البيانات المخزنة، بما في ذلك Responses API ذات الحالة، وFiles and Collections، وBatch API. [اعرف المزيد](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** تُنشأ سجلات مراقبة إساءة الاستخدام لكل استخدام لميزات API، ويُحتفظ بها لمدة تصل إلى 30 يومًا. [اعرف المزيد](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** أسعار توكنات مخفّضة للغاية مقابل منح الإذن باستخدام مطالباتك وإكمالات النموذج لتدريب نماذج Meta المستقبلية. يقتصر التوفر على المناطق التي تسمح بها [سياسة الاستخدام الجغرافي](https://ai.developer.meta.com/legal/geographic-use-policy) الخاصة بـ Meta. [اعرف المزيد](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** تُجدَّد اتفاقية ZDR شهريًا. الاتفاقية الحالية سارية حتى 31 أغسطس 2026.
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Samo jedan član po radnom prostoru (workspace) može se pretplatiti na OpenCode
|
|||
|
||||
Trenutna lista modela uključuje:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -101,7 +101,7 @@ Tabela ispod pruža procijenjeni broj zahtjeva na osnovu tipičnih obrazaca kori
|
|||
|
||||
| Model | zahtjeva na 5 sati | zahtjeva sedmično | zahtjeva mjesečno |
|
||||
| ---------------------------- | ------------------ | ----------------- | ----------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -127,7 +127,7 @@ Tabela ispod pruža procijenjeni broj zahtjeva na osnovu tipičnih obrazaca kori
|
|||
|
||||
Procjene se zasnivaju na zapaženim obrascima zahtjeva:
|
||||
|
||||
- Grok 4.5 — 1,100 ulaznih, 71,500 keširanih, 220 izlaznih tokena po zahtjevu
|
||||
- Grok 4.6 — 390 ulaznih, 32,500 keširanih, 120 izlaznih tokena po zahtjevu
|
||||
- GLM-5.3/5.2/5.1 — 700 ulaznih (input), 52,000 keširanih, 150 izlaznih (output) tokena po zahtjevu
|
||||
- GPT 5.6 Luna — 1,000 ulaznih, 50,000 keširanih, 220 izlaznih tokena po zahtjevu
|
||||
- Kimi K3 — 1,050 ulaznih, 76,500 keširanih, 300 izlaznih tokena po zahtjevu
|
||||
|
|
@ -151,7 +151,8 @@ Procjene se također zasnivaju na sljedećim cijenama po 1M tokena i mjesečnoj
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Potrošnja |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | --------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -224,7 +225,7 @@ Također možete pristupiti Go modelima putem sljedećih API endpointa.
|
|||
|
||||
| Model | Model ID | Endpoint | AI SDK Paket |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -269,7 +270,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Model | Treniranje modela | Zadržavanje podataka |
|
||||
| ---------------------------- | ----------------- | -------------------- |
|
||||
| Grok 4.5 | Ne koristi se | 30 dana |
|
||||
| Grok 4.6 | Ne koristi se | 30 dana |
|
||||
| GPT 5.6 Luna | Ne koristi se | 30 dana |
|
||||
| GLM-5.3 | Ne koristi se | 0 dana |
|
||||
| GLM-5.2 | Ne koristi se | 0 dana |
|
||||
|
|
@ -293,7 +294,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Ne koristi se | 0 dana |
|
||||
| Ox Alpha Free | Ne koristi se | 0 dana |
|
||||
|
||||
- **Grok 4.5:** ZDR onemogućava važne API funkcije koje zavise od pohranjenih podataka, uključujući Responses API s očuvanjem stanja, Files and Collections i Batch API. [Saznajte više](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR onemogućava važne API funkcije koje zavise od pohranjenih podataka, uključujući Responses API s očuvanjem stanja, Files and Collections i Batch API. [Saznajte više](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Zapisi o nadzoru zloupotrebe generišu se za svako korištenje API funkcija i čuvaju do 30 dana. [Saznajte više](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Znatno snižene cijene tokena u zamjenu za dopuštenje da se vaši promptovi i odgovori modela koriste za treniranje budućih Meta modela. Dostupnost je ograničena na regije dopuštene [Pravilima geografskog korištenja](https://ai.developer.meta.com/legal/geographic-use-policy) kompanije Meta. [Saznajte više](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** ZDR sporazum obnavlja se mjesečno. Trenutni sporazum važi do 31. augusta 2026.
|
||||
|
|
|
|||
|
|
@ -701,6 +701,7 @@ OpenCode can be configured using environment variables.
|
|||
| `OPENCODE_FAKE_VCS` | string | Fake VCS provider for testing purposes |
|
||||
| `OPENCODE_CLIENT` | string | Client identifier (defaults to `cli`) |
|
||||
| `OPENCODE_ENABLE_EXA` | boolean | Enable Exa web search tools |
|
||||
| `OPENCODE_ENABLE_PARALLEL` | boolean | Enable Parallel web search tools |
|
||||
| `OPENCODE_SERVER_PASSWORD` | string | Enable basic auth for `serve`/`web` |
|
||||
| `OPENCODE_SERVER_USERNAME` | string | Override basic auth username (default `opencode`) |
|
||||
| `OPENCODE_MODELS_URL` | string | Custom URL for fetching models configuration |
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Kun ét medlem per arbejdsområde kan abonnere på OpenCode Go.
|
|||
|
||||
Den nuværende liste over modeller inkluderer:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -101,7 +101,7 @@ Tabellen nedenfor giver et estimeret antal anmodninger baseret på typiske Go-fo
|
|||
|
||||
| Model | anmodninger pr. 5 timer | anmodninger pr. uge | anmodninger pr. måned |
|
||||
| ---------------------------- | ----------------------- | ------------------- | --------------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -127,7 +127,7 @@ Tabellen nedenfor giver et estimeret antal anmodninger baseret på typiske Go-fo
|
|||
|
||||
Estimaterne er baseret på observerede anmodningsmønstre:
|
||||
|
||||
- Grok 4.5 — 1.100 input, 71.500 cachelagrede, 220 output-tokens pr. anmodning
|
||||
- Grok 4.6 — 390 input, 32.500 cachelagrede, 120 output-tokens pr. anmodning
|
||||
- GLM-5.3/5.2/5.1 — 700 input, 52.000 cachelagrede, 150 output-tokens pr. anmodning
|
||||
- GPT 5.6 Luna — 1.000 input, 50.000 cachelagrede, 220 output-tokens pr. anmodning
|
||||
- Kimi K3 — 1.050 input, 76.500 cachelagrede, 300 output-tokens pr. anmodning
|
||||
|
|
@ -151,7 +151,8 @@ Estimaterne er også baseret på følgende priser pr. 1M tokens og det månedlig
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Forbrug |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -224,7 +225,7 @@ Du kan også få adgang til Go-modeller gennem følgende API-endpoints.
|
|||
|
||||
| Model | Model ID | Endpoint | AI SDK Package |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -269,7 +270,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Model | Modeltræning | Dataopbevaring |
|
||||
| ---------------------------- | ------------ | -------------- |
|
||||
| Grok 4.5 | Ikke brugt | 30 dage |
|
||||
| Grok 4.6 | Ikke brugt | 30 dage |
|
||||
| GPT 5.6 Luna | Ikke brugt | 30 dage |
|
||||
| GLM-5.3 | Ikke brugt | 0 dage |
|
||||
| GLM-5.2 | Ikke brugt | 0 dage |
|
||||
|
|
@ -293,7 +294,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Ikke brugt | 0 dage |
|
||||
| Ox Alpha Free | Ikke brugt | 0 dage |
|
||||
|
||||
- **Grok 4.5:** ZDR deaktiverer vigtige API-funktioner, der afhænger af lagrede data, herunder den tilstandsbevarende Responses API, Files and Collections og Batch API. [Læs mere](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR deaktiverer vigtige API-funktioner, der afhænger af lagrede data, herunder den tilstandsbevarende Responses API, Files and Collections og Batch API. [Læs mere](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Logfiler til overvågning af misbrug genereres ved al brug af API-funktioner og opbevares i op til 30 dage. [Læs mere](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Kraftigt nedsatte tokenpriser til gengæld for tilladelse til at bruge dine prompts og modelsvar til at træne fremtidige Meta-modeller. Tilgængeligheden er begrænset til regioner, der er tilladt i henhold til [politikken for geografisk brug](https://ai.developer.meta.com/legal/geographic-use-policy) fra Meta. [Læs mere](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** ZDR-aftalen fornyes månedligt. Den nuværende aftale er gyldig til og med 31. august 2026.
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ Nur ein Mitglied pro Workspace kann OpenCode Go abonnieren.
|
|||
|
||||
Die aktuelle Liste der Modelle umfasst:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -93,7 +93,7 @@ Die folgende Tabelle zeigt eine geschätzte Anzahl von Anfragen basierend auf ty
|
|||
|
||||
| Model | Anfragen pro 5 Stunden | Anfragen pro Woche | Anfragen pro Monat |
|
||||
| ---------------------------- | ---------------------- | ------------------ | ------------------ |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -119,7 +119,7 @@ Die folgende Tabelle zeigt eine geschätzte Anzahl von Anfragen basierend auf ty
|
|||
|
||||
Die Schätzungen basieren auf beobachteten Anfragemustern:
|
||||
|
||||
- Grok 4.5 — 1.100 Input-, 71.500 Cached-, 220 Output-Tokens pro Anfrage
|
||||
- Grok 4.6 — 390 Input-, 32.500 Cached-, 120 Output-Tokens pro Anfrage
|
||||
- GLM-5.3/5.2/5.1 — 700 Input-, 52.000 Cached-, 150 Output-Tokens pro Anfrage
|
||||
- GPT 5.6 Luna — 1.000 Input-, 50.000 Cached-, 220 Output-Tokens pro Anfrage
|
||||
- Kimi K3 — 1.050 Input-, 76.500 Cached-, 300 Output-Tokens pro Anfrage
|
||||
|
|
@ -143,7 +143,8 @@ Die Schätzungen basieren außerdem auf den folgenden Preisen pro 1M Tokens und
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Nutzung |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -214,7 +215,7 @@ Du kannst auf die Go-Modelle auch über die folgenden API-Endpunkte zugreifen.
|
|||
|
||||
| Modell | Modell-ID | Endpunkt | AI SDK Package |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -257,7 +258,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Modell | Modelltraining | Datenaufbewahrung |
|
||||
| ---------------------------- | --------------- | ----------------- |
|
||||
| Grok 4.5 | Nicht verwendet | 30 Tage |
|
||||
| Grok 4.6 | Nicht verwendet | 30 Tage |
|
||||
| GPT 5.6 Luna | Nicht verwendet | 30 Tage |
|
||||
| GLM-5.3 | Nicht verwendet | 0 Tage |
|
||||
| GLM-5.2 | Nicht verwendet | 0 Tage |
|
||||
|
|
@ -281,7 +282,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Nicht verwendet | 0 Tage |
|
||||
| Ox Alpha Free | Nicht verwendet | 0 Tage |
|
||||
|
||||
- **Grok 4.5:** ZDR deaktiviert wichtige API-Funktionen, die von gespeicherten Daten abhängen, einschließlich der zustandsbehafteten Responses API, Files and Collections und der Batch API. [Mehr erfahren](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR deaktiviert wichtige API-Funktionen, die von gespeicherten Daten abhängen, einschließlich der zustandsbehafteten Responses API, Files and Collections und der Batch API. [Mehr erfahren](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Für die Nutzung aller API-Funktionen werden Protokolle zur Missbrauchsüberwachung erstellt und bis zu 30 Tage lang aufbewahrt. [Mehr erfahren](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Stark vergünstigte Tokenpreise im Gegenzug für die Erlaubnis, deine Prompts und Vervollständigungen zum Trainieren zukünftiger Meta-Modelle zu verwenden. Die Verfügbarkeit ist auf Regionen beschränkt, die gemäß der [Richtlinie zur geografischen Nutzung](https://ai.developer.meta.com/legal/geographic-use-policy) von Meta zulässig sind. [Mehr erfahren](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** Die ZDR-Vereinbarung wird monatlich erneuert. Die aktuelle Vereinbarung gilt bis einschließlich 31. August 2026.
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Solo un miembro por espacio de trabajo puede suscribirse a OpenCode Go.
|
|||
|
||||
La lista actual de modelos incluye:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -101,7 +101,7 @@ La siguiente tabla proporciona una cantidad estimada de peticiones basada en los
|
|||
|
||||
| Model | peticiones por 5 horas | peticiones por semana | peticiones por mes |
|
||||
| ---------------------------- | ---------------------- | --------------------- | ------------------ |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -127,7 +127,7 @@ La siguiente tabla proporciona una cantidad estimada de peticiones basada en los
|
|||
|
||||
Las estimaciones se basan en los patrones de peticiones observados:
|
||||
|
||||
- Grok 4.5 — 1,100 tokens de entrada, 71,500 en caché, 220 tokens de salida por petición
|
||||
- Grok 4.6 — 390 tokens de entrada, 32,500 en caché, 120 tokens de salida por petición
|
||||
- GLM-5.3/5.2/5.1 — 700 tokens de entrada, 52,000 en caché, 150 tokens de salida por petición
|
||||
- GPT 5.6 Luna — 1,000 tokens de entrada, 50,000 en caché, 220 tokens de salida por petición
|
||||
- Kimi K3 — 1,050 tokens de entrada, 76,500 en caché, 300 tokens de salida por petición
|
||||
|
|
@ -151,7 +151,8 @@ Las estimaciones también se basan en los siguientes precios por 1M tokens y en
|
|||
|
||||
| Modelo | Entrada | Salida | Lectura en caché | Escritura en caché | Uso |
|
||||
| --------------------------------------- | ------- | ------ | ---------------- | ------------------ | --- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -224,7 +225,7 @@ También puedes acceder a los modelos de Go a través de los siguientes endpoint
|
|||
|
||||
| Modelo | ID del modelo | Endpoint | Paquete de AI SDK |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -269,7 +270,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Modelo | Entrenamiento del modelo | Retención de datos |
|
||||
| ---------------------------- | ------------------------ | ------------------ |
|
||||
| Grok 4.5 | No utilizado | 30 días |
|
||||
| Grok 4.6 | No utilizado | 30 días |
|
||||
| GPT 5.6 Luna | No utilizado | 30 días |
|
||||
| GLM-5.3 | No utilizado | 0 días |
|
||||
| GLM-5.2 | No utilizado | 0 días |
|
||||
|
|
@ -293,7 +294,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | No utilizado | 0 días |
|
||||
| Ox Alpha Free | No utilizado | 0 días |
|
||||
|
||||
- **Grok 4.5:** ZDR deshabilita funciones importantes de la API que dependen de datos almacenados, incluidas la Responses API con estado, Files and Collections y la Batch API. [Más información](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR deshabilita funciones importantes de la API que dependen de datos almacenados, incluidas la Responses API con estado, Files and Collections y la Batch API. [Más información](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Se generan registros de supervisión de abusos para todo el uso de funciones de la API y se conservan durante un máximo de 30 días. [Más información](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Precios de tokens muy reducidos a cambio de permitir que tus prompts y las respuestas generadas se utilicen para entrenar futuros modelos de Meta. La disponibilidad está limitada a las regiones permitidas por la [Política de uso geográfico](https://ai.developer.meta.com/legal/geographic-use-policy) de Meta. [Más información](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** El acuerdo de ZDR se renueva mensualmente. El acuerdo actual es válido hasta el 31 de agosto de 2026.
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ Un seul membre par espace de travail peut s'abonner à OpenCode Go.
|
|||
|
||||
La liste actuelle des modèles comprend :
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ Le tableau ci-dessous fournit une estimation du nombre de requêtes basée sur d
|
|||
|
||||
| Model | requêtes par 5 heures | requêtes par semaine | requêtes par mois |
|
||||
| ---------------------------- | --------------------- | -------------------- | ----------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ Le tableau ci-dessous fournit une estimation du nombre de requêtes basée sur d
|
|||
|
||||
Les estimations sont basées sur les schémas de requêtes observés :
|
||||
|
||||
- Grok 4.5 — 1,100 tokens en entrée, 71,500 en cache, 220 tokens en sortie par requête
|
||||
- Grok 4.6 — 390 tokens en entrée, 32,500 en cache, 120 tokens en sortie par requête
|
||||
- GLM-5.3/5.2/5.1 — 700 tokens en entrée, 52,000 en cache, 150 tokens en sortie par requête
|
||||
- GPT 5.6 Luna — 1,000 tokens en entrée, 50,000 en cache, 220 tokens en sortie par requête
|
||||
- Kimi K3 — 1,050 tokens en entrée, 76,500 en cache, 300 tokens en sortie par requête
|
||||
|
|
@ -141,7 +141,8 @@ Les estimations sont également basées sur les prix suivants par 1M tokens et s
|
|||
|
||||
| Modèle | Input | Output | Cached Read | Cached Write | Utilisation |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ----------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ Vous pouvez également accéder aux modèles Go via les points de terminaison d'
|
|||
|
||||
| Modèle | ID de modèle | Point de terminaison | Package AI SDK |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Modèle | Entraînement des modèles | Conservation des données |
|
||||
| ---------------------------- | ------------------------ | ------------------------ |
|
||||
| Grok 4.5 | Non utilisé | 30 jours |
|
||||
| Grok 4.6 | Non utilisé | 30 jours |
|
||||
| GPT 5.6 Luna | Non utilisé | 30 jours |
|
||||
| GLM-5.3 | Non utilisé | 0 jour |
|
||||
| GLM-5.2 | Non utilisé | 0 jour |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Non utilisé | 0 jour |
|
||||
| Ox Alpha Free | Non utilisé | 0 jour |
|
||||
|
||||
- **Grok 4.5:** Le ZDR désactive d’importantes fonctionnalités API qui dépendent des données stockées, notamment Responses API avec état, Files and Collections et Batch API. [En savoir plus](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** Le ZDR désactive d’importantes fonctionnalités API qui dépendent des données stockées, notamment Responses API avec état, Files and Collections et Batch API. [En savoir plus](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Des journaux de surveillance des abus sont générés pour toute utilisation des fonctionnalités API et conservés pendant un maximum de 30 jours. [En savoir plus](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Des tarifs de tokens fortement réduits en échange de l’autorisation d’utiliser vos prompts et vos complétions pour entraîner de futurs modèles Meta. La disponibilité est limitée aux régions autorisées par la [Politique d’utilisation géographique](https://ai.developer.meta.com/legal/geographic-use-policy) de Meta. [En savoir plus](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** L’accord ZDR est renouvelé chaque mois. L’accord actuel est valable jusqu’au 31 août 2026.
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Only one member per workspace can subscribe to OpenCode Go.
|
|||
|
||||
The current list of models includes:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -101,7 +101,7 @@ The table below provides an estimated request count based on typical Go usage pa
|
|||
|
||||
| Model | requests per 5 hour | requests per week | requests per month |
|
||||
| ---------------------------- | ------------------- | ----------------- | ------------------ |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -127,7 +127,7 @@ The table below provides an estimated request count based on typical Go usage pa
|
|||
|
||||
The estimates are based on observed request patterns:
|
||||
|
||||
- Grok 4.5 — 1,100 input, 71,500 cached, 220 output tokens per request
|
||||
- Grok 4.6 — 390 input, 32,500 cached, 120 output tokens per request
|
||||
- GLM-5.3/5.2/5.1 — 700 input, 52,000 cached, 150 output tokens per request
|
||||
- GPT 5.6 Luna — 1,000 input, 50,000 cached, 220 output tokens per request
|
||||
- Kimi K3 — 1,050 input, 76,500 cached, 300 output tokens per request
|
||||
|
|
@ -151,7 +151,8 @@ The estimates are also based on the following prices per 1M tokens and the month
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Usage |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ----- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -224,7 +225,7 @@ You can also access Go models through the following API endpoints.
|
|||
|
||||
| Model | Model ID | Endpoint | AI SDK Package |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -269,7 +270,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Model | Model training | Data retention |
|
||||
| ---------------------------- | -------------- | -------------- |
|
||||
| Grok 4.5 | Not used | 30 days |
|
||||
| Grok 4.6 | Not used | 30 days |
|
||||
| GPT 5.6 Luna | Not used | 30 days |
|
||||
| GLM-5.3 | Not used | 0 days |
|
||||
| GLM-5.2 | Not used | 0 days |
|
||||
|
|
@ -293,7 +294,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Not used | 0 days |
|
||||
| Ox Alpha Free | Not used | 0 days |
|
||||
|
||||
- **Grok 4.5:** ZDR disables important API features that depend on stored data, including the stateful Responses API, Files and Collections, and the Batch API. [Learn more](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR disables important API features that depend on stored data, including the stateful Responses API, Files and Collections, and the Batch API. [Learn more](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Abuse monitoring logs are generated for all API feature usage and retained for up to 30 days. [Learn more](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Heavily discounted token pricing in exchange for permission to use your prompts and completions to train future Meta models. Availability is limited to regions permitted by Meta's [Geographic Use Policy](https://ai.developer.meta.com/legal/geographic-use-policy). [Learn more](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek:** ZDR agreement is renewed monthly. The current agreement is valid through August 31, 2026.
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ Solo un membro per workspace può abbonarsi a OpenCode Go.
|
|||
|
||||
L'elenco attuale dei modelli include:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -99,7 +99,7 @@ La tabella seguente fornisce una stima del conteggio delle richieste in base a p
|
|||
|
||||
| Model | richieste ogni 5 ore | richieste a settimana | richieste al mese |
|
||||
| ---------------------------- | -------------------- | --------------------- | ----------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -125,7 +125,7 @@ La tabella seguente fornisce una stima del conteggio delle richieste in base a p
|
|||
|
||||
Le stime si basano sui pattern di richieste osservati:
|
||||
|
||||
- Grok 4.5 — 1.100 di input, 71.500 in cache, 220 token di output per richiesta
|
||||
- Grok 4.6 — 390 di input, 32.500 in cache, 120 token di output per richiesta
|
||||
- GLM-5.3/5.2/5.1 — 700 di input, 52.000 in cache, 150 token di output per richiesta
|
||||
- GPT 5.6 Luna — 1.000 token di input, 50.000 in cache, 220 token di output per richiesta
|
||||
- Kimi K3 — 1.050 di input, 76.500 in cache, 300 token di output per richiesta
|
||||
|
|
@ -149,7 +149,8 @@ Le stime si basano anche sui seguenti prezzi per 1M token e sull'utilizzo mensil
|
|||
|
||||
| Modello | Input | Output | Cached Read | Cached Write | Utilizzo |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | -------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -222,7 +223,7 @@ Puoi anche accedere ai modelli Go tramite i seguenti endpoint API.
|
|||
|
||||
| Modello | ID Modello | Endpoint | Pacchetto AI SDK |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -267,7 +268,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Modello | Addestramento del modello | Conservazione dei dati |
|
||||
| ---------------------------- | ------------------------- | ---------------------- |
|
||||
| Grok 4.5 | Non utilizzato | 30 giorni |
|
||||
| Grok 4.6 | Non utilizzato | 30 giorni |
|
||||
| GPT 5.6 Luna | Non utilizzato | 30 giorni |
|
||||
| GLM-5.3 | Non utilizzato | 0 giorni |
|
||||
| GLM-5.2 | Non utilizzato | 0 giorni |
|
||||
|
|
@ -291,7 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Non utilizzato | 0 giorni |
|
||||
| Ox Alpha Free | Non utilizzato | 0 giorni |
|
||||
|
||||
- **Grok 4.5:** ZDR disabilita importanti funzionalità API che dipendono dai dati archiviati, tra cui la Responses API con stato, Files and Collections e Batch API. [Scopri di più](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR disabilita importanti funzionalità API che dipendono dai dati archiviati, tra cui la Responses API con stato, Files and Collections e Batch API. [Scopri di più](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** I log di monitoraggio degli abusi vengono generati per l'utilizzo di tutte le funzionalità API e conservati per un massimo di 30 giorni. [Scopri di più](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Prezzi dei token fortemente scontati in cambio dell'autorizzazione a utilizzare i tuoi prompt e completamenti per addestrare futuri modelli Meta. La disponibilità è limitata alle regioni consentite dalla [Politica sull'uso geografico](https://ai.developer.meta.com/legal/geographic-use-policy) di Meta. [Scopri di più](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** L'accordo ZDR viene rinnovato mensilmente. L'accordo attuale è valido fino al 31 agosto 2026.
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ OpenCode Goをサブスクライブできるのは、1つのワークスペー
|
|||
|
||||
現在のモデルリストには以下が含まれます:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ OpenCode Goには以下の制限が含まれています:
|
|||
|
||||
| Model | 5時間あたりのリクエスト数 | 週間リクエスト数 | 月間リクエスト数 |
|
||||
| ---------------------------- | ------------------------- | ---------------- | ---------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ OpenCode Goには以下の制限が含まれています:
|
|||
|
||||
推定値は、観測されたリクエストパターンに基づいています:
|
||||
|
||||
- Grok 4.5 — リクエストあたり 入力 1,100トークン、キャッシュ 71,500トークン、出力 220トークン
|
||||
- Grok 4.6 — リクエストあたり 入力 390トークン、キャッシュ 32,500トークン、出力 120トークン
|
||||
- GLM-5.3/5.2/5.1 — リクエストあたり 入力 700トークン、キャッシュ 52,000トークン、出力 150トークン
|
||||
- GPT 5.6 Luna — リクエストあたり 入力 1,000トークン、キャッシュ 50,000トークン、出力 220トークン
|
||||
- Kimi K3 — リクエストあたり 入力 1,050トークン、キャッシュ 76,500トークン、出力 300トークン
|
||||
|
|
@ -141,7 +141,8 @@ OpenCode Goには以下の制限が含まれています:
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Usage |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ----- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ Goでは月額$10を支払い、その6倍の利用枠を提供することを
|
|||
|
||||
| Model | Model ID | Endpoint | AI SDK Package |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| モデル | モデルのトレーニング | データ保持 |
|
||||
| ---------------------------- | -------------------- | ----------- |
|
||||
| Grok 4.5 | 使用なし | 30日 |
|
||||
| Grok 4.6 | 使用なし | 30日 |
|
||||
| GPT 5.6 Luna | 使用なし | 30日 |
|
||||
| GLM-5.3 | 使用なし | 0日 |
|
||||
| GLM-5.2 | 使用なし | 0日 |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | 使用なし | 0日 |
|
||||
| Ox Alpha Free | 使用なし | 0日 |
|
||||
|
||||
- **Grok 4.5:** ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。[詳しく見る](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **Grok 4.6:** ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。[詳しく見る](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **GPT 5.6 Luna:** 不正使用監視ログはすべてのAPI機能の使用時に生成され、最大30日間保持されます。[詳しく見る](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
|
||||
- **Muse Spark 1.2 Contributor:** 将来のMetaモデルのトレーニングにプロンプトと生成結果を使用する許可と引き換えに、トークン料金が大幅に割引されます。利用できるのは、Metaの[地域別利用ポリシー](https://ai.developer.meta.com/legal/geographic-use-policy)で許可されている地域に限られます。[詳しく見る](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier)。
|
||||
- **DeepSeek V4 Flash:** ZDR契約は毎月更新されます。現在の契約は2026年8月31日まで有効です。
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ workspace당 한 명의 멤버만 OpenCode Go를 구독할 수 있습니다.
|
|||
|
||||
현재 모델 목록에는 다음이 포함됩니다.
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
|
|||
|
||||
| Model | 5시간당 요청 횟수 | 주간 요청 횟수 | 월간 요청 횟수 |
|
||||
| ---------------------------- | ----------------- | -------------- | -------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
|
|||
|
||||
이 예상치는 관찰된 요청 패턴을 기준으로 합니다.
|
||||
|
||||
- Grok 4.5 — 요청당 입력 1,100, 캐시 71,500, 출력 토큰 220
|
||||
- Grok 4.6 — 요청당 입력 390, 캐시 32,500, 출력 토큰 120
|
||||
- GLM-5.3/5.2/5.1 — 요청당 입력 700, 캐시 52,000, 출력 토큰 150
|
||||
- GPT 5.6 Luna — 요청당 입력 토큰 1,000개, 캐시 토큰 50,000개, 출력 토큰 220개
|
||||
- Kimi K3 — 요청당 입력 1,050, 캐시 76,500, 출력 토큰 300
|
||||
|
|
@ -141,7 +141,8 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Usage |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ----- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ Go에서는 월 $10를 지불하며, 저희는 그 6배의 사용량을 제공
|
|||
|
||||
| 모델 | 모델 ID | 엔드포인트 | AI SDK 패키지 |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| 모델 | 모델 학습 | 데이터 보존 |
|
||||
| ---------------------------- | ------------- | ----------- |
|
||||
| Grok 4.5 | 사용되지 않음 | 30일 |
|
||||
| Grok 4.6 | 사용되지 않음 | 30일 |
|
||||
| GPT 5.6 Luna | 사용되지 않음 | 30일 |
|
||||
| GLM-5.3 | 사용되지 않음 | 0일 |
|
||||
| GLM-5.2 | 사용되지 않음 | 0일 |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | 사용되지 않음 | 0일 |
|
||||
| Ox Alpha Free | 사용되지 않음 | 0일 |
|
||||
|
||||
- **Grok 4.5:** ZDR은 저장된 데이터에 의존하는 중요한 API 기능(상태 저장형 Responses API, Files and Collections, Batch API 포함)을 비활성화합니다. [자세히 알아보기](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR은 저장된 데이터에 의존하는 중요한 API 기능(상태 저장형 Responses API, Files and Collections, Batch API 포함)을 비활성화합니다. [자세히 알아보기](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** 모든 API 기능 사용에 대해 악용 모니터링 로그가 생성되며 최대 30일 동안 보존됩니다. [자세히 알아보기](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** 향후 Meta 모델 학습에 사용자의 프롬프트와 생성 결과를 사용할 수 있도록 허용하는 대신 토큰 가격이 대폭 할인됩니다. Meta의 [지역별 사용 정책](https://ai.developer.meta.com/legal/geographic-use-policy)에서 허용하는 지역에서만 이용할 수 있습니다. [자세히 알아보기](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** ZDR 계약은 매월 갱신됩니다. 현재 계약은 2026년 8월 31일까지 유효합니다.
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Kun ett medlem per arbeidsområde kan abonnere på OpenCode Go.
|
|||
|
||||
Den nåværende listen over modeller inkluderer:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -101,7 +101,7 @@ Tabellen nedenfor gir et estimert antall forespørsler basert på typiske bruksm
|
|||
|
||||
| Model | forespørsler per 5 timer | forespørsler per uke | forespørsler per måned |
|
||||
| ---------------------------- | ------------------------ | -------------------- | ---------------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -127,7 +127,7 @@ Tabellen nedenfor gir et estimert antall forespørsler basert på typiske bruksm
|
|||
|
||||
Estimatene er basert på observerte forespørselsmønstre:
|
||||
|
||||
- Grok 4.5 — 1 100 input, 71 500 bufret, 220 output-tokens per forespørsel
|
||||
- Grok 4.6 — 390 input, 32 500 bufret, 120 output-tokens per forespørsel
|
||||
- GLM-5.3/5.2/5.1 — 700 input, 52 000 bufret, 150 output-tokens per forespørsel
|
||||
- GPT 5.6 Luna — 1 000 input, 50 000 bufret, 220 output-tokens per forespørsel
|
||||
- Kimi K3 — 1 050 input, 76 500 bufret, 300 output-tokens per forespørsel
|
||||
|
|
@ -151,7 +151,8 @@ Estimatene er også basert på følgende priser per 1M tokens og den månedlige
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Bruk |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ---- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -224,7 +225,7 @@ Du kan også få tilgang til Go-modeller gjennom følgende API-endepunkter.
|
|||
|
||||
| Modell | Modell-ID | Endepunkt | AI SDK Package |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -269,7 +270,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Modell | Modelltrening | Dataoppbevaring |
|
||||
| ---------------------------- | ------------- | --------------- |
|
||||
| Grok 4.5 | Brukes ikke | 30 dager |
|
||||
| Grok 4.6 | Brukes ikke | 30 dager |
|
||||
| GPT 5.6 Luna | Brukes ikke | 30 dager |
|
||||
| GLM-5.3 | Brukes ikke | 0 dager |
|
||||
| GLM-5.2 | Brukes ikke | 0 dager |
|
||||
|
|
@ -293,7 +294,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Brukes ikke | 0 dager |
|
||||
| Ox Alpha Free | Brukes ikke | 0 dager |
|
||||
|
||||
- **Grok 4.5:** ZDR deaktiverer viktige API-funksjoner som er avhengige av lagrede data, inkludert den tilstandsbaserte Responses API, Files and Collections og Batch API. [Les mer](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR deaktiverer viktige API-funksjoner som er avhengige av lagrede data, inkludert den tilstandsbaserte Responses API, Files and Collections og Batch API. [Les mer](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Logger for overvåking av misbruk genereres for all bruk av API-funksjoner og oppbevares i opptil 30 dager. [Les mer](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Kraftig rabatterte tokenpriser i bytte mot tillatelse til å bruke ledetekstene og fullføringene dine til å trene fremtidige Meta-modeller. Tilgjengeligheten er begrenset til regioner som er tillatt i henhold til [retningslinjene for geografisk bruk](https://ai.developer.meta.com/legal/geographic-use-policy) fra Meta. [Les mer](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** ZDR-avtalen fornyes månedlig. Den gjeldende avtalen er gyldig til og med 31. august 2026.
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ Tylko jeden członek na obszar roboczy (workspace) może zasubskrybować OpenCod
|
|||
|
||||
Obecna lista modeli obejmuje:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -95,7 +95,7 @@ Poniższa tabela przedstawia szacunkową liczbę żądań na podstawie typowych
|
|||
|
||||
| Model | żądania na 5 godzin | żądania na tydzień | żądania na miesiąc |
|
||||
| ---------------------------- | ------------------- | ------------------ | ------------------ |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -121,7 +121,7 @@ Poniższa tabela przedstawia szacunkową liczbę żądań na podstawie typowych
|
|||
|
||||
Szacunki te opierają się na zaobserwowanych wzorcach żądań:
|
||||
|
||||
- Grok 4.5 — 1 100 tokenów wejściowych, 71 500 w pamięci podręcznej, 220 tokenów wyjściowych na żądanie
|
||||
- Grok 4.6 — 390 tokenów wejściowych, 32 500 w pamięci podręcznej, 120 tokenów wyjściowych na żądanie
|
||||
- GLM-5.3/5.2/5.1 — 700 tokenów wejściowych, 52 000 w pamięci podręcznej, 150 tokenów wyjściowych na żądanie
|
||||
- GPT 5.6 Luna — 1 000 tokenów wejściowych, 50 000 w pamięci podręcznej, 220 tokenów wyjściowych na żądanie
|
||||
- Kimi K3 — 1 050 tokenów wejściowych, 76 500 w pamięci podręcznej, 300 tokenów wyjściowych na żądanie
|
||||
|
|
@ -145,7 +145,8 @@ Szacunki opierają się również na następujących cenach za 1M tokenów oraz
|
|||
|
||||
| Model | Wejście | Wyjście | Odczyt z cache | Zapis do cache | Użycie |
|
||||
| --------------------------------------- | ------- | ------- | -------------- | -------------- | ------ |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -216,7 +217,7 @@ Możesz również uzyskać dostęp do modeli Go za pośrednictwem następującyc
|
|||
|
||||
| Model | ID modelu | Punkt końcowy | Pakiet AI SDK |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -261,7 +262,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Model | Trenowanie modelu | Retencja danych |
|
||||
| ---------------------------- | ----------------- | --------------- |
|
||||
| Grok 4.5 | Niewykorzystywane | 30 dni |
|
||||
| Grok 4.6 | Niewykorzystywane | 30 dni |
|
||||
| GPT 5.6 Luna | Niewykorzystywane | 30 dni |
|
||||
| GLM-5.3 | Niewykorzystywane | 0 dni |
|
||||
| GLM-5.2 | Niewykorzystywane | 0 dni |
|
||||
|
|
@ -285,7 +286,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Niewykorzystywane | 0 dni |
|
||||
| Ox Alpha Free | Niewykorzystywane | 0 dni |
|
||||
|
||||
- **Grok 4.5:** ZDR wyłącza ważne funkcje API zależne od przechowywanych danych, w tym stanowy Responses API, Files and Collections oraz Batch API. [Dowiedz się więcej](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR wyłącza ważne funkcje API zależne od przechowywanych danych, w tym stanowy Responses API, Files and Collections oraz Batch API. [Dowiedz się więcej](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Dzienniki monitorowania nadużyć są generowane dla każdego użycia funkcji API i przechowywane przez maksymalnie 30 dni. [Dowiedz się więcej](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Znacznie obniżone ceny tokenów w zamian za zgodę na wykorzystanie Twoich promptów i odpowiedzi do trenowania przyszłych modeli Meta. Dostępność jest ograniczona do regionów dozwolonych przez [Zasady korzystania w poszczególnych regionach geograficznych](https://ai.developer.meta.com/legal/geographic-use-policy) firmy Meta. [Dowiedz się więcej](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** Umowa ZDR jest odnawiana co miesiąc. Obecna umowa obowiązuje do 31 sierpnia 2026 r.
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Apenas um membro por workspace pode assinar o OpenCode Go.
|
|||
|
||||
A lista atual de modelos inclui:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -101,7 +101,7 @@ A tabela abaixo fornece uma contagem estimada de requisições com base nos padr
|
|||
|
||||
| Model | requisições por 5 horas | requisições por semana | requisições por mês |
|
||||
| ---------------------------- | ----------------------- | ---------------------- | ------------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -127,7 +127,7 @@ A tabela abaixo fornece uma contagem estimada de requisições com base nos padr
|
|||
|
||||
As estimativas se baseiam nos padrões de requisições observados:
|
||||
|
||||
- Grok 4.5 — 1.100 tokens de entrada, 71.500 em cache, 220 tokens de saída por requisição
|
||||
- Grok 4.6 — 390 tokens de entrada, 32.500 em cache, 120 tokens de saída por requisição
|
||||
- GLM-5.3/5.2/5.1 — 700 tokens de entrada, 52.000 em cache, 150 tokens de saída por requisição
|
||||
- GPT 5.6 Luna — 1.000 tokens de entrada, 50.000 em cache, 220 tokens de saída por requisição
|
||||
- Kimi K3 — 1.050 tokens de entrada, 76.500 em cache, 300 tokens de saída por requisição
|
||||
|
|
@ -151,7 +151,8 @@ As estimativas também se baseiam nos seguintes preços por 1M tokens e no uso m
|
|||
|
||||
| Modelo | Entrada | Saída | Leitura em cache | Escrita em cache | Uso |
|
||||
| --------------------------------------- | ------- | ------ | ---------------- | ---------------- | --- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -224,7 +225,7 @@ Você também pode acessar os modelos do Go através dos seguintes endpoints de
|
|||
|
||||
| Modelo | ID do Modelo | Endpoint | Pacote do AI SDK |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -269,7 +270,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Modelo | Treinamento de modelos | Retenção de dados |
|
||||
| ---------------------------- | ---------------------- | ----------------- |
|
||||
| Grok 4.5 | Não usado | 30 dias |
|
||||
| Grok 4.6 | Não usado | 30 dias |
|
||||
| GPT 5.6 Luna | Não usado | 30 dias |
|
||||
| GLM-5.3 | Não usado | 0 dias |
|
||||
| GLM-5.2 | Não usado | 0 dias |
|
||||
|
|
@ -293,7 +294,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Não usado | 0 dias |
|
||||
| Ox Alpha Free | Não usado | 0 dias |
|
||||
|
||||
- **Grok 4.5:** O ZDR desativa recursos importantes da API que dependem de dados armazenados, incluindo a Responses API com estado, Files and Collections e a Batch API. [Saiba mais](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** O ZDR desativa recursos importantes da API que dependem de dados armazenados, incluindo a Responses API com estado, Files and Collections e a Batch API. [Saiba mais](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Logs de monitoramento de abuso são gerados para todo uso de recursos da API e retidos por até 30 dias. [Saiba mais](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Preços de tokens com grandes descontos em troca da permissão para usar seus prompts e respostas geradas para treinar futuros modelos da Meta. A disponibilidade é limitada às regiões permitidas pela [Política de Uso Geográfico](https://ai.developer.meta.com/legal/geographic-use-policy) da Meta. [Saiba mais](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** O acordo de ZDR é renovado mensalmente. O acordo atual é válido até 31 de agosto de 2026.
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ OpenCode Go работает так же, как и любой другой пр
|
|||
|
||||
Текущий список моделей включает:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -101,7 +101,7 @@ OpenCode Go включает следующие лимиты:
|
|||
|
||||
| Model | запросов за 5 часов | запросов в неделю | запросов в месяц |
|
||||
| ---------------------------- | ------------------- | ----------------- | ---------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -127,7 +127,7 @@ OpenCode Go включает следующие лимиты:
|
|||
|
||||
Эти оценки основаны на наблюдаемых показателях запросов:
|
||||
|
||||
- Grok 4.5 — 1,100 входных, 71,500 кешированных, 220 выходных токенов на запрос
|
||||
- Grok 4.6 — 390 входных, 32,500 кешированных, 120 выходных токенов на запрос
|
||||
- GLM-5.3/5.2/5.1 — 700 входных, 52,000 кешированных, 150 выходных токенов на запрос
|
||||
- GPT 5.6 Luna — 1,000 входных, 50,000 кешированных, 220 выходных токенов на запрос
|
||||
- Kimi K3 — 1,050 входных, 76,500 кешированных, 300 выходных токенов на запрос
|
||||
|
|
@ -151,7 +151,8 @@ OpenCode Go включает следующие лимиты:
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Использование |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ------------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -224,7 +225,7 @@ OpenCode Go включает следующие лимиты:
|
|||
|
||||
| Модель | ID модели | Эндпоинт | Пакет AI SDK |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -269,7 +270,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Модель | Обучение моделей | Хранение данных |
|
||||
| ---------------------------- | ---------------- | --------------- |
|
||||
| Grok 4.5 | Не используется | 30 дней |
|
||||
| Grok 4.6 | Не используется | 30 дней |
|
||||
| GPT 5.6 Luna | Не используется | 30 дней |
|
||||
| GLM-5.3 | Не используется | 0 дней |
|
||||
| GLM-5.2 | Не используется | 0 дней |
|
||||
|
|
@ -293,7 +294,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Не используется | 0 дней |
|
||||
| Ox Alpha Free | Не используется | 0 дней |
|
||||
|
||||
- **Grok 4.5:** ZDR отключает важные функции API, зависящие от сохраненных данных, включая Responses API с сохранением состояния, Files and Collections и Batch API. [Подробнее](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR отключает важные функции API, зависящие от сохраненных данных, включая Responses API с сохранением состояния, Files and Collections и Batch API. [Подробнее](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Журналы мониторинга злоупотреблений создаются при любом использовании функций API и хранятся до 30 дней. [Подробнее](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** Значительно сниженная стоимость токенов в обмен на разрешение использовать ваши промпты и ответы для обучения будущих моделей Meta. Доступность ограничена регионами, разрешёнными [Политикой географического использования](https://ai.developer.meta.com/legal/geographic-use-policy) компании Meta. [Подробнее](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** Соглашение ZDR продлевается ежемесячно. Текущее соглашение действует до 31 августа 2026 года.
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ OpenCode Go ทำงานเหมือนกับผู้ให้บร
|
|||
|
||||
รายชื่อโมเดลในปัจจุบันประกอบด้วย:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
|
|||
|
||||
| Model | requests ต่อ 5 ชั่วโมง | requests ต่อสัปดาห์ | requests ต่อเดือน |
|
||||
| ---------------------------- | ---------------------- | ------------------- | ----------------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
|
|||
|
||||
การประมาณการนี้อ้างอิงจากรูปแบบการใช้งาน request ที่สังเกตพบ:
|
||||
|
||||
- Grok 4.5 — 1,100 input, 71,500 cached, 220 output tokens ต่อ request
|
||||
- Grok 4.6 — 390 input, 32,500 cached, 120 output tokens ต่อ request
|
||||
- GLM-5.3/5.2/5.1 — 700 input, 52,000 cached, 150 output tokens ต่อ request
|
||||
- GPT 5.6 Luna — 1,000 input, 50,000 cached, 220 output tokens ต่อ request
|
||||
- Kimi K3 — 1,050 input, 76,500 cached, 300 output tokens ต่อ request
|
||||
|
|
@ -141,7 +141,8 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Usage |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | ----- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
|
|||
|
||||
| Model | Model ID | Endpoint | AI SDK Package |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| โมเดล | การฝึกโมเดล | การเก็บรักษาข้อมูล |
|
||||
| ---------------------------- | ----------- | ------------------ |
|
||||
| Grok 4.5 | ไม่นำไปใช้ | 30 วัน |
|
||||
| Grok 4.6 | ไม่นำไปใช้ | 30 วัน |
|
||||
| GPT 5.6 Luna | ไม่นำไปใช้ | 30 วัน |
|
||||
| GLM-5.3 | ไม่นำไปใช้ | 0 วัน |
|
||||
| GLM-5.2 | ไม่นำไปใช้ | 0 วัน |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | ไม่นำไปใช้ | 0 วัน |
|
||||
| Ox Alpha Free | ไม่นำไปใช้ | 0 วัน |
|
||||
|
||||
- **Grok 4.5:** ZDR ปิดใช้งานฟีเจอร์ API สำคัญที่ต้องอาศัยข้อมูลที่จัดเก็บไว้ ซึ่งรวมถึง Responses API แบบมีสถานะ, Files and Collections และ Batch API [ดูข้อมูลเพิ่มเติม](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)
|
||||
- **Grok 4.6:** ZDR ปิดใช้งานฟีเจอร์ API สำคัญที่ต้องอาศัยข้อมูลที่จัดเก็บไว้ ซึ่งรวมถึง Responses API แบบมีสถานะ, Files and Collections และ Batch API [ดูข้อมูลเพิ่มเติม](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)
|
||||
- **GPT 5.6 Luna:** ระบบจะสร้างบันทึกการตรวจสอบการใช้งานในทางที่ผิดสำหรับการใช้งานฟีเจอร์ API ทั้งหมด และเก็บรักษาไว้นานสูงสุด 30 วัน [ดูข้อมูลเพิ่มเติม](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)
|
||||
- **Muse Spark 1.2 Contributor:** ราคาของ token ลดลงอย่างมาก โดยแลกกับการอนุญาตให้นำพรอมต์และผลลัพธ์ที่สร้างขึ้นของคุณไปใช้ฝึกโมเดล Meta ในอนาคต การให้บริการจำกัดเฉพาะภูมิภาคที่ได้รับอนุญาตตาม[นโยบายการใช้งานตามพื้นที่ทางภูมิศาสตร์](https://ai.developer.meta.com/legal/geographic-use-policy)ของ Meta [ดูข้อมูลเพิ่มเติม](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier)
|
||||
- **DeepSeek V4 Flash:** ข้อตกลง ZDR จะต่ออายุทุกเดือน ข้อตกลงปัจจุบันมีผลใช้ถึงวันที่ 31 สิงหาคม 2026
|
||||
|
|
|
|||
|
|
@ -257,12 +257,14 @@ Allows the LLM to fetch and read web pages. Useful for looking up documentation
|
|||
Search the web for information.
|
||||
|
||||
:::note
|
||||
This tool is only available when using the OpenCode or OpenCode Go provider, or when the `OPENCODE_ENABLE_EXA` environment variable is set to any truthy value (e.g., `true` or `1`).
|
||||
This tool is only available when using the OpenCode or OpenCode Go provider, or when either the `OPENCODE_ENABLE_EXA` or `OPENCODE_ENABLE_PARALLEL` environment variable is set to any truthy value (e.g., `true` or `1`).
|
||||
|
||||
To enable when launching OpenCode:
|
||||
|
||||
```bash
|
||||
OPENCODE_ENABLE_EXA=1 opencode
|
||||
# or
|
||||
OPENCODE_ENABLE_PARALLEL=1 opencode
|
||||
```
|
||||
|
||||
:::
|
||||
|
|
@ -276,9 +278,9 @@ OPENCODE_ENABLE_EXA=1 opencode
|
|||
}
|
||||
```
|
||||
|
||||
Performs web searches using Exa AI to find relevant information online. Useful for researching topics, finding current events, or gathering information beyond the training data cutoff.
|
||||
Performs web searches using Exa or Parallel to find relevant information online. Useful for researching topics, finding current events, or gathering information beyond the training data cutoff.
|
||||
|
||||
No API key is required — the tool connects directly to Exa AI's hosted MCP service without authentication.
|
||||
No API key is required — the tool connects directly to the backend's hosted MCP service without authentication.
|
||||
|
||||
:::tip
|
||||
Use `websearch` when you need to find information (discovery), and `webfetch` when you need to retrieve content from a specific URL (retrieval).
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ Her çalışma alanından yalnızca bir üye OpenCode Go'ya abone olabilir.
|
|||
|
||||
Mevcut model listesi şunları içerir:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ Aşağıdaki tablo, tipik Go kullanım modellerine dayalı tahmini bir istek say
|
|||
|
||||
| Model | 5 saatte bir istek | haftalık istek | aylık istek |
|
||||
| ---------------------------- | ------------------ | -------------- | ----------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ Aşağıdaki tablo, tipik Go kullanım modellerine dayalı tahmini bir istek say
|
|||
|
||||
Tahminler, gözlemlenen istek modellerine dayanır:
|
||||
|
||||
- Grok 4.5 — İstek başına 1.100 girdi, 71.500 önbelleğe alınmış, 220 çıktı token'ı
|
||||
- Grok 4.6 — İstek başına 390 girdi, 32.500 önbelleğe alınmış, 120 çıktı token'ı
|
||||
- GLM-5.3/5.2/5.1 — İstek başına 700 girdi, 52.000 önbelleğe alınmış, 150 çıktı token'ı
|
||||
- GPT 5.6 Luna — İstek başına 1.000 girdi, 50.000 önbelleğe alınmış, 220 çıktı token'ı
|
||||
- Kimi K3 — İstek başına 1.050 girdi, 76.500 önbelleğe alınmış, 300 çıktı token'ı
|
||||
|
|
@ -141,7 +141,8 @@ Tahminler ayrıca 1M token başına aşağıdaki fiyatlara ve her modelle birlik
|
|||
|
||||
| Model | Input | Output | Cached Read | Cached Write | Kullanım |
|
||||
| --------------------------------------- | ------ | ------ | ----------- | ------------ | -------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ Go modellerine aşağıdaki API uç noktaları aracılığıyla da erişebilirsi
|
|||
|
||||
| Model | Model ID | Uç Nokta | AI SDK Paketi |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| Model | Model eğitimi | Veri saklama |
|
||||
| ---------------------------- | ------------- | ------------ |
|
||||
| Grok 4.5 | Kullanılmaz | 30 gün |
|
||||
| Grok 4.6 | Kullanılmaz | 30 gün |
|
||||
| GPT 5.6 Luna | Kullanılmaz | 30 gün |
|
||||
| GLM-5.3 | Kullanılmaz | 0 gün |
|
||||
| GLM-5.2 | Kullanılmaz | 0 gün |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | Kullanılmaz | 0 gün |
|
||||
| Ox Alpha Free | Kullanılmaz | 0 gün |
|
||||
|
||||
- **Grok 4.5:** ZDR, durum bilgisi tutan Responses API, Files and Collections ve Batch API dahil olmak üzere saklanan verilere bağlı önemli API özelliklerini devre dışı bırakır. [Daha fazla bilgi](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **Grok 4.6:** ZDR, durum bilgisi tutan Responses API, Files and Collections ve Batch API dahil olmak üzere saklanan verilere bağlı önemli API özelliklerini devre dışı bırakır. [Daha fazla bilgi](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Tüm API özelliklerinin kullanımı için kötüye kullanım izleme günlükleri oluşturulur ve 30 güne kadar saklanır. [Daha fazla bilgi](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
- **Muse Spark 1.2 Contributor:** İstemlerinizi ve tamamlamalarınızı gelecekteki Meta modellerini eğitmek için kullanma izni karşılığında büyük ölçüde indirimli token fiyatları. Kullanılabilirlik, Meta'nın [Coğrafi Kullanım Politikası](https://ai.developer.meta.com/legal/geographic-use-policy) kapsamında izin verilen bölgelerle sınırlıdır. [Daha fazla bilgi](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier).
|
||||
- **DeepSeek V4 Flash:** ZDR anlaşması aylık olarak yenilenir. Mevcut anlaşma 31 Ağustos 2026 tarihine kadar geçerlidir.
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ OpenCode Go 的工作方式与 OpenCode 中的其他提供商一样。
|
|||
|
||||
当前支持的模型列表包括:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
| Model | 每 5 小时请求数 | 每周请求数 | 每月请求数 |
|
||||
| ---------------------------- | --------------- | ---------- | ---------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
预估值基于观察到的请求模式:
|
||||
|
||||
- Grok 4.5 — 每次请求 1,100 个输入 token,71,500 个缓存 token,220 个输出 token
|
||||
- Grok 4.6 — 每次请求 390 个输入 token,32,500 个缓存 token,120 个输出 token
|
||||
- GLM-5.3/5.2/5.1 — 每次请求 700 个输入 token,52,000 个缓存 token,150 个输出 token
|
||||
- GPT 5.6 Luna — 每次请求 1,000 个输入 token,50,000 个缓存 token,220 个输出 token
|
||||
- Kimi K3 — 每次请求 1,050 个输入 token,76,500 个缓存 token,300 个输出 token
|
||||
|
|
@ -141,7 +141,8 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
| 模型 | 输入 | 输出 | 缓存读取 | 缓存写入 | 使用额度 |
|
||||
| --------------------------------------- | ------ | ------ | --------- | -------- | -------- |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
| 模型 | 模型 ID | 端点 | AI SDK 包 |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| 模型 | 模型训练 | 数据留存 |
|
||||
| ---------------------------- | -------- | -------- |
|
||||
| Grok 4.5 | 不使用 | 30 天 |
|
||||
| Grok 4.6 | 不使用 | 30 天 |
|
||||
| GPT 5.6 Luna | 不使用 | 30 天 |
|
||||
| GLM-5.3 | 不使用 | 0 天 |
|
||||
| GLM-5.2 | 不使用 | 0 天 |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | 不使用 | 0 天 |
|
||||
| Ox Alpha Free | 不使用 | 0 天 |
|
||||
|
||||
- **Grok 4.5:** ZDR 会禁用依赖所存储数据的重要 API 功能,包括有状态的 Responses API、Files and Collections 和 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **Grok 4.6:** ZDR 会禁用依赖所存储数据的重要 API 功能,包括有状态的 Responses API、Files and Collections 和 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **GPT 5.6 Luna:** 所有 API 功能的使用都会生成滥用监控日志,并最多保留 30 天。[了解更多](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
|
||||
- **Muse Spark 1.2 Contributor:** 以允许使用你的提示词和补全结果训练未来的 Meta 模型为交换,token 价格可获得大幅折扣。仅在 Meta 的[地理使用政策](https://ai.developer.meta.com/legal/geographic-use-policy)允许的地区提供。[了解更多](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier)。
|
||||
- **DeepSeek V4 Flash:** ZDR 协议每月续签。当前协议有效期至 2026 年 8 月 31 日。
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ OpenCode Go 的運作方式與 OpenCode 中的任何其他供應商相同。
|
|||
|
||||
目前的模型清單包括:
|
||||
|
||||
- **Grok 4.5**
|
||||
- **Grok 4.6**
|
||||
- **GLM-5.3**
|
||||
- **GLM-5.2**
|
||||
- **GLM-5.1**
|
||||
|
|
@ -91,7 +91,7 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
| Model | 每 5 小時請求數 | 每週請求數 | 每月請求數 |
|
||||
| ---------------------------- | --------------- | ---------- | ---------- |
|
||||
| Grok 4.5 | 120 | 300 | 600 |
|
||||
| Grok 4.6 | 169 | 423 | 845 |
|
||||
| GPT 5.6 Luna | 2,050 | 5,100 | 10,250 |
|
||||
| GLM-5.3 | 220 | 540 | 1,080 |
|
||||
| GLM-5.2 | 880 | 2,150 | 4,300 |
|
||||
|
|
@ -117,7 +117,7 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
這些預估值是基於觀察到的請求模式:
|
||||
|
||||
- Grok 4.5 — 每次請求 1,100 個輸入 token、71,500 個快取 token、220 個輸出 token
|
||||
- Grok 4.6 — 每次請求 390 個輸入 token、32,500 個快取 token、120 個輸出 token
|
||||
- GLM-5.3/5.2/5.1 — 每次請求 700 個輸入 token、52,000 個快取 token、150 個輸出 token
|
||||
- GPT 5.6 Luna — 每次請求 1,000 個輸入 token、50,000 個快取 token、220 個輸出 token
|
||||
- Kimi K3 — 每次請求 1,050 個輸入 token、76,500 個快取 token、300 個輸出 token
|
||||
|
|
@ -141,7 +141,8 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
| 模型 | 輸入 | 輸出 | 快取讀取 | 快取寫入 | 使用量 |
|
||||
| --------------------------------------- | ------ | ------ | --------- | -------- | ------ |
|
||||
| Grok 4.5 | $2.00 | $6.00 | $0.30 | - | $15 |
|
||||
| Grok 4.6 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | $15 |
|
||||
| Grok 4.6 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | $15 |
|
||||
| GPT 5.6 Luna (≤ 272K tokens) | $0.20 | $1.20 | $0.02 | $0.25 | $15 |
|
||||
| GPT 5.6 Luna (> 272K tokens) | $0.40 | $1.80 | $0.04 | $0.50 | $15 |
|
||||
| GLM-5.3 | $1.40 | $4.40 | $0.26 | - | $15 |
|
||||
|
|
@ -212,7 +213,7 @@ OpenCode Go 包含以下限制:
|
|||
|
||||
| 模型 | 模型 ID | 端點 | AI SDK 套件 |
|
||||
| ---------------------------- | ---------------------------- | ------------------------------------------------ | --------------------------- |
|
||||
| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| Grok 4.6 | grok-4.6 | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/go/v1/responses` | `@ai-sdk/openai` |
|
||||
| GLM-5.3 | glm-5.3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
|
@ -255,7 +256,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
|
||||
| 模型 | 模型訓練 | 資料保留 |
|
||||
| ---------------------------- | -------- | -------- |
|
||||
| Grok 4.5 | 不使用 | 30 天 |
|
||||
| Grok 4.6 | 不使用 | 30 天 |
|
||||
| GPT 5.6 Luna | 不使用 | 30 天 |
|
||||
| GLM-5.3 | 不使用 | 0 天 |
|
||||
| GLM-5.2 | 不使用 | 0 天 |
|
||||
|
|
@ -279,7 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
|||
| Hy3 | 不使用 | 0 天 |
|
||||
| Ox Alpha Free | 不使用 | 0 天 |
|
||||
|
||||
- **Grok 4.5:** ZDR 會停用依賴儲存資料的重要 API 功能,包括具狀態的 Responses API、Files and Collections 與 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **Grok 4.6:** ZDR 會停用依賴儲存資料的重要 API 功能,包括具狀態的 Responses API、Files and Collections 與 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **GPT 5.6 Luna:** 所有 API 功能的使用都會產生濫用監控日誌,並保留最多 30 天。[了解更多](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
|
||||
- **Muse Spark 1.2 Contributor:** 以允許使用您的提示詞和生成結果來訓練未來的 Meta 模型為交換,token 價格可享大幅折扣。僅在 Meta 的[地理使用政策](https://ai.developer.meta.com/legal/geographic-use-policy)允許的地區提供。[了解更多](https://dev.meta.ai/docs/pricing-rate-limits#contributor-tier)。
|
||||
- **DeepSeek V4 Flash:** ZDR 協議每月續簽。目前的協議有效至 2026 年 8 月 31 日。
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"name": "opencode",
|
||||
"displayName": "opencode",
|
||||
"description": "opencode for VS Code",
|
||||
"version": "1.18.22",
|
||||
"version": "1.18.23",
|
||||
"publisher": "sst-dev",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue