Compare commits

...
Author SHA1 Message Date
rekram1-node aad3dcccf2 fix(tui): highlight C++ module interface files 2026-10-08 04:17:40 +00:00
Frank 663fbd7573 docs(web): add Sonnet 5.5 to Zen model tables 2026-10-07 23:30:49 -04:00
opencode-agent[bot] a697115b20 chore: generate 2026-10-07 19:19:04 +00:00
Frank 65c47af9b9 feat(console): show Haiku 5.5 across Go pages 2026-10-07 15:17:03 -04:00
Frank bd662d514d docs(web): add Haiku 5.5 to Go model tables 2026-10-07 15:17:03 -04:00
Frank 1bc3ce9abf docs(web): add Haiku 5.5 to Zen model tables 2026-10-07 15:17:02 -04:00
Stefan Avramandslickstef11 b1fe25ab5e feat(console): capture monthly inference spend (#53637)
Co-authored-by: slickstef11 <stefanavram22@gmail.com>
2026-10-07 13:28:10 -04:00
Victor Navarro 3865c696ef feat(console): proxy keyless Zen requests to new inference per model (#53717) 2026-10-07 18:06:54 +02:00
Daniel Chen ecc4916b5a fix(stats): attribute exo usage to an unknown provider (#53621) 2026-10-06 15:32:45 -07:00
Daniel Chen e2564336e4 docs(web): add Exo Free to Zen docs (#53622) 2026-10-06 15:29:35 -07:00
opencode-agent[bot] 52a6c35825 chore: generate 2026-10-06 21:57:27 +00:00
Frank adf32d6c37 docs(web): show Mistral Large 4 discount 2026-10-06 17:55:13 -04:00
Frank d5772b1eab docs(web): add Mistral Large 4 to Zen locales 2026-10-06 17:32:11 -04:00
opencode 63be8f95d8 sync release versions for v1.18.35 2026-10-06 20:18:36 +00:00
opencode-agent[bot] 4ac0d9c3d1 chore: update nix node_modules hashes 2026-10-06 16:28:48 +00:00
Milosz Jankiewicz 83802d800e fix(opencode): bump @ai-sdk/xai to 3.0.139 so tool-result images reach xAI (#53549) 2026-10-06 11:11:21 -05:00
opencode-agent[bot]andadamdotdevin 3f393d78bf fix(stats): show public specs for stealth models (#53381)
Co-authored-by: adamdotdevin <2363879+adamdotdevin@users.noreply.github.com>
2026-10-06 05:29:36 -05:00
Jack f03046d9f5 feat(go): list paid Space Bunny (#53486) 2026-10-06 13:14:54 +08:00
opencode-agent[bot] 652c090dc1 chore: update nix node_modules hashes 2026-10-06 02:26:50 +00:00
Vladimir Glafirov fa49567529 chore: bump gitlab-ai-provider to 6.19.0 (#53345) 2026-10-05 21:12:00 -05:00
Shoubhit Dash 7723920505 chore: remove unused artifacts directory (#53436) 2026-10-06 03:14:02 +05:30
Adam 219c2268c3 fix(console): link dev Go navigation to Console (#53430) 2026-10-05 15:38:15 -05:00
Adam 3569ebe5d6 chore(ci): use blacksmith for dev deploys (#53423) 2026-10-05 15:04:53 -05:00
opencode-agent[bot] 54e51ea515 chore: generate 2026-10-05 19:46:46 +00:00
Jordan Lee a5c0c36e9d docs(ecosystem): add opencode-supabase to ecosystem plugins (#49848) 2026-10-05 14:45:22 -05:00
Adam f32284975f feat(console): enable marketing nav in dev (#53421) 2026-10-05 14:41:28 -05:00
Filip a2aea963d1 fix: include neriousy in Windows issue triage (#53410) 2026-10-05 20:46:56 +02:00
Daniel Chen 907b3bc518 docs(web): add Fledge Alpha Free to Zen docs (#52895) 2026-10-02 21:55:40 -07:00
vprdev 108b988a08 fix(stats): hide models listed in a secret (#52834) 2026-10-02 16:56:07 -04:00
Jack c42ae0d56b docs(web): add Ling 3.1 Flash Free to Zen docs (#52781) 2026-10-02 23:58:36 +08:00
Adam 1ddb0873ae chore(stats): retire legacy s3 lake (#52515) 2026-10-01 22:21:08 -05:00
Adam a79ecfe109 feat(stats): add canonical redirects and agent-readable data formats 2026-10-01 16:41:08 -05:00
opencode-agent[bot] cff9078bb3 chore: update nix node_modules hashes 2026-10-01 21:16:11 +00:00
Adam dc31828006 chore(stats): remove s3 lake ingestion (#52572) 2026-10-01 15:58:14 -05:00
Adam aa481b8f56 fix(stats): fix data page canonicals, 404s, and sitemap coverage (#52525) 2026-10-01 11:24:41 -05:00
opencode-agent[bot] 63cf236140 chore: update nix node_modules hashes 2026-10-01 15:37:36 +00:00
Adam 8bb2ccf829 chore(stats): retire the S3 data lake (#52514) 2026-10-01 10:12:55 -05:00
vprdev 0112a92c41 chore(triage): add vimtor to inference issue owners (#52425) 2026-10-01 00:27:04 -04:00
vprdev 62ac31eb7a chore(triage): update inference issue owners (#52424) 2026-10-01 00:21:33 -04:00
opencode-agent[bot]andrekram1-node 28e13d9fd0 fix(ci): extend issue and PR compliance grace to 72 hours (#52415)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-30 21:39:52 -05:00
opencode 82ea3a3a63 sync release versions for v1.18.34 2026-09-30 22:39:43 +00:00
Aiden Cline e9f8a210b9 fix(opencode): add namespaced session identity headers (#52370) 2026-09-30 15:39:43 -05:00
RyanandRyan Wyler 9b4882db54 fix(opencode): ad-hoc re-sign darwin binaries after local compile (#52183)
Co-authored-by: Ryan Wyler <ryan.wyler@gmail.com>
2026-09-30 12:53:09 -05:00
Metal Heart 97a86b7677 fix(tui): use path.sep for plugin name extraction in /status dialog (#52328) 2026-09-30 11:22:47 -05:00
Daniel Chen 2fa3363c92 docs(web): correct GPT 6.1 Sol cache pricing (#52176) 2026-09-29 14:43:58 -07:00
Dax Raad f66b86ceec fix(ci): sign macOS CLI with Developer ID
Cross-compiled darwin binaries ship with an invalid Bun signature, which breaks codesign verification and publisher-based allowlists. Sign them on macOS with the Developer ID certificate and hardened runtime, matching V2, then repack the release zips and publish the signed binaries to npm and Homebrew.

Refs #46313
2026-09-29 15:33:27 -04:00
Frank 7945de2089 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-09-28 18:59:34 -04:00
opencode-agent[bot] 8d05153965 chore: generate 2026-09-28 19:57:36 +00:00
vprdev d1dc00d83d feat(console): refresh Go page hero and plans to match design (#51933) 2026-09-28 15:55:38 -04:00
opencode-agent[bot] 90853b2121 chore: generate 2026-09-28 19:53:39 +00:00
vprdev d03d6e28d6 fix(console): tell referral link visitors the program has ended (#51920) 2026-09-28 15:52:09 -04:00
Frank 09a3aa0b4c zen: jev privacy policy 2026-09-28 14:32:47 -04:00
Adam 7f964bbb00 fix(stats): keep chart tooltips readable (#51898) 2026-09-28 11:30:23 -05:00
opencode-agent[bot] ad6c72c706 chore: generate 2026-09-28 15:46:01 +00:00
vprdev 75e1e7ae31 fix(console): stop Black subscription renewals (#51884) 2026-09-28 11:44:42 -04:00
Victor Navarro 3c893f0a16 fix(console): polish Go limits chart on mobile (#51870) 2026-09-28 15:39:52 +02:00
Victor Navarro b76bbb3692 feat(console): compare Go and Go Plus limits side by side (#51865) 2026-09-28 15:25:55 +02:00
vprdev f416138844 fix(console): fit Go page to mobile screens (#51855) 2026-09-28 09:05:12 -04:00
Frank 083ed266e0 docs(go): simplify usage limit explanation 2026-09-28 07:34:04 -04:00
Adam acb6859b06 fix(stats): attribute usage from catalog identity (#51833) 2026-09-28 06:08:52 -05:00
opencode-agent[bot] 9f9e73ae0f chore: generate 2026-09-28 11:04:37 +00:00
Frank c1919a3477 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-09-28 07:02:20 -04:00
Frank 482a1cdf0d doc: go plus 2026-09-28 06:43:54 -04:00
Jack 725e4ba4b8 feat(go): show Go Plus plans and limits (#51822) 2026-09-28 18:38:26 +08:00
Frank fed9d78791 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-09-28 06:11:28 -04:00
Frank ddbeaa17c0 doc: go plus 2026-09-28 06:07:01 -04:00
Jack 03e67171ab fix(stats): hide partial-day ranking changes (#51777) 2026-09-28 13:11:35 +08:00
Jack d6963bdf24 fix(stats): localize weekly ranking option (#51776) 2026-09-28 12:52:16 +08:00
Jack 661b7c5548 feat(stats): add daily model rankings (#51774) 2026-09-28 12:44:38 +08:00
opencode 90e65205f6 sync release versions for v1.18.33 2026-09-28 04:22:44 +00:00
opencode-agent[bot]andrekram1-node 1eacc1bdb9 fix: use available model for release changelog (#51773)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-27 23:01:45 -05:00
Dan Lapid 35fc7a776c fix(opencode): apply provider timeouts to Cloudflare AI Gateway models (#51549) 2026-09-27 22:22:28 -05:00
opencode-agent[bot]andrekram1-node b471c2b449 fix(opencode): catch completed MCP browser launcher failures (#51538)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-26 14:56:38 -05:00
Tommy D. Rossi a42f393c85 docs(web): link kimaki to product website (#49735) 2026-09-26 10:55:17 -05:00
Jack b65de4d694 docs(go): add LongCat 2.5 Preview Free to V1 pages (#51488) 2026-09-26 21:16:22 +08:00
opencode-agent[bot] 696f41bc8e chore: update nix node_modules hashes 2026-09-25 23:27:56 +00:00
Aiden Cline 29f07e0c69 refactor(core): share a browser opener across opencode and tui (#51414) 2026-09-25 18:09:47 -05:00
opencode-agent[bot] adee738d1e chore: generate 2026-09-25 16:14:58 +00:00
Jack 543c686c0d fix(go): make DeepSeek $60 allowance permanent (#51364) 2026-09-26 00:13:42 +08:00
Jack 34aa427434 docs(zen): document Qwen3.8 Max (#51321) 2026-09-25 19:00:58 +08:00
opencode-agent[bot]andrekram1-node 16c56fe5ec fix(ci): use GPT-6 Luna for issue automation (#51261)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-24 22:13:00 -05:00
Adam 6df0d5d951 fix(stats): use capability fallbacks in comparison radar (#51161) 2026-09-24 14:26:39 -05:00
JackandMrMushrooooom 0f549842ee fix(stats): attribute Hy4 preview traffic to Tencent (#51050)
Co-authored-by: MrMushrooooom <19261047+MrMushrooooom@users.noreply.github.com>
2026-09-24 14:20:31 +08:00
Jack 0027387dc5 fix(go): include DeepSeek V4 Flash in chart (#51032) 2026-09-24 12:32:44 +08:00
opencode-agent[bot] 5fcfb06f94 chore: update nix node_modules hashes 2026-09-24 02:18:19 +00:00
Vladimir Glafirov 79e8eee5cf chore: bump gitlab-ai-provider to 6.18.0 (#50890) 2026-09-23 21:03:37 -05:00
opencode-agent[bot]andrekram1-node 82d4c89031 fix(opencode): redact credentials in debug config (#50956)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-23 17:35:46 -05:00
Jack 1d6c3c0e29 feat(go): add GPT 6 Luna to Go pages (#50947) 2026-09-24 02:25:48 +08:00
Mark McDonaldandAiden Cline 610df0b566 fix(gemini): switch thinking default logic (#50841)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2026-09-23 11:41:37 -05:00
opencode-agent[bot] 7cb044ee89 chore: generate 2026-09-23 13:59:42 +00:00
Jack 1b4a6dbc65 feat(go): add Space Bunny promotion (#50572) 2026-09-23 21:58:18 +08:00
opencode-agent[bot] 18ef3cc7c5 chore: update nix node_modules hashes 2026-09-23 04:38:22 +00:00
Vladimir Glafirov 45719acebb maint(gitlab): bump gitlab-ai-provider to 6.16.0 (#50742) 2026-09-22 23:21:33 -05:00
opencode-agent[bot] 2406400f0a chore: generate 2026-09-22 19:25:10 +00:00
vprdev fe51b0b19a fix(console): restrict legacy access to Black (#50716) 2026-09-22 12:23:33 -07:00
Daniel Chen 6ea95e5e6f docs(web): add Claude Opus 5.5, GPT 6 Sol, and GPT 6 Luna to Zen (#50708) 2026-09-22 11:54:04 -07:00
opencode-agent[bot] fc827ea8d5 chore: generate 2026-09-22 18:38:53 +00:00
opencode-agent[bot]andrekram1-node 3a35b45db8 feat(openai): allow GPT-6 Sol and Luna with Codex (#50704)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-22 13:36:43 -05:00
opencode fe3f3a41f7 sync release versions for v1.18.32 2026-09-21 22:51:18 +00:00
f5ce4f881e fix(core): break filesystem search import cycle (#50439)
Co-authored-by: frank <48937772+joe-ieta@users.noreply.github.com>
Co-authored-by: kernel-oops <300539221+kernel-oops@users.noreply.github.com>
2026-09-21 16:41:28 -05:00
opencode-agent[bot] f54ce313b9 chore: generate 2026-09-21 19:56:28 +00:00
Jack 32808ad5f1 docs: add MiMo V2.6 models (#50395) 2026-09-22 03:55:06 +08:00
Aiden Cline ba341c6cac fix(core): resolve npm package entrypoint to a file under Node (#50413) 2026-09-21 14:36:52 -05:00
Daniel Chen e059ac5918 feat: add Grok 4.7 to Zen and Go (#50288) 2026-09-21 08:32:28 -07:00
Frank 70a24697ea fix(console): authenticate inference proxy 2026-09-21 04:40:11 -04:00
Frank cf494c2029 fix(console): forward client IP to inference 2026-09-21 04:02:27 -04:00
Aiden Cline c10134729d fix(opencode): hoist Bedrock tool images except Claude, Nova, and Llama 4 (#50272) 2026-09-20 22:31:41 -05:00
opencode-agent[bot] 0e3dfd1769 chore: update nix node_modules hashes 2026-09-21 02:15:03 +00:00
Aiden Cline 8bf288ecb1 fix(opencode): bump togetherai so streams report usage (#50264) 2026-09-20 21:01:45 -05:00
Jack 17b7678875 docs(web): extend DeepSeek promotion (#50255) 2026-09-21 08:40:48 +08:00
Adam d870e22c70 fix(stats): retry transient query failures (#50205) 2026-09-20 17:43:04 +00:00
Adam 45ad8dc38a fix(stats): paginate sync aggregates (#50198) 2026-09-20 17:00:07 +00:00
opencode-agent[bot] 8b2de7317b chore: generate 2026-09-20 16:23:45 +00:00
Aiden Cline ac88182b3e ci: sync v2 catalog once a day (#50194) 2026-09-20 11:22:28 -05:00
Frank ebb7b76eca docs(web): align Jev section heading 2026-09-19 20:49:02 -04:00
Frank 11be5bc29c docs(web): document Jev usage 2026-09-19 20:41:21 -04:00
Aiden Cline 83abc64a5c chore(ci): refresh v2 models.dev snapshot on a schedule (#50030) 2026-09-19 16:46:33 -05:00
opencode-agent[bot]andthdxr fee476bb90 refactor(console): redirect desktop downloads (#49984)
Co-authored-by: thdxr <826656+thdxr@users.noreply.github.com>
2026-09-19 14:31:47 +00:00
opencode-agent[bot]andBrendonovich ae93d4afb3 fix(console): use v2 desktop downloads (#49931)
Co-authored-by: Brendonovich <14191578+Brendonovich@users.noreply.github.com>
2026-09-19 09:01:25 +00:00
opencode-agent[bot] 9a53565790 chore: generate 2026-09-19 08:05:40 +00:00
Frank 61eae8811a docs(web): add Jev models to Zen 2026-09-19 04:04:16 -04:00
Frank 34b4c3cd9f fix(console): update systemone endpoints 2026-09-19 03:37:25 -04:00
Dax Raad 3c7f191972 fix(web): add v2 banner border and restore header hairline 2026-09-19 03:35:42 -04:00
Dax Raad 7c22dbbaf9 fix(web): use neutral colors for v2 banner 2026-09-19 03:29:50 -04:00
Dax Raad 6da6d47aab fix(web): render v2 banner full width below header 2026-09-19 03:29:17 -04:00
Dax Raad f1aacaba22 feat(web): add v2 announcement banner to legacy docs 2026-09-19 03:14:51 -04:00
opencode-agent[bot] 4e1c49630a chore: generate 2026-09-19 04:17:02 +00:00
Daniel Chen a6cad7743f docs: add DeepSeek V4.1 Flash to Zen (#49897) 2026-09-18 21:15:46 -07:00
Jack ae2da69004 docs: add Qwen3.8 Flash to Zen (#49888) 2026-09-19 11:30:51 +08:00
Dax 285cff53da feat(console): switch install links to v2 (#49874) 2026-09-19 01:27:27 +00:00
opencode-agent[bot] 5f9d9187c0 chore: generate 2026-09-18 15:59:01 +00:00
Frank 1573a7b608 support jev 2026-09-18 11:57:10 -04:00
Jack 3dd1b30539 docs: restore GPT-5.6 Sol pricing (#49724) 2026-09-18 18:06:35 +08:00
opencode-agent[bot] e80db11160 chore: generate 2026-09-18 09:14:23 +00:00
Jack a7f2373a05 chore(go): retire Union Alpha (#49718) 2026-09-18 17:13:11 +08:00
opencode-agent[bot]andrekram1-node b02acc1e30 chore(stats): update GitHub star fallback (#49654)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-17 20:50:22 -05:00
opencode-agent[bot]andvimtor 5a8335857b fix(console): show migrated workspaces in selector (#49520)
Co-authored-by: vimtor <vimtor@users.noreply.github.com>
2026-09-17 11:25:14 +02:00
Adam 88c6c7abc7 fix(stats): preserve container dependency lock (#49385) 2026-09-16 13:15:53 -05:00
opencode-agent[bot]andadamdotdevin a6183af6f3 fix(stats): hide Union Alpha provider (#49356)
Co-authored-by: adamdotdevin <2363879+adamdotdevin@users.noreply.github.com>
2026-09-16 12:47:12 -05:00
opencode-agent[bot]andadamdotdevin 2e018f70f2 fix(stats): guard oversized model names (#49363)
Co-authored-by: adamdotdevin <2363879+adamdotdevin@users.noreply.github.com>
2026-09-16 16:47:21 +00:00
Jack 1364769e51 fix(go): label Union Alpha as free (#49353) 2026-09-16 23:30:58 +08:00
opencode-agent[bot] 350c726aa8 chore: generate 2026-09-16 13:44:33 +00:00
Jack ee91f190c5 feat(go): add Union Alpha (#49178) 2026-09-16 21:42:09 +08:00
Victor Navarro 501ff62cbf fix(console): exclude migrated workspaces from selection (#49336) 2026-09-16 15:07:22 +02:00
Frank e03db9bc69 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-09-14 17:41:36 -04:00
Frank 403627b031 deepseek v4.1 flash 2026-09-14 17:41:34 -04:00
vprdev 5cf4e13588 fix(console): route new Console keys to inference (#49036) 2026-09-14 14:32:56 -07:00
opencode-agent[bot]andrekram1-node 4ae176520d chore: add Alan to team members (#49054)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-14 14:16:46 -07:00
opencode a74c472ffb sync release versions for v1.18.31 2026-09-14 17:47:27 +00:00
opencode-agent[bot]andthdxr a97622c801 fix(tui): surface remote auth startup errors (#49016)
Co-authored-by: thdxr <826656+thdxr@users.noreply.github.com>
2026-09-14 13:24:08 -04:00
opencode-agent[bot]andrekram1-node 7f209437b5 test(app): retire legacy layout e2e coverage (#49015)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-14 12:08:40 -05:00
Matthew Feroz 228e9095ba fix(ui): add Merge Gateway logo (#42015) 2026-09-14 02:16:48 -05:00
Frank df23b7f948 feat(console): forward Go billing source 2026-09-13 17:38:53 -04:00
opencode-agent[bot] 631f67a9f3 chore: update nix node_modules hashes 2026-09-13 17:14:41 +00:00
Rohan Tanejaandrekram1-node 199a4cdbea chore(deps): bump @ai-sdk/gateway to 3.0.191 (#48710)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-13 11:56:55 -05:00
opencode-agent[bot] a453386e9d chore: generate 2026-09-13 15:24:43 +00:00
Jack ca34cecc03 docs(go): show DeepSeek V4.1 Flash promo limits (#48824) 2026-09-13 23:23:29 +08:00
Jacob WolfandShoubhit Dash 95daf90670 fix(acp): restore session options and reasoning boundaries (#48225)
Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>
2026-09-11 18:46:41 +05:30
opencode-agent[bot] 0b934e9516 chore: generate 2026-09-11 13:07:53 +00:00
黑墨水鱼 5de2f241c6 feat(console): add batch workspace block endpoints (#48491) 2026-09-11 21:06:26 +08:00
Adam 193de13a88 fix(stats): normalize deepseek v4.1 flash 2026-09-10 15:33:35 -05:00
Adam 43e89ea167 fix(stats): prevent full retention sync timeouts 2026-09-10 14:50:04 -05:00
Jack b7ca4f91d9 docs(go): update DeepSeek V4.1 Flash model ID (#48363) 2026-09-11 01:53:15 +08:00
Victor Navarro b3f1a96c6d fix(console): unblock Go subscriptions in dev (#48309) 2026-09-10 11:25:59 +02:00
Jack 859106eb17 docs(go): remove Omen Alpha listings (#48280) 2026-09-10 12:22:43 +08:00
opencode-agent[bot] 486e8460b1 chore: generate 2026-09-10 03:06:55 +00:00
Jack 28a62b7148 feat(go): add DeepSeek V4.1 Flash (#48270) 2026-09-10 11:05:41 +08:00
Aiden ClineandAljosha Friemann a9a6fad0fa fix(opencode): request summarized adaptive thinking (#48269)
Co-authored-by: Aljosha Friemann <1730315+afriemann@users.noreply.github.com>
2026-09-09 21:51:42 -05:00
opencode-agent[bot] b6914b39db chore: generate 2026-09-09 22:45:26 +00:00
JackandFrank 72635a3720 feat(console): clarify Go model usage (#48192)
Co-authored-by: Frank <frank@anoma.ly>
2026-09-09 18:44:00 -04:00
Victor Navarro 9f8db119fc feat(console): route migrated Go inference (#48123) 2026-09-09 19:45:38 +02:00
Jack f69beceaff docs(go): update GLM-5.3-Flash allowance (#48130) 2026-09-09 23:41:56 +08:00
opencode 830d5eb535 sync release versions for v1.18.30 2026-09-09 03:34:25 +00:00
Aiden Cline 5cd8e68fdd feat(opencode): port Astra system prompt from v2 (#48057) 2026-09-08 21:27:13 -05:00
opencode-agent[bot] dff8fbc149 chore: generate 2026-09-08 16:21:49 +00:00
Emrickandyeqisong ac1758c0e6 fix: preserve Bedrock DeepSeek model ids (#34441)
Co-authored-by: yeqisong <yeqisong@authing.com>
2026-09-08 11:20:22 -05:00
opencode-agent[bot] d6855b6b47 chore: generate 2026-09-08 06:51:49 +00:00
Jack eebd85f5d1 docs(go): translate client compatibility guidance (#47901) 2026-09-08 14:50:35 +08:00
opencode-agent[bot] ecbc6ccac8 chore: update nix node_modules hashes 2026-09-07 16:21:14 +00:00
Vladimir Glafirov 0b082b065d chore: bump gitlab-ai-provider to 6.15.0 (#47792) 2026-09-07 11:03:30 -05:00
Aiden Cline 57ef382843 feat(console): publish oauth client metadata document (#47737) 2026-09-07 01:11:00 -05:00
Dax Raad f914cac3d4 docs 2026-09-07 01:49:16 -04:00
opencode-agent[bot] 53fec37d8d chore: generate 2026-09-07 04:03:53 +00:00
Dax Raad a03bba5f2c docs 2026-09-07 00:02:27 -04:00
opencode-agent[bot] 56d4fb24a1 chore: generate 2026-09-07 03:44:38 +00:00
Dax Raad 13e3744f76 docs(go): document client session compatibility 2026-09-06 23:42:25 -04:00
opencode-agent[bot] e207624c48 chore: update nix node_modules hashes 2026-09-06 22:05:22 +00:00
opencode-agent[bot]andrekram1-node ea2d59d7ca fix(provider): preserve explicit OpenAI service tiers (#47671)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-06 16:48:43 -05:00
opencode-agent[bot]andrekram1-node bec9ee41af fix(provider): bump Azure SDK to 3.0.93 (#47664)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-06 16:34:09 -05:00
opencode-agent[bot] c470c79513 chore: update nix node_modules hashes 2026-09-06 20:59:14 +00:00
23ec4f55c8 fix(provider): bump OpenAI SDK to 3.0.88 (#47659)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: GuestAUser <62957566+GuestAUser@users.noreply.github.com>
2026-09-06 15:40:58 -05:00
opencode-agent[bot] 337fd144d2 chore: generate 2026-09-06 04:32:46 +00:00
Jack 1ddaeec480 docs(console): add localized refund FAQs for Go and Zen (#47575) 2026-09-06 12:31:27 +08:00
far-ouq 7c2199d84a fix(opencode): add GitLab reasoning variants (#47306) 2026-09-05 18:29:29 -05:00
Stefan Avramandslickstef11 bbd72fb8b0 fix(console): connect enterprise form to Chatwoot (#47488)
Co-authored-by: slickstef11 <stefanavram22@gmail.com>
2026-09-05 15:51:32 +02:00
黑墨水鱼andJack e2894562f8 fix(console): openai usage normalization and tier threshold config (#47342)
Co-authored-by: Jack <jack@anoma.ly>
2026-09-05 03:36:32 +00:00
Frank 70b4ca8c18 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-09-04 21:49:05 -04:00
Frank 4db1eec321 update zen docs 2026-09-04 21:48:55 -04:00
opencode-agent[bot] 79903a4cf7 chore: generate 2026-09-05 01:40:11 +00:00
Frank e8548ae8b2 update zen models 2026-09-04 21:38:36 -04:00
Frank 7774580e61 zen: add muse spark 2026-09-04 21:32:15 -04:00
opencode 5b1e31988e sync release versions for v1.18.29 2026-09-04 23:47:13 +00:00
Aiden Cline 02a167e048 fix(opencode): compare Codex GPT versions by major and minor (#47385) 2026-09-04 18:22:56 -05:00
Aiden Cline 500c46ec79 fix(opencode): allow integer GPT versions in Codex model filter (#47384) 2026-09-04 18:14:21 -05:00
黑墨水鱼 5cf9f517cf feat(console): add quota reset support action (#47313) 2026-09-05 02:47:06 +08:00
Peter267 5d5c35ee71 docs(zh): fix bold rendering by adding spaces around asterisks (#46231) 2026-09-04 12:50:14 -05:00
opencode 51f86c8537 sync release versions for v1.18.28 2026-09-04 15:38:19 +00:00
Jack 20a7743876 docs(go): renew DeepSeek ZDR through September 2026 (#47288) 2026-09-04 21:31:04 +08:00
opencode-agent[bot] 31afdd5938 chore: generate 2026-09-04 12:34:53 +00:00
Adam 4178fd74f1 fix(stats): hide stealth model providers 2026-09-04 07:33:04 -05:00
Victor Navarro 3f31139064 feat(console): route migrated BYOK through provider connections (#47266) 2026-09-04 12:42:58 +02:00
Jack 475b408119 fix(console): backport usage reset boundary fix to dev (#47267) 2026-09-04 18:41:12 +08:00
opencode-agent[bot]andfwang 70f74112e3 fix(stats): keep omen-alpha under unknown provider (#47248)
Co-authored-by: fwang <83515+fwang@users.noreply.github.com>
2026-09-04 04:22:48 -04:00
opencode-agent[bot]andrekram1-node 03cb632435 test(core): disable npm audits in the test preload (#47222)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-04 00:34:37 -05:00
opencode-agent[bot] dd417f1a6b chore: generate 2026-09-04 05:09:10 +00:00
Jack 8b9f89e7e8 docs(go): add Omen Alpha (#47220) 2026-09-04 13:07:43 +08:00
opencode-agent[bot]andrekram1-node c0f09afef5 feat(copilot): send X-Interaction-Id header with session id (#47215)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-09-03 23:24:55 -05:00
Adam 8a6cf2c9aa feat(stats): improve market share chart (#47115) 2026-09-03 16:03:32 -05:00
opencode-agent[bot] a935432b5c chore: generate 2026-09-03 19:58:32 +00:00
David Hill 7561b4a050 fix(tui): use unicode ellipses in interface text (#45126) 2026-09-03 13:56:40 -06:00
opencode-agent[bot] d8eb3b80fb chore: generate 2026-09-03 17:42:08 +00:00
Adam 08c483dc36 fix(stats): reduce database query load 2026-09-03 12:38:24 -05:00
Victor Navarro d2efd81fb3 fix(console): proxy migrated model discovery to v1 endpoint (#47065) 2026-09-03 17:04:58 +02:00
Jack 79d503150c docs(web): translate Go usage requirements (#47057) 2026-09-03 21:52:04 +08:00
opencode-agent[bot] f12e14cf16 fix(app): identify desktop in Console device auth (v1) (#47000) 2026-09-03 11:01:59 +02:00
David Hill b578b7261f fix(app): increase open-in icon size (#46540) 2026-09-03 09:47:21 +08:00
Victor M. SMITH bbe4c952d7 docs: add Eden AI to the providers list (#43386) 2026-09-02 20:35:18 -05:00
opencode-agent[bot] 3a9d4e78b6 chore: update nix node_modules hashes 2026-09-02 23:33:47 +00:00
Vladimir Glafirov 8d1f8916d3 chore: bump gitlab-ai-provider to 6.13.0 (#46914) 2026-09-02 18:18:04 -05:00
opencode 05028334b2 sync release versions for v1.18.27 2026-09-02 21:40:57 +00:00
Aiden Cline b04697366f fix(opencode): default header timeout to five minutes (#46903) 2026-09-02 16:00:54 -05:00
Aiden Cline 4eb29a64f0 fix(opencode): default chunk timeout to five minutes (#46890) 2026-09-02 15:33:15 -05:00
Darien KindlundandAiden Cline 68abdce1a0 fix(opencode): let config opt out of Anthropic thinking blockBinding (#46820)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2026-09-02 14:15:39 -05:00
Victor Navarro ef2792511d fix(console): restore migrated inference proxy requests (#46854) 2026-09-02 18:44:43 +02:00
Aiden Cline 9a71624d2d fix(provider): scope thinking binding to Claude 5.1+ (#46848) 2026-09-02 11:30:28 -05:00
opencode-agent[bot] ffbdee7b17 chore: generate 2026-09-02 16:06:24 +00:00
Jack 77aec36da1 feat(console): add Muse Spark 1.3 and Gemini 3.8 Flash (#46836) 2026-09-03 00:04:37 +08:00
Victor Navarro 50efc055de feat(console): keep migrated teams on the new Console (#46830) 2026-09-02 17:52:15 +02:00
Alex 69c172e8a7 fix(provider): handle SSE reader cancel rejections (#44944) 2026-09-01 23:28:47 -05:00
Jack 82b665075b docs(zen): add Claude Fable 5.1 (#46728) 2026-09-02 11:54:40 +08:00
opencode 8e0f1c253b sync release versions for v1.18.26 2026-09-01 21:52:12 +00:00
opencode-agent[bot] 8ff796f133 chore: update nix node_modules hashes 2026-09-01 21:18:22 +00:00
Aiden Cline 8100c68b50 fix(app): bump happy-dom to fix GC-dependent MutationObserver flake (#46675) 2026-09-01 16:00:24 -05:00
Aiden Cline 86387e90b2 test(opencode): fix session tools test typecheck and runtime (#46677) 2026-09-01 15:24:30 -05:00
opencode-agent[bot] c10d6767c9 chore: update nix node_modules hashes 2026-09-01 20:18:42 +00:00
Roscoe A. Bartlett 765ae641d7 fix(core): Fix for incorrect time.start reset in tool call logging (#32574) (#32596) 2026-09-01 15:17:03 -05:00
Aiden Cline c066339d80 test(opencode): guard patched dependency versions (#46673) 2026-09-01 14:59:45 -05:00
Aiden Cline 1542195217 fix(opencode): allow none reasoning effort in Bedrock SDK (#46671) 2026-09-01 14:57:55 -05:00
Filip af1f9e6269 remove azure discovery stuff (#46666) 2026-09-01 21:53:43 +02:00
opencode-agent[bot] 2961956c74 chore: update nix node_modules hashes 2026-09-01 19:53:04 +00:00
Aiden Cline 3f39a329c3 feat(opencode): tolerate Anthropic thinking block binding (#46653) 2026-09-01 14:32:26 -05:00
opencode-agent[bot] dc8753f82a chore: update nix node_modules hashes 2026-09-01 19:11:11 +00:00
KevinZhouandAiden Cline 4502ee568e fix(core): bump @ai-sdk/amazon-bedrock to 4.0.166 for reasoning and replay fixes (#45520)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2026-09-01 13:52:35 -05:00
Aiden Cline 55c54d14b8 chore: use native runtime conditions in development (#46644) 2026-09-01 13:50:55 -05:00
Aiden Cline 2da5a4b034 refactor(tui): use OpenTUI Dynamic in session view (#46649) 2026-09-01 13:47:49 -05:00
Aiden Cline 216ba8f05f fix(opencode): stop Azure model discovery from logging to stdout (#46646) 2026-09-01 13:39:45 -05:00
opencode-agent[bot] df6aecdbc5 chore: generate 2026-09-01 17:14:51 +00:00
Adam 1ce281b7ab fix(stats): prevent comparison legend collapse 2026-09-01 12:12:22 -05:00
Victor Navarro 5341a5e442 feat(console): add workspace migration timestamp (#46627) 2026-09-01 18:20:52 +02:00
Jack ebece6efd7 docs(web): update Qwen3.7 Max Go usage (#46555) 2026-09-01 15:11:17 +08:00
Dax Raad 1ead9e3d7f fix(web): number Go usage requirements 2026-08-31 22:45:35 -04:00
Dax Raad be3b703a7b fix(web): restore documentation list markers 2026-08-31 22:45:35 -04:00
Kyle Altendorf f7da00f35e fix(opencode): omit empty apply patch move path (#45329) 2026-08-31 21:37:19 -05:00
5c5c709fee fix(tui): pin diff highlights query (#46519)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Andreas Holt <6665487+AndreasHolt@users.noreply.github.com>
2026-08-31 21:16:05 -05:00
opencode-agent[bot] 2386fcec75 chore: generate 2026-09-01 01:35:29 +00:00
Dax Raad ba790579ea docs on proper usage of OpenCode Go 2026-08-31 21:34:02 -04:00
opencode-agent[bot] 04284921ac chore: generate 2026-08-31 17:33:52 +00:00
Adam b639de07ac fix(stats): merge deepseek flash variants (#46446) 2026-08-31 12:32:22 -05:00
opencode-agent[bot]andKit Langton 26ff3ed3d3 fix(tui): keep home shortcuts right-aligned (#36906)
Co-authored-by: Kit Langton <kit.langton@gmail.com>
2026-08-31 12:01:31 -04:00
opencode-agent[bot]andBrendonovich 9f69463f1d fix(app): backport session rename and tab menu fixes to v1 (#46116)
Co-authored-by: Brendonovich <14191578+Brendonovich@users.noreply.github.com>
2026-08-31 05:19:51 +00:00
Jack 10765ff2a9 fix: remove Hy3 Free docs and correct Go chart rendering (#46221) 2026-08-30 12:09:56 +08:00
Jack be53e17e19 docs(go): end Hy3 usage promotion (#46213) 2026-08-30 11:34:46 +08:00
opencode-agent[bot] dc4449df0d chore: update nix node_modules hashes 2026-08-29 02:34:49 +00:00
Kit Langton 62a2f0e617 feat(console): animate Go usage allowances and bonuses (#46055) 2026-08-29 02:22:28 +00:00
Jack df35e842f5 docs(zen): add Ling 3.0 Flash Fin Free (#45923) 2026-08-28 20:04:58 +08:00
Jack 1be9fd55a9 docs(go): add Hy4 preview (#45904) 2026-08-28 18:21:28 +08:00
opencode 755ebdb94e sync release versions for v1.18.25 2026-08-28 05:58:17 +00:00
opencode-agent[bot]andHona c2e39bb556 test(opencode): use native config path in permission assertion (#45849)
Co-authored-by: Hona <10430890+Hona@users.noreply.github.com>
2026-08-28 05:52:06 +00:00
opencode-agent[bot]andHona 733562e92a fix(opencode): remove Bun dependency from Azure authentication (#45845)
Co-authored-by: Hona <10430890+Hona@users.noreply.github.com>
2026-08-28 15:38:25 +10:00
Jack 8a7cc0c0ff docs(go): add Qwen3.8 Flash (#45836) 2026-08-28 13:17:02 +08:00
opencode 19db518e0a sync release versions for v1.18.24 2026-08-28 04:10:10 +00:00
opencode-agent[bot]andjlongster 15537a41d2 fix(opencode): compare config snapshots as JSON (#45784)
Co-authored-by: jlongster <17031+jlongster@users.noreply.github.com>
2026-08-27 20:08:12 -04:00
opencode-agent[bot]andneriousy 790fb5b86f feat(opencode): support Azure CLI authentication (#45079)
Co-authored-by: neriousy <34747899+neriousy@users.noreply.github.com>
2026-08-28 01:50:15 +02:00
opencode-agent[bot]andneriousy 517ee736b3 fix(provider): filter unreplayable Bedrock reasoning before caching (#45769)
Co-authored-by: neriousy <34747899+neriousy@users.noreply.github.com>
2026-08-28 00:48:48 +02:00
opencode-agent[bot] c77100a40c chore: generate 2026-08-27 20:05:43 +00:00
James Long 03afae5b95 feat(opencode): load supported v2 config in v1 (#45421) 2026-08-27 16:03:36 -04:00
opencode-agent[bot]andjayair 05ea5073be fix(console): improve Go comparison chart on mobile (#45044)
Co-authored-by: jayair <53023+jayair@users.noreply.github.com>
2026-08-27 13:21:00 -04:00
opencode-agent[bot] 5f5ea53afb chore: generate 2026-08-27 11:13:37 +00:00
Adam 1120d0704e fix(stats): map ox alpha to glm 5.3 flash (#45542) 2026-08-27 06:12:21 -05:00
opencode-agent[bot]andMrMushrooooom 6568a82455 fix(console): merge duplicate Go usage rows (#45503)
Co-authored-by: MrMushrooooom <19261047+MrMushrooooom@users.noreply.github.com>
2026-08-27 03:11:56 -04:00
Adam c2eacd72af fix(console): secure server action redirects (#45374) 2026-08-26 15:03:16 -05:00
Adam c5ef753d28 fix(stats): align retention columns 2026-08-26 11:14:49 -05:00
Adam 530535c6ea fix(stats): reduce retention query scan 2026-08-26 10:38:12 -05:00
Adam 023620b57e chore: add sst unlock workflow 2026-08-26 09:39:34 -05:00
Adam 902e67eba9 feat(stats): add weekly retention 2026-08-26 09:02:23 -05:00
Jack 830aaf2059 docs(go): add GLM-5.3-Flash (#45269) 2026-08-26 21:49:06 +08:00
Adam a0f36c9df7 feat(stats): add retention metrics 2026-08-26 07:39:44 -05:00
opencode-agent[bot] 1216c55094 chore: generate 2026-08-26 11:20:31 +00:00
Jack ec25388937 docs: remove Ox Alpha Free (#45221) 2026-08-26 19:19:12 +08:00
opencode-agent[bot] c7134cbb01 chore: update nix node_modules hashes 2026-08-26 10:55:43 +00:00
Adam ba4d0ea8bf fix(console): validate auth redirects (#45027) 2026-08-26 05:41:23 -05:00
opencode-agent[bot] 1cc53890dc chore: update nix node_modules hashes 2026-08-26 07:47:41 +00:00
Frank ae2ea3c723 fix map inaccuracy 2026-08-26 03:40:35 -04:00
Frank 3f31551fad fix map inaccuracy 2026-08-26 03:31:48 -04:00
Frank 13c27598d3 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-26 02:31:35 -04:00
Frank 2564a4f172 remove map 2026-08-26 02:31:32 -04:00
Ravitez Dondeti fd9bd448a2 docs: mention Exa and Parallel as web search backends (#38395) 2026-08-25 19:57:17 -05:00
opencode-agent[bot]andneriousy b72b50006b fix(core): recover legacy database migration history (#45061)
Co-authored-by: neriousy <34747899+neriousy@users.noreply.github.com>
2026-08-25 21:58:35 +02:00
Jack ac1c048e64 docs(go): add Grok 4.6 (#45042) 2026-08-26 01:27:48 +08:00
Dax 8615731d46 fix(console): rate limit checkout session creation (#45007) 2026-08-25 11:25:59 -04:00
OpeOginniandBrendan Allan a7444bf944 fix(ui): restore focus in stacked dialogs (#44928)
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
2026-08-25 19:05:49 +08:00
Frank 69aaa22793 zen: void invoice of cancelled subscription 2026-08-25 05:26:31 -04:00
opencode-agent[bot] 322e2b9dd5 chore: generate 2026-08-25 09:07:56 +00:00
Frank afd6f3b064 zen: display quota usage breakdown 2026-08-25 05:06:33 -04:00
Frank 1e86be2bc5 update inference headers 2026-08-25 04:22:20 -04:00
Nathan ThomassinandBrendan Allan a57230b80b fix(app): drop archived sessions from home list right away (#44905)
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
2026-08-25 07:34:24 +00:00
Frank 6bb1a76e58 update inference headers 2026-08-25 03:30:20 -04:00
Frank bdcb6be649 update inference headers 2026-08-25 03:14:21 -04:00
opencode 2f36ffe35d sync release versions for v1.18.23 2026-08-25 06:30:46 +00:00
Frank 31c409a865 update inference headers 2026-08-25 01:54:38 -04:00
Dax Raad d0ceaef6aa docs(console): prohibit abusive multi-account use 2026-08-24 23:32:44 -04:00
Charlie GleasonandClaude Opus 4.8 3ef72fe8f6 fix(provider): route non-native Cloudflare AI Gateway providers via the REST API (#44828)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 22:01:17 -05:00
51070b6f59 docs: clarify prompt data handling (#44854)
Co-authored-by: thdxr <826656+thdxr@users.noreply.github.com>
Co-authored-by: Dax <mail@thdxr.com>
2026-08-24 22:31:47 -04:00
Filip 18b4cb6819 docs(github): correct action token configuration (#44793) 2026-08-25 00:29:56 +02:00
Frank 0561bac189 add client header replacement 2026-08-24 17:40:33 -04:00
Filip f4019cab3e fix(github): support immutable OIDC subjects (#44776) 2026-08-24 23:23:22 +02:00
Charlie GleasonandClaude Sonnet 5 f8b4dd70ac fix(provider): send Anthropic's dashed native slug through the AI Gateway (#44281)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 16:15:26 -05:00
opencode-agent[bot]andrekram1-node 611cc73d84 fix(opencode): send parent session header (#44752)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-24 15:24:47 -05:00
Frank 7cde8329bc update model parser 2026-08-24 13:19:53 -04:00
Frank be15db5861 Revert "delay removing first month discount"
This reverts commit 754bb7e390.
2026-08-24 12:07:27 -04:00
opencode 55f984126c sync release versions for v1.18.22 2026-08-24 14:37:14 +00:00
opencode-agent[bot] 2a6be0a03b chore: generate 2026-08-24 12:50:53 +00:00
Dax 2a36236132 fix(opencode): normalize upgrade endpoint (#44686) 2026-08-24 12:49:33 +00:00
opencode-agent[bot]andnexxeln 105b398c2a docs(acp): update Zed custom agent config (#44658)
Co-authored-by: nexxeln <95541290+nexxeln@users.noreply.github.com>
2026-08-24 16:22:48 +05:30
opencode-agent[bot] 9fa27bd41c chore: generate 2026-08-24 10:04:12 +00:00
Jack 6bb772215b docs(go): add LongCat-2.0 (#44636) 2026-08-24 18:02:51 +08:00
Jack 03521003fa docs(go): clarify DeepSeek weekend pricing (#44637) 2026-08-24 16:21:37 +08:00
Frank 754bb7e390 delay removing first month discount 2026-08-24 04:00:55 -04:00
Frank 4371298fff fix(console): discontinue first-month Go discount (#44633) 2026-08-24 03:54:38 -04:00
opencode-agent[bot] 3f2e0e89ec chore: generate 2026-08-24 07:18:00 +00:00
Frank 4dbeeddc77 discontinue first month discount 2026-08-24 03:01:02 -04:00
Frank 4161695885 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-24 02:19:03 -04:00
Frank 7bbfe425f6 always allow ox alpha in go 2026-08-24 02:18:34 -04:00
Frank f2a1d547f1 fix(console): set duplex for streamed zen requests 2026-08-24 02:13:33 -04:00
b1ce938ebe fix(console): support DeepSeek weekend pricing (#44305)
Co-authored-by: MrMushrooooom <MrMushrooooom@users.noreply.github.com>
Co-authored-by: Frank <frank@anoma.ly>
2026-08-24 01:54:31 -04:00
opencode-agent[bot] 03bba464d4 chore: generate 2026-08-23 17:15:36 +00:00
Dax 63a883a4f7 refactor(console): stream zen bodies without modifiers (#44472) 2026-08-23 13:14:18 -04:00
Dax b3bad6b581 fix(console): revert scanned zen request streaming (#44470) 2026-08-23 13:03:20 -04:00
opencode-agent[bot] ca10088bdf chore: generate 2026-08-23 16:51:36 +00:00
Dax dd3f915956 fix(console): release streamed zen prefixes (#44465) 2026-08-23 12:50:18 -04:00
opencode-agent[bot] c11c41bd86 chore: generate 2026-08-23 16:48:45 +00:00
Dax fa117558ee fix(console): scan zen model before streaming (#44463) 2026-08-23 12:47:29 -04:00
Frank 17b47301ba feat(console): add unblock workspace action 2026-08-23 12:46:02 -04:00
Dax 3d31e4bcec fix(console): revert streamed zen request bodies (#44444) 2026-08-23 11:54:07 -04:00
opencode-agent[bot] bb72277407 chore: generate 2026-08-23 15:19:54 +00:00
Dax 32c3637da0 fix(console): stream zen request bodies (#44429) 2026-08-23 11:18:38 -04:00
Dax Raad 9d466cd849 fix(stats): normalize model casing 2026-08-23 10:33:11 -04:00
opencode-agent[bot] e3bd6e0947 chore: generate 2026-08-23 14:00:45 +00:00
Dax dc13c6bb3d fix(console): reduce zen request memory (#44403) 2026-08-23 09:59:29 -04:00
Brendan Allan 3a31c4ea80 fix(app): keep model provider headers visible (#44115) 2026-08-22 20:50:02 +08:00
Kit Langton e00890c672 fix: resolve console device URLs (#44029) 2026-08-22 00:25:56 +00:00
joelstucki-tauliaandJoel Stucki 3a4c253969 fix(provider): guard textVerbosity injection for @ai-sdk/openai-compatible providers (#43915)
Co-authored-by: Joel Stucki <joel.stucki@example.com>
2026-08-21 22:19:33 +00:00
Adam 34a83b27c3 fix(stats): improve chart tooltip truncation 2026-08-21 17:13:13 -05:00
opencode-agent[bot] ff3ef6e3e6 chore: update nix node_modules hashes 2026-08-21 21:54:44 +00:00
opencode-agent[bot]andneriousy e2ec62d073 fix: bump Amazon Bedrock provider (#43909)
Co-authored-by: neriousy <34747899+neriousy@users.noreply.github.com>
2026-08-21 23:39:17 +02:00
opencode-agent[bot]andSlickstef11 bcf1103a8c docs(zen): update GPT 5.6 Sol pricing (#43986)
Co-authored-by: Slickstef11 <98915060+Slickstef11@users.noreply.github.com>
2026-08-21 17:00:03 -04:00
Dax Raad 9cb6fb6529 fix(console): cache desktop downloads 2026-08-21 16:58:52 -04:00
opencode-agent[bot]andthdxr 1b937c860b test(opencode): align unknown finish coverage (#43895)
Co-authored-by: thdxr <826656+thdxr@users.noreply.github.com>
2026-08-21 10:56:50 -04:00
opencode ad0bb6d9a3 sync release versions for v1.18.21 2026-08-21 14:51:08 +00:00
opencode-agent[bot] 487d584402 docs(zen): reflect GPT 5.6 Sol discount (#43874) 2026-08-21 22:49:25 +08:00
opencode-agent[bot]andrekram1-node 57fa34f235 fix(opencode): continue unknown finish responses (#43892)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-21 10:30:15 -04:00
Adam 0af9dd61d2 fix(stats): merge renamed model data (#43883) 2026-08-21 08:38:31 -05:00
opencode-agent[bot] 8ecd4c21bf chore: generate 2026-08-21 13:24:26 +00:00
361a71ffad fix(opencode): route Vertex multi-regions through REP (#42648)
Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com>
Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com>
2026-08-21 15:23:05 +02:00
opencode-agent[bot] fa8f17014c chore: generate 2026-08-21 12:58:43 +00:00
Jack 813e6f3cec docs(go): add DeepSeek vision model (#43866) 2026-08-21 20:57:25 +08:00
Jack ba72a6ff2b fix(go): align Ox Alpha model ID (#43837) 2026-08-21 17:03:23 +08:00
Brendan Allan b6a1f95858 fix(app): preserve file search results while loading (#43836) 2026-08-21 08:52:45 +00:00
Nathan Thomassin f357e70779 fix(app): register archive session command in both layouts (#41741) 2026-08-21 08:28:40 +00:00
opencode a9cac91d60 sync release versions for v1.18.20 2026-08-21 08:09:28 +00:00
Aiden Cline 35fe5b7212 fix(opencode): surface subagent tool errors (#43821) 2026-08-21 02:44:44 -05:00
opencode-agent[bot]andAiden 62cb3f77bd test(opencode): remove flaky subagent test (#43819)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
2026-08-21 02:35:25 -05:00
opencode-agent[bot]andAiden e0b9e68a68 fix(opencode): retry raw network finish errors (#43813)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
2026-08-21 02:17:35 -05:00
opencode-agent[bot] 1e4c153aed chore: generate 2026-08-21 07:07:33 +00:00
Jack c9dc1a1b3d feat(go): add Ox Alpha to usage graph (#43809) 2026-08-21 15:06:23 +08:00
opencode-agent[bot]andAiden 40282c1d4d fix(opencode): retry network error variants (#43806)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
2026-08-21 01:47:20 -05:00
opencode-agent[bot] e11dbd0206 chore: generate 2026-08-21 06:25:22 +00:00
Jack 7b11ef5a5e docs(go): add Ox Alpha Free (#43798) 2026-08-21 14:24:06 +08:00
opencode-agent[bot] 2859603cbb chore: generate 2026-08-21 02:58:48 +00:00
opencode-agent[bot]andrekram1-node c313504c82 fix(opencode): surface resumable subagent errors (#43657)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-20 21:57:33 -05:00
e49772a8b4 fix(opencode): preserve Cerebras completion limit (#43736)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
Co-authored-by: ryanl-cerebras <230249923+ryanl-cerebras@users.noreply.github.com>
2026-08-20 19:30:30 -05:00
opencode-agent[bot]andrekram1-node 08faeb3893 fix(opencode): answer subagent permissions in run (#43675)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-20 19:29:32 -05:00
Frank 5e75e5e990 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-20 14:53:36 -04:00
Frank 5cc5b622f0 update muse country list 2026-08-20 14:53:34 -04:00
Jack 11e8110f9e fix(docs): align Ox Alpha free model ID (#43695) 2026-08-21 01:49:11 +08:00
Jack 82dee24302 docs(zen): add Ox Alpha free model (#43690) 2026-08-21 01:31:56 +08:00
Adam ad192a59b5 fix(stats): clarify market share providers (#43647) 2026-08-20 10:46:24 -05:00
opencode-agent[bot]andrekram1-node 71d08e94d5 fix(opencode): retry xAI capacity stream errors (#43640)
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-08-20 09:29:30 -05:00
opencode b155b15694 sync release versions for v1.18.19 2026-08-20 06:22:03 +00:00
Frank d06bf487a5 sync 2026-08-20 02:19:05 -04:00
Frank ccccd75328 Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-20 02:08:32 -04:00
Frank 03d65f36d3 sync 2026-08-20 02:08:22 -04:00
Aiden Cline f4a89683da fix(tui): remove encrypted label from thought header (#43588) 2026-08-20 00:46:39 -05:00
Frank f715478a13 doc muse regions 2026-08-20 01:43:59 -04:00
e0e9bd7d5f fix(tui): show encrypted reasoning status (#43578)
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
2026-08-20 00:23:20 -05:00
opencode-agent[bot]andthdxr 5ccb1e88e1 fix(stats): normalize routed model ids (#43582)
Co-authored-by: thdxr <thdxr@users.noreply.github.com>
2026-08-20 01:12:18 -04:00
Frank be469f328c sync 2026-08-20 00:42:47 -04:00
opencode-agent[bot] fc80874f45 chore: generate 2026-08-20 02:49:11 +00:00
Frank 3d26b12251 zen: muse spark contributor 2026-08-19 22:47:41 -04:00
Frank 1b77242d40 country check for muse spark in free 2026-08-19 22:44:35 -04:00
Adam 4c5960dc4b feat(stats): include free tier usage 2026-08-19 19:39:23 -05:00
Frank e2505d434a Revert "update go models"
This reverts commit 16af134053.
2026-08-19 15:03:41 -04:00
Frank a466a357b6 Revert "chore: generate"
This reverts commit 6386e67949.
2026-08-19 15:03:39 -04:00
613 changed files with 36599 additions and 13026 deletions

No files matched your search

+1
View File
@@ -20,3 +20,4 @@ Slickstef11
usrnk1
vimtor
StarpTech
vaprdev
+11 -15
View File
@@ -15,12 +15,15 @@ runs:
with:
node-version: "24"
- name: Get baseline download URL
- name: Get Bun version and baseline download URL
id: bun-url
shell: bash
run: |
V=$(node -p "require('./package.json').packageManager.split('@')[1]")
# Bun 1.4.2 includes the patched peer-variant fix in oven-sh/bun#33646.
if [ "$RUNNER_OS" = "Windows" ]; then V=1.4.2; fi
echo "version=$V" >> "$GITHUB_OUTPUT"
if [ "$RUNNER_ARCH" = "X64" ]; then
V=$(node -p "require('./package.json').packageManager.split('@')[1]")
case "$RUNNER_OS" in
macOS) OS=darwin ;;
Linux) OS=linux ;;
@@ -30,9 +33,10 @@ runs:
fi
- name: Setup Bun
id: setup-bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }}
bun-version: ${{ !steps.bun-url.outputs.url && steps.bun-url.outputs.version || '' }}
bun-download-url: ${{ steps.bun-url.outputs.url }}
- name: Get cache directory
@@ -45,24 +49,16 @@ runs:
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ steps.cache.outputs.dir }}
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
key: ${{ runner.os }}-bun-${{ steps.setup-bun.outputs.bun-version }}-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
${{ runner.os }}-bun-${{ steps.setup-bun.outputs.bun-version }}-
- name: Install setuptools for distutils compatibility
run: python3 -m pip install setuptools || pip install setuptools || true
shell: bash
- name: Install dependencies
run: |
# Workaround for patched peer variants
# e.g. ./patches/ for standard-openapi
# https://github.com/oven-sh/bun/issues/28147
if [ "$RUNNER_OS" = "Windows" ]; then
bun install --linker hoisted ${{ inputs.install-flags }}
else
bun install ${{ inputs.install-flags }}
fi
run: bun install ${{ inputs.install-flags }}
shell: bash
- name: Save Bun dependencies
@@ -70,4 +66,4 @@ runs:
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ steps.cache.outputs.dir }}
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
key: ${{ runner.os }}-bun-${{ steps.setup-bun.outputs.bun-version }}-${{ hashFiles('**/bun.lock') }}
+7 -7
View File
@@ -15,7 +15,7 @@ jobs:
close-non-compliant:
runs-on: ubuntu-latest
steps:
- name: Close non-compliant issues and PRs after 2 hours
- name: Close non-compliant issues and PRs after 72 hours
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
with:
script: |
@@ -33,7 +33,7 @@ jobs:
}
const now = Date.now();
const twoHours = 2 * 60 * 60 * 1000;
const seventyTwoHours = 72 * 60 * 60 * 1000;
const orgMemberAssociations = new Set(['OWNER', 'MEMBER']);
const agentLogin = 'opencode-agent[bot]';
const { data: file } = await github.rest.repos.getContent({
@@ -87,14 +87,14 @@ jobs:
if (!complianceComment) continue;
const commentAge = now - new Date(complianceComment.created_at).getTime();
if (commentAge < twoHours) {
core.info(`${kind} #${item.number} still within 2-hour window (${Math.round(commentAge / 60000)}m elapsed)`);
if (commentAge < seventyTwoHours) {
core.info(`${kind} #${item.number} still within 72-hour window (${Math.round(commentAge / 60000)}m elapsed)`);
continue;
}
const closeMessage = isPR
? 'This pull request has been automatically closed because it was not updated to meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md) within the 2-hour window.\n\nFeel free to open a new pull request that follows our guidelines.'
: 'This issue has been automatically closed because it was not updated to meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md) within the 2-hour window.\n\nFeel free to open a new issue that follows our issue templates.';
? 'This pull request has been automatically closed because it was not updated to meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md) within the 72-hour window.\n\nFeel free to open a new pull request that follows our guidelines.'
: 'This issue has been automatically closed because it was not updated to meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md) within the 72-hour window.\n\nFeel free to open a new issue that follows our issue templates.';
await github.rest.issues.createComment({
owner: context.repo.owner,
@@ -129,5 +129,5 @@ jobs:
});
}
core.info(`Closed non-compliant ${kind} #${item.number} after 2-hour window`);
core.info(`Closed non-compliant ${kind} #${item.number} after 72-hour window`);
}
+1 -1
View File
@@ -16,7 +16,7 @@ permissions:
jobs:
deploy:
if: github.repository == 'anomalyco/opencode' && (github.ref_name == 'dev' || github.ref_name == 'production')
runs-on: ubuntu-latest
runs-on: ${{ github.ref_name == 'dev' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
environment: ${{ github.ref_name }}
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+4 -4
View File
@@ -54,7 +54,7 @@ jobs:
"webfetch": "deny"
}
run: |
opencode run -m opencode/claude-sonnet-4-6 "A new issue has been created:
opencode run -m opencode/gpt-6-luna --variant high "A new issue has been created:
Issue number: ${{ github.event.issue.number }}
Issue author association: ${{ github.event.issue.author_association }}
@@ -107,7 +107,7 @@ jobs:
If the issue is NOT compliant and the author association is not OWNER or MEMBER, start the comment with:
<!-- issue-compliance -->
Then explain what needs to be fixed and that they have 2 hours to edit the issue before it is automatically closed. Also add the label needs:compliance to the issue using: gh issue edit ${{ github.event.issue.number }} --add-label needs:compliance
Then explain what needs to be fixed and that they have 72 hours to edit the issue before it is automatically closed. Also add the label needs:compliance to the issue using: gh issue edit ${{ github.event.issue.number }} --add-label needs:compliance
If duplicates were found, include a section about potential duplicates with links.
@@ -124,7 +124,7 @@ jobs:
**What needs to be fixed:**
- [specific reasons]
Please edit this issue to address the above within **2 hours**, or it will be automatically closed.
Please edit this issue to address the above within **72 hours**, or it will be automatically closed.
[If duplicates found, add:]
---
@@ -188,7 +188,7 @@ jobs:
"webfetch": "deny"
}
run: |
opencode run -m opencode/claude-sonnet-4-6 "Issue #${{ github.event.issue.number }} was previously flagged as non-compliant and has been edited.
opencode run -m opencode/gpt-6-luna --variant high "Issue #${{ github.event.issue.number }} was previously flagged as non-compliant and has been edited.
Issue author association: ${{ github.event.issue.author_association }}
Lookup this issue with gh issue view ${{ github.event.issue.number }}.
+62
View File
@@ -0,0 +1,62 @@
name: models-snapshot
permissions:
contents: write
on:
workflow_dispatch:
schedule:
- cron: "0 12 * * *"
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
jobs:
refresh:
if: github.repository == 'anomalyco/opencode'
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
persist-credentials: false
ref: v2
# The refresh script only needs `fetch`; skip the monorepo install.
- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version-file: package.json
- name: Setup git committer
uses: ./.github/actions/setup-git-committer
with:
opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
- name: Refresh snapshot
run: bun packages/core/script/update-models-snapshot.ts
- name: Commit changes
run: |
set -euo pipefail
FILE="packages/core/src/models-dev/snapshot.txt"
if [ -z "$(git status --short -- "$FILE")" ]; then
echo "No changes to commit"
echo "### models.dev snapshot" >> "$GITHUB_STEP_SUMMARY"
echo "Status: no changes" >> "$GITHUB_STEP_SUMMARY"
exit 0
fi
git add "$FILE"
git commit -m "chore(core): refresh bundled models.dev snapshot"
git pull --rebase --autostash origin v2
git push origin HEAD:v2 --no-verify
echo "### models.dev snapshot" >> "$GITHUB_STEP_SUMMARY"
echo "Status: committed $(git rev-parse --short HEAD)" >> "$GITHUB_STEP_SUMMARY"
+1 -1
View File
@@ -298,7 +298,7 @@ jobs:
**What needs to be fixed:**
${issues.map(i => `- ${i}`).join('\n')}
Please edit this PR description to address the above within **2 hours**, or it will be automatically closed.
Please edit this PR description to address the above within **72 hours**, or it will be automatically closed.
If you believe this was flagged incorrectly, please let a maintainer know.`;
+91
View File
@@ -117,6 +117,88 @@ jobs:
outputs:
version: ${{ needs.version.outputs.version }}
sign-cli-macos:
needs:
- build-cli
- version
runs-on: macos-26
if: github.repository == 'anomalyco/opencode'
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
- uses: apple-actions/import-codesign-certs@8f3fb608891dd2244cdab3d69cd68c0d37a7fe93 # v2.0.0
with:
keychain: build
p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: opencode-cli
path: packages/opencode/dist
- name: Setup git committer
id: committer
uses: ./.github/actions/setup-git-committer
with:
opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
- name: Sign macOS CLI binaries
run: |
identity=$(security find-identity -v -p codesigning build.keychain | sed -n 's/.*"\(Developer ID Application:.*\)"/\1/p' | head -n 1)
if [ -z "$identity" ]; then
echo "Developer ID Application identity not found"
exit 1
fi
for name in opencode-darwin-arm64 opencode-darwin-x64 opencode-darwin-x64-baseline; do
file="packages/opencode/dist/$name/bin/opencode"
chmod +x "$file"
codesign \
--force \
--timestamp \
--options runtime \
--entitlements packages/opencode/script/entitlements.plist \
--sign "$identity" \
"$file"
codesign --verify --deep --strict --verbose=4 "$file"
codesign --display --requirements - "$file"
done
- name: Smoke test signed binary
run: ./packages/opencode/dist/opencode-darwin-arm64/bin/opencode --version
- name: Repack macOS CLI archives
working-directory: packages/opencode/dist
run: |
for name in opencode-darwin-arm64 opencode-darwin-x64 opencode-darwin-x64-baseline; do
rm -f "$name.zip"
(cd "$name/bin" && zip -r "../../$name.zip" *)
done
- name: Upload signed macOS CLI release assets
if: needs.version.outputs.release != ''
env:
GH_TOKEN: ${{ steps.committer.outputs.token }}
run: |
gh release upload "v${{ needs.version.outputs.version }}" \
packages/opencode/dist/opencode-darwin-arm64.zip \
packages/opencode/dist/opencode-darwin-x64.zip \
packages/opencode/dist/opencode-darwin-x64-baseline.zip \
--clobber \
--repo "${{ needs.version.outputs.repo }}"
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: opencode-cli-signed-macos
path: |
packages/opencode/dist/opencode-darwin-arm64
packages/opencode/dist/opencode-darwin-x64
packages/opencode/dist/opencode-darwin-x64-baseline
packages/opencode/dist/opencode-darwin-*.zip
if-no-files-found: error
sign-cli-windows:
needs:
- build-cli
@@ -405,6 +487,7 @@ jobs:
needs:
- version
- build-cli
- sign-cli-macos
- sign-cli-windows
- build-electron
if: always() && !failure() && !cancelled()
@@ -437,6 +520,14 @@ jobs:
name: opencode-cli
path: packages/opencode/dist
- name: Remove unsigned macOS CLI binaries
run: rm -rf packages/opencode/dist/opencode-darwin*
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: opencode-cli-signed-macos
path: packages/opencode/dist
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: opencode-cli-windows
+1 -1
View File
@@ -49,7 +49,7 @@ jobs:
ISSUE_TITLE: ${{ github.event.issue.title }}
ISSUE_BODY: ${{ github.event.issue.body }}
run: |
opencode run --agent triage "The following issue was just opened, triage it:
opencode run --agent triage --variant high "The following issue was just opened, triage it:
Title: $ISSUE_TITLE
+52
View File
@@ -0,0 +1,52 @@
name: unlock
on:
workflow_dispatch:
inputs:
stage:
description: SST stage to unlock
required: true
type: choice
options:
- dev
- production
concurrency: deploy-${{ inputs.stage }}
permissions:
contents: read
id-token: write
jobs:
unlock:
runs-on: ubuntu-latest
environment: ${{ inputs.stage }}
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
- uses: ./.github/actions/setup-bun
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "24"
- uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4.3.1
with:
role-to-assume: ${{ vars.AWS_DEPLOY_ROLE_ARN }}
role-session-name: opencode-${{ github.run_id }}
aws-region: us-east-1
- run: bun sst unlock --stage=${{ inputs.stage }}
env:
GITHUB_TOKEN: ${{ github.token }}
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
PLANETSCALE_SERVICE_TOKEN_NAME: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_NAME }}
PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }}
STRIPE_SECRET_KEY: ${{ inputs.stage == 'production' && secrets.STRIPE_SECRET_KEY_PROD || secrets.STRIPE_SECRET_KEY_DEV }}
HONEYCOMB_API_KEY: ${{ secrets.HONEYCOMB_API_KEY }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
SENTRY_PROJECT: ${{ vars.WEB_SENTRY_PROJECT }}
SENTRY_RELEASE: unlock@${{ github.sha }}
VITE_SENTRY_DSN: ${{ vars.WEB_SENTRY_DSN }}
VITE_SENTRY_RELEASE: unlock@${{ github.sha }}
+1
View File
@@ -32,3 +32,4 @@ UPCOMING_CHANGELOG.md
logs/
*.bun-build
tsconfig.tsbuildinfo
/artifacts/
+1 -1
View File
@@ -1,7 +1,7 @@
---
mode: primary
hidden: true
model: opencode/gpt-5.4-mini
model: opencode/gpt-6-luna
color: "#44BA81"
tools:
"*": false
+1 -1
View File
@@ -1,5 +1,5 @@
---
model: opencode/gpt-5.4
model: opencode/gpt-6-luna
---
Create `UPCOMING_CHANGELOG.md` from the structured changelog input below.
+1 -1
View File
@@ -1,6 +1,6 @@
---
description: translate English to other languages
model: opencode/gpt-5.6-sol
model: opencode/gpt-6-sol
---
run git diff and translate changed english doc and UI copy files to other international languages. Translate all languages in parallel to save time.
+2 -2
View File
@@ -5,8 +5,8 @@ const TEAM = {
tui: ["kommander", "simonklee"],
desktop_web: ["Hona", "Brendonovich"],
core: ["jlongster", "rekram1-node", "neriousy", "nexxeln", "kitlangton"],
inference: ["fwang", "MrMushrooooom", "starptech"],
windows: ["Hona"],
inference: ["fwang", "vaprdev", "vimtor"],
windows: ["Hona", "neriousy"],
} as const
function pick<T>(items: readonly T[]) {
+2 -2
View File
@@ -157,7 +157,7 @@ Caveats:
- If `spawn` does not work for you, you can debug the server separately:
- Debug server: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode ./src/index.ts serve --port 4096`,
then attach TUI with `opencode attach http://localhost:4096`
- Debug TUI: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode --conditions=browser ./src/index.ts`
- Debug TUI: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode ./src/index.ts`
Other tips and tricks:
@@ -260,7 +260,7 @@ All issues **must** use one of our issue templates:
- **Feature request** — for suggesting enhancements (requires verification checkbox and description)
- **Question** — for asking questions (requires the question)
Blank issues are not allowed. When a new issue is opened, an automated check verifies that it follows a template and meets our contributing guidelines. If an issue doesn't meet the requirements, you'll receive a comment explaining what needs to be fixed and have **2 hours** to edit the issue. After that, it will be automatically closed.
Blank issues are not allowed. When a new issue is opened, an automated check verifies that it follows a template and meets our contributing guidelines. If an issue doesn't meet the requirements, you'll receive a comment explaining what needs to be fixed and have **72 hours** to edit the issue. After that, it will be automatically closed.
Issues may be flagged for:
-3
View File
@@ -1,3 +0,0 @@
node_modules
.remotion
out/frame-*.png
-483
View File
@@ -1,483 +0,0 @@
{
"lockfileVersion": 1,
"configVersion": 1,
"workspaces": {
"": {
"name": "glm52-rise-video",
"dependencies": {
"@remotion/cli": "^4.0.384",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"remotion": "^4.0.384",
},
"devDependencies": {
"@types/react": "^19.2.8",
"@types/react-dom": "^19.2.3",
"typescript": "^5.8.2",
},
},
},
"packages": {
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
"@babel/parser": ["@babel/parser@7.24.1", "", { "bin": "./bin/babel-parser.js" }, "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg=="],
"@babel/types": ["@babel/types@7.24.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w=="],
"@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="],
"@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="],
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="],
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="],
"@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="],
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="],
"@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="],
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="],
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="],
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="],
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="],
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="],
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="],
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="],
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="],
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="],
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="],
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="],
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="],
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="],
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="],
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="],
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="],
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="],
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="],
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="],
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="],
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="],
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="],
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
"@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
"@mediabunny/aac-encoder": ["@mediabunny/aac-encoder@1.47.0", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-JNzgdJoHMFFnv5imi1+dmjZMudsJ1zNCUCEkKjBh90cqGhAFg8xu4V2gsyxE2i6oq/YpWx23P+OvoANLSMcDzA=="],
"@mediabunny/flac-encoder": ["@mediabunny/flac-encoder@1.47.0", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-VpKmJO0xlYcFCRD6JvJlMbNQ6d/6YMHdO1gFIqWlZABHjSSL6BquNNEgWSCv5vdF8ELDBwIYBVZEslakIB/7GA=="],
"@mediabunny/mp3-encoder": ["@mediabunny/mp3-encoder@1.47.0", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-JyzZyGeGRm2HVUQaGJ/VZT9OG+kG00mA8SLP/f3CO7+qWAmBncKc16WYXWHbZEo8Jn/ZGA6De32S5R2bTQbDqA=="],
"@module-federation/error-codes": ["@module-federation/error-codes@0.22.0", "", {}, "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug=="],
"@module-federation/runtime": ["@module-federation/runtime@0.22.0", "", { "dependencies": { "@module-federation/error-codes": "0.22.0", "@module-federation/runtime-core": "0.22.0", "@module-federation/sdk": "0.22.0" } }, "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA=="],
"@module-federation/runtime-core": ["@module-federation/runtime-core@0.22.0", "", { "dependencies": { "@module-federation/error-codes": "0.22.0", "@module-federation/sdk": "0.22.0" } }, "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA=="],
"@module-federation/runtime-tools": ["@module-federation/runtime-tools@0.22.0", "", { "dependencies": { "@module-federation/runtime": "0.22.0", "@module-federation/webpack-bundler-runtime": "0.22.0" } }, "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA=="],
"@module-federation/sdk": ["@module-federation/sdk@0.22.0", "", {}, "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g=="],
"@module-federation/webpack-bundler-runtime": ["@module-federation/webpack-bundler-runtime@0.22.0", "", { "dependencies": { "@module-federation/runtime": "0.22.0", "@module-federation/sdk": "0.22.0" } }, "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA=="],
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="],
"@remotion/bundler": ["@remotion/bundler@4.0.483", "", { "dependencies": { "@remotion/media-parser": "4.0.483", "@remotion/studio": "4.0.483", "@remotion/studio-shared": "4.0.483", "@remotion/timeline-utils": "4.0.483", "@rspack/core": "1.7.11", "@rspack/plugin-react-refresh": "1.6.1", "css-loader": "7.1.4", "esbuild": "0.28.1", "react-refresh": "0.18.0", "remotion": "4.0.483", "style-loader": "4.0.0", "webpack": "5.105.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-5fQRMYgr2sxZPBOThnIVuFwHBq/FhusJ+Ke6xopga8io8ecK/mj9GaRXC3tgfMa+YWuu8ZSXZ0U9EsMZjjP5YQ=="],
"@remotion/canvas-capture": ["@remotion/canvas-capture@4.0.483", "", { "dependencies": { "mediabunny": "1.47.0", "remotion": "4.0.483" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JABgbfvXwjFp1E61tlDN9gVAH8OoeF4kUUELNwG9kcNOE4ex8+vCYEO6VKIaXZ4l8A1PEAQ5EK//NheTJ80gfw=="],
"@remotion/cli": ["@remotion/cli@4.0.483", "", { "dependencies": { "@remotion/bundler": "4.0.483", "@remotion/media-utils": "4.0.483", "@remotion/player": "4.0.483", "@remotion/renderer": "4.0.483", "@remotion/studio": "4.0.483", "@remotion/studio-server": "4.0.483", "@remotion/studio-shared": "4.0.483", "dotenv": "17.3.1", "minimist": "1.2.6", "prompts": "2.4.2", "remotion": "4.0.483" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" }, "bin": { "remotion": "remotion-cli.js", "remotionb": "remotionb-cli.js", "remotiond": "remotiond-cli.js" } }, "sha512-z4TQcgTfQbSIV4GQpCvIihDL77M+leQelbxv962PmfSKTT7z3XnNN732PcZ4sei2+Xg+d2SD95K4tI5XBYs5Gw=="],
"@remotion/compositor-darwin-arm64": ["@remotion/compositor-darwin-arm64@4.0.483", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CkEJXouGEoCs5PX3KOufkXrlT/Kgn0ZF7SEQ4meCYGYMZD+QPVtsmS1MXH8pQ4RHlFO6Tk7g0CIHMT3Y4yzpuA=="],
"@remotion/compositor-darwin-x64": ["@remotion/compositor-darwin-x64@4.0.483", "", { "os": "darwin", "cpu": "x64" }, "sha512-vDZK5U8FYbHGMjFC2lUgJRBz8KXwbwFSvEQi8FATD0roNg75SoaEJWrqAOIVv8v5eBjPvo18znDc36NLRYn1Eg=="],
"@remotion/compositor-linux-arm64-gnu": ["@remotion/compositor-linux-arm64-gnu@4.0.483", "", { "os": "linux", "cpu": "arm64" }, "sha512-1LzfYDY/DQxy3MIc9pCbTn1ObcBDcyI6MzODOwe1bTZl8TZxdUUt1M3hDrQ60AB6iHwruBAnzT9dnogiMIdSew=="],
"@remotion/compositor-linux-arm64-musl": ["@remotion/compositor-linux-arm64-musl@4.0.483", "", { "os": "linux", "cpu": "arm64" }, "sha512-nG1btxg0HXuLzulIqAg9NnxWyewZNrA0iLe82HdniaJjeWLORreGo4cEEJz1SjbDpQuPEY562XGkTO2DLKK5mA=="],
"@remotion/compositor-linux-x64-gnu": ["@remotion/compositor-linux-x64-gnu@4.0.483", "", { "os": "linux", "cpu": "x64" }, "sha512-CV4h6r2rNYh4P8utUzP6RM2vW2vq43nA3IvVOwRSuh9LwJh/7rwG53Oco4HanY/sstaNuymGpT57wdXwONU5CQ=="],
"@remotion/compositor-linux-x64-musl": ["@remotion/compositor-linux-x64-musl@4.0.483", "", { "os": "linux", "cpu": "x64" }, "sha512-moKvavbkoz5nteJZA4K6LMgTTlewhwIbtO7DYARZ3LK3ClGUKnYfFcmaPS15hMun02JPTOMIWbrlaszdR75mxA=="],
"@remotion/compositor-win32-x64-msvc": ["@remotion/compositor-win32-x64-msvc@4.0.483", "", { "os": "win32", "cpu": "x64" }, "sha512-eDpWe6Vy7ySHugwxlgaeohqdBwR1etxiymXzT13cgbPw2+p6d55z1tJ7VPTXyfu0o+UdyRTauWqD4msoxN0wow=="],
"@remotion/licensing": ["@remotion/licensing@4.0.483", "", {}, "sha512-GRtjykrxMmB5Cjpq1oVqeYIRXI95vid6afX0LTLfp1shD6MR4lTZRoRuopxrrZp1E4XFGXoY64b6dlIudgTyBQ=="],
"@remotion/media-parser": ["@remotion/media-parser@4.0.483", "", {}, "sha512-iva9Eof7QQX+3hGxH/N8pGi80wgdGuzOr825Zn7IuEe7IWdtRYWlFpCEghmyfhrwgaWa7RY51wg77ycR3c3nRg=="],
"@remotion/media-utils": ["@remotion/media-utils@4.0.483", "", { "dependencies": { "mediabunny": "1.47.0", "remotion": "4.0.483" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4T4WQh/U95kCBzgmz/EL/HL8Zeox/AKAL5ufsehrZFgwlcvH1EsKNJH/RWaAtNPRLF+pskEOgFzPYaczHeI8hg=="],
"@remotion/player": ["@remotion/player@4.0.483", "", { "dependencies": { "remotion": "4.0.483" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-yyIQ9vinUqqS0fQeL52bPCWQIr8qDXCqQ4iys8P7dSZncdu8V29p4W2a0/4eKV8bv5+mjnJQ/U6nl9NxBF1hdA=="],
"@remotion/renderer": ["@remotion/renderer@4.0.483", "", { "dependencies": { "@remotion/licensing": "4.0.483", "@remotion/streaming": "4.0.483", "execa": "5.1.1", "remotion": "4.0.483", "source-map": "0.8.0-beta.0", "ws": "8.21.0" }, "optionalDependencies": { "@remotion/compositor-darwin-arm64": "4.0.483", "@remotion/compositor-darwin-x64": "4.0.483", "@remotion/compositor-linux-arm64-gnu": "4.0.483", "@remotion/compositor-linux-arm64-musl": "4.0.483", "@remotion/compositor-linux-x64-gnu": "4.0.483", "@remotion/compositor-linux-x64-musl": "4.0.483", "@remotion/compositor-win32-x64-msvc": "4.0.483" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-eSKdQqm8rcl+GNyOhFsBgcPYWMcxTJWHL5xaNrd037piCaL3sdJ57OEO/AbfEvvOO14zwUvlsONKjlkLlEVyKg=="],
"@remotion/streaming": ["@remotion/streaming@4.0.483", "", {}, "sha512-96rqrk+l5AfriHOqmqxMn8rI6UJfFY7r5UMDZoSKqXWzTOwj+0VWHTRl9ilZQMXhYACaMSA/5yrL9jgQEK8Yuw=="],
"@remotion/studio": ["@remotion/studio@4.0.483", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.31", "@remotion/canvas-capture": "4.0.483", "@remotion/media-utils": "4.0.483", "@remotion/player": "4.0.483", "@remotion/renderer": "4.0.483", "@remotion/studio-shared": "4.0.483", "@remotion/timeline-utils": "4.0.483", "@remotion/web-renderer": "4.0.483", "@remotion/zod-types": "4.0.483", "mediabunny": "1.47.0", "memfs": "3.4.3", "open": "8.4.2", "remotion": "4.0.483", "semver": "7.5.3", "zod": "4.3.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-gNa1Lw8NmHl0jwFb5fk7rzA+WFTJQpGDT/49A38t9jpEwoF+h1mKTgY8gA202apzjBHrEECdFE450npnBOUpUw=="],
"@remotion/studio-server": ["@remotion/studio-server@4.0.483", "", { "dependencies": { "@babel/parser": "7.24.1", "@babel/types": "7.24.0", "@remotion/bundler": "4.0.483", "@remotion/renderer": "4.0.483", "@remotion/studio-shared": "4.0.483", "memfs": "3.4.3", "open": "8.4.2", "prettier": "3.8.1", "recast": "0.23.11", "remotion": "4.0.483", "semver": "7.5.3" } }, "sha512-2FSLbVN5N8bgtQPX+RQRbis557tJJnVTOZuEBZndfC9NOoPdARlSgEnwVer9tBNczUlc6B3KrPxyPSlS3UjL+Q=="],
"@remotion/studio-shared": ["@remotion/studio-shared@4.0.483", "", { "dependencies": { "remotion": "4.0.483" } }, "sha512-aXxBYUgsWgphHVq7T7bz+ICMGzfii7pcX1IxS5hbLMLJHqlDtk9g+qcxm4kJ2Fjj/Gb5gERKiNzYym8WZTIM2Q=="],
"@remotion/timeline-utils": ["@remotion/timeline-utils@4.0.483", "", { "dependencies": { "mediabunny": "1.47.0" } }, "sha512-KTTMdpNA5uRLX+iisAITO+V9cJBk17F8EWvuUnAEVmAFOQTbGIyPI9HNw5pZmL7SlzOJdFjAtksTjipeYGkEug=="],
"@remotion/web-renderer": ["@remotion/web-renderer@4.0.483", "", { "dependencies": { "@mediabunny/aac-encoder": "1.47.0", "@mediabunny/flac-encoder": "1.47.0", "@mediabunny/mp3-encoder": "1.47.0", "@remotion/licensing": "4.0.483", "mediabunny": "1.47.0", "remotion": "4.0.483" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-14iURfVWA/hcF/rJvkid1ZR5nmnVhkTIf071FabCFi6kdViOSVBugSglJ8tUPvWVbWmxlXGDGQD9CSU18IATww=="],
"@remotion/zod-types": ["@remotion/zod-types@4.0.483", "", { "dependencies": { "remotion": "4.0.483" }, "peerDependencies": { "zod": "4.3.6" } }, "sha512-KIVYIzFpZBDB0wxGGQu5tDBr4XOYRzvrPXjmo6O/FI5Xx7O8hgvJmBs9VDkEwonAOft86sg79hI19F1DTX1p4w=="],
"@rspack/binding": ["@rspack/binding@1.7.11", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "1.7.11", "@rspack/binding-darwin-x64": "1.7.11", "@rspack/binding-linux-arm64-gnu": "1.7.11", "@rspack/binding-linux-arm64-musl": "1.7.11", "@rspack/binding-linux-x64-gnu": "1.7.11", "@rspack/binding-linux-x64-musl": "1.7.11", "@rspack/binding-wasm32-wasi": "1.7.11", "@rspack/binding-win32-arm64-msvc": "1.7.11", "@rspack/binding-win32-ia32-msvc": "1.7.11", "@rspack/binding-win32-x64-msvc": "1.7.11" } }, "sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q=="],
"@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@1.7.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig=="],
"@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@1.7.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA=="],
"@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@1.7.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA=="],
"@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@1.7.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw=="],
"@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@1.7.11", "", { "os": "linux", "cpu": "x64" }, "sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ=="],
"@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@1.7.11", "", { "os": "linux", "cpu": "x64" }, "sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg=="],
"@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@1.7.11", "", { "dependencies": { "@napi-rs/wasm-runtime": "1.0.7" }, "cpu": "none" }, "sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ=="],
"@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@1.7.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA=="],
"@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@1.7.11", "", { "os": "win32", "cpu": "ia32" }, "sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw=="],
"@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@1.7.11", "", { "os": "win32", "cpu": "x64" }, "sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q=="],
"@rspack/core": ["@rspack/core@1.7.11", "", { "dependencies": { "@module-federation/runtime-tools": "0.22.0", "@rspack/binding": "1.7.11", "@rspack/lite-tapable": "1.1.0" }, "peerDependencies": { "@swc/helpers": ">=0.5.1" }, "optionalPeers": ["@swc/helpers"] }, "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew=="],
"@rspack/lite-tapable": ["@rspack/lite-tapable@1.1.0", "", {}, "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw=="],
"@rspack/plugin-react-refresh": ["@rspack/plugin-react-refresh@1.6.1", "", { "dependencies": { "error-stack-parser": "^2.1.4", "html-entities": "^2.6.0" }, "peerDependencies": { "react-refresh": ">=0.10.0 <1.0.0", "webpack-hot-middleware": "2.x" }, "optionalPeers": ["webpack-hot-middleware"] }, "sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw=="],
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="],
"@types/dom-mediacapture-transform": ["@types/dom-mediacapture-transform@0.1.11", "", { "dependencies": { "@types/dom-webcodecs": "*" } }, "sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ=="],
"@types/dom-webcodecs": ["@types/dom-webcodecs@0.1.13", "", {}, "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ=="],
"@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="],
"@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="],
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
"@types/node": ["@types/node@26.0.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw=="],
"@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="],
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
"@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="],
"@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="],
"@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="],
"@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="],
"@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="],
"@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="],
"@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="],
"@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="],
"@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="],
"@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="],
"@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/helper-wasm-section": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="],
"@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="],
"@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="],
"@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="],
"@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="],
"@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="],
"@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="],
"acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="],
"acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="],
"ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
"ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
"ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="],
"ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="],
"baseline-browser-mapping": ["baseline-browser-mapping@2.10.40", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw=="],
"browserslist": ["browserslist@4.28.4", "", { "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", "electron-to-chromium": "^1.5.376", "node-releases": "^2.0.48", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw=="],
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
"caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="],
"chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="],
"commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
"css-loader": ["css-loader@7.1.4", "", { "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.40", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.6.3" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "webpack": "^5.27.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw=="],
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="],
"dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="],
"electron-to-chromium": ["electron-to-chromium@1.5.379", "", {}, "sha512-v/qV5aV5EUA2pGilzUCq5/eyOloZAqDZBu9UMBIzgPpLlprjSR6zswsWBTv0KpqxLGUAZEwhO95ZCt7srymNVA=="],
"enhanced-resolve": ["enhanced-resolve@5.24.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw=="],
"error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="],
"es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="],
"esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="],
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
"eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
"estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
"events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
"execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
"fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
"fs-monkey": ["fs-monkey@1.0.3", "", {}, "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q=="],
"get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
"glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="],
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
"html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="],
"human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
"icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="],
"is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="],
"is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
"is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="],
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
"jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="],
"json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
"json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
"kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
"loader-runner": ["loader-runner@4.3.2", "", {}, "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w=="],
"lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="],
"lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
"mediabunny": ["mediabunny@1.47.0", "", { "dependencies": { "@types/dom-mediacapture-transform": "^0.1.11", "@types/dom-webcodecs": "0.1.13" } }, "sha512-XQMZAcaKPkJ7hQ/Q2fvBdl3ZazQl2WVxDysUbJWh4PuAnLoerdsQBdPTDWdUdK6hh26LQ8Ue94MLLnmpWvlUYg=="],
"memfs": ["memfs@3.4.3", "", { "dependencies": { "fs-monkey": "1.0.3" } }, "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg=="],
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
"mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
"mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
"minimist": ["minimist@1.2.6", "", {}, "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="],
"nanoid": ["nanoid@3.3.15", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="],
"neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
"node-releases": ["node-releases@2.0.50", "", {}, "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg=="],
"npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
"onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
"open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="],
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="],
"postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="],
"postcss-modules-local-by-default": ["postcss-modules-local-by-default@4.2.0", "", { "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw=="],
"postcss-modules-scope": ["postcss-modules-scope@3.2.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA=="],
"postcss-modules-values": ["postcss-modules-values@4.0.0", "", { "dependencies": { "icss-utils": "^5.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ=="],
"postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="],
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
"prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
"prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
"react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="],
"react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="],
"react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="],
"recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
"remotion": ["remotion@4.0.483", "", { "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-lf4xq4Twn75TQeTavFLrTE4zdck7EKBSx07ZrPv4om40Sist+3G0kq7NNzSjMeJ6G2Wx6vI+0oICD/vv4sGWtg=="],
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
"schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="],
"semver": ["semver@7.5.3", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ=="],
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
"signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
"source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
"stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="],
"strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
"style-loader": ["style-loader@4.0.0", "", { "peerDependencies": { "webpack": "^5.27.0" } }, "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA=="],
"supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
"tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
"terser": ["terser@5.48.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q=="],
"terser-webpack-plugin": ["terser-webpack-plugin@5.6.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ=="],
"tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
"to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="],
"tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
"undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="],
"update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
"watchpack": ["watchpack@2.5.2", "", { "dependencies": { "graceful-fs": "^4.1.2" } }, "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg=="],
"webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="],
"webpack": ["webpack@5.105.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.19.0", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.5.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw=="],
"webpack-sources": ["webpack-sources@3.5.0", "", {}, "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ=="],
"whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="],
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
"ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="],
"yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
"zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
"css-loader/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
"esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
"recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
-24
View File
@@ -1,24 +0,0 @@
{
"name": "glm52-rise-video",
"private": true,
"type": "module",
"scripts": {
"render": "remotion render src/index.tsx GLM52Rise out/glm-52-broke-out.mp4 --codec h264 --pixel-format yuv420p",
"render:sheep": "remotion render src/index.tsx NZSheep out/nz-sheep.mp4 --codec h264 --pixel-format yuv420p",
"render:novel": "remotion render src/index.tsx NovelTokens out/novel-1984.mp4 --codec h264 --pixel-format yuv420p",
"render:flash": "remotion render src/index.tsx FlashShare out/flash-share.mp4 --codec h264 --pixel-format yuv420p",
"render:minimax": "remotion render src/index.tsx MiniMaxClimb out/minimax-climb.mp4 --codec h264 --pixel-format yuv420p",
"still:june": "remotion still src/index.tsx JuneTotals out/june-totals.png --frame=0"
},
"dependencies": {
"@remotion/cli": "^4.0.384",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"remotion": "^4.0.384"
},
"devDependencies": {
"@types/react": "^19.2.8",
"@types/react-dom": "^19.2.3",
"typescript": "^5.8.2"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

-156
View File
@@ -1,156 +0,0 @@
// Verified against the production opencode-stats PlanetScale DB.
// Scope: tier='Go' (OpenCode Go), dataset='zen', client='all', source='all', grain='day'.
// metric = total_tokens. Daily token volume per model; GLM-5.2 (zhipu) launched Jun 17.
// Segments per day (tokens): glm-5.2, deepseek-v4-flash, deepseek-v4-pro, minimax-m3, all others.
export type Day = {
date: string
total: number
glm: number
dsf: number
dsp: number
mm: number
others: number
}
export const days: Day[] = [
{
date: "Jun 12",
total: 2_283_799_449_383,
glm: 0,
dsf: 1_176_701_653_509,
dsp: 569_527_034_307,
mm: 159_016_250_684,
others: 378_554_510_883,
},
{
date: "Jun 13",
total: 2_008_462_388_420,
glm: 0,
dsf: 995_338_131_997,
dsp: 445_817_536_548,
mm: 211_743_241_967,
others: 355_563_477_908,
},
{
date: "Jun 14",
total: 2_007_785_405_251,
glm: 0,
dsf: 983_954_176_228,
dsp: 428_151_999_341,
mm: 262_476_527_930,
others: 333_202_701_752,
},
{
date: "Jun 15",
total: 2_694_736_103_062,
glm: 0,
dsf: 1_255_893_953_859,
dsp: 632_223_338_376,
mm: 352_507_442_991,
others: 454_111_367_836,
},
{
date: "Jun 16",
total: 2_838_153_758_908,
glm: 0,
dsf: 1_336_625_283_800,
dsp: 676_480_415_730,
mm: 305_268_829_013,
others: 519_779_230_365,
},
{
date: "Jun 17",
total: 2_778_964_711_109,
glm: 70_095_977_043,
dsf: 1_339_831_523_555,
dsp: 660_414_395_220,
mm: 251_302_096_157,
others: 457_320_719_134,
},
{
date: "Jun 18",
total: 2_806_992_430_656,
glm: 201_130_231_172,
dsf: 1_295_599_996_869,
dsp: 595_665_008_776,
mm: 322_205_104_324,
others: 392_392_089_515,
},
{
date: "Jun 19",
total: 2_419_611_630_232,
glm: 199_086_413_910,
dsf: 1_115_750_468_802,
dsp: 475_965_869_304,
mm: 303_586_698_735,
others: 325_222_179_481,
},
{
date: "Jun 20",
total: 2_188_278_916_865,
glm: 193_931_516_396,
dsf: 1_050_194_681_012,
dsp: 395_303_435_278,
mm: 281_998_000_337,
others: 266_851_283_842,
},
{
date: "Jun 21",
total: 2_042_309_961_344,
glm: 181_894_043_118,
dsf: 985_164_570_580,
dsp: 368_194_079_542,
mm: 259_812_551_324,
others: 247_244_716_780,
},
{
date: "Jun 22",
total: 2_893_934_325_663,
glm: 301_759_048_475,
dsf: 1_298_124_282_989,
dsp: 581_012_596_194,
mm: 371_581_117_839,
others: 341_457_280_166,
},
{
date: "Jun 23",
total: 3_109_009_321_480,
glm: 282_277_235_158,
dsf: 1_423_571_678_821,
dsp: 627_374_654_587,
mm: 429_416_300_508,
others: 346_369_452_406,
},
{
date: "Jun 24",
total: 2_939_149_971_595,
glm: 256_497_442_533,
dsf: 1_373_583_023_234,
dsp: 601_270_997_775,
mm: 391_586_493_231,
others: 316_212_014_822,
},
{
date: "Jun 25",
total: 3_029_641_552_948,
glm: 256_279_657_734,
dsf: 1_481_084_002_776,
dsp: 602_077_167_287,
mm: 375_985_302_874,
others: 314_215_422_277,
},
]
export const launchIndex = 5 // Jun 17, first day of GLM-5.2 usage
// GLM-5.2 weekly token volume, Jun 19-25 (sum of glm): 1,671,725,357,324 = 1.67T
export const glmWeekTokensT = 1.672
// stacked segments, bottom -> top. GLM-5.2 is the hero (blue); the rest are the field it cut into.
export const segments = [
{ key: "glm", label: "GLM-5.2", color: "#3b5cf6", hero: true },
{ key: "dsf", label: "deepseek-v4-flash", color: "#9ca3ad" },
{ key: "dsp", label: "deepseek-v4-pro", color: "#b3b9c1" },
{ key: "mm", label: "minimax-m3", color: "#c8cdd3" },
{ key: "others", label: "other models", color: "#dde0e4" },
] as const
-185
View File
@@ -1,185 +0,0 @@
import React from "react"
import { AbsoluteFill, Easing, interpolate, spring, useCurrentFrame, useVideoConfig } from "remotion"
// stats.opencode.ai design tokens (light theme)
const c = {
bg: "#ffffff",
ink: "#161616",
muted: "#5c5c5c",
faint: "#808080",
line: "#e6e6e6",
dot: "#e4e4e4",
gray: "#aab0b8",
accent: "#3b5cf6",
accentHi: "#5b78ff",
}
const MONO = '"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace'
const DOT_MASK =
"url(\"data:image/svg+xml,%3Csvg viewBox='0 0 6 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0H2V2H0V0Z' fill='black'/%3E%3C/svg%3E\")"
// verified: OpenCode Go, week of Jun 22-28, 2026 (2026-W26). share = % of 19.64T total Go tokens.
const bars = [
{ label: "deepseek-v4-flash", share: 48.3, hero: true },
{ label: "deepseek-v4-pro", share: 19.4 },
{ label: "minimax-m3", share: 13.0 },
{ label: "glm-5.2", share: 8.3 },
{ label: "mimo-v2.5", share: 4.3 },
{ label: "kimi-k2.7-code", share: 2.6 },
{ label: "other models", share: 4.1 },
]
function DataWordmark({ height = 30 }: { height?: number }) {
return (
<svg width={(height * 66) / 20} height={height} viewBox="0 0 66 20" fill="none" style={{ color: c.ink }}>
<path opacity="0.2" d="M12 16H4V8H12V16Z" fill="currentColor" />
<path d="M12 4H4V16H12V4ZM16 20H0V0H16V20Z" fill="currentColor" />
<path
d="M63.3543 16L62.5119 12.8711H58.6437L57.8013 16H55.7383L59.2454 4H61.9618L65.4689 16H63.3543ZM61.0678 7.851L60.6896 5.94269H60.4489L60.0707 7.851L59.1595 11.1347H61.9962L61.0678 7.851Z"
fill="currentColor"
/>
<path d="M52.5951 5.87392V16H50.4461V5.87392H47.4375V4H55.6209V5.87392H52.5951Z" fill="currentColor" />
<path
d="M45.2059 16L44.3635 12.8711H40.4953L39.6529 16H37.5898L41.097 4H43.8133L47.3205 16H45.2059ZM42.9194 7.851L42.5411 5.94269H42.3004L41.9222 7.851L41.011 11.1347H43.8477L42.9194 7.851Z"
fill="currentColor"
/>
<path
d="M28 4H32.0917C32.8138 4 33.4556 4.11461 34.0172 4.34384C34.5903 4.5616 35.0716 4.9169 35.4613 5.40974C35.8625 5.89112 36.1662 6.51003 36.3725 7.26648C36.5788 8.02292 36.6819 8.9341 36.6819 10C36.6819 11.0659 36.5788 11.9771 36.3725 12.7335C36.1662 13.49 35.8625 14.1146 35.4613 14.6075C35.0716 15.0888 34.5903 15.4441 34.0172 15.6734C33.4556 15.8911 32.8138 16 32.0917 16H28V4ZM32.0917 14.1261C32.8252 14.1261 33.3926 13.9026 33.7937 13.4556C34.1948 12.9971 34.3954 12.3152 34.3954 11.4097V8.59026C34.3954 7.68481 34.1948 7.0086 33.7937 6.5616C33.3926 6.10315 32.8252 5.87392 32.0917 5.87392H30.149V14.1261H32.0917Z"
fill="currentColor"
/>
</svg>
)
}
export function FlashShare() {
const frame = useCurrentFrame()
const { fps } = useVideoConfig()
const grow = (i: number) =>
Math.min(
1,
Math.max(0, spring({ frame: frame - 18 - i * 7, fps, config: { damping: 18, stiffness: 120, mass: 0.6 } })),
)
return (
<AbsoluteFill style={{ background: c.bg, color: c.ink, fontFamily: MONO, padding: 72, boxSizing: "border-box" }}>
<div style={{ height: "100%", display: "flex", flexDirection: "column" }}>
{/* header */}
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
<DataWordmark height={30} />
<div style={{ fontSize: 20, fontWeight: 500, color: c.faint, letterSpacing: 1 }}>JUN 22–28, 2026</div>
</div>
{/* headline (static) */}
<div style={{ marginTop: 50 }}>
<div style={{ fontSize: 23, fontWeight: 600, color: c.muted, letterSpacing: 2 }}>
OPENCODE GO · SHARE OF TOKENS
</div>
<div
style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", gap: 24, marginTop: 14 }}
>
<div style={{ fontSize: 62, fontWeight: 600, letterSpacing: -2, lineHeight: 1 }}>DeepSeek V4 Flash</div>
<div
style={{
fontSize: 88,
fontWeight: 600,
letterSpacing: -2,
lineHeight: 1,
color: c.accent,
fontVariantNumeric: "tabular-nums",
}}
>
48%
</div>
</div>
</div>
{/* bar chart */}
<div style={{ flex: 1, display: "flex", flexDirection: "column", justifyContent: "center", gap: 16 }}>
{bars.map((b, i) => {
const g = grow(i)
const pct = b.share * g
return (
<div key={b.label} style={{ display: "flex", alignItems: "center", gap: 18 }}>
<div
style={{
width: 268,
fontSize: 23,
fontWeight: b.hero ? 600 : 500,
color: b.hero ? c.ink : c.muted,
textAlign: "right",
whiteSpace: "nowrap",
}}
>
{b.label}
</div>
<div style={{ position: "relative", flex: 1, height: 48 }}>
{/* dotted 100% track — height is a multiple of the 12px tile, anchored bottom, so dots never clip */}
<div
style={{
position: "absolute",
inset: 0,
background: c.dot,
WebkitMaskImage: DOT_MASK,
maskImage: DOT_MASK,
WebkitMaskSize: "12px 12px",
maskSize: "12px 12px",
WebkitMaskRepeat: "repeat",
maskRepeat: "repeat",
WebkitMaskPosition: "left bottom",
maskPosition: "left bottom",
}}
/>
{/* fill */}
<div
style={{
position: "absolute",
left: 0,
top: 0,
bottom: 0,
width: `${pct}%`,
background: b.hero ? c.accent : c.gray,
borderRight: b.hero ? `2px solid ${c.accentHi}` : "none",
}}
/>
</div>
<div
style={{
width: 84,
fontSize: 24,
fontWeight: b.hero ? 600 : 500,
color: b.hero ? c.accent : c.muted,
textAlign: "right",
fontVariantNumeric: "tabular-nums",
}}
>
{Math.round(pct)}%
</div>
</div>
)
})}
</div>
{/* footer */}
<div
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
marginTop: 24,
paddingTop: 22,
borderTop: `1px solid ${c.line}`,
fontSize: 20,
fontWeight: 500,
}}
>
<div style={{ display: "inline-flex", alignItems: "center", gap: 9, color: c.muted }}>
<span style={{ width: 13, height: 13, background: c.accent, display: "inline-block" }} />
DeepSeek V4 Flash · 9.48T tokens · 83.6M requests
</div>
<div style={{ color: c.ink }}>opencode.ai/data</div>
</div>
</div>
</AbsoluteFill>
)
}
-36
View File
@@ -1,36 +0,0 @@
import { Composition, registerRoot } from "remotion"
import { GLM52Rise } from "./video"
import { NZSheep } from "./sheep"
import { NovelTokens } from "./novel"
import { FlashShare } from "./flash"
import { MiniMaxClimb } from "./minimax"
import { JuneTotals } from "./june"
function Root() {
return (
<>
<Composition id="GLM52Rise" component={GLM52Rise} durationInFrames={240} fps={30} width={1080} height={1080} />
<Composition id="NZSheep" component={NZSheep} durationInFrames={150} fps={30} width={1080} height={1080} />
<Composition
id="NovelTokens"
component={NovelTokens}
durationInFrames={150}
fps={30}
width={1080}
height={1080}
/>
<Composition id="FlashShare" component={FlashShare} durationInFrames={165} fps={30} width={1080} height={1080} />
<Composition
id="MiniMaxClimb"
component={MiniMaxClimb}
durationInFrames={165}
fps={30}
width={1080}
height={1080}
/>
<Composition id="JuneTotals" component={JuneTotals} durationInFrames={1} fps={30} width={1080} height={1080} />
</>
)
}
registerRoot(Root)
-144
View File
@@ -1,144 +0,0 @@
import React from "react"
import { AbsoluteFill } from "remotion"
const c = {
bg: "#ffffff",
ink: "#161616",
muted: "#5c5c5c",
faint: "#808080",
line: "#e6e6e6",
dot: "#dcdcdc",
accent: "#3b5cf6",
}
const MONO = '"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace'
const DOT_MASK =
"url(\"data:image/svg+xml,%3Csvg viewBox='0 0 6 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0H2V2H0V0Z' fill='black'/%3E%3C/svg%3E\")"
// verified: OpenCode Go (tier=Go, dataset=zen), June 1-30, 2026.
// 72.78T tokens · 651.4M requests · 11.42M sessions -> rounded headline figures.
function DataWordmark({ height = 30 }: { height?: number }) {
return (
<svg width={(height * 66) / 20} height={height} viewBox="0 0 66 20" fill="none" style={{ color: c.ink }}>
<path opacity="0.2" d="M12 16H4V8H12V16Z" fill="currentColor" />
<path d="M12 4H4V16H12V4ZM16 20H0V0H16V20Z" fill="currentColor" />
<path
d="M63.3543 16L62.5119 12.8711H58.6437L57.8013 16H55.7383L59.2454 4H61.9618L65.4689 16H63.3543ZM61.0678 7.851L60.6896 5.94269H60.4489L60.0707 7.851L59.1595 11.1347H61.9962L61.0678 7.851Z"
fill="currentColor"
/>
<path d="M52.5951 5.87392V16H50.4461V5.87392H47.4375V4H55.6209V5.87392H52.5951Z" fill="currentColor" />
<path
d="M45.2059 16L44.3635 12.8711H40.4953L39.6529 16H37.5898L41.097 4H43.8133L47.3205 16H45.2059ZM42.9194 7.851L42.5411 5.94269H42.3004L41.9222 7.851L41.011 11.1347H43.8477L42.9194 7.851Z"
fill="currentColor"
/>
<path
d="M28 4H32.0917C32.8138 4 33.4556 4.11461 34.0172 4.34384C34.5903 4.5616 35.0716 4.9169 35.4613 5.40974C35.8625 5.89112 36.1662 6.51003 36.3725 7.26648C36.5788 8.02292 36.6819 8.9341 36.6819 10C36.6819 11.0659 36.5788 11.9771 36.3725 12.7335C36.1662 13.49 35.8625 14.1146 35.4613 14.6075C35.0716 15.0888 34.5903 15.4441 34.0172 15.6734C33.4556 15.8911 32.8138 16 32.0917 16H28V4ZM32.0917 14.1261C32.8252 14.1261 33.3926 13.9026 33.7937 13.4556C34.1948 12.9971 34.3954 12.3152 34.3954 11.4097V8.59026C34.3954 7.68481 34.1948 7.0086 33.7937 6.5616C33.3926 6.10315 32.8252 5.87392 32.0917 5.87392H30.149V14.1261H32.0917Z"
fill="currentColor"
/>
</svg>
)
}
function DotBand() {
return (
<div
style={{
height: 12,
background: c.dot,
WebkitMaskImage: DOT_MASK,
maskImage: DOT_MASK,
WebkitMaskSize: "12px 12px",
maskSize: "12px 12px",
WebkitMaskRepeat: "repeat",
maskRepeat: "repeat",
WebkitMaskPosition: "left top",
maskPosition: "left top",
}}
/>
)
}
function Metric({ value, label }: { value: string; label: string }) {
return (
<div>
<div
style={{
fontSize: 92,
fontWeight: 600,
letterSpacing: -3,
lineHeight: 1,
fontVariantNumeric: "tabular-nums",
marginLeft: -8, // align the glyph's visual left edge to the column
}}
>
{value}
</div>
<div style={{ marginTop: 16, fontSize: 24, fontWeight: 500, color: c.muted, letterSpacing: 1 }}>{label}</div>
</div>
)
}
export function JuneTotals() {
return (
<AbsoluteFill style={{ background: c.bg, color: c.ink, fontFamily: MONO, padding: 72, boxSizing: "border-box" }}>
<div style={{ height: "100%", display: "flex", flexDirection: "column" }}>
{/* header */}
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 22 }}>
<DataWordmark height={30} />
<div style={{ fontSize: 20, fontWeight: 500, color: c.faint, letterSpacing: 1 }}>MONTHLY RECAP</div>
</div>
<DotBand />
{/* hero */}
<div style={{ flex: 1, display: "flex", flexDirection: "column", justifyContent: "center" }}>
<div style={{ fontSize: 25, fontWeight: 600, color: c.muted, letterSpacing: 3 }}>OPENCODE GO · JUNE 2026</div>
<div style={{ marginTop: 14 }}>
<div
style={{
fontSize: 300,
fontWeight: 600,
letterSpacing: -10,
lineHeight: 0.82,
color: c.accent,
marginLeft: -22,
}}
>
73T
</div>
<div style={{ fontSize: 50, fontWeight: 600, color: c.ink, marginTop: 10 }}>tokens processed</div>
</div>
{/* supporting metrics */}
<div
style={{
display: "grid",
gridTemplateColumns: "1fr 1fr",
marginTop: 60,
paddingTop: 40,
borderTop: `1px solid ${c.line}`,
}}
>
<Metric value="650M" label="requests" />
<Metric value="11M" label="sessions" />
</div>
</div>
{/* footer */}
<DotBand />
<div
style={{
display: "flex",
justifyContent: "flex-end",
alignItems: "center",
marginTop: 22,
fontSize: 20,
fontWeight: 500,
}}
>
<div style={{ color: c.ink }}>opencode.ai/data</div>
</div>
</div>
</AbsoluteFill>
)
}
-201
View File
@@ -1,201 +0,0 @@
import React from "react"
import { AbsoluteFill, interpolate, spring, useCurrentFrame, useVideoConfig } from "remotion"
const c = {
bg: "#ffffff",
ink: "#161616",
muted: "#5c5c5c",
faint: "#808080",
line: "#e6e6e6",
dot: "#e4e4e4",
accent: "#3b5cf6",
accentHi: "#5b78ff",
accentDim: "#aebcf3",
}
const MONO = '"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace'
const DOT_MASK =
"url(\"data:image/svg+xml,%3Csvg viewBox='0 0 6 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0H2V2H0V0Z' fill='black'/%3E%3C/svg%3E\")"
// verified: minimax-m3, OpenCode Go (tier=Go, dataset=zen), weekly total_tokens.
// W26 2.559T is +23.2% / +482.3B vs W25 2.077T.
const weeks = [
{ label: "May 25", t: 0.008 },
{ label: "Jun 1", t: 0.429 },
{ label: "Jun 8", t: 1.192 },
{ label: "Jun 15", t: 2.077 },
{ label: "Jun 22", t: 2.559, latest: true },
]
const AXIS_MAX = 3.0
function DataWordmark({ height = 30 }: { height?: number }) {
return (
<svg width={(height * 66) / 20} height={height} viewBox="0 0 66 20" fill="none" style={{ color: c.ink }}>
<path opacity="0.2" d="M12 16H4V8H12V16Z" fill="currentColor" />
<path d="M12 4H4V16H12V4ZM16 20H0V0H16V20Z" fill="currentColor" />
<path
d="M63.3543 16L62.5119 12.8711H58.6437L57.8013 16H55.7383L59.2454 4H61.9618L65.4689 16H63.3543ZM61.0678 7.851L60.6896 5.94269H60.4489L60.0707 7.851L59.1595 11.1347H61.9962L61.0678 7.851Z"
fill="currentColor"
/>
<path d="M52.5951 5.87392V16H50.4461V5.87392H47.4375V4H55.6209V5.87392H52.5951Z" fill="currentColor" />
<path
d="M45.2059 16L44.3635 12.8711H40.4953L39.6529 16H37.5898L41.097 4H43.8133L47.3205 16H45.2059ZM42.9194 7.851L42.5411 5.94269H42.3004L41.9222 7.851L41.011 11.1347H43.8477L42.9194 7.851Z"
fill="currentColor"
/>
<path
d="M28 4H32.0917C32.8138 4 33.4556 4.11461 34.0172 4.34384C34.5903 4.5616 35.0716 4.9169 35.4613 5.40974C35.8625 5.89112 36.1662 6.51003 36.3725 7.26648C36.5788 8.02292 36.6819 8.9341 36.6819 10C36.6819 11.0659 36.5788 11.9771 36.3725 12.7335C36.1662 13.49 35.8625 14.1146 35.4613 14.6075C35.0716 15.0888 34.5903 15.4441 34.0172 15.6734C33.4556 15.8911 32.8138 16 32.0917 16H28V4ZM32.0917 14.1261C32.8252 14.1261 33.3926 13.9026 33.7937 13.4556C34.1948 12.9971 34.3954 12.3152 34.3954 11.4097V8.59026C34.3954 7.68481 34.1948 7.0086 33.7937 6.5616C33.3926 6.10315 32.8252 5.87392 32.0917 5.87392H30.149V14.1261H32.0917Z"
fill="currentColor"
/>
</svg>
)
}
const CHART_H = 420 // multiple of 12 so the dotted tracks never clip
export function MiniMaxClimb() {
const frame = useCurrentFrame()
const { fps } = useVideoConfig()
const grow = (i: number) =>
Math.min(
1,
Math.max(0, spring({ frame: frame - 22 - i * 9, fps, config: { damping: 18, stiffness: 110, mass: 0.6 } })),
)
return (
<AbsoluteFill style={{ background: c.bg, color: c.ink, fontFamily: MONO, padding: 72, boxSizing: "border-box" }}>
<div style={{ height: "100%", display: "flex", flexDirection: "column" }}>
{/* header */}
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
<DataWordmark height={30} />
<div style={{ fontSize: 20, fontWeight: 500, color: c.faint, letterSpacing: 1 }}>JUN 22–28, 2026</div>
</div>
{/* headline (static) */}
<div style={{ marginTop: 50 }}>
<div style={{ fontSize: 23, fontWeight: 600, color: c.muted, letterSpacing: 2 }}>
OPENCODE GO · WEEKLY TOKENS
</div>
<div
style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", gap: 24, marginTop: 14 }}
>
<div style={{ fontSize: 62, fontWeight: 600, letterSpacing: -2, lineHeight: 1 }}>MiniMax M3</div>
<div style={{ textAlign: "right", flexShrink: 0 }}>
<div
style={{
fontSize: 84,
fontWeight: 600,
letterSpacing: -2,
lineHeight: 1,
color: c.accent,
fontVariantNumeric: "tabular-nums",
}}
>
+23.2%
</div>
<div style={{ fontSize: 19, fontWeight: 500, color: c.muted, letterSpacing: 1, marginTop: 6 }}>
WEEK OVER WEEK
</div>
</div>
</div>
</div>
{/* column chart */}
<div style={{ flex: 1, display: "flex", alignItems: "flex-end", marginTop: 30 }}>
<div style={{ width: "100%", display: "flex", alignItems: "flex-end", gap: 30 }}>
{weeks.map((w, i) => {
const g = grow(i)
const h = Math.round((w.t / AXIS_MAX) * CHART_H * g)
return (
<div key={w.label} style={{ flex: 1, display: "flex", flexDirection: "column", alignItems: "center" }}>
{/* value + bar */}
<div style={{ position: "relative", width: "100%", height: CHART_H }}>
{/* dotted track */}
<div
style={{
position: "absolute",
inset: 0,
background: c.dot,
WebkitMaskImage: DOT_MASK,
maskImage: DOT_MASK,
WebkitMaskSize: "12px 12px",
maskSize: "12px 12px",
WebkitMaskRepeat: "repeat",
maskRepeat: "repeat",
WebkitMaskPosition: "left bottom",
maskPosition: "left bottom",
}}
/>
{/* fill */}
<div
style={{
position: "absolute",
left: 0,
right: 0,
bottom: 0,
height: h,
background: w.latest ? c.accent : c.accentDim,
borderTop: w.latest ? `3px solid ${c.accentHi}` : "none",
}}
/>
{/* value label */}
<div
style={{
position: "absolute",
left: 0,
right: 0,
bottom: h + 10,
textAlign: "center",
fontSize: 26,
fontWeight: w.latest ? 600 : 500,
color: w.latest ? c.accent : c.muted,
fontVariantNumeric: "tabular-nums",
opacity: interpolate(g, [0.5, 1], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
}),
}}
>
{w.t.toFixed(2)}T
</div>
</div>
{/* week label */}
<div
style={{
marginTop: 14,
fontSize: 18,
fontWeight: 500,
color: w.latest ? c.ink : c.faint,
}}
>
{w.label}
</div>
</div>
)
})}
</div>
</div>
{/* footer */}
<div
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
marginTop: 22,
paddingTop: 22,
borderTop: `1px solid ${c.line}`,
fontSize: 20,
fontWeight: 500,
}}
>
<div style={{ display: "inline-flex", alignItems: "center", gap: 9, color: c.muted }}>
<span style={{ width: 13, height: 13, background: c.accent, display: "inline-block" }} />
2.56T tokens last week · +482.3B added
</div>
<div style={{ color: c.ink }}>opencode.ai/data</div>
</div>
</div>
</AbsoluteFill>
)
}
-135
View File
@@ -1,135 +0,0 @@
import React from "react"
import { AbsoluteFill, Easing, Img, interpolate, staticFile, useCurrentFrame } from "remotion"
const c = {
white: "#ffffff",
dim: "rgba(255,255,255,0.74)",
}
const MONO = '"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace'
// verified: OpenCode Go, week of Jun 22-28, 2026 (2026-W26)
// 19,642,742,937,105 tokens / 173,651,197 requests = 113,116 tokens/request
const AVG = 113116
const K = Math.round(AVG / 1000) // 113
const nf = new Intl.NumberFormat("en-US")
function DataWordmark({ height = 30 }: { height?: number }) {
return (
<svg width={(height * 66) / 20} height={height} viewBox="0 0 66 20" fill="none" style={{ color: c.white }}>
<path opacity="0.35" d="M12 16H4V8H12V16Z" fill="currentColor" />
<path d="M12 4H4V16H12V4ZM16 20H0V0H16V20Z" fill="currentColor" />
<path
d="M63.3543 16L62.5119 12.8711H58.6437L57.8013 16H55.7383L59.2454 4H61.9618L65.4689 16H63.3543ZM61.0678 7.851L60.6896 5.94269H60.4489L60.0707 7.851L59.1595 11.1347H61.9962L61.0678 7.851Z"
fill="currentColor"
/>
<path d="M52.5951 5.87392V16H50.4461V5.87392H47.4375V4H55.6209V5.87392H52.5951Z" fill="currentColor" />
<path
d="M45.2059 16L44.3635 12.8711H40.4953L39.6529 16H37.5898L41.097 4H43.8133L47.3205 16H45.2059ZM42.9194 7.851L42.5411 5.94269H42.3004L41.9222 7.851L41.011 11.1347H43.8477L42.9194 7.851Z"
fill="currentColor"
/>
<path
d="M28 4H32.0917C32.8138 4 33.4556 4.11461 34.0172 4.34384C34.5903 4.5616 35.0716 4.9169 35.4613 5.40974C35.8625 5.89112 36.1662 6.51003 36.3725 7.26648C36.5788 8.02292 36.6819 8.9341 36.6819 10C36.6819 11.0659 36.5788 11.9771 36.3725 12.7335C36.1662 13.49 35.8625 14.1146 35.4613 14.6075C35.0716 15.0888 34.5903 15.4441 34.0172 15.6734C33.4556 15.8911 32.8138 16 32.0917 16H28V4ZM32.0917 14.1261C32.8252 14.1261 33.3926 13.9026 33.7937 13.4556C34.1948 12.9971 34.3954 12.3152 34.3954 11.4097V8.59026C34.3954 7.68481 34.1948 7.0086 33.7937 6.5616C33.3926 6.10315 32.8252 5.87392 32.0917 5.87392H30.149V14.1261H32.0917Z"
fill="currentColor"
/>
</svg>
)
}
export function NovelTokens() {
const frame = useCurrentFrame()
const k = Math.round(
K *
interpolate(frame, [18, 92], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
easing: Easing.out(Easing.cubic),
}),
)
const zoom = interpolate(frame, [0, 150], [1.06, 1.12], {
extrapolateRight: "clamp",
easing: Easing.inOut(Easing.quad),
})
return (
<AbsoluteFill style={{ background: "#0c0c0c", overflow: "hidden" }}>
<Img
src={staticFile("book.jpg")}
style={{
position: "absolute",
width: "100%",
height: "100%",
objectFit: "cover",
objectPosition: "center 34%",
transform: `scale(${zoom})`,
transformOrigin: "center 30%",
}}
/>
{/* legibility scrims */}
<div
style={{
position: "absolute",
inset: 0,
background:
"linear-gradient(to bottom, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0) 20%, rgba(0,0,0,0.1) 44%, rgba(0,0,0,0.86) 100%)",
}}
/>
<div
style={{
position: "absolute",
inset: 0,
boxSizing: "border-box",
padding: 64,
color: c.white,
fontFamily: MONO,
display: "flex",
flexDirection: "column",
justifyContent: "space-between",
}}
>
{/* header */}
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
<DataWordmark height={30} />
<div style={{ fontSize: 20, fontWeight: 500, color: c.dim, letterSpacing: 1 }}>JUN 22–28, 2026</div>
</div>
{/* bottom block */}
<div>
<div style={{ fontSize: 23, fontWeight: 600, color: c.dim, letterSpacing: 2, marginBottom: 8 }}>
OPENCODE GO · LAST WEEK
</div>
<div
style={{
fontSize: 168,
fontWeight: 600,
lineHeight: 0.92,
letterSpacing: -5,
fontVariantNumeric: "tabular-nums",
}}
>
{k}K
</div>
<div style={{ fontSize: 50, fontWeight: 600, letterSpacing: -1, marginTop: 4 }}>tokens per request</div>
<div
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
marginTop: 30,
fontSize: 20,
fontWeight: 500,
}}
>
<div style={{ color: c.dim }}>{nf.format(AVG)} tokens / request · last week</div>
<div style={{ color: c.white }}>opencode.ai/data</div>
</div>
</div>
</div>
</AbsoluteFill>
)
}
-139
View File
@@ -1,139 +0,0 @@
import React from "react"
import { AbsoluteFill, Easing, Img, interpolate, staticFile, useCurrentFrame } from "remotion"
const c = {
white: "#ffffff",
dim: "rgba(255,255,255,0.72)",
faint: "rgba(255,255,255,0.55)",
}
const MONO = '"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace'
// verified: NZ OpenCode Go, week of Jun 22-28, 2026 (2026-W26)
const TOKENS = 40_915_594_381 // 40.9B
const SHEEP = 23_600_000 // 23.6M
const PER_SHEEP = Math.round(TOKENS / SHEEP) // 1,734
const nf = new Intl.NumberFormat("en-US")
// the correct opencode "DATA" wordmark (white, over photo)
function DataWordmark({ height = 30 }: { height?: number }) {
return (
<svg width={(height * 66) / 20} height={height} viewBox="0 0 66 20" fill="none" style={{ color: c.white }}>
<path opacity="0.35" d="M12 16H4V8H12V16Z" fill="currentColor" />
<path d="M12 4H4V16H12V4ZM16 20H0V0H16V20Z" fill="currentColor" />
<path
d="M63.3543 16L62.5119 12.8711H58.6437L57.8013 16H55.7383L59.2454 4H61.9618L65.4689 16H63.3543ZM61.0678 7.851L60.6896 5.94269H60.4489L60.0707 7.851L59.1595 11.1347H61.9962L61.0678 7.851Z"
fill="currentColor"
/>
<path d="M52.5951 5.87392V16H50.4461V5.87392H47.4375V4H55.6209V5.87392H52.5951Z" fill="currentColor" />
<path
d="M45.2059 16L44.3635 12.8711H40.4953L39.6529 16H37.5898L41.097 4H43.8133L47.3205 16H45.2059ZM42.9194 7.851L42.5411 5.94269H42.3004L41.9222 7.851L41.011 11.1347H43.8477L42.9194 7.851Z"
fill="currentColor"
/>
<path
d="M28 4H32.0917C32.8138 4 33.4556 4.11461 34.0172 4.34384C34.5903 4.5616 35.0716 4.9169 35.4613 5.40974C35.8625 5.89112 36.1662 6.51003 36.3725 7.26648C36.5788 8.02292 36.6819 8.9341 36.6819 10C36.6819 11.0659 36.5788 11.9771 36.3725 12.7335C36.1662 13.49 35.8625 14.1146 35.4613 14.6075C35.0716 15.0888 34.5903 15.4441 34.0172 15.6734C33.4556 15.8911 32.8138 16 32.0917 16H28V4ZM32.0917 14.1261C32.8252 14.1261 33.3926 13.9026 33.7937 13.4556C34.1948 12.9971 34.3954 12.3152 34.3954 11.4097V8.59026C34.3954 7.68481 34.1948 7.0086 33.7937 6.5616C33.3926 6.10315 32.8252 5.87392 32.0917 5.87392H30.149V14.1261H32.0917Z"
fill="currentColor"
/>
</svg>
)
}
export function NZSheep() {
const frame = useCurrentFrame()
const count = Math.round(
PER_SHEEP *
interpolate(frame, [18, 90], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
easing: Easing.out(Easing.cubic),
}),
)
// slow Ken Burns push-in (scale up only — never reveals an edge)
const zoom = interpolate(frame, [0, 150], [1.06, 1.12], {
extrapolateRight: "clamp",
easing: Easing.inOut(Easing.quad),
})
return (
<AbsoluteFill style={{ background: "#0c0c0c", overflow: "hidden" }}>
{/* the sheep, staring */}
<Img
src={staticFile("sheep.jpg")}
style={{
position: "absolute",
width: "100%",
height: "100%",
objectFit: "cover",
objectPosition: "center 38%",
transform: `scale(${zoom})`,
transformOrigin: "center 35%",
}}
/>
{/* legibility scrims */}
<div
style={{
position: "absolute",
inset: 0,
background:
"linear-gradient(to bottom, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 22%, rgba(0,0,0,0) 48%, rgba(0,0,0,0.78) 100%)",
}}
/>
{/* content */}
<div
style={{
position: "absolute",
inset: 0,
boxSizing: "border-box",
padding: 64,
color: c.white,
fontFamily: MONO,
display: "flex",
flexDirection: "column",
justifyContent: "space-between",
}}
>
{/* header */}
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
<DataWordmark height={30} />
<div style={{ fontSize: 20, fontWeight: 500, color: c.dim, letterSpacing: 1 }}>JUN 22–28, 2026</div>
</div>
{/* bottom block */}
<div>
<div style={{ fontSize: 23, fontWeight: 600, color: c.dim, letterSpacing: 2, marginBottom: 8 }}>
OPENCODE GO · NEW ZEALAND
</div>
<div
style={{
fontSize: 168,
fontWeight: 600,
lineHeight: 0.92,
letterSpacing: -5,
fontVariantNumeric: "tabular-nums",
}}
>
{nf.format(count)}
</div>
<div style={{ fontSize: 50, fontWeight: 600, letterSpacing: -1, marginTop: 4 }}>tokens per sheep</div>
<div
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
marginTop: 34,
fontSize: 20,
fontWeight: 500,
}}
>
<div style={{ color: c.dim }}>40.9B tokens ÷ 23.6M sheep · last week</div>
<div style={{ color: c.white }}>opencode.ai/data</div>
</div>
</div>
</div>
</AbsoluteFill>
)
}
-254
View File
@@ -1,254 +0,0 @@
import React from "react"
import { AbsoluteFill, Easing, interpolate, useCurrentFrame, useVideoConfig } from "remotion"
import { days, launchIndex, glmWeekTokensT, segments } from "./data"
// stats.opencode.ai design tokens (light theme)
const c = {
bg: "#ffffff",
ink: "#161616",
muted: "#5c5c5c",
faint: "#808080",
line: "#e6e6e6",
dot: "#ededed",
accent: "#3b5cf6",
accentHi: "#5b78ff",
}
const MONO = '"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace'
const W = 1080
const DOT_MASK =
"url(\"data:image/svg+xml,%3Csvg viewBox='0 0 6 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0H2V2H0V0Z' fill='black'/%3E%3C/svg%3E\")"
const field = segments.filter((s) => !s.hero)
const glmColor = segments.find((s) => s.hero)!.color
const clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v))
// the correct opencode "DATA" wordmark (from stats.opencode.ai header)
function DataWordmark({ height = 30, color = c.ink }: { height?: number; color?: string }) {
return (
<svg width={(height * 66) / 20} height={height} viewBox="0 0 66 20" fill="none" style={{ color }}>
<path opacity="0.2" d="M12 16H4V8H12V16Z" fill="currentColor" />
<path d="M12 4H4V16H12V4ZM16 20H0V0H16V20Z" fill="currentColor" />
<path
d="M63.3543 16L62.5119 12.8711H58.6437L57.8013 16H55.7383L59.2454 4H61.9618L65.4689 16H63.3543ZM61.0678 7.851L60.6896 5.94269H60.4489L60.0707 7.851L59.1595 11.1347H61.9962L61.0678 7.851Z"
fill="currentColor"
/>
<path d="M52.5951 5.87392V16H50.4461V5.87392H47.4375V4H55.6209V5.87392H52.5951Z" fill="currentColor" />
<path
d="M45.2059 16L44.3635 12.8711H40.4953L39.6529 16H37.5898L41.097 4H43.8133L47.3205 16H45.2059ZM42.9194 7.851L42.5411 5.94269H42.3004L41.9222 7.851L41.011 11.1347H43.8477L42.9194 7.851Z"
fill="currentColor"
/>
<path
d="M28 4H32.0917C32.8138 4 33.4556 4.11461 34.0172 4.34384C34.5903 4.5616 35.0716 4.9169 35.4613 5.40974C35.8625 5.89112 36.1662 6.51003 36.3725 7.26648C36.5788 8.02292 36.6819 8.9341 36.6819 10C36.6819 11.0659 36.5788 11.9771 36.3725 12.7335C36.1662 13.49 35.8625 14.1146 35.4613 14.6075C35.0716 15.0888 34.5903 15.4441 34.0172 15.6734C33.4556 15.8911 32.8138 16 32.0917 16H28V4ZM32.0917 14.1261C32.8252 14.1261 33.3926 13.9026 33.7937 13.4556C34.1948 12.9971 34.3954 12.3152 34.3954 11.4097V8.59026C34.3954 7.68481 34.1948 7.0086 33.7937 6.5616C33.3926 6.10315 32.8252 5.87392 32.0917 5.87392H30.149V14.1261H32.0917Z"
fill="currentColor"
/>
</svg>
)
}
export function GLM52Rise() {
const frame = useCurrentFrame()
const { fps } = useVideoConfig()
// ---------- virtual camera ----------
// open zoomed-in on the field, pan right while the blue fills, then pull back to reveal.
const K = [0, 32, 150, 206, 240]
const ease = Easing.inOut(Easing.cubic)
const opt = { extrapolateLeft: "clamp" as const, extrapolateRight: "clamp" as const, easing: ease }
const s = interpolate(frame, K, [1.82, 1.72, 1.72, 1.0, 1.0], opt)
let fx = interpolate(frame, K, [420, 438, 760, 540, 540], opt)
let fy = interpolate(frame, K, [664, 664, 664, 540, 540], opt)
// keep the framing inside the 1080 canvas so edges never reveal black
fx = clamp(fx, 540 / s, W - 540 / s)
fy = clamp(fy, 540 / s, W - 540 / s)
const camera = `translate(${540 - fx * s}px, ${540 - fy * s}px) scale(${s})`
// ---------- blue sweep (synced to the pan) ----------
const p = interpolate(frame, [32, 150], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: ease })
const revealAmount = p * (days.length - launchIndex) + 0.35
const fillOf = (i: number) => clamp(revealAmount - (i - launchIndex), 0, 1)
// token number climbs as the camera pulls back and the headline re-enters frame
const tokensT =
glmWeekTokensT *
interpolate(frame, [150, 202], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
easing: Easing.out(Easing.cubic),
})
// chart geometry
const chartH = 440
const chartW = 936
const gap = 14
const EXAGGERATE = 2.876 // broken y-axis: GLM-5.2 magnified ~2.9x for emphasis
return (
<AbsoluteFill style={{ background: c.bg, overflow: "hidden" }}>
<div
style={{
position: "absolute",
width: W,
height: W,
background: c.bg,
transformOrigin: "0 0",
transform: camera,
}}
>
<div
style={{
width: W,
height: W,
boxSizing: "border-box",
padding: 72,
color: c.ink,
fontFamily: MONO,
display: "flex",
flexDirection: "column",
}}
>
{/* header */}
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
<DataWordmark height={30} />
<div style={{ fontSize: 20, fontWeight: 500, color: c.faint, letterSpacing: 1 }}>JUN 12–25, 2026</div>
</div>
{/* headline (static) */}
<div style={{ marginTop: 52 }}>
<div style={{ fontSize: 92, fontWeight: 600, lineHeight: 0.98, letterSpacing: -2 }}>
GLM-5.2 <span style={{ color: c.accent }}>broke out</span>
</div>
<div style={{ marginTop: 22, fontSize: 30, fontWeight: 500, color: c.muted }}>
From 0 to <span style={{ color: c.ink }}>{tokensT.toFixed(2)}T tokens</span> in a week.
</div>
</div>
{/* stacked chart */}
<div style={{ flex: 1, display: "flex", alignItems: "flex-end", marginTop: 40 }}>
<div
style={{
position: "relative",
width: chartW,
height: chartH,
margin: "0 auto",
borderBottom: `2px solid ${c.ink}`,
boxSizing: "border-box",
}}
>
{/* faint dotted backdrop */}
<div
style={{
position: "absolute",
left: -8,
right: -8,
top: -8,
bottom: 0,
background: c.dot,
WebkitMaskImage: DOT_MASK,
maskImage: DOT_MASK,
WebkitMaskSize: "12px 12px",
maskSize: "12px 12px",
WebkitMaskRepeat: "repeat",
maskRepeat: "repeat",
}}
/>
{/* columns */}
<div style={{ position: "absolute", inset: 0, display: "flex", gap, alignItems: "flex-end" }}>
{days.map((d, i) => {
const glmShare = d.glm / d.total
const blueH = Math.round(glmShare * EXAGGERATE * chartH)
const filled = Math.round(blueH * fillOf(i))
const slotGap = filled > 2 ? 5 : 0
const fieldH = chartH - filled - slotGap
const fieldTotal = d.dsf + d.dsp + d.mm + d.others
return (
<div key={i} style={{ position: "relative", flex: 1, height: chartH }}>
{/* gray field of other models (already in place) */}
<div
style={{
position: "absolute",
top: 0,
left: 0,
right: 0,
height: fieldH,
display: "flex",
flexDirection: "column-reverse",
}}
>
{field.map((seg) => (
<div
key={seg.key}
style={{
height: Math.round(((d[seg.key as keyof typeof d] as number) / fieldTotal) * fieldH),
background: seg.color,
borderTop: `2px solid ${c.bg}`,
}}
/>
))}
</div>
{/* GLM-5.2, animates in */}
{filled > 2 && (
<div
style={{
position: "absolute",
left: 0,
right: 0,
bottom: 0,
height: filled,
background: glmColor,
borderTop: `2px solid ${c.accentHi}`,
}}
/>
)}
</div>
)
})}
</div>
</div>
</div>
{/* day axis */}
<div style={{ display: "flex", gap, width: chartW, margin: "14px auto 0" }}>
{days.map((d, i) => (
<div
key={i}
style={{
flex: 1,
textAlign: "center",
fontSize: 15,
fontWeight: 500,
color: i === days.length - 1 ? c.ink : c.faint,
}}
>
{i === 0 || i === launchIndex || i === days.length - 1 ? d.date : ""}
</div>
))}
</div>
{/* footer */}
<div
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
marginTop: 28,
paddingTop: 22,
borderTop: `1px solid ${c.line}`,
fontSize: 20,
fontWeight: 500,
}}
>
<div style={{ display: "inline-flex", alignItems: "center", gap: 9, color: c.muted }}>
<span style={{ width: 13, height: 13, background: c.accent, display: "inline-block" }} />
GLM-5.2
</div>
<div style={{ color: c.ink }}>opencode.ai/data</div>
</div>
</div>
</div>
</AbsoluteFill>
)
}
-10
View File
@@ -1,10 +0,0 @@
/* This file is auto-generated by SST. Do not edit. */
/* tslint:disable */
/* eslint-disable */
/* deno-fmt-ignore-file */
/* biome-ignore-all lint: auto-generated */
/// <reference path="../../sst-env.d.ts" />
import "sst"
export {}
+175 -172
View File
File diff suppressed because it is too large. Load diff
+19 -6
View File
@@ -1,9 +1,7 @@
import { deployAws, domain } from "./stage"
import { domain } from "./stage"
import { EMAILOCTOPUS_API_KEY } from "./app"
import { SECRET } from "./secret"
const lake = deployAws ? await import("./lake") : undefined
////////////////
// DATABASE
////////////////
@@ -150,8 +148,9 @@ const zenLitePrice = new stripe.Price("ZenLitePrice", {
})
const ZEN_LITE_PRICE = new sst.Linkable("ZEN_LITE_PRICE", {
properties: {
product: zenLiteProduct.id,
price: zenLitePrice.id,
// Use existing Go resources in dev's checkout Stripe account.
product: $app.stage === "dev" ? "prod_U1tUscpmwtV2bG" : zenLiteProduct.id,
price: $app.stage === "dev" ? "price_1T3phhE7fOCwHSD4zS6w2NPy" : zenLitePrice.id,
priceInr: 92900,
firstMonth50Coupon: zenLiteCouponFirstMonth50.id,
firstMonth100Coupon: zenLiteCouponFirstMonth100.id,
@@ -221,6 +220,15 @@ const STRIPE_PUBLISHABLE_KEY = new sst.Secret("STRIPE_PUBLISHABLE_KEY")
const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", {
properties: { value: auth.url.apply((url) => url!) },
})
// Preview branches have independent databases; do not send their workspaces to shared dev.
const migrationDomain =
$app.stage === "production" ? "opencode.ai" : $app.stage === "dev" ? "dev.opencode.ai" : undefined
const consoleMigration = new sst.Linkable("ConsoleMigration", {
properties: {
consoleUrl: migrationDomain ? `https://${migrationDomain}/console` : "",
inferenceUrl: migrationDomain ? `https://${migrationDomain}/inference` : "",
},
})
const STRIPE_WEBHOOK_SECRET = new sst.Linkable("STRIPE_WEBHOOK_SECRET", {
properties: { value: stripeWebhook.secret },
})
@@ -235,6 +243,7 @@ const bucketNew = new sst.cloudflare.Bucket("ZenDataNew")
const DISCORD_INCIDENT_WEBHOOK_URL = new sst.Secret("DISCORD_INCIDENT_WEBHOOK_URL")
const AWS_SES_ACCESS_KEY_ID = new sst.Secret("AWS_SES_ACCESS_KEY_ID")
const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY")
const ENTERPRISE_SALES_INBOX_EMAIL = new sst.Secret("ENTERPRISE_SALES_INBOX_EMAIL")
const SALESFORCE_CLIENT_ID = new sst.Secret("SALESFORCE_CLIENT_ID")
const SALESFORCE_CLIENT_SECRET = new sst.Secret("SALESFORCE_CLIENT_SECRET")
@@ -242,7 +251,7 @@ const SALESFORCE_INSTANCE_URL = new sst.Secret("SALESFORCE_INSTANCE_URL")
const logProcessor = new sst.cloudflare.Worker("LogProcessor", {
handler: "packages/console/function/src/log-processor.ts",
link: [SECRET.HoneycombApiKey, ...(lake?.lakeIngest ? [lake.lakeIngest] : [])],
link: [SECRET.HoneycombApiKey],
})
new sst.cloudflare.x.SolidStart("Console", {
@@ -255,6 +264,7 @@ new sst.cloudflare.x.SolidStart("Console", {
SECRET.UpstashRedisRestUrl,
SECRET.UpstashRedisRestToken,
AUTH_API_URL,
consoleMigration,
STRIPE_WEBHOOK_SECRET,
SECRET.SupportApiKey,
DISCORD_INCIDENT_WEBHOOK_URL,
@@ -263,6 +273,7 @@ new sst.cloudflare.x.SolidStart("Console", {
EMAILOCTOPUS_API_KEY,
AWS_SES_ACCESS_KEY_ID,
AWS_SES_SECRET_ACCESS_KEY,
ENTERPRISE_SALES_INBOX_EMAIL,
SALESFORCE_CLIENT_ID,
SALESFORCE_CLIENT_SECRET,
SALESFORCE_INSTANCE_URL,
@@ -270,6 +281,7 @@ new sst.cloudflare.x.SolidStart("Console", {
ZEN_LITE_PRICE,
new sst.Secret("ZEN_LIMITS"),
new sst.Secret("ZEN_SESSION_SECRET"),
new sst.Secret("CLOUDFLARE_ACCESS_CLIENT_ID"),
...ZEN_MODELS,
...($dev
? [
@@ -283,6 +295,7 @@ new sst.cloudflare.x.SolidStart("Console", {
//VITE_API_URL: gateway.url.apply((url) => url!),
VITE_AUTH_URL: auth.url.apply((url) => url!),
VITE_STRIPE_PUBLISHABLE_KEY: STRIPE_PUBLISHABLE_KEY.value,
VITE_CONSOLE_MARKETING_ENABLED: $app.stage === "dev" ? "true" : "false",
},
transform: {
server: {
-331
View File
@@ -1,331 +0,0 @@
import { domain } from "./stage"
const current = aws.getCallerIdentityOutput({})
const partition = aws.getPartitionOutput({})
const region = aws.getRegionOutput({})
const tableBucketName = `opencode-${$app.stage}-lake`
const glueCatalogName = "s3tablescatalog"
const glueCatalogArn = $interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:catalog`
const glueS3TablesCatalogArn = $interpolate`${glueCatalogArn}/${glueCatalogName}`
const glueS3TablesChildCatalogArn = $interpolate`${glueS3TablesCatalogArn}/${tableBucketName}`
const glueS3TablesDatabaseWildcardArn = $interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:database/${glueCatalogName}/${tableBucketName}/*`
const glueS3TablesTableWildcardArn = $interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:table/${glueCatalogName}/${tableBucketName}/*/*`
const s3TablesBucketWildcardArn = $interpolate`arn:${partition.partition}:s3tables:${region.region}:${current.accountId}:bucket/*`
export const tableBucket = new aws.s3tables.TableBucket("LakeTableBucket", {
name: tableBucketName,
forceDestroy: $app.stage !== "production",
})
const s3TablesCatalog = new aws.cloudcontrol.Resource(
"LakeS3TablesCatalog",
{
typeName: "AWS::Glue::Catalog",
desiredState: $jsonStringify({
Name: glueCatalogName,
Description: "Federated catalog for S3 Tables",
FederatedCatalog: {
Identifier: s3TablesBucketWildcardArn,
ConnectionName: "aws:s3tables",
},
CreateDatabaseDefaultPermissions: [
{
Principal: {
DataLakePrincipalIdentifier: "IAM_ALLOWED_PRINCIPALS",
},
Permissions: ["ALL"],
},
],
CreateTableDefaultPermissions: [
{
Principal: {
DataLakePrincipalIdentifier: "IAM_ALLOWED_PRINCIPALS",
},
Permissions: ["ALL"],
},
],
AllowFullTableExternalDataAccess: "True",
}),
},
{ dependsOn: [tableBucket] },
)
const athenaResultsBucket = new aws.s3.Bucket("LakeAthenaResults", {
bucket: `opencode-${$app.stage}-lake-athena-results`,
forceDestroy: $app.stage !== "production",
})
const firehoseErrorBucket = new aws.s3.Bucket("LakeFirehoseErrors", {
bucket: `opencode-${$app.stage}-lake-firehose-errors`,
forceDestroy: $app.stage !== "production",
})
const athenaWorkgroup = new aws.athena.Workgroup("LakeAthenaWorkgroup", {
name: `opencode-${$app.stage}-lake-workgroup`,
forceDestroy: $app.stage !== "production",
configuration: {
enforceWorkgroupConfiguration: true,
publishCloudwatchMetricsEnabled: true,
// Athena bills $5/TB scanned; kill any query that would scan more than 2 TB
// so a regression cannot silently burn money. Stats sync full passes scan
// ~250 GB as of 2026-07.
bytesScannedCutoffPerQuery: 2 * 1024 ** 4,
resultConfiguration: {
outputLocation: $interpolate`s3://${athenaResultsBucket.bucket}/`,
},
},
})
const firehoseRole = new aws.iam.Role("LakeFirehoseRole", {
assumeRolePolicy: aws.iam.getPolicyDocumentOutput({
statements: [
{
effect: "Allow",
actions: ["sts:AssumeRole"],
principals: [
{
type: "Service",
identifiers: ["firehose.amazonaws.com"],
},
],
},
],
}).json,
})
const firehosePolicy = new aws.iam.RolePolicy("LakeFirehosePolicy", {
role: firehoseRole.id,
policy: aws.iam.getPolicyDocumentOutput({
statements: [
{
effect: "Allow",
actions: [
"s3tables:ListTableBuckets",
"s3tables:GetTableBucket",
"s3tables:GetNamespace",
"s3tables:GetTable",
"s3tables:GetTableData",
"s3tables:GetTableMetadataLocation",
"s3tables:ListNamespaces",
"s3tables:ListTables",
"s3tables:PutTableData",
"s3tables:UpdateTableMetadataLocation",
],
resources: ["*"],
},
{
effect: "Allow",
actions: [
"glue:GetCatalog",
"glue:GetCatalogs",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:UpdateTable",
],
resources: [
glueCatalogArn,
glueS3TablesCatalogArn,
$interpolate`${glueS3TablesCatalogArn}/*`,
glueS3TablesDatabaseWildcardArn,
glueS3TablesTableWildcardArn,
$interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:database/*`,
$interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:table/*/*`,
$interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:table/${glueCatalogName}/*`,
],
},
{
effect: "Allow",
actions: [
"s3:AbortMultipartUpload",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:PutObject",
],
resources: [firehoseErrorBucket.arn, $interpolate`${firehoseErrorBucket.arn}/*`],
},
{
effect: "Allow",
actions: ["lakeformation:GetDataAccess"],
resources: ["*"],
},
],
}).json,
})
const firehose = new aws.kinesis.FirehoseDeliveryStream(
"LakeFirehose",
{
name: `opencode-${$app.stage}-lake-ingest`,
destination: "iceberg",
icebergConfiguration: {
appendOnly: true,
bufferingInterval: 60,
bufferingSize: 1,
catalogArn: glueS3TablesChildCatalogArn,
processingConfiguration: {
enabled: true,
processors: [
{
type: "MetadataExtraction",
parameters: [
{ parameterName: "JsonParsingEngine", parameterValue: "JQ-1.6" },
{
parameterName: "MetadataExtractionQuery",
parameterValue:
'{destinationDatabaseName:._lake_database,destinationTableName:._lake_table,operation:(._lake_operation // "insert")}',
},
],
},
],
},
roleArn: firehoseRole.arn,
s3BackupMode: "FailedDataOnly",
s3Configuration: {
roleArn: firehoseRole.arn,
bucketArn: firehoseErrorBucket.arn,
errorOutputPrefix: "errors/!{firehose:error-output-type}/",
},
},
},
{ dependsOn: [s3TablesCatalog, firehosePolicy] },
)
export const lakeVpc = new sst.aws.Vpc("LakeVpc")
export const lakeCluster = new sst.aws.Cluster("LakeCluster", { vpc: lakeVpc })
export const lakeRegion = region.region
export const lakeCatalog = $interpolate`${glueCatalogName}/${tableBucket.name}`
export const lakeAthenaWorkgroup = athenaWorkgroup
const ingestSecret = new random.RandomPassword("LakeIngestSecret", { length: 32 })
export const ingestSecretSsm = new aws.ssm.Parameter("LakeIngestSecretSsm", {
name: $interpolate`/${$app.name}/${$app.stage}/lake/ingest/secret`,
type: "SecureString",
value: ingestSecret.result,
})
const ingestConfig = new sst.Linkable("LakeIngestConfig", {
properties: {
streamName: firehose.name,
secret: ingestSecret.result,
},
})
const ingestService = new sst.aws.Service("LakeIngestService", {
cluster: lakeCluster,
architecture: "arm64",
cpu: "1 vCPU",
memory: "4 GB",
image: {
context: ".",
dockerfile: "packages/stats/server/Dockerfile",
},
link: [ingestConfig],
permissions: [
{
actions: ["firehose:PutRecord", "firehose:PutRecordBatch"],
resources: [firehose.arn],
},
],
scaling: {
min: $app.stage === "production" ? 2 : 1,
max: $app.stage === "production" ? 32 : 4,
cpuUtilization: 60,
memoryUtilization: 70,
},
loadBalancer: {
domain: {
name: `lake.${domain}`,
dns: sst.cloudflare.dns(),
},
rules: [
{ listen: "80/http", redirect: "443/https" },
{ listen: "443/https", forward: "3000/http" },
],
health: {
"3000/http": {
path: "/ready",
successCodes: "200-299",
},
},
},
health: {
command: [
"CMD-SHELL",
"bun --eval \"fetch('http://localhost:3000/health').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))\"",
],
interval: "30 seconds",
retries: 3,
startPeriod: "30 seconds",
timeout: "5 seconds",
},
dev: {
command: "bun run start",
directory: "packages/stats/server",
url: "http://localhost:3000",
},
wait: $app.stage === "production",
})
export const lakeIngest = new sst.Linkable("LakeIngest", {
properties: {
url: ingestService.url,
secret: ingestSecret.result,
},
})
export const lakeQueryPermissions = [
{
actions: ["athena:StartQueryExecution", "athena:GetQueryExecution", "athena:GetQueryResults"],
resources: [athenaWorkgroup.arn],
},
{
actions: [
"glue:GetCatalog",
"glue:GetCatalogs",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:GetPartitions",
],
resources: [
glueCatalogArn,
glueS3TablesCatalogArn,
$interpolate`${glueS3TablesCatalogArn}/*`,
glueS3TablesDatabaseWildcardArn,
glueS3TablesTableWildcardArn,
$interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:database/*`,
$interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:table/*/*`,
$interpolate`arn:${partition.partition}:glue:${region.region}:${current.accountId}:table/${glueCatalogName}/*`,
],
},
{
actions: ["s3:GetBucketLocation", "s3:ListBucket"],
resources: [athenaResultsBucket.arn],
},
{
actions: ["s3:GetObject", "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListBucketMultipartUploads"],
resources: [$interpolate`${athenaResultsBucket.arn}/*`],
},
{
actions: [
"s3tables:GetTableBucket",
"s3tables:GetNamespace",
"s3tables:GetTable",
"s3tables:GetTableData",
"s3tables:GetTableMetadataLocation",
"s3tables:ListNamespaces",
"s3tables:ListTables",
],
resources: ["*"],
},
{
actions: ["lakeformation:GetDataAccess"],
resources: ["*"],
},
]
+9 -102
View File
@@ -1,104 +1,10 @@
import { lakeAthenaWorkgroup, lakeCatalog, lakeCluster, lakeQueryPermissions, lakeRegion, tableBucket } from "./lake"
import { EMAILOCTOPUS_API_KEY } from "./app"
import { domain } from "./stage"
////////////////
// LAKE
////////////////
const inferenceNamespace = new aws.s3tables.Namespace("LakeInferenceNamespace", {
namespace: "inference",
tableBucketArn: tableBucket.arn,
})
const inferenceEventTable = new aws.s3tables.Table(
"LakeInferenceEventTable",
{
name: "event",
namespace: inferenceNamespace.namespace,
tableBucketArn: inferenceNamespace.tableBucketArn,
format: "ICEBERG",
metadata: {
iceberg: {
schema: {
fields: [
{ name: "event_timestamp", type: "string", required: false },
{ name: "event_date", type: "string", required: false },
{ name: "event_type", type: "string", required: false },
{ name: "dataset", type: "string", required: false },
{ name: "cf_continent", type: "string", required: false },
{ name: "cf_country", type: "string", required: false },
{ name: "cf_city", type: "string", required: false },
{ name: "cf_region", type: "string", required: false },
{ name: "cf_latitude", type: "double", required: false },
{ name: "cf_longitude", type: "double", required: false },
{ name: "cf_timezone", type: "string", required: false },
{ name: "duration", type: "double", required: false },
{ name: "request_length", type: "long", required: false },
{ name: "status", type: "int", required: false },
{ name: "ip", type: "string", required: false },
{ name: "is_stream", type: "boolean", required: false },
{ name: "session", type: "string", required: false },
{ name: "request", type: "string", required: false },
{ name: "client", type: "string", required: false },
{ name: "user_agent", type: "string", required: false },
{ name: "model", type: "string", required: false },
{ name: "model_tier", type: "string", required: false },
{ name: "model_variant", type: "string", required: false },
{ name: "source", type: "string", required: false },
{ name: "provider", type: "string", required: false },
{ name: "provider_model", type: "string", required: false },
{ name: "llm_error_code", type: "int", required: false },
{ name: "llm_error_message", type: "string", required: false },
{ name: "error_response", type: "string", required: false },
{ name: "error_type", type: "string", required: false },
{ name: "error_message", type: "string", required: false },
{ name: "error_cause", type: "string", required: false },
{ name: "error_cause2", type: "string", required: false },
{ name: "api_key", type: "string", required: false },
{ name: "workspace", type: "string", required: false },
{ name: "user_id", type: "string", required: false },
{ name: "is_subscription", type: "boolean", required: false },
{ name: "subscription", type: "string", required: false },
{ name: "response_length", type: "long", required: false },
{ name: "time_to_first_byte", type: "long", required: false },
{ name: "timestamp_first_byte", type: "long", required: false },
{ name: "timestamp_last_byte", type: "long", required: false },
{ name: "tokens_input", type: "long", required: false },
{ name: "tokens_output", type: "long", required: false },
{ name: "tokens_reasoning", type: "long", required: false },
{ name: "tokens_cache_read", type: "long", required: false },
{ name: "tokens_cache_write_5m", type: "long", required: false },
{ name: "tokens_cache_write_1h", type: "long", required: false },
{ name: "cost_input_microcents", type: "long", required: false },
{ name: "cost_output_microcents", type: "long", required: false },
{ name: "cost_cache_read_microcents", type: "long", required: false },
{ name: "cost_cache_write_microcents", type: "long", required: false },
{ name: "cost_total_microcents", type: "long", required: false },
{ name: "cost_input", type: "long", required: false },
{ name: "cost_output", type: "long", required: false },
{ name: "cost_cache_read", type: "long", required: false },
{ name: "cost_cache_write_5m", type: "long", required: false },
{ name: "cost_cache_write_1h", type: "long", required: false },
{ name: "cost_total", type: "long", required: false },
],
},
},
},
},
{ deleteBeforeReplace: $app.stage !== "production", ignoreChanges: ["metadata"] },
)
export const inferenceEvent = new sst.Linkable("InferenceEvent", {
properties: {
region: lakeRegion,
catalog: lakeCatalog,
database: inferenceNamespace.namespace,
table: inferenceEventTable.name,
tableBucket: tableBucket.name,
workgroup: lakeAthenaWorkgroup.name,
},
})
// Keep the deployed names and arguments: the R2 stats sync still uses this VPC
// and cluster after the legacy lake is removed.
const lakeVpc = new sst.aws.Vpc("LakeVpc")
const lakeCluster = new sst.aws.Cluster("LakeCluster", { vpc: lakeVpc })
////////////////
// DATABASE
@@ -181,6 +87,10 @@ const statsSyncConfig = new sst.Linkable("StatsSyncConfig", {
},
})
// Comma-separated model IDs kept off the public stats site. A secret, so excluding
// an unreleased model does not publish its name in git.
const statsHiddenModels = new sst.Secret("StatsHiddenModels", "")
const r2SqlAuthToken = new sst.Secret("R2SqlAuthToken")
const r2Sql = new sst.Linkable("R2Sql", {
properties: {
@@ -203,10 +113,7 @@ export const statSync = new sst.aws.Service("StatsSyncService", {
dockerfile: "packages/stats/server/Dockerfile",
},
command: ["bun", "src/stat-sync.ts"],
// Keep the legacy Athena link and IAM permissions during the first R2-backed
// release so reverting the application code remains a one-deploy rollback.
link: [database, inferenceEvent, r2Sql, r2SqlAuthToken, statsSyncConfig],
permissions: lakeQueryPermissions,
link: [database, r2Sql, r2SqlAuthToken, statsHiddenModels, statsSyncConfig],
scaling: {
min: 1,
max: 1,
+4 -4
View File
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-yQ8EIxxYkzlEWIMY/UiIR+7lbGBuizsoehMPZzFA65Y=",
"aarch64-linux": "sha256-JF9VVgnl5QUZ430fqb5Qu8y0kchYJ00LO3FbYcd0lBM=",
"aarch64-darwin": "sha256-f3Tu6eu463NWcHgr7dupfD/zUTh26bJ6N2vVXuEyi6c=",
"x86_64-darwin": "sha256-miv9Sv4KdhD0UIi2O5LVS1wQOfq29IV+9S+BvIzAvgo="
"x86_64-linux": "sha256-fLT+bI7WUsOOZ/LDplgOPOyTdJoaC0DmtyfOu8C3m6E=",
"aarch64-linux": "sha256-hGj5ekUknuo/qGfKY/2EDGG6+XuSWf4NfDM6sDJzxYA=",
"aarch64-darwin": "sha256-kJ1/F43fWtuReKVsnfc5O/RFu36QsXmTEGyxXZ0fiM8=",
"x86_64-darwin": "sha256-UvNIsIoNzHBSzK3mcqdfG62qFcpMj3SoEUpqvA5oYIA="
}
}
+9 -5
View File
@@ -6,7 +6,7 @@
"type": "module",
"packageManager": "bun@1.3.14",
"scripts": {
"dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts",
"dev": "bun run --cwd packages/opencode src/index.ts",
"dev:desktop": "bun --cwd packages/desktop dev",
"dev:web": "bun --cwd packages/app dev",
"dev:console": "ulimit -n 10240 2>/dev/null; bun run --cwd packages/console/app dev",
@@ -137,20 +137,21 @@
"electron"
],
"overrides": {
"@ai-sdk/anthropic": "3.0.111",
"@opentui/core": "catalog:",
"@opentui/keymap": "catalog:",
"@opentui/solid": "catalog:",
"@types/bun": "catalog:",
"@types/node": "catalog:"
"@types/node": "catalog:",
"open": "11.0.4"
},
"patchedDependencies": {
"@dnd-kit/dom@0.5.0": "patches/@dnd-kit%2Fdom@0.5.0.patch",
"@ff-labs/fff-bun@0.9.3": "patches/@ff-labs%2Ffff-bun@0.9.3.patch",
"@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
"@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
"solid-js@1.9.10": "patches/solid-js@1.9.10.patch",
"@ai-sdk/xai@3.0.102": "patches/@ai-sdk%2Fxai@3.0.102.patch",
"@ai-sdk/xai@3.0.139": "patches/@ai-sdk%2Fxai@3.0.139.patch",
"@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch",
"gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch",
"pacote@21.5.0": "patches/pacote@21.5.0.patch",
@@ -160,6 +161,9 @@
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
"@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch",
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch",
"@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch"
"@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch",
"@ai-sdk/anthropic@3.0.111": "patches/@ai-sdk%2Fanthropic@3.0.111.patch",
"@ai-sdk/amazon-bedrock@4.0.166": "patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch",
"@ai-sdk/openai@3.0.88": "patches/@ai-sdk%2Fopenai@3.0.88.patch"
}
}
+1 -1
View File
@@ -11,7 +11,7 @@
- `opencode dev web` proxies `https://app.opencode.ai`, so local UI/CSS changes will not show there.
- For local UI changes, run the backend and app dev servers separately.
- Backend (from `packages/opencode`): `bun run --conditions=browser ./src/index.ts serve --port 4096`
- Backend (from `packages/opencode`): `bun run ./src/index.ts serve --port 4096`
- App (from `packages/app`): `bun dev -- --port 4444`
- Open `http://localhost:4444` to verify UI changes (it targets the backend at `http://localhost:4096`).
@@ -60,6 +60,39 @@ test("keeps the file-browser sidebar mounted when switching file tabs", async ({
await expect.poll(() => viewport.evaluate((element) => element.scrollTop)).toBe(scrolled)
})
test("keeps previous file search results visible while the next search loads", async ({ page }) => {
const searchPending = Promise.withResolvers<void>()
await setup(page, async ({ query }) => {
if (query === "file-0") return ["file-00.ts"]
if (query === "file-7") {
await searchPending.promise
return ["file-79.ts"]
}
return []
})
await page.goto(`/server/${base64Encode(server)}/session/${sessionID}`)
await expectSessionTitle(page, title)
const panel = page.locator("#review-panel")
await panel.getByRole("button", { name: "Open file" }).click()
const filter = panel.getByRole("combobox", { name: "Filter files" })
await filter.fill("file-0")
await expect(panel.getByRole("option", { name: "file-00.ts" })).toBeVisible()
const nextSearch = page.waitForRequest((request) => {
const url = new URL(request.url())
return url.pathname === "/find/file" && url.searchParams.get("query") === "file-7"
})
await filter.fill("file-7")
await nextSearch
await expect(panel.getByRole("option", { name: "file-00.ts" })).toBeVisible()
searchPending.resolve()
await expect(panel.getByRole("option", { name: "file-79.ts" })).toBeVisible()
await expect(panel.getByRole("option", { name: "file-00.ts" })).toBeHidden()
})
type Probed = HTMLElement & { __e2eProbe?: string }
async function writeProbe(page: Page) {
@@ -74,7 +107,10 @@ async function readProbe(page: Page) {
.evaluate((el) => (el as Probed).__e2eProbe)
}
async function setup(page: Page) {
async function setup(
page: Page,
findFiles?: (input: { query: string; dirs?: string; limit?: number }) => unknown | Promise<unknown>,
) {
await mockOpenCodeServer(page, {
directory,
project: {
@@ -119,6 +155,7 @@ async function setup(page: Page) {
}))
},
fileContent: (path) => ({ type: "text", content: `contents:${path}` }),
findFiles,
pageMessages: () => ({ items: [] }),
})
@@ -1,41 +0,0 @@
import { expect, test } from "@playwright/test"
import { base64Encode } from "@opencode-ai/core/util/encode"
import { mockOpenCodeServer } from "../utils/mock-server"
const draftID = "draft_legacy_new_session"
const directory = "C:/OpenCode/LegacyNewSession"
const server = `http://${process.env.PLAYWRIGHT_SERVER_HOST ?? "127.0.0.1"}:${process.env.PLAYWRIGHT_SERVER_PORT ?? "4096"}`
test("redirects a draft to the legacy new-session route", async ({ page }) => {
await mockOpenCodeServer(page, {
directory,
project: {
id: "proj_legacy_new_session",
worktree: directory,
vcs: "git",
name: "legacy-new-session",
time: { created: 1700000000000, updated: 1700000000000 },
sandboxes: [],
},
provider: { all: [], connected: [], default: {} },
sessions: [],
pageMessages: () => ({ items: [] }),
})
await page.addInitScript(
({ directory, draftID, server }) => {
localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: false } }))
localStorage.setItem("app-version.v1", JSON.stringify({ version: "1.17.20" }))
localStorage.setItem(
"opencode.window.browser.dat:tabs",
JSON.stringify([{ type: "draft", draftID, server, directory }]),
)
},
{ directory, draftID, server },
)
await page.goto(`/new-session?draftId=${draftID}`)
await expect(page).toHaveURL(`/${base64Encode(directory)}/session`)
await expect(page.locator("header[data-tauri-drag-region]")).toBeVisible()
await expect(page.locator('[data-component="prompt-input"]')).toBeVisible()
})
@@ -0,0 +1,141 @@
import { expect, test } from "@playwright/test"
import { fixture, pageMessages } from "../smoke/session-timeline.fixture"
import { mockOpenCodeServer } from "../utils/mock-server"
test.beforeEach(async ({ page }) => {
const sessions = fixture.sessions.map((session) => ({ ...session }))
await mockOpenCodeServer(page, {
protocol: "v1",
sessions,
provider: fixture.provider,
directory: fixture.directory,
project: fixture.project,
pageMessages,
})
await page.route(/\/session\/[^/]+(?:\?.*)?$/, async (route) => {
if (route.request().method() !== "PATCH") return route.fallback()
const id = new URL(route.request().url()).pathname.split("/").at(-1)
const session = sessions.find((item) => item.id === id)
const payload: unknown = route.request().postDataJSON()
if (
!session ||
!payload ||
typeof payload !== "object" ||
!("title" in payload) ||
typeof payload.title !== "string"
)
throw new Error("Invalid rename request")
session.title = payload.title
await route.fulfill({ json: session, headers: { "access-control-allow-origin": "*" } })
})
await page.addInitScript((directory) => {
localStorage.setItem(
"opencode.global.dat:server",
JSON.stringify({
projects: { local: [{ worktree: directory, expanded: true }] },
lastProject: { local: directory },
}),
)
}, fixture.directory)
await page.goto("/")
await page.locator('[data-component="home-session-row"]').filter({ hasText: fixture.expected.targetTitle }).click()
await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
})
for (const commit of ["Enter", "blur", "click outside"]) {
test(`saves the session heading on ${commit}`, async ({ page }) => {
await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
const input = page.locator('input[data-slot="session-title-child"]')
await expect(input).toBeFocused()
await input.fill("Renamed session")
if (commit === "Enter") await input.press("Enter")
if (commit === "blur") await input.press("Tab")
if (commit === "click outside") await page.getByRole("textbox", { name: "Prompt", exact: true }).click()
await expect(page.getByRole("heading", { name: "Renamed session", exact: true })).toBeVisible()
await expect(page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: "Renamed session" })).toBeVisible()
await page.reload()
await expect(page.getByRole("heading", { name: "Renamed session", exact: true })).toBeVisible()
})
}
test("cancels the session heading with Escape", async ({ page }) => {
await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
const input = page.locator('input[data-slot="session-title-child"]')
await input.fill("Discard this title")
await input.press("Escape")
await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
await page.reload()
await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
})
test("keeps the draft when saving the session heading fails", async ({ page }) => {
await page.route(/\/session\/[^/]+(?:\?.*)?$/, (route) => {
if (route.request().method() !== "PATCH") return route.fallback()
return route.fulfill({ status: 500, headers: { "access-control-allow-origin": "*" } })
})
await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
const input = page.locator('input[data-slot="session-title-child"]')
await input.fill("Retry this title")
await input.press("Tab")
await expect(page.getByText("Request failed", { exact: true })).toBeVisible()
await expect(input).toBeEnabled()
await expect(input).toHaveValue("Retry this title")
await expect(
page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: fixture.expected.targetTitle }),
).toBeVisible()
})
test("does not save an empty session heading", async ({ page }) => {
await page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true }).click()
const input = page.locator('input[data-slot="session-title-child"]')
await input.fill(" ")
await input.press("Tab")
await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
await page.reload()
await expect(page.getByRole("heading", { name: fixture.expected.targetTitle, exact: true })).toBeVisible()
})
test("renames and closes the session tab from its context menu", async ({ page }) => {
const tab = page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: fixture.expected.targetTitle })
await tab.click({ button: "right" })
await expect(page.getByRole("menuitem", { name: "Rename", exact: true })).toBeVisible()
await page.keyboard.press("Escape")
await expect(page.getByRole("menuitem", { name: "Rename", exact: true })).toBeHidden()
await expect(tab).toBeFocused()
await tab.press("Shift+F10")
await page.getByRole("menuitem", { name: "Rename", exact: true }).click()
const input = page.locator('[data-slot="tab-title"][contenteditable="true"]')
await expect(input).toBeFocused()
await input.fill("Renamed from tab")
await input.press("Enter")
await expect(page.getByRole("heading", { name: "Renamed from tab", exact: true })).toBeVisible()
await page.reload()
await expect(page.getByRole("heading", { name: "Renamed from tab", exact: true })).toBeVisible()
const renamed = page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: "Renamed from tab" })
await renamed.click({ button: "right" })
await page.getByRole("menuitem", { name: "Close tab", exact: true }).click()
await expect(renamed).toBeHidden()
await page.getByRole("button", { name: "Home", exact: true }).click()
await expect(
page.locator('[data-component="home-session-row"]').filter({ hasText: "Renamed from tab" }),
).toBeVisible()
})
test("renames an inactive tab without switching sessions", async ({ page }) => {
await page.getByRole("button", { name: "Home", exact: true }).click()
await page.locator('[data-component="home-session-row"]').filter({ hasText: fixture.expected.sourceTitle }).click()
await expect(page.getByRole("heading", { name: fixture.expected.sourceTitle, exact: true })).toBeVisible()
const tab = page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: fixture.expected.targetTitle })
await tab.click({ button: "right" })
await page.getByRole("menuitem", { name: "Rename", exact: true }).click()
const input = page.locator('[data-slot="tab-title"][contenteditable="true"]')
await expect(input).toBeFocused()
await input.fill("Inactive tab renamed")
await input.press("Tab")
await expect(page.getByRole("heading", { name: fixture.expected.sourceTitle, exact: true })).toBeVisible()
await expect(page).toHaveURL(new RegExp(`/session/${fixture.sourceID}$`))
await page.locator('[data-slot="titlebar-tabs"] a').filter({ hasText: "Inactive tab renamed" }).click()
await expect(page.getByRole("heading", { name: "Inactive tab renamed", exact: true })).toBeVisible()
await page.reload()
await expect(page.getByRole("heading", { name: "Inactive tab renamed", exact: true })).toBeVisible()
})
@@ -128,7 +128,7 @@ test.describe("session timeline projection", () => {
await expect(page.locator('[data-timeline-row="TurnGap"]')).toBeVisible()
})
test("renders comment strips and historical diff summary overflow", async ({ page }) => {
test("renders inline comments and historical diff summary overflow", async ({ page }) => {
const user = userMessage(
[
userText("The user made the following comment regarding lines 4 through 8 of src/a.ts: Keep this stable", {
@@ -152,14 +152,10 @@ test.describe("session timeline projection", () => {
parentID: "msg_2000_diff_next_user",
created: 1700000011000,
})
await setupTimeline(page, {
messages: [user, assistantMessage(), nextUser, nextAssistant],
settings: { newLayoutDesigns: false },
})
await setupTimeline(page, { messages: [user, assistantMessage(), nextUser, nextAssistant] })
const scroller = page.locator(".scroll-view__viewport", { has: page.locator("[data-timeline-row]") })
await scroller.evaluate((element) => (element.scrollTop = 0))
await expect(page.locator('[data-timeline-row="CommentStrip"]')).toBeVisible()
await expect(page.getByText("Keep this stable", { exact: true })).toBeVisible()
await expect(page.locator('[data-timeline-row="DiffSummary"]')).toBeVisible()
await expect(page.getByText(/show all/i)).toBeVisible()
@@ -39,7 +39,7 @@ test("shows the not found fallback when the viewed session is deleted", async ({
})
await expect(page.getByText("This session cannot be found")).toBeVisible()
await expect(page.getByRole("button", { name: "Close Tab" })).toBeVisible()
await expect(page.getByRole("button", { name: "Close Tab", exact: true })).toBeVisible()
await expect(page.getByRole("heading", { name: taskDescription })).toHaveCount(0)
})
+1 -1
View File
@@ -26,7 +26,7 @@ export interface MockServerConfig {
questions?: unknown[] | (() => unknown[])
fileList?: (path: string) => unknown | Promise<unknown>
fileContent?: (path: string) => unknown | Promise<unknown>
findFiles?: (input: { query: string; dirs?: string; limit?: number }) => unknown
findFiles?: (input: { query: string; dirs?: string; limit?: number }) => unknown | Promise<unknown>
sessionStatus?: Record<string, unknown> | (() => Record<string, unknown>)
}
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.18.18",
"version": "1.18.35",
"description": "",
"type": "module",
"exports": {
@@ -32,7 +32,7 @@
},
"license": "MIT",
"devDependencies": {
"@happy-dom/global-registrator": "20.0.11",
"@happy-dom/global-registrator": "20.12.0",
"@playwright/test": "catalog:",
"@sentry/vite-plugin": "catalog:",
"@tailwindcss/vite": "catalog:",
@@ -33,6 +33,7 @@ import { ExternalLink } from "@/components/external-link"
import { useServerSDK } from "@/context/server-sdk"
import { useServerSync } from "@/context/server-sync"
import { useLanguage } from "@/context/language"
import { usePlatform } from "@/context/platform"
import { useSettings } from "@/context/settings"
import { popularProviders, useProviders } from "@/hooks/use-providers"
import { CustomProviderForm } from "./dialog-custom-provider"
@@ -386,6 +387,7 @@ function ProviderConnection(props: {
const serverSDK = useServerSDK()
const params = useParams()
const language = useLanguage()
const platform = usePlatform()
const settings = useSettings()
const newLayout = settings.general.newLayoutDesigns
const providers = useProviders(() => props.directory?.())
@@ -560,6 +562,11 @@ function ProviderConnection(props: {
})
.then((x) => {
if (!alive.value) return
if (props.provider === "opencode" && platform.platform === "desktop") {
const url = new URL(x.data.url)
url.searchParams.set("client_id", "opencode-desktop")
x.data.url = url.href
}
dispatch({ type: "auth.complete", authorization: x.data })
})
.catch((e) => {
@@ -450,7 +450,7 @@ function ModelSelectorPopoverV2View(props: {
<For each={groups()}>
{(group) => (
<MenuV2.Group>
<MenuV2.GroupLabel class="gap-2 px-3">
<MenuV2.GroupLabel class="sticky top-0 z-10 gap-2 bg-v2-background-bg-layer-01 px-3">
<span class="min-w-0 truncate">{group.items[0].provider.name}</span>
</MenuV2.GroupLabel>
<MenuV2.RadioGroup value={props.current()}>
@@ -31,7 +31,10 @@ export function OpenInAppV2(props: { directory: () => string }) {
disabled={state.opening()}
aria-label={language.t("session.header.open.ariaLabel", { app: state.current().label })}
>
<Show when={state.opening()} fallback={<AppIcon id={state.current().icon} class="size-[18px]" />}>
<Show
when={state.opening()}
fallback={<AppIcon id={state.current().icon} style={{ width: "20px", height: "20px" }} />}
>
<Spinner class="size-3.5" />
</Show>
</SplitButtonV2Action>
@@ -1,9 +1,11 @@
import { createEffect, createMemo, createSignal, onCleanup, Show, type Ref } from "solid-js"
import { createStore } from "solid-js/store"
import { makeEventListener } from "@solid-primitives/event-listener"
import { createResizeObserver } from "@solid-primitives/resize-observer"
import { createMutation } from "@tanstack/solid-query"
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
import { MenuV2 } from "@opencode-ai/ui/v2/menu-v2"
import { useGlobal } from "@/context/global"
import { useLanguage } from "@/context/language"
import { ServerConnection, serverName } from "@/context/server"
@@ -33,6 +35,8 @@ export function TabNavItem(props: {
pressed?: boolean
hidden?: boolean
}) {
const language = useLanguage()
const [menu, setMenu] = createStore({ open: false, rename: false })
const [editing, setEditing] = createSignal(false)
const [titleOverflowing, setTitleOverflowing] = createSignal(false)
let tabRoot!: HTMLDivElement
@@ -76,7 +80,7 @@ export function TabNavItem(props: {
})
const [popoverOpen, setPopoverOpen] = createSignal(false)
const previewBlocked = () => !!props.dragging || editing() || !!props.pressed || !props.session()
const previewBlocked = () => !!props.dragging || editing() || menu.open || !!props.pressed || !props.session()
const measureTitleOverflow = () => {
if (!titleEl || editing()) {
@@ -138,9 +142,9 @@ export function TabNavItem(props: {
titleEl.textContent = value
})
const openRename = (event: MouseEvent) => {
event.preventDefault()
event.stopPropagation()
const openRename = (event?: MouseEvent) => {
event?.preventDefault()
event?.stopPropagation()
if (!canOpenTabRename(props.dragging, editing(), rename.isPending)) return
const session = props.session()
if (!session) return
@@ -171,7 +175,7 @@ export function TabNavItem(props: {
onCleanup(cleanup)
})
const tab = (
const tab = () => (
<div
ref={(el) => {
tabRoot = el
@@ -196,7 +200,11 @@ export function TabNavItem(props: {
closeTab(event)
}}
>
<a
<MenuV2.Context.Trigger
as="a"
disabled={editing() || props.dragging}
aria-haspopup="menu"
aria-expanded={menu.open}
data-slot="tab-link"
data-titlebar-tab-link
href={props.href}
@@ -276,7 +284,7 @@ export function TabNavItem(props: {
event.preventDefault()
}}
/>
</a>
</MenuV2.Context.Trigger>
<div data-slot="tab-close">
<IconButtonV2
@@ -289,26 +297,49 @@ export function TabNavItem(props: {
}}
onClick={closeTab}
icon={<IconV2 name="xmark-small" />}
aria-label={language.t("common.closeTab")}
/>
</div>
</div>
)
return (
<TabPreviewPopover
trigger={tab}
open={popoverOpen() && !previewBlocked()}
onOpenChange={(value) => {
if (value && previewBlocked()) return
setPopoverOpen(value)
<MenuV2.Context
onOpenChange={(open) => {
setMenu("open", open)
if (open) setPopoverOpen(false)
}}
data={{
projectName: projectName(),
title: props.session()?.title,
path: previewPath(),
serverName: serverLabel(),
}}
/>
>
<TabPreviewPopover
trigger={tab()}
open={popoverOpen() && !previewBlocked()}
onOpenChange={(value) => {
if (value && previewBlocked()) return
setPopoverOpen(value)
}}
data={{
projectName: projectName(),
title: props.session()?.title,
path: previewPath(),
serverName: serverLabel(),
}}
/>
<MenuV2.Context.Portal>
<MenuV2.Context.Content
onCloseAutoFocus={(event) => {
if (!menu.rename) return
event.preventDefault()
setMenu("rename", false)
openRename()
}}
>
<MenuV2.Item disabled={!props.session() || rename.isPending} onSelect={() => setMenu("rename", true)}>
{language.t("common.rename")}
</MenuV2.Item>
<MenuV2.Item onSelect={props.onClose}>{language.t("common.closeTab")}</MenuV2.Item>
</MenuV2.Context.Content>
</MenuV2.Context.Portal>
</MenuV2.Context>
)
}
@@ -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"),
-11
View File
@@ -972,17 +972,6 @@ export default function LegacyLayout(props: ParentProps) {
keybind: "shift+alt+arrowdown",
onSelect: () => navigateSessionByUnseen(1),
},
{
id: "session.archive",
title: language.t("command.session.archive"),
category: language.t("command.category.session"),
keybind: "mod+shift+backspace",
disabled: !params.dir || !params.id,
onSelect: () => {
const session = currentSessions().find((s) => s.id === params.id)
if (session) void archiveSession(session)
},
},
{
id: "workspace.new",
title: language.t("workspace.new"),
@@ -0,0 +1,74 @@
import { useNavigate } from "@solidjs/router"
import { produce } from "solid-js/store"
import { notifySessionTabsRemoved } from "@/components/titlebar-session-events"
import { useLanguage } from "@/context/language"
import { useSDK } from "@/context/sdk"
import { useServerSync } from "@/context/server-sync"
import { useSync } from "@/context/sync"
import { useTabs } from "@/context/tabs"
import { errorMessage } from "@/pages/layout/helpers"
import { useSessionKey } from "@/pages/session/session-layout"
import { legacySessionHref, requireServerKey, sessionHref } from "@/utils/session-route"
import { showToast } from "@/utils/toast"
export function useSessionArchive() {
const language = useLanguage()
const navigate = useNavigate()
const sdk = useSDK()
const sync = useSync()
const serverSync = useServerSync()
const tabs = useTabs()
const { params } = useSessionKey()
const navigateAfterRemoval = (sessionID: string, parentID?: string, nextSessionID?: string) => {
if (params.id !== sessionID) return
const href = (id: string) =>
params.serverKey ? sessionHref(requireServerKey(params.serverKey), id) : legacySessionHref(sdk().directory, id)
if (parentID) {
navigate(href(parentID))
return
}
if (nextSessionID) {
navigate(href(nextSessionID))
return
}
if (params.serverKey) {
tabs.newDraft({ server: requireServerKey(params.serverKey), directory: sdk().directory })
return
}
navigate(`/${params.dir}/session`)
}
const archive = async (sessionID: string) => {
const session = sync().session.get(sessionID)
if (!session) return
if ((await sdk().protocol) !== "v1") return
const sessions = sync().data.session ?? []
const index = sessions.findIndex((s) => s.id === sessionID)
const nextSession = index === -1 ? undefined : (sessions[index + 1] ?? sessions[index - 1])
await sdk()
.client.session.update({ sessionID, directory: sdk().directory, time: { archived: Date.now() } })
.then(() => {
sync().set(
produce((draft) => {
const index = draft.session.findIndex((s) => s.id === sessionID)
if (index !== -1) draft.session.splice(index, 1)
}),
)
sync().session.evict(sessionID)
serverSync().homeSessions.remove(sessionID)
navigateAfterRemoval(sessionID, session.parentID, nextSession?.id)
notifySessionTabsRemoved({ directory: sdk().directory, sessionIDs: [sessionID] })
})
.catch((err) => {
showToast({
title: language.t("common.requestFailed"),
description: errorMessage(err, language.t("common.requestFailed")),
})
})
}
return { archive, navigateAfterRemoval }
}
@@ -63,10 +63,10 @@ import { SessionContextUsage } from "@/components/session-context-usage"
import { useDialog } from "@opencode-ai/ui/context/dialog"
import { useLanguage } from "@/context/language"
import { useSessionKey } from "@/pages/session/session-layout"
import { useSessionArchive } from "@/pages/session/session-archive"
import { useServerSDK } from "@/context/server-sdk"
import { usePlatform } from "@/context/platform"
import { useSettings } from "@/context/settings"
import { useTabs } from "@/context/tabs"
import { legacySessionHref, requireServerKey, sessionHref } from "@/utils/session-route"
import { useSDK } from "@/context/sdk"
import { useSync } from "@/context/sync"
@@ -263,8 +263,8 @@ export function MessageTimeline(props: {
const sdk = useSDK()
const sync = useSync()
const settings = useSettings()
const tabs = useTabs()
const dialog = useDialog()
const sessionArchive = useSessionArchive()
const language = useLanguage()
const { params, sessionKey } = useSessionKey()
const ownerSessionKey = sessionKey()
@@ -777,6 +777,7 @@ export function MessageTimeline(props: {
}
const saveTitleEditor = () => {
if (!title.editing) return
const id = sessionID()
if (!id) return
if (titleMutation.isPending) return
@@ -790,25 +791,6 @@ export function MessageTimeline(props: {
titleMutation.mutate({ id, title: next })
}
const navigateAfterSessionRemoval = (sessionID: string, parentID?: string, nextSessionID?: string) => {
if (params.id !== sessionID) return
const href = (id: string) =>
params.serverKey ? sessionHref(requireServerKey(params.serverKey), id) : legacySessionHref(sdk().directory, id)
if (parentID) {
navigate(href(parentID))
return
}
if (nextSessionID) {
navigate(href(nextSessionID))
return
}
if (params.serverKey) {
tabs.newDraft({ server: requireServerKey(params.serverKey), directory: sdk().directory })
return
}
navigate(`/${params.dir}/session`)
}
const exportSession = async (sessionID: string) => {
try {
const data = await fetchSessionExport({
@@ -832,36 +814,6 @@ export function MessageTimeline(props: {
}
}
const archiveSession = async (sessionID: string) => {
const session = sync().session.get(sessionID)
if (!session) return
if ((await sdk().protocol) !== "v1") return
const sessions = sync().data.session ?? []
const index = sessions.findIndex((s) => s.id === sessionID)
const nextSession = index === -1 ? undefined : (sessions[index + 1] ?? sessions[index - 1])
await sdk()
.client.session.update({ sessionID, directory: sdk().directory, time: { archived: Date.now() } })
.then(() => {
sync().set(
produce((draft) => {
const index = draft.session.findIndex((s) => s.id === sessionID)
if (index !== -1) draft.session.splice(index, 1)
}),
)
sync().session.evict(sessionID)
navigateAfterSessionRemoval(sessionID, session.parentID, nextSession?.id)
notifySessionTabsRemoved({ directory: sdk().directory, sessionIDs: [sessionID] })
})
.catch((err) => {
showToast({
title: language.t("common.requestFailed"),
description: errorMessage(err),
})
})
}
const deleteSession = async (sessionID: string) => {
const session = sync().session.get(sessionID)
if (!session) return false
@@ -911,7 +863,7 @@ export function MessageTimeline(props: {
}
}
navigateAfterSessionRemoval(sessionID, session.parentID, nextSession?.id)
sessionArchive.navigateAfterRemoval(sessionID, session.parentID, nextSession?.id)
sync().set(
produce((draft) => {
@@ -1496,6 +1448,7 @@ export function MessageTimeline(props: {
onInput={(event) => setTitle("draft", event.currentTarget.value)}
onKeyDown={(event) => {
event.stopPropagation()
if (event.isComposing || event.keyCode === 229) return
if (event.key === "Enter") {
event.preventDefault()
void saveTitleEditor()
@@ -1506,7 +1459,7 @@ export function MessageTimeline(props: {
closeTitleEditor()
}
}}
onBlur={closeTitleEditor}
onBlur={saveTitleEditor}
/>
</Show>
</Show>
@@ -1593,7 +1546,7 @@ export function MessageTimeline(props: {
<DropdownMenu.Item onSelect={() => exportSession(id)}>
<DropdownMenu.ItemLabel>{language.t("common.export")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item>
<DropdownMenu.Item onSelect={() => void archiveSession(id)}>
<DropdownMenu.Item onSelect={() => void sessionArchive.archive(id)}>
<DropdownMenu.ItemLabel>{language.t("common.archive")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item>
<DropdownMenu.Separator />
@@ -1667,7 +1620,7 @@ export function MessageTimeline(props: {
<MenuV2.Item onSelect={() => exportSession(id)}>
{language.t("common.export")}...
</MenuV2.Item>
<MenuV2.Item onSelect={() => void archiveSession(id)}>
<MenuV2.Item onSelect={() => void sessionArchive.archive(id)}>
{language.t("common.archive")}
</MenuV2.Item>
<MenuV2.Separator />
@@ -18,6 +18,7 @@ import { createSessionTabs } from "@/pages/session/helpers"
import { extractPromptFromParts } from "@/utils/prompt"
import { Message, Part, UserMessage } from "@opencode-ai/sdk/v2"
import { useSessionLayout } from "@/pages/session/session-layout"
import { useSessionArchive } from "@/pages/session/session-archive"
import { createSessionOwnership } from "./session-ownership"
import { useLocal } from "@/context/local"
@@ -52,6 +53,7 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
const navigate = useNavigate()
const { params, sessionKey, tabs, view } = useSessionLayout()
const sessionOwnership = createSessionOwnership(sessionKey)
const sessionArchive = useSessionArchive()
const openDialog = async <T,>(load: () => Promise<T>, show: (value: T) => void) => {
const owner = sessionOwnership.capture()
const value = await load()
@@ -497,6 +499,16 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
disabled: !params.id,
onSelect: exportSession,
}),
sessionCommand({
id: "session.archive",
title: language.t("command.session.archive"),
keybind: "mod+shift+backspace",
disabled: !params.id,
onSelect: () => {
const id = params.id
if (id) void sessionArchive.archive(id)
},
}),
]
const fileCmds = () => {
@@ -1,5 +1,5 @@
import { createMemo, createSignal, createUniqueId, Show } from "solid-js"
import { createQuery } from "@tanstack/solid-query"
import { createQuery, keepPreviousData } from "@tanstack/solid-query"
import { Icon } from "@opencode-ai/ui/icon"
import { SessionFilePanelV2, SessionFilePanelV2Empty } from "@opencode-ai/session-ui/v2/session-file-panel-v2"
import { SessionReviewV2Sidebar } from "@opencode-ai/session-ui/v2/session-review-v2"
@@ -50,6 +50,7 @@ export function SessionFileBrowserTab(props: {
queryKey: ["session-open-file", workspaceKey(), value] as const,
enabled: value.length > 0,
queryFn: ({ signal }) => file.searchFiles(value, { limit: 200, signal }),
placeholderData: keepPreviousData,
}
})
const files = createMemo(() => {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/cli",
"version": "1.18.18",
"version": "1.18.35",
"type": "module",
"license": "MIT",
"bin": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/codemode",
"version": "1.18.18",
"version": "1.18.35",
"description": "Effect-native confined code execution over schema-described tools",
"private": true,
"type": "module",
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
"version": "1.18.18",
"version": "1.18.35",
"type": "module",
"license": "MIT",
"scripts": {
@@ -29,6 +29,7 @@
"@upstash/redis": "1.38.0",
"chart.js": "4.5.1",
"nitro": "3.0.1-alpha.1",
"number-flow": "0.6.2",
"solid-js": "catalog:",
"solid-list": "0.3.0",
"solid-stripe": "0.8.1",
@@ -1,6 +0,0 @@
<svg width="54" height="30" viewBox="0 0 54 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 30H0V0H24V6H6V24H18V18H12V12H24V30Z" fill="#F1ECEC"/>
<path d="M12 18H18V24H6V12H12V18Z" fill="#4B4646"/>
<path d="M48 12V24H36V12H48Z" fill="#4B4646"/>
<path d="M54 30H30V0H54V30ZM36 24H48V6H36V24Z" fill="#F1ECEC"/>
</svg>

Before

Width:  |  Height:  |  Size: 333 B

@@ -1,6 +0,0 @@
<svg width="54" height="30" viewBox="0 0 54 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 30H0V0H24V6H6V24H18V18H12V12H24V30Z" fill="#211E1E"/>
<path d="M12 18H18V24H6V12H12V18Z" fill="#CFCECD"/>
<path d="M48 12V24H36V12H48Z" fill="#CFCECD"/>
<path d="M54 30H30V0H54V30ZM36 24H48V6H36V24Z" fill="#211E1E"/>
</svg>

Before

Width:  |  Height:  |  Size: 333 B

@@ -0,0 +1,108 @@
// Requests are per 5 hours; allowances are monthly usage at official API prices.
export const goModels = [
{ id: "kimi-k3", name: "Kimi K3", requests: 110, allowance: 15, featured: true },
{ id: "qwen3.8-max", name: "Qwen3.8 Max", requests: 160, allowance: 15 },
{ id: "grok-4.7", name: "Grok 4.7", requests: 169, allowance: 15 },
{ id: "grok-4.6", name: "Grok 4.6", requests: 169, allowance: 15 },
{ id: "glm-5.3", name: "GLM-5.3", requests: 220, allowance: 15 },
{ id: "glm-5.2", name: "GLM-5.2", requests: 880, allowance: 60 },
{ id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", requests: 1050, allowance: 15 },
{ id: "kimi-k2.7-code", name: "Kimi K2.7 Code", requests: 1350, allowance: 60, featured: true },
{ id: "hy4-preview", name: "Hy4 preview", requests: 1350, allowance: 30 },
{ id: "gpt-5.6-luna", name: "GPT 5.6 Luna", requests: 2050, allowance: 15 },
{ id: "space-bunny", name: "Space Bunny", requests: 3130, allowance: 30, featured: true, fresh: true },
{ id: "minimax-m3", name: "MiniMax M3", requests: 3200, allowance: 60, featured: true },
{ id: "mimo-v2.6-pro", name: "MiMo-V2.6-Pro", requests: 3250, allowance: 15, fresh: true },
{ id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", requests: 3250, allowance: 15 },
{ id: "minimax-m2.7", name: "MiniMax M2.7", requests: 3400, allowance: 60 },
{ id: "claude-haiku-5-5", name: "Claude Haiku 5.5", requests: 3850, allowance: 15, featured: true, fresh: true },
{ id: "deepseek-v4-flash-vision-exp", name: "DeepSeek V4 Flash Vision Exp", requests: 6500, allowance: 15 },
{ id: "qwen3.7-plus", name: "Qwen3.7 Plus", requests: 4300, allowance: 60, featured: true },
{ id: "gpt-6-luna", name: "GPT 6 Luna", requests: 4230, allowance: 15, featured: true, fresh: true },
{ id: "hy3", name: "Hy3", requests: 4300, allowance: 60 },
{ id: "qwen3.8-flash", name: "Qwen3.8 Flash", requests: 5400, allowance: 30 },
{ id: "glm-5.3-flash", name: "GLM-5.3-Flash", requests: 6320, allowance: 60, featured: true },
{
id: "deepseek-flash",
name: "DeepSeek V4.1 Flash",
requests: 26000,
allowance: 60,
featured: true,
fresh: true,
},
{ id: "longcat-2.0", name: "LongCat-2.0", requests: 11400, allowance: 60 },
{ id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", requests: 13000, allowance: 30 },
{
id: "mimo-v2.6-flash",
name: "MiMo-V2.6-Flash",
requests: 30100,
allowance: 60,
featured: true,
fresh: true,
},
{ id: "mimo-v2.5", name: "MiMo-V2.5", requests: 30100, allowance: 60 },
{
id: "muse-spark-1.3-contributor",
name: "Muse Spark 1.3 Contributor",
requests: 45300,
allowance: 60,
featured: true,
regions: true,
},
{
id: "muse-spark-1.2-contributor",
name: "Muse Spark 1.2 Contributor",
requests: 45300,
allowance: 60,
regions: true,
},
{
id: "longcat-2.5-preview-free",
name: "LongCat 2.5 Preview Free",
requests: Infinity,
allowance: Infinity,
featured: true,
fresh: true,
limitedTime: true,
},
].sort((a, b) => a.requests - b.requests)
// Go Plus limits are published per model in the Console, not a fixed multiplier of Go.
const plusLimits: Record<string, [number, number]> = {
"kimi-k3": [440, 60],
"qwen3.8-max": [640, 60],
"grok-4.7": [676, 60],
"grok-4.6": [676, 60],
"glm-5.3": [1760, 120],
"glm-5.2": [2640, 180],
"deepseek-v4-pro": [4200, 60],
"kimi-k2.7-code": [4050, 180],
"hy4-preview": [5400, 120],
"gpt-5.6-luna": [8200, 60],
"space-bunny": [12500, 120],
"minimax-m3": [9600, 180],
"mimo-v2.6-pro": [13000, 60],
"mimo-v2.5-pro": [13000, 60],
"minimax-m2.7": [13600, 240],
"deepseek-v4-flash-vision-exp": [26000, 60],
"qwen3.7-plus": [12900, 180],
"gpt-6-luna": [16920, 60],
"claude-haiku-5-5": [15380, 60],
hy3: [17200, 240],
"qwen3.8-flash": [16200, 90],
"glm-5.3-flash": [18960, 180],
"deepseek-flash": [52000, 120],
"longcat-2.0": [45600, 240],
"deepseek-v4-flash": [52000, 120],
"mimo-v2.6-flash": [60200, 120],
"mimo-v2.5": [60200, 120],
"muse-spark-1.3-contributor": [90600, 120],
"muse-spark-1.2-contributor": [90600, 120],
"longcat-2.5-preview-free": [Infinity, Infinity],
}
export const goPlanModels = goModels.map((model) => ({
...model,
plusRequests: plusLimits[model.id]![0],
plusAllowance: plusLimits[model.id]![1],
}))
@@ -0,0 +1,346 @@
@import "@opencode-ai/ui/v2/styles/colors.css";
[data-page="go"] {
--go-console-bg: var(--v2-grey-50);
--go-console-surface: var(--v2-grey-100);
--go-console-track: var(--v2-grey-200);
--go-console-text: var(--v2-grey-1100);
--go-console-secondary: var(--v2-grey-700);
--go-console-muted: var(--v2-grey-600);
--go-console-border: var(--v2-alpha-dark-8);
--go-console-icon: var(--v2-grey-600);
@media (prefers-color-scheme: dark) {
--go-console-bg: var(--v2-grey-1000);
--go-console-surface: var(--v2-grey-900);
--go-console-track: var(--v2-grey-800);
--go-console-text: var(--v2-grey-200);
--go-console-secondary: var(--v2-grey-500);
--go-console-muted: var(--v2-grey-600);
--go-console-border: var(--v2-alpha-light-8);
--go-console-icon: var(--v2-grey-600);
}
}
[data-component="go-plan-chart"] {
margin: 0;
padding: 2rem var(--padding) 3rem;
background: var(--go-console-bg);
color: var(--go-console-text);
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 440;
line-height: 1.25rem;
letter-spacing: -0.04px;
text-rendering: geometricPrecision;
font-variant-numeric: tabular-nums;
-webkit-font-smoothing: antialiased;
[data-slot="heading"] {
display: flex;
align-items: end;
justify-content: space-between;
gap: 1rem;
margin-bottom: 0.75rem;
}
h2 {
font-size: 0.9375rem;
font-weight: 530;
line-height: 1.25rem;
margin-bottom: 0.25rem;
}
[data-slot="heading"] p {
color: var(--go-console-muted);
line-height: 1.25rem;
}
[data-slot="legend"] {
display: flex;
align-items: center;
gap: 1rem;
margin: 0;
padding: 0 0 0.375rem;
list-style: none;
color: var(--go-console-secondary);
font-weight: 530;
white-space: nowrap;
}
[data-slot="legend"] li {
display: flex;
align-items: center;
gap: 0.5rem;
}
[data-slot="legend"] i {
width: 3px;
height: 12px;
border-radius: 1px;
}
[data-tier="go"] {
background: linear-gradient(var(--v2-yellow-500), var(--v2-yellow-600));
}
[data-tier="plus"] {
background: linear-gradient(var(--v2-orange-500), var(--v2-orange-600));
}
button {
display: flex;
align-items: center;
gap: 0.5rem;
background: none;
border: 0;
color: inherit;
font: inherit;
font-weight: 530;
padding: 0.375rem 0.5rem;
cursor: pointer;
white-space: nowrap;
}
[data-slot="expand"][aria-expanded="true"] svg {
transform: rotate(180deg);
}
[data-slot="scroll"] {
overflow-x: auto;
}
table {
width: 100%;
min-width: 48rem;
table-layout: fixed;
border-spacing: 0;
font-size: 0.8125rem;
}
thead {
color: var(--go-console-secondary);
}
thead tr {
background: var(--go-console-surface);
}
thead th {
padding: 0.5rem 1rem;
border-block: 1px solid var(--go-console-border);
font-weight: 440;
text-align: end;
white-space: nowrap;
}
thead th:first-child {
text-align: start;
border-inline-start: 1px solid var(--go-console-border);
border-start-start-radius: 6px;
border-end-start-radius: 6px;
}
thead th:last-child {
border-inline-end: 1px solid var(--go-console-border);
border-start-end-radius: 6px;
border-end-end-radius: 6px;
}
tbody tr > * {
transition: background-color 120ms ease;
}
tbody tr:hover > * {
background: var(--go-console-surface);
}
tbody tr > :first-child {
border-start-start-radius: 6px;
border-end-start-radius: 6px;
}
tbody tr > :last-child {
border-start-end-radius: 6px;
border-end-end-radius: 6px;
}
tbody th {
padding: 0.5rem 1rem;
text-align: start;
font-weight: 400;
color: var(--go-console-text);
}
[data-slot="labels"] {
display: flex;
flex-wrap: wrap;
gap: 0.25rem;
margin-top: 0.25rem;
}
[data-slot="labels"] :is(small, a) {
border: 1px solid var(--go-console-border);
padding: 0 0.25rem;
font-size: 0.625rem;
line-height: 1rem;
}
[data-slot="labels"] a {
color: inherit;
text-decoration: none;
transition:
background-color 180ms ease,
border-color 180ms ease;
}
[data-slot="labels"] a:hover {
background: var(--go-console-track);
border-color: var(--go-console-track);
}
[data-slot="bars"] {
position: relative;
}
[data-slot="gridline"] {
position: absolute;
inset-block: 0;
border-inline-start: 1px dashed var(--go-console-border);
}
[data-slot="track"] {
position: relative;
display: grid;
grid-template-rows: 0.5rem 0.5rem;
row-gap: 0.5rem;
margin: 0.5rem 0;
}
[data-slot="lane"] {
display: flex;
gap: 0.25rem;
}
[data-slot="lane"] > [data-tier] {
border-radius: 2px;
}
[data-slot="remainder"] {
flex: 1;
border-radius: 2px;
background: var(--go-console-track);
}
[data-slot="number"] {
padding: 0.5rem 1rem;
text-align: end;
white-space: nowrap;
}
:is(thead th, [data-slot="number"]):last-child {
padding-inline-start: 0.5rem;
}
[data-slot="number"] span {
display: block;
/* 13px digits are ~9.5px tall, so this leaves the same ~8px visual gap as the bars. */
line-height: 1.1rem;
}
[data-slot="axis"] {
position: relative;
height: 2rem;
color: var(--go-console-muted);
font-size: 0.6875rem;
}
[data-slot="axis"] span {
position: absolute;
top: 0.25rem;
transform: translateX(-50%);
}
&:dir(rtl) [data-slot="axis"] span {
transform: translateX(50%);
}
figcaption {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-top: 0.75rem;
border-top: 1px solid var(--go-console-border);
padding-top: 0.75rem;
}
[data-slot="expand"] {
padding-inline: 0;
}
figcaption a {
color: var(--go-console-secondary);
}
:is(button, a):focus-visible {
outline: 2px solid currentColor;
outline-offset: 3px;
}
@media (max-width: 55rem) {
[data-slot="heading"] {
align-items: start;
flex-direction: column;
}
}
/* Phones stack each model name above its bar so the table fits without horizontal scrolling. */
@media (max-width: 40rem) {
/* Rows share the table's columns through subgrid, so number columns size to their unwrapped headers. */
table {
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto;
min-width: 0;
}
thead,
tbody,
tfoot {
display: contents;
}
colgroup,
tfoot td:not([data-slot="axis"]) {
display: none;
}
tr {
display: grid;
grid-column: 1 / -1;
grid-template-columns: subgrid;
align-items: center;
}
thead tr {
border: 1px solid var(--go-console-border);
border-radius: 6px;
}
thead th,
thead th:is(:first-child, :last-child) {
border: 0;
padding-inline: 0.375rem;
font-size: 0.75rem;
}
/* The bars are too narrow to label 100 and 1K apart from 10K. */
[data-slot="gridline"],
[data-slot="axis"] span:not(:last-child) {
display: none;
}
thead th:first-child {
padding-inline-start: 1rem;
}
thead th:last-child,
[data-slot="number"]:last-child {
padding-inline-end: 1rem;
}
tbody th {
grid-column: 1 / -1;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.25rem 0.5rem;
padding-block-end: 0;
}
[data-slot="labels"] {
margin-top: 0;
}
/* Bars extend under the requests column's spare header width, stopping short of the right-aligned numbers. */
[data-slot="bars"],
[data-slot="axis"] {
grid-column: 1 / 3;
margin-inline: 1rem 4rem;
}
[data-slot="bars"] {
grid-row: 2;
}
[data-slot="bars"] + [data-slot="number"] {
grid-row: 2;
grid-column: 2;
}
[data-slot="number"]:last-child {
grid-row: 2;
grid-column: 3;
}
[data-slot="number"] {
padding-inline: 0.375rem;
}
/* Rows are grids here, so highlight the row itself instead of each cell. */
tbody tr {
padding-block: 0.375rem;
border-radius: 6px;
transition: background-color 120ms ease;
}
tbody tr:hover {
background: var(--go-console-surface);
}
tbody tr > *,
tbody tr:hover > * {
border-radius: 0;
background: none;
}
}
}
@@ -0,0 +1,161 @@
import "./go-plan-chart.css"
import { createMemo, createSignal, createUniqueId, For, Show } from "solid-js"
import { useI18n } from "~/context/i18n"
import { useLanguage } from "~/context/language"
import { goPlanModels } from "./go-models"
const ticks = [100, 1000, 10000]
const max = Math.max(...goPlanModels.map((model) => model.plusRequests).filter(Number.isFinite))
export function GoPlanChart(props: { href: string }) {
const i18n = useI18n()
const language = useLanguage()
const id = createUniqueId()
const [expanded, setExpanded] = createSignal(false)
const models = createMemo(() => goPlanModels.filter((model) => expanded() || model.featured))
const position = (requests: number) =>
Number.isFinite(requests)
? 4 + Math.pow(Math.log10(Math.max(requests / 100, 1)) / Math.log10(max / 100), 2.2) * 78
: 100
const format = createMemo(() => new Intl.NumberFormat(language.tag(language.locale())))
const currency = createMemo(
() =>
new Intl.NumberFormat(language.tag(language.locale()), {
style: "currency",
currency: "USD",
currencyDisplay: "narrowSymbol",
maximumFractionDigits: 0,
}),
)
return (
<figure data-component="go-plan-chart" dir={language.dir(language.locale())} aria-labelledby={`${id}-title`}>
<div data-slot="heading">
<div>
<h2 id={`${id}-title`}>{i18n.t("go.plans.limits")}</h2>
<p>{i18n.t("go.plans.description")}</p>
</div>
<ul data-slot="legend" aria-label={i18n.t("go.plans.legend")}>
<li>
<i data-tier="go" />
Go
</li>
<li>
<i data-tier="plus" />
Go Plus
</li>
</ul>
</div>
<div data-slot="scroll">
<table id={id}>
<colgroup>
<col style={{ width: "26%" }} />
<col style={{ width: "44%" }} />
<col style={{ width: "16%" }} />
<col style={{ width: "14%" }} />
</colgroup>
<thead>
<tr>
<th scope="col">{i18n.t("go.graph.model")}</th>
<th scope="col" colspan="2">
{i18n.t("go.graph.requests")}
</th>
<th scope="col">{i18n.t("go.graph.allowance")}</th>
</tr>
</thead>
<tbody>
<For each={models()}>
{(model) => (
<tr>
<th scope="row">
<bdi>{model.name}</bdi>
<Show when={model.fresh || model.limitedTime || model.regions}>
<span data-slot="labels">
<Show when={model.fresh}>
<small>{i18n.t("go.graph.new")}</small>
</Show>
<Show when={model.limitedTime}>
<small>{i18n.t("go.graph.limitedTime")}</small>
</Show>
<Show when={model.regions}>
<a href="https://ai.developer.meta.com/legal/geographic-use-policy">
{i18n.t("go.graph.limitedRegions")}
</a>
</Show>
</span>
</Show>
</th>
<td data-slot="bars" aria-hidden="true">
<For each={ticks}>
{(tick) => <span data-slot="gridline" style={{ "inset-inline-start": `${position(tick)}%` }} />}
</For>
<div data-slot="track">
<div data-slot="lane">
{/* The Go bar is a linear fraction of the Plus bar so the multiplier reads true on the log scale. */}
<span
data-tier="go"
style={{
width: `${
Number.isFinite(model.plusRequests)
? (position(model.plusRequests) * model.requests) / model.plusRequests
: position(model.requests)
}%`,
}}
/>
<span data-slot="remainder" />
</div>
<div data-slot="lane">
<span data-tier="plus" style={{ width: `${position(model.plusRequests)}%` }} />
<span data-slot="remainder" />
</div>
</div>
</td>
<td data-slot="number">
<span>{format().format(model.requests)}</span>
<span>{format().format(model.plusRequests)}</span>
</td>
<td data-slot="number">
<span>{Number.isFinite(model.allowance) ? currency().format(model.allowance) : "∞"}</span>
<span>{Number.isFinite(model.plusAllowance) ? currency().format(model.plusAllowance) : "∞"}</span>
</td>
</tr>
)}
</For>
</tbody>
<tfoot aria-hidden="true">
<tr>
<td />
<td data-slot="axis">
<For each={ticks}>
{(tick) => (
<span style={{ "inset-inline-start": `${position(tick)}%` }}>
{tick < 1000 ? format().format(tick) : `${tick / 1000}K`}
</span>
)}
</For>
</td>
<td colspan="2" />
</tr>
</tfoot>
</table>
</div>
<figcaption>
<button
type="button"
data-slot="expand"
aria-expanded={expanded()}
aria-controls={id}
onClick={() => setExpanded(!expanded())}
>
{expanded()
? i18n.t("go.graph.showLess")
: i18n.t("go.graph.showAll", { count: format().format(goPlanModels.length) })}
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="m4 6 4 4 4-4" stroke="currentColor" stroke-width="1.25" />
</svg>
</button>
<a href={props.href}>{i18n.t("go.graph.usageLimits")}</a>
</figcaption>
</figure>
)
}
+54 -11
View File
@@ -14,7 +14,7 @@ import copyLogoSvgDark from "../asset/lander/opencode-logo-dark.svg"
import copyWordmarkSvgLight from "../asset/lander/opencode-wordmark-light.svg"
import copyWordmarkSvgDark from "../asset/lander/opencode-wordmark-dark.svg"
import { A, useNavigate } from "@solidjs/router"
import { createMemo, Match, Show, Switch } from "solid-js"
import { Match, Show, Switch } from "solid-js"
import { createStore } from "solid-js/store"
import { createEffect, onCleanup } from "solid-js"
import { config } from "~/config"
@@ -143,24 +143,46 @@ export function Header(props: { zen?: boolean; go?: boolean; hideGetStarted?: bo
<nav data-component="nav-desktop">
<ul>
<li>
<a href={config.github.repoUrl} target="_blank" style="white-space: nowrap;">
<a href={`${config.github.repoUrl}/tree/v2`} target="_blank" style="white-space: nowrap;">
{i18n.t("nav.github")}
</a>
</li>
<li>
<a href={language.route("/docs")}>{i18n.t("nav.docs")}</a>
<a href="/v2/docs">{i18n.t("nav.docs")}</a>
</li>
<li>
<a href={language.route("/data")}>{i18n.t("nav.data")}</a>
</li>
<li>
<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>
{/* Console links use a full page load into its separate application. */}
<Show
when={config.consoleMarketingEnabled}
fallback={<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>}
>
<a href="/console/models" target="_self">
{i18n.t("nav.models")}
</a>
</Show>
</li>
<li>
<A href={language.route("/go")}>{i18n.t("nav.go")}</A>
<Show
when={config.consoleMarketingEnabled}
fallback={<A href={language.route("/go")}>{i18n.t("nav.go")}</A>}
>
<a href="/console/go" target="_self">
{i18n.t("nav.go")}
</a>
</Show>
</li>
<li>
<A href={language.route("/enterprise")}>{i18n.t("nav.enterprise")}</A>
<Show
when={config.consoleMarketingEnabled}
fallback={<A href={language.route("/enterprise")}>{i18n.t("nav.enterprise")}</A>}
>
<a href="/console/teams" target="_self">
{i18n.t("nav.teams")}
</a>
</Show>
</li>
<Show when={props.zen || props.go}>
<li>
@@ -243,28 +265,49 @@ export function Header(props: { zen?: boolean; go?: boolean; hideGetStarted?: bo
<A href={language.route("/")}>{i18n.t("nav.home")}</A>
</li>
<li>
<a href={config.github.repoUrl} target="_blank" style="white-space: nowrap;">
<a href={`${config.github.repoUrl}/tree/v2`} target="_blank" style="white-space: nowrap;">
{i18n.t("nav.github")}
</a>
</li>
<li>
<a href={language.route("/docs")}>{i18n.t("nav.docs")}</a>
<a href="/v2/docs">{i18n.t("nav.docs")}</a>
</li>
<li>
<a href={language.route("/data")}>{i18n.t("nav.data")}</a>
</li>
<Show when={!props.zen}>
<li>
<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>
<Show
when={config.consoleMarketingEnabled}
fallback={<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>}
>
<a href="/console/models" target="_self">
{i18n.t("nav.models")}
</a>
</Show>
</li>
</Show>
<Show when={!props.go}>
<li>
<A href={language.route("/go")}>{i18n.t("nav.go")}</A>
<Show
when={config.consoleMarketingEnabled}
fallback={<A href={language.route("/go")}>{i18n.t("nav.go")}</A>}
>
<a href="/console/go" target="_self">
{i18n.t("nav.go")}
</a>
</Show>
</li>
</Show>
<li>
<A href={language.route("/enterprise")}>{i18n.t("nav.enterprise")}</A>
<Show
when={config.consoleMarketingEnabled}
fallback={<A href={language.route("/enterprise")}>{i18n.t("nav.enterprise")}</A>}
>
<a href="/console/teams" target="_self">
{i18n.t("nav.teams")}
</a>
</Show>
</li>
<Show when={props.zen || props.go}>
<li>
+15 -10
View File
@@ -141,13 +141,9 @@ export function IconAnthropic(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
export function IconXai(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
<path
d="M9.16861 16.0529L17.2018 9.85156C17.5957 9.54755 18.1586 9.66612 18.3463 10.1384C19.3339 12.6288 18.8926 15.6217 16.9276 17.6766C14.9626 19.7314 12.2285 20.1821 9.72948 19.1557L6.9995 20.4775C10.9151 23.2763 15.6699 22.5841 18.6411 19.4749C20.9979 17.0103 21.7278 13.6508 21.0453 10.6214L21.0515 10.6278C20.0617 6.17736 21.2948 4.39847 23.8207 0.760904C23.8804 0.674655 23.9402 0.588405 24 0.5L20.6762 3.97585V3.96506L9.16658 16.0551"
fill="currentColor"
/>
<path
d="M7.37742 16.7017C4.67579 14.0395 5.14158 9.91963 7.44676 7.54383C9.15135 5.78544 11.9442 5.06779 14.3821 6.12281L17.0005 4.87559C16.5288 4.52392 15.9242 4.14566 15.2305 3.87986C12.0948 2.54882 8.34069 3.21127 5.79171 5.8386C3.33985 8.36779 2.56881 12.2567 3.89286 15.5751C4.88192 18.0552 3.26056 19.8094 1.62731 21.5801C1.04853 22.2078 0.467774 22.8355 0 23.5L7.3754 16.7037"
d="M9.3753 11.9829L20.3313 27.5H15.4615L4.50546 11.9829H9.3753ZM9.3709 20.6011L11.8069 24.0527L9.37306 27.5H4.5L9.3709 20.6011ZM26.3182 5.22582V27.5H22.3266V10.8789L26.3182 5.22582ZM26.3182 3.5L15.4615 18.8764L13.0255 15.4258L21.4451 3.5H26.3182Z"
fill="currentColor"
/>
</svg>
@@ -156,12 +152,10 @@ export function IconXai(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
export function IconAlibaba(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22" fill="none">
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M30 18.3491C26.7333 20.113 23.4433 21.7277 19.7813 22.4603C18.9646 22.6225 18.0593 22.6225 17.2298 22.5105C16.4388 22.4113 16.0433 21.7148 16.3244 20.9822C16.5928 20.2997 16.9498 19.6044 17.4094 19.0327C18.4034 17.7902 19.5258 16.6597 20.5338 15.4301C21.1493 14.6765 21.704 13.8752 22.1927 13.0338C22.5497 12.4376 22.384 11.7166 21.7587 11.4191C20.7123 10.9093 19.5899 10.55 18.4804 10.165C18.3521 10.1148 18.1608 10.2513 17.9064 10.3388C18.2249 10.6235 18.4548 10.8347 18.7733 11.1204C15.4821 11.6804 12.3683 12.4738 9.34668 13.5681C9.33268 13.6299 9.30818 13.6789 9.31985 13.7046C9.76668 14.3871 9.56251 14.9086 8.91151 15.3309C8.65881 15.4963 8.43489 15.702 8.24885 15.9399C10.2392 16.5232 12.0125 16.1884 13.7088 15.0824C13.6073 14.9342 13.5046 14.7977 13.4031 14.6484C14.0401 14.7604 14.4228 15.1081 14.4741 15.6541C14.4869 15.7789 14.4111 15.9026 14.3726 16.0274C14.2828 15.9271 14.1684 15.8291 14.0926 15.7159C14.0401 15.6412 14.0273 15.5549 13.9899 15.4301C11.974 16.7717 9.80518 17.1077 7.41936 16.4124C7.41936 16.8837 7.39369 17.2816 7.43219 17.6666C7.45786 18.0014 7.31786 18.1507 7.01219 18.3246C6.3227 18.7469 5.60754 19.1821 5.03354 19.7409C4.34522 20.4233 4.60072 21.2563 5.53171 21.604C6.58987 22.0007 7.70052 22.0123 8.81001 21.877C10.1237 21.7148 11.4117 21.5037 12.8419 21.3053C11.1702 22.087 9.52401 22.6353 7.79035 22.857C6.57703 23.0203 5.36604 23.1067 4.16672 22.759C2.44473 22.2748 1.67824 21.0078 2.12508 19.3057C2.54623 17.7156 3.56706 16.4486 4.66372 15.2807C8.32585 11.3934 12.9563 9.4195 18.3136 9.02167C19.5643 8.93533 20.8278 9.09633 22.0002 9.61783C23.6463 10.3633 24.3358 11.9394 23.532 13.5308C23.0093 14.5866 22.2813 15.5549 21.5545 16.5116C20.8406 17.4554 20.0368 18.3246 19.2843 19.2311C19.0673 19.5041 18.8631 19.7911 18.6974 20.1002C18.3778 20.6835 18.5948 21.0685 19.2714 21.0078C20.6866 20.8702 22.1297 20.7593 23.4947 20.4117C25.4967 19.9018 27.4485 19.1821 29.426 18.5486C29.6302 18.4984 29.8215 18.4237 30 18.3502V18.3491Z"
fill="currentColor"
d="M11.6043 0.340162C11.9973 1.03016 12.3883 1.72215 12.7783 2.41514C12.7941 2.44286 12.8169 2.46589 12.8445 2.48187C12.8721 2.49786 12.9034 2.50624 12.9353 2.50614H18.4873C18.6612 2.50614 18.8092 2.61614 18.9332 2.83314L20.3872 5.40311C20.5772 5.74011 20.6272 5.88111 20.4112 6.24011C20.1512 6.6701 19.8982 7.1041 19.6512 7.54009L19.2842 8.19809C19.1782 8.39409 19.0612 8.47809 19.2442 8.71008L21.8962 13.347C22.0682 13.648 22.0072 13.841 21.8532 14.117C21.4162 14.902 20.9712 15.681 20.5182 16.457C20.3592 16.729 20.1662 16.832 19.8382 16.827C19.0612 16.811 18.2863 16.817 17.5113 16.843C17.4946 16.8439 17.4785 16.8489 17.4644 16.8576C17.4502 16.8664 17.4385 16.8785 17.4303 16.893C16.5361 18.4773 15.6344 20.0573 14.7253 21.633C14.5563 21.926 14.3453 21.996 14.0003 21.997C13.0033 22 11.9983 22.001 10.9833 21.999C10.8889 21.9987 10.7961 21.9735 10.7145 21.9259C10.6328 21.8783 10.5652 21.8101 10.5184 21.728L9.18337 19.405C9.1756 19.3898 9.16368 19.3771 9.14898 19.3684C9.13429 19.3598 9.11743 19.3554 9.10037 19.356H3.98244C3.69744 19.386 3.42944 19.355 3.17745 19.264L1.57447 16.494C1.52706 16.412 1.50193 16.319 1.50158 16.2243C1.50123 16.1296 1.52567 16.0364 1.57247 15.954L2.77945 13.834C2.79665 13.8041 2.80569 13.7701 2.80569 13.7355C2.80569 13.701 2.79665 13.667 2.77945 13.637C2.15073 12.5485 1.52573 11.4579 0.904476 10.3651L0.114486 8.97008C-0.0455115 8.66008 -0.0585113 8.47409 0.209485 8.00509C0.674479 7.1921 1.13647 6.38011 1.59647 5.56911C1.72847 5.33512 1.90046 5.23512 2.18046 5.23412C3.04344 5.23048 3.90644 5.23015 4.76943 5.23312C4.79123 5.23295 4.81259 5.22704 4.83138 5.21597C4.85016 5.20491 4.8657 5.1891 4.87643 5.17012L7.68239 0.275163C7.72491 0.200697 7.78631 0.138751 7.86039 0.0955646C7.93448 0.0523783 8.01863 0.0294762 8.10439 0.0291651C8.62838 0.0281651 9.15737 0.029165 9.68736 0.0231651L10.7044 0.000165317C11.0453 -0.00283466 11.4283 0.032165 11.6043 0.340162ZM8.17238 0.743158C8.16185 0.743152 8.15149 0.745921 8.14236 0.751187C8.13323 0.756454 8.12565 0.764031 8.12038 0.773158L5.25442 5.78811C5.24066 5.81174 5.22097 5.83137 5.19729 5.84505C5.17361 5.85873 5.14677 5.86599 5.11942 5.86611H2.25346C2.19746 5.86611 2.18346 5.89111 2.21246 5.94011L8.02239 16.096C8.04739 16.138 8.03539 16.158 7.98839 16.159L5.19342 16.174C5.15256 16.1727 5.11214 16.1828 5.07678 16.2033C5.04141 16.2238 5.01253 16.2539 4.99342 16.29L3.67344 18.6C3.62944 18.678 3.65244 18.718 3.74144 18.718L9.45737 18.726C9.50337 18.726 9.53737 18.746 9.56137 18.787L10.9643 21.241C11.0103 21.322 11.0563 21.323 11.1033 21.241L16.1093 12.481L16.8923 11.0991C16.897 11.0905 16.904 11.0834 16.9125 11.0785C16.9209 11.0735 16.9305 11.0709 16.9403 11.0709C16.9501 11.0709 16.9597 11.0735 16.9681 11.0785C16.9765 11.0834 16.9835 11.0905 16.9883 11.0991L18.4123 13.629C18.4229 13.648 18.4385 13.6637 18.4573 13.6746C18.4761 13.6855 18.4975 13.6912 18.5193 13.691L21.2822 13.671C21.2893 13.6711 21.2963 13.6693 21.3024 13.6658C21.3086 13.6623 21.3137 13.6572 21.3172 13.651C21.3206 13.6449 21.3224 13.638 21.3224 13.631C21.3224 13.624 21.3206 13.6172 21.3172 13.611L18.4173 8.52508C18.4068 8.50809 18.4013 8.48853 18.4013 8.46859C18.4013 8.44864 18.4068 8.42908 18.4173 8.41209L18.7102 7.90509L19.8302 5.92811C19.8542 5.88711 19.8422 5.86611 19.7952 5.86611H8.20038C8.14138 5.86611 8.12738 5.84011 8.15738 5.78911L9.59137 3.28413C9.60211 3.26706 9.60781 3.24731 9.60781 3.22714C9.60781 3.20697 9.60211 3.18721 9.59137 3.17014L8.22538 0.774158C8.22016 0.764697 8.21248 0.756822 8.20315 0.751365C8.19382 0.745909 8.18319 0.743073 8.17238 0.743158ZM14.4623 8.76308C14.5083 8.76308 14.5203 8.78308 14.4963 8.82308L13.6643 10.2881L11.0513 14.873C11.0464 14.8819 11.0392 14.8894 11.0304 14.8945C11.0216 14.8996 11.0115 14.9022 11.0013 14.902C10.9912 14.902 10.9813 14.8993 10.9725 14.8942C10.9637 14.8891 10.9564 14.8818 10.9513 14.873L7.49839 8.84108C7.47839 8.80708 7.48839 8.78908 7.52639 8.78708L7.74239 8.77508L14.4643 8.76308H14.4623Z"
/>
</svg>
)
@@ -196,6 +190,17 @@ export function IconMiniMax(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
)
}
export function IconGoogle(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="currentColor">
<path d="M28.7399 16.296C28.7399 15.3742 28.6571 14.4878 28.5035 13.6369H16.2599V18.6714H23.2563C22.949 20.2905 22.0272 21.6614 20.6445 22.5832V25.8568H24.8635C27.3217 23.5877 28.7399 20.255 28.7399 16.296Z" />
<path d="M16.26 29.0001C19.77 29.0001 22.7127 27.8419 24.8636 25.8565L20.6446 22.5829C19.4864 23.3629 18.0091 23.8356 16.26 23.8356C12.8801 23.8356 10.0083 21.5547 8.98009 18.482H4.65466V21.8383C6.79374 26.081 11.1783 29.0001 16.26 29.0001Z" />
<path d="M8.98006 18.4701C8.72006 17.6901 8.56643 16.8629 8.56643 16.0002C8.56643 15.1374 8.72006 14.3102 8.98006 13.5302V10.1738H4.65464C3.76828 11.9229 3.2601 13.8965 3.2601 16.0002C3.2601 18.1038 3.76828 20.0774 4.65464 21.8265L8.0228 19.2029L8.98006 18.4701Z" />
<path d="M16.26 8.17639C18.1746 8.17639 19.8764 8.8382 21.2355 10.1146L24.9582 6.39186C22.7009 4.28823 19.77 3.00006 16.26 3.00006C11.1783 3.00006 6.79374 5.91913 4.65466 10.1736L8.98009 13.53C10.0083 10.4573 12.8801 8.17639 16.26 8.17639Z" />
</svg>
)
}
export function IconGemini(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 50 50" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
@@ -0,0 +1,305 @@
[data-component="go-usage"] {
--model-width: 16.5rem;
--request-width: 5.25rem;
--allowance-width: 6.75rem;
--column-gap: 1.5rem;
--bar-origin: left;
container-type: inline-size;
margin: 0;
padding: 3rem var(--padding) 2.5rem;
font-variant-numeric: tabular-nums;
scroll-margin-top: 6rem;
-webkit-font-smoothing: antialiased;
&:dir(rtl) {
--bar-origin: right;
}
[data-slot="heading"] {
padding-bottom: 1.5rem;
h2 {
color: var(--color-text-strong);
font-size: 1rem;
font-weight: 600;
}
}
s {
display: block;
color: var(--color-text-weak);
font-size: 0.6875rem;
font-weight: 400;
}
[data-slot="columns"],
[data-slot="model-row"] {
display: grid;
grid-template-columns: var(--model-width) minmax(0, 1fr) var(--allowance-width);
align-items: center;
column-gap: var(--column-gap);
}
[data-slot="columns"] {
padding-bottom: 0.875rem;
border-bottom: 1px solid var(--color-border-weak);
font-size: 0.6875rem;
color: var(--color-text);
overflow-wrap: anywhere;
}
[data-slot="requests-heading"],
[data-slot="allowance-heading"] {
text-align: end;
}
[data-slot="rows"] {
padding-top: 0.375rem;
}
[data-slot="model-row"] {
min-height: 2.5rem;
font-size: 0.8125rem;
}
[data-slot="model"] {
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 0.375rem 0.5rem;
min-width: 0;
line-height: 1.5;
color: var(--color-text);
font-weight: 400;
}
[data-slot="badge"] {
color: var(--color-text-strong);
font-size: 0.625rem;
line-height: 1.3;
border: 1px solid var(--color-border);
padding: 0.0625rem 0.25rem;
}
[data-slot="region"] {
display: inline-flex;
align-self: center;
padding: 0.25rem;
color: var(--color-text);
text-decoration: none;
&:hover {
color: var(--color-text-strong);
}
}
[data-slot="usage-value"] {
display: grid;
grid-template-columns: minmax(0, 1fr) var(--request-width);
align-items: center;
gap: var(--column-gap);
align-self: stretch;
}
[data-slot="track"] {
display: flex;
align-items: center;
align-self: stretch;
position: relative;
isolation: isolate;
}
[data-slot="gridline"] {
position: absolute;
inset-block: 0;
inset-inline-start: var(--position);
border-inline-start: 1px dotted var(--color-border-weak);
z-index: -1;
}
[data-slot="bar"] {
width: var(--width);
height: 0.375rem;
background: var(--color-go-2);
transform-origin: var(--bar-origin);
}
&[data-visible] [data-slot="bar"] {
animation: go-usage-reveal 700ms cubic-bezier(0.22, 1, 0.36, 1) both;
animation-delay: var(--delay);
}
[data-slot="requests"] {
text-align: end;
font-weight: 600;
color: var(--color-text-strong);
}
[data-slot="allowance"] {
text-align: end;
color: var(--color-text);
&[data-high] {
color: var(--color-text-strong);
}
}
[data-slot="model-row"][data-infinite] :is([data-slot="requests"], [data-slot="allowance"]) {
font-size: 1.125rem;
line-height: 1;
}
[data-slot="currency"] {
color: var(--color-text-weak);
}
[data-slot="axis"] {
padding-inline-start: calc(var(--model-width) + var(--column-gap));
padding-inline-end: calc(var(--request-width) + var(--allowance-width) + 2 * var(--column-gap));
height: 2.5rem;
}
[data-slot="ticks"] {
position: relative;
height: 100%;
font-size: 0.625rem;
color: var(--color-text-weak);
span {
position: absolute;
inset-inline-start: var(--position);
top: 0.75rem;
transform: translateX(-50%);
&:dir(rtl) {
transform: translateX(50%);
}
}
}
[data-slot="expand"] {
display: flex;
justify-content: center;
align-items: center;
gap: 0.5rem;
min-height: 2.75rem;
padding: 0.75rem 0;
background: none;
border: none;
color: var(--color-text);
font-family: inherit;
font-size: 0.75rem;
cursor: pointer;
&:hover {
color: var(--color-text-strong);
}
&[aria-expanded="true"] svg {
transform: rotate(180deg);
}
}
:is(button, a):focus-visible {
outline: 1px solid var(--color-text-strong);
outline-offset: 4px;
}
figcaption {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
gap: 1rem;
border-top: 1px solid var(--color-border-weak);
font-size: 0.75rem;
color: var(--color-text);
a {
color: inherit;
white-space: nowrap;
}
}
@container (max-width: 48rem) {
[data-slot="columns"],
[data-slot="model-row"],
[data-slot="axis"] {
--model-width: 13rem;
--request-width: 4rem;
--allowance-width: 6rem;
--column-gap: 1rem;
}
}
@container (max-width: 38rem) {
[data-slot="columns"],
[data-slot="model-row"] {
--request-width: 5rem;
--allowance-width: 4.5rem;
--column-gap: 0.75rem;
grid-template-columns: minmax(0, 1fr) var(--request-width) var(--allowance-width);
}
[data-slot="columns"] {
font-size: 0.625rem;
}
[data-slot="model-row"] {
min-height: 4rem;
padding-block: 0.375rem;
row-gap: 0.25rem;
font-size: 1rem;
}
[data-slot="model"] {
grid-column: 1 / -1;
}
[data-slot="usage-value"] {
display: contents;
}
[data-slot="track"] {
grid-column: 1;
grid-row: 2;
align-self: center;
height: 4px;
}
[data-slot="bar"] {
height: 4px;
}
[data-slot="requests"] {
grid-column: 2;
grid-row: 2;
}
[data-slot="allowance"] {
grid-column: 3;
grid-row: 2;
}
[data-slot="gridline"],
[data-slot="axis"] {
display: none;
}
[data-slot="expand"] {
font-size: 0.8125rem;
}
figcaption {
margin-top: 1rem;
}
}
@media (prefers-reduced-motion: reduce) {
&[data-visible] [data-slot="bar"] {
animation: none;
}
}
}
@keyframes go-usage-reveal {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
@@ -0,0 +1,170 @@
import "./limits-graph.css"
import { For, Show, createMemo, createSignal, createUniqueId, onCleanup, onMount } from "solid-js"
import { useI18n } from "~/context/i18n"
import { useLanguage } from "~/context/language"
import { goModels } from "./go-models"
// Compress the request range, with the same domain in both views.
const max = Math.max(...goModels.map((model) => model.requests).filter(Number.isFinite))
const position = (requests: number) =>
Number.isFinite(requests)
? 4 + Math.pow(Math.log10(Math.max(requests / 100, 1)) / Math.log10(max / 100), 2.2) * 78
: 100
const ticks = [100, 1000, 10000, 40000]
export function LimitsGraph(props: { href: string }) {
const i18n = useI18n()
const language = useLanguage()
const id = createUniqueId()
const [expanded, setExpanded] = createSignal(false)
const [visible, setVisible] = createSignal(false)
const models = createMemo(() => goModels.filter((model) => expanded() || model.featured))
const format = createMemo(() => new Intl.NumberFormat(language.tag(language.locale())))
const compact = createMemo(
() => new Intl.NumberFormat(language.tag(language.locale()), { notation: "compact", maximumFractionDigits: 1 }),
)
const currency = createMemo(
() =>
new Intl.NumberFormat(language.tag(language.locale()), {
style: "currency",
currency: "USD",
currencyDisplay: "narrowSymbol",
maximumFractionDigits: 0,
}),
)
let root!: HTMLElement
onMount(() => {
if (!window.IntersectionObserver) return setVisible(true)
const observer = new IntersectionObserver(
(entries) => {
if (!entries.some((entry) => entry.isIntersecting)) return
setVisible(true)
observer.disconnect()
},
{ threshold: 0.1 },
)
observer.observe(root)
onCleanup(() => observer.disconnect())
})
return (
<figure
ref={root}
id="usage"
dir={language.dir(language.locale())}
data-component="go-usage"
data-visible={visible() ? "" : undefined}
aria-labelledby={`${id}-title`}
>
<div data-slot="heading">
<h2 id={`${id}-title`}>{i18n.t("go.graph.period")}</h2>
</div>
<div role="table" aria-labelledby={`${id}-title`} id={`${id}-models`}>
<div role="row" data-slot="columns">
<div role="columnheader" data-slot="model-heading">
{i18n.t("go.graph.model")}
</div>
<div role="columnheader" data-slot="requests-heading">
{i18n.t("go.graph.requests")}
</div>
<div role="columnheader" data-slot="allowance-heading">
{i18n.t("go.graph.allowance")}
</div>
</div>
<div role="rowgroup" data-slot="rows">
<For each={models()}>
{(model, index) => (
<div
role="row"
data-slot="model-row"
data-model={model.id}
data-infinite={!Number.isFinite(model.requests) ? "" : undefined}
style={{ "--delay": `${index() * 30}ms` }}
>
<div role="rowheader" data-slot="model">
<bdi>{model.name}</bdi>
<Show when={model.fresh}>
<span data-slot="badge">{i18n.t("go.graph.new")}</span>
</Show>
<Show when={model.limitedTime}>
<span data-slot="badge">{i18n.t("go.graph.limitedTime")}</span>
</Show>
<Show when={model.regions}>
<a
data-slot="region"
href="https://ai.developer.meta.com/legal/geographic-use-policy"
aria-label={`${model.name}: ${i18n.t("go.graph.limitedRegions")}`}
title={i18n.t("go.graph.limitedRegions")}
>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" aria-hidden="true">
<circle cx="8" cy="8" r="6" stroke="currentColor" />
<ellipse cx="8" cy="8" rx="2.5" ry="6" stroke="currentColor" />
<path d="M2 8h12" stroke="currentColor" />
</svg>
</a>
</Show>
</div>
<div role="cell" data-slot="usage-value">
<div data-slot="track" aria-hidden="true">
<For each={ticks}>
{(tick) => <span data-slot="gridline" style={{ "--position": `${position(tick)}%` }} />}
</For>
<div data-slot="bar" style={{ "--width": `${position(model.requests)}%` }} />
</div>
<div data-slot="requests">
<bdi>{format().format(model.requests)}</bdi>
</div>
</div>
<div role="cell" data-slot="allowance" data-high={model.allowance >= 60 ? "" : undefined}>
<bdi>
<Show when={Number.isFinite(model.allowance)} fallback="∞">
<For each={currency().formatToParts(model.allowance)}>
{(part) => (
<span data-slot={part.type === "currency" ? "currency" : undefined}>{part.value}</span>
)}
</For>
</Show>
</bdi>
</div>
</div>
)}
</For>
</div>
</div>
<div data-slot="axis" aria-hidden="true" title={i18n.t("go.graph.scale")}>
<div data-slot="ticks">
<For each={ticks}>
{(tick) => <span style={{ "--position": `${position(tick)}%` }}>{compact().format(tick)}</span>}
</For>
</div>
</div>
<figcaption>
<button
type="button"
data-slot="expand"
aria-expanded={expanded()}
aria-controls={`${id}-models`}
onClick={() => {
if (expanded()) {
const top = root.getBoundingClientRect().top
if (top < 80) window.scrollTo({ top: window.scrollY + top - 96, behavior: "instant" })
}
setExpanded(!expanded())
}}
>
{expanded()
? i18n.t("go.graph.showLess")
: i18n.t("go.graph.showAll", { count: format().format(goModels.length) })}
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="m4 6 4 4 4-4" stroke="currentColor" stroke-width="1.25" />
</svg>
</button>
<a href={props.href}>{i18n.t("go.graph.usageLimits")}</a>
</figcaption>
</figure>
)
}
@@ -0,0 +1,58 @@
import NumberFlow from "number-flow"
import { continuous } from "number-flow/plugins"
import { createEffect, onCleanup, onMount } from "solid-js"
export function RollingNumber(props: {
value: number
target: number
timing: () => { duration: number; easing: string; spinEasing: string }
}) {
let root!: HTMLSpanElement
// Keep the server-rendered text stable while the custom element owns its contents.
const initial = props.value.toLocaleString()
const growing = props.target.toLocaleString().length > initial.length
onMount(() => {
if (new Intl.NumberFormat().resolvedOptions().numberingSystem !== "latn") {
createEffect(() => {
root.textContent = props.value.toLocaleString()
})
return
}
const flow = new NumberFlow()
flow.format = { useGrouping: true, maximumFractionDigits: 0 }
flow.trend = 1
if (growing) flow.plugins = [continuous]
flow.opacityTiming = { duration: 180, easing: "ease-out" }
const motion = window.matchMedia("(prefers-reduced-motion: reduce)")
const updateMotion = () => {
flow.animated = !motion.matches
}
updateMotion()
motion.addEventListener("change", updateMotion)
onCleanup(() => motion.removeEventListener("change", updateMotion))
root.replaceChildren(flow)
createEffect(() => {
const value = props.value
if (flow.value === value) return
const timing = props.timing()
flow.transformTiming = { duration: timing.duration, easing: timing.easing }
flow.spinTiming = {
duration: timing.duration,
easing: growing ? "cubic-bezier(0.45, 0, 0.55, 1)" : timing.spinEasing,
}
flow.update(value)
})
})
return (
<span
data-value
ref={root}
style={{ "min-width": `${props.target.toLocaleString().length}ch`, "text-align": "right" }}
>
{initial}
</span>
)
}
+4 -2
View File
@@ -2,6 +2,8 @@
* Application-wide constants and configuration
*/
export const config = {
consoleMarketingEnabled: import.meta.env.VITE_CONSOLE_MARKETING_ENABLED === "true",
// Base URL
baseUrl: "https://opencode.ai",
@@ -9,8 +11,8 @@ export const config = {
github: {
repoUrl: "https://github.com/anomalyco/opencode",
starsFormatted: {
compact: "195K",
full: "195,000",
compact: "208K",
full: "208,000",
},
},
+67 -19
View File
@@ -1,6 +1,8 @@
import { getRequestEvent } from "solid-js/web"
import { and, Database, eq, inArray, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js"
import { and, Database, eq, inArray, isNotNull, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js"
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
import { BillingTable } from "@opencode-ai/console-core/schema/billing.sql.js"
import { redirect } from "@solidjs/router"
import { Actor } from "@opencode-ai/console-core/actor.js"
@@ -47,28 +49,14 @@ export const getActor = async (workspace?: string): Promise<Actor.Info> => {
if (!workspace) {
const account = auth.data.account ?? {}
const current = account[auth.data.current ?? ""]
if (current) {
return {
type: "account",
properties: {
email: current.email,
accountID: current.id,
},
}
}
if (current) return requireBlackAccount(current)
if (Object.keys(account).length > 0) {
const current = Object.values(account)[0]
await auth.update((val) => ({
...val,
current: current.id,
}))
return {
type: "account",
properties: {
email: current.email,
accountID: current.id,
},
}
return requireBlackAccount(current)
}
return {
type: "public",
@@ -77,15 +65,38 @@ export const getActor = async (workspace?: string): Promise<Actor.Info> => {
}
const accounts = Object.keys(auth.data.account ?? {})
if (accounts.length) {
const blackAccounts = await Database.use((tx) =>
tx
.selectDistinct({ accountID: UserTable.accountID })
.from(UserTable)
.innerJoin(BillingTable, eq(BillingTable.workspaceID, UserTable.workspaceID))
.where(
and(
inArray(UserTable.accountID, accounts),
isNull(UserTable.timeDeleted),
isNotNull(BillingTable.subscriptionID),
),
)
.then((rows) => rows.map((row) => row.accountID).filter((accountID): accountID is string => !!accountID)),
)
if (!blackAccounts.length) throw redirectToNewConsole()
const user = await Database.use((tx) =>
tx
.select()
.select({
id: UserTable.id,
workspaceID: UserTable.workspaceID,
accountID: UserTable.accountID,
role: UserTable.role,
migratedAt: WorkspaceTable.migrated_at,
})
.from(UserTable)
.innerJoin(WorkspaceTable, eq(WorkspaceTable.id, UserTable.workspaceID))
.where(
and(
eq(UserTable.workspaceID, workspace),
isNull(UserTable.timeDeleted),
inArray(UserTable.accountID, accounts),
inArray(UserTable.accountID, blackAccounts),
),
)
.limit(1)
@@ -93,6 +104,15 @@ export const getActor = async (workspace?: string): Promise<Actor.Info> => {
.then((x) => x[0]),
)
if (user) {
if (user.migratedAt) {
const destination = Resource.ConsoleMigration.consoleUrl
if (!destination) throw new Error("New Console URL is not configured")
evt.response.headers.set("Cache-Control", "no-store")
throw redirect(`${destination}/login`, {
status: evt.request.method === "GET" || evt.request.method === "HEAD" ? 302 : 303,
headers: { "Cache-Control": "no-store" },
})
}
await Database.use((tx) =>
tx
.update(UserTable)
@@ -114,3 +134,31 @@ export const getActor = async (workspace?: string): Promise<Actor.Info> => {
})()
return evt.locals.actor
}
async function requireBlackAccount(account: { id: string; email: string }): Promise<Actor.Info> {
const black = await Database.use((tx) =>
tx
.select({ id: UserTable.id })
.from(UserTable)
.innerJoin(BillingTable, eq(BillingTable.workspaceID, UserTable.workspaceID))
.where(
and(eq(UserTable.accountID, account.id), isNull(UserTable.timeDeleted), isNotNull(BillingTable.subscriptionID)),
)
.limit(1)
.then((rows) => rows[0]),
)
if (!black) throw redirectToNewConsole()
return {
type: "account",
properties: {
email: account.email,
accountID: account.id,
},
}
}
function redirectToNewConsole() {
const destination = Resource.ConsoleMigration.consoleUrl
if (!destination) throw new Error("New Console URL is not configured")
return redirect(`${destination}/login`, { status: 302, headers: { "Cache-Control": "no-store" } })
}
+72 -20
View File
@@ -3,6 +3,9 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "تحذير",
"go.referral.ended": "انتهى برنامج الإحالة. لم تعد روابط الإحالة تمنح رصيدًا لك أو للشخص الذي شاركها.",
"go.graph.bonus": "استخدام مضاعف {{count}} مرات",
"nav.github": "GitHub",
"nav.docs": "الوثائق",
"nav.changelog": "سجل التغييرات",
@@ -58,6 +61,7 @@ export const dict = {
"common.cancel": "إلغاء",
"common.creating": "جارٍ الإنشاء...",
"common.create": "إنشاء",
"common.contactUs": "اتصل بنا",
"common.videoUnsupported": "متصفحك لا يدعم وسم الفيديو.",
"common.figure": "شكل {{n}}.",
@@ -224,6 +228,9 @@ export const dict = {
"zen.faq.q8": "هل يمكنني استخدام Zen مع وكلاء برمجة آخرين؟",
"zen.faq.a8":
"بينما يعمل Zen بشكل رائع مع OpenCode، يمكنك استخدام Zen مع أي وكيل. اتبع تعليمات الإعداد في وكيل البرمجة المفضل لديك.",
"zen.faq.q9": "هل يمكنني استرداد أموالي؟",
"zen.faq.a9":
"قد تكون مؤهلًا لاسترداد أموالك إذا تم الخصم خلال آخر 14 يومًا ولم تستخدم الرصيد الناتج عن عملية الشراء هذه. {{contact}} لطلب استرداد الأموال.",
"zen.cta.start": "ابدأ مع Zen",
"zen.pricing.title": "أضف رصيد 20 دولار (دفع حسب الاستخدام)",
@@ -252,10 +259,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "الاستثناءات التالية",
"go.title": "OpenCode Go | نماذج برمجة منخفضة التكلفة للجميع",
"go.banner.text": "يحصل Hy3 على حدود استخدام أكبر 8 أضعاف لفترة محدودة",
"go.meta.description":
"يبدأ Go بسعر $5 للشهر الأول، ثم $10/شهر، مع حدود استخدام سخية ووصول موثوق إلى نماذج البرمجة الرائدة.",
"go.meta.description": "يبلغ سعر Go ‏$10/شهر، مع حدود استخدام سخية ووصول موثوق إلى نماذج البرمجة الرائدة.",
"go.hero.title": "نماذج برمجة منخفضة التكلفة للجميع",
"go.hero.tagline": "استخدمه مع أي وكيل. قم بزيادة الرصيد إذا لزم الأمر. الإلغاء في أي وقت.",
"go.hero.body":
"يجلب Go البرمجة الوكيلة للمبرمجين حول العالم. يوفر حدودًا سخية ووصولًا موثوقًا إلى أقوى النماذج مفتوحة المصدر، حتى تتمكن من البناء باستخدام وكلاء أقوياء دون القلق بشأن التكلفة أو التوفر.",
@@ -263,13 +269,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "اشترك في Go",
"go.cta.price": "$10/شهر",
"go.cta.promo": "$5 للشهر الأول",
"go.pricing.body":
"استخدمه مع أي وكيل. $5 للشهر الأول، ثم $10/شهر. قم بزيادة الرصيد إذا لزم الأمر. الإلغاء في أي وقت.",
"go.plans.month": "شهريًا",
"go.plans.plus.cta": "الاشتراك في Go Plus",
"go.plans.plus.description": "تبلغ تكلفة Go Plus ‏$40/شهر مع حدود استخدام أعلى.",
"go.plans.go.feature1": "نماذج مختارة بأسعار معقولة",
"go.plans.go.feature2": "مختبرة للبرمجة باستخدام الوكلاء",
"go.plans.go.feature3": "حدود سخية ووصول موثوق",
"go.plans.plus.feature1": "يشمل كل مزايا Go",
"go.plans.plus.feature2": "حدود أعلى لجلسات برمجة أطول وأكثر تركيزًا",
"go.plans.plus.feature3": "للمشاريع الأكبر والأكثر تطلبًا",
"go.plans.limits": "الحدود",
"go.plans.description": "الطلبات المقدرة لكل 5 ساعات وحدود الاستخدام الشهرية لكل نموذج",
"go.plans.legend": "الخطط",
"go.pricing.body": "استخدمه مع أي وكيل. $10/شهر. قم بزيادة الرصيد إذا لزم الأمر. الإلغاء في أي وقت.",
"go.graph.free": "مجاني",
"go.graph.freePill": "Big Pickle ونماذج مجانية",
"go.graph.go": "Go",
"go.graph.label": "الطلبات كل 5 ساعات",
"go.graph.period": "الاستخدام",
"go.graph.model": "النموذج",
"go.graph.requests": "الطلبات المقدّرة / ٥ ساعات",
"go.graph.allowance": "الاستخدام الشهري",
"go.graph.new": "جديد",
"go.graph.scale": "مقياس غير خطي لعدد الطلبات",
"go.graph.showAll": "عرض جميع النماذج ({{count}})",
"go.graph.showLess": "عرض نماذج أقل",
"go.graph.limitedRegions": "مناطق محدودة",
"go.graph.limitedTime": "لفترة محدودة",
"go.graph.usageLimits": "حدود الاستخدام",
"go.graph.aria": "الطلبات كل 5 ساعات: {{free}} مقابل {{go}}",
@@ -296,20 +322,20 @@ export const dict = {
"go.testimonials.frank.quote": "أتمنى لو كنت لا أزال في Nvidia.",
"go.problem.title": "ما المشكلة التي يحلها Go؟",
"go.problem.body":
"نحن نركز على تقديم تجربة OpenCode لأكبر عدد ممكن من الناس. OpenCode Go هو اشتراك منخفض التكلفة: $5 للشهر الأول، ثم $10/شهر. يوفر حدودا سخية ووصولا موثوقا إلى نماذج المصدر المفتوح الأكثر قدرة.",
"نحن نركز على تقديم تجربة OpenCode لأكبر عدد ممكن من الناس. OpenCode Go هو اشتراك منخفض التكلفة بسعر $10/شهر. يوفر حدودا سخية ووصولا موثوقا إلى نماذج المصدر المفتوح الأكثر قدرة.",
"go.problem.subtitle": " ",
"go.problem.item1": "أسعار اشتراك منخفضة التكلفة",
"go.problem.item2": "حدود سخية ووصول موثوق",
"go.problem.item3": "مصمم لأكبر عدد ممكن من المبرمجين",
"go.problem.item4": "مجموعة منسقة من النماذج المختبرة للبرمجة الوكيلة",
"go.how.title": "كيف يعمل Go",
"go.how.body": "يبدأ Go من $5 للشهر الأول، ثم $10/شهر. يمكنك استخدامه مع OpenCode أو أي وكيل.",
"go.how.body": "يبلغ سعر Go ‏$10/شهر. يمكنك استخدامه مع OpenCode أو أي وكيل.",
"go.how.step1.title": "أنشئ حسابًا",
"go.how.step1.beforeLink": "اتبع",
"go.how.step1.link": "تعليمات الإعداد",
"go.how.step2.title": "اشترك في Go",
"go.how.step2.link": "$5 للشهر الأول",
"go.how.step2.afterLink": "ثم $10/شهر مع حدود سخية",
"go.how.step2.link": "$10/شهر",
"go.how.step2.afterLink": "مع حدود سخية",
"go.how.step3.title": "ابدأ البرمجة",
"go.how.step3.body": "مع وصول موثوق لنماذج مفتوحة المصدر",
"go.privacy.title": "خصوصيتك مهمة بالنسبة لنا",
@@ -325,11 +351,11 @@ export const dict = {
"go.faq.a2": "يتضمن Go النماذج المدرجة أدناه، مع حدود سخية وإتاحة موثوقة.",
"go.faq.q3": "هل Go هو نفسه Zen؟",
"go.faq.a3":
"لا. يعتمد Zen على الدفع حسب الاستخدام، بينما يبدأ Go بسعر $5 للشهر الأول، ثم $10/شهر، مع حدود سخية ووصول موثوق إلى مجموعة منسقة من النماذج.",
"لا. يعتمد Zen على الدفع حسب الاستخدام، بينما يبلغ سعر Go ‏$10/شهر، مع حدود سخية ووصول موثوق إلى مجموعة منسقة من النماذج.",
"go.faq.q4": "كم تكلفة Go؟",
"go.faq.a4.p1.beforePricing": "تكلفة Go",
"go.faq.a4.p1.pricingLink": "$5 للشهر الأول",
"go.faq.a4.p1.afterPricing": "ثم $10/شهر مع حدود سخية.",
"go.faq.a4.p1.pricingLink": "$10/شهر",
"go.faq.a4.p1.afterPricing": "مع حدود سخية.",
"go.faq.a4.p2.beforeAccount": "يمكنك إدارة اشتراكك في",
"go.faq.a4.p2.accountLink": "حسابك",
"go.faq.a4.p3": "ألغِ في أي وقت.",
@@ -339,14 +365,18 @@ export const dict = {
"go.faq.a5.retention": "الاحتفاظ بالبيانات",
"go.faq.a5.retention30": "30 يومًا",
"go.faq.a5.retention0": "0 أيام",
"go.faq.a5.used": "مستخدَمة",
"go.faq.a5.notUsed": "غير مستخدَمة",
"go.faq.a5.noAgreement": "لا توجد اتفاقية",
"go.faq.a5.notZdr": "ليست ZDR",
"go.faq.a5.grokRetention":
"تعطّل ZDR ميزات API مهمة تعتمد على البيانات المخزنة، بما في ذلك Responses API ذات الحالة، وFiles and Collections، وBatch API.",
"go.faq.a5.gptRetention":
"تُنشأ سجلات مراقبة إساءة الاستخدام لكل استخدام لميزات API، ويُحتفظ بها لمدة تصل إلى 30 يومًا.",
"go.faq.a5.museRetention":
"أسعار توكنات مخفّضة للغاية مقابل منح الإذن باستخدام مطالباتك وإكمالات النموذج لتدريب نماذج Meta المستقبلية.",
"go.faq.a5.learnMore": "اعرف المزيد",
"go.faq.a5.deepseekRetention": "تُجدَّد اتفاقية ZDR شهريًا. الاتفاقية الحالية سارية حتى 31 أغسطس 2026.",
"go.faq.a5.deepseekRetention": "تُجدَّد اتفاقية ZDR شهريًا. الاتفاقية الحالية سارية حتى 30 سبتمبر 2026.",
"go.faq.a5.beforeExceptions":
"تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"go.faq.a5.exceptionsLink": "الاستثناءات التالية",
@@ -359,7 +389,10 @@ export const dict = {
"go.faq.q9": "ما الفرق بين النماذج المجانية وGo؟",
"go.faq.a9":
"تشمل النماذج المجانية Big Pickle بالإضافة إلى النماذج الترويجية المتاحة في ذلك الوقت، مع حصة قدرها 200 طلب/يوم. يقدّم Go مجموعة منسقة من النماذج مع حصص طلبات أعلى مطبقة عبر نوافذ متجددة (5 ساعات، وأسبوعية، وشهرية)، تعادل تقريبًا $12 لكل 5 ساعات، و$30 في الأسبوع، و$60 في الشهر (تختلف أعداد الطلبات الفعلية حسب النموذج والاستخدام).",
"تشمل النماذج المجانية Big Pickle بالإضافة إلى النماذج الترويجية المتاحة في ذلك الوقت، مع حصة قدرها 200 طلب/يوم. يقدّم Go مجموعة منسقة من النماذج مع حصص طلبات أعلى عبر نوافذ متجددة: 20% من الحصة الشهرية لكل 5 ساعات، و50% لكل أسبوع، و100% لكل شهر. وقد تختلف الحصص حسب النموذج (تختلف أعداد الطلبات الفعلية حسب النموذج والاستخدام).",
"go.faq.q10": "هل يمكنني استرداد أموالي؟",
"go.faq.a10":
"قد تكون مؤهلًا لاسترداد أموالك إذا تم الخصم خلال آخر 14 يومًا ولم تستخدم مخصصات Go خلال فترة الفوترة تلك. {{contact}} لطلب استرداد الأموال.",
"zen.api.error.rateLimitExceeded": "تم تجاوز حد الطلبات. يرجى المحاولة مرة أخرى لاحقًا.",
"zen.api.error.modelNotSupported": "النموذج {{model}} غير مدعوم",
@@ -622,7 +655,6 @@ export const dict = {
"workspace.payments.type.subscription": "اشتراك",
"workspace.payments.view": "عرض",
"workspace.black.loading": "جارٍ التحميل...",
"workspace.black.time.day": "يوم",
"workspace.black.time.days": "أيام",
"workspace.black.time.hour": "ساعة",
@@ -632,7 +664,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "بضع ثوان",
"workspace.black.subscription.title": "الاشتراك",
"workspace.black.subscription.message": "أنت مشترك في OpenCode Black مقابل ${{plan}} شهريًا.",
"workspace.black.subscription.manage": "إدارة الاشتراك",
"workspace.black.subscription.ending":
"ينتهي OpenCode Black بنهاية فترة الفوترة الحالية ولن يتم تجديده. سننقلك إلى وحدة التحكم الجديدة.",
"workspace.black.subscription.rollingUsage": "استخدام لمدة 5 ساعات",
"workspace.black.subscription.weeklyUsage": "الاستخدام الأسبوعي",
"workspace.black.subscription.resetsIn": "إعادة تعيين في",
@@ -658,23 +691,32 @@ 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.',
"workspace.lite.providers.title": "المزودون",
"workspace.lite.providers.description": "تحكم في المزودين المستخدمين للتوجيه.",
"workspace.lite.providers.allowTraining": "السماح بالنماذج التي تتدرب على بيانات الطلبات",
"workspace.lite.providers.useChina": "تفعيل النماذج المستضافة في الصين",
"workspace.lite.black.message":
"أنت مشترك حاليًا في OpenCode Black أو في قائمة الانتظار. يرجى إلغاء الاشتراك أولاً إذا كنت ترغب في التبديل إلى Go.",
"workspace.lite.other.message":
"عضو آخر في مساحة العمل هذه مشترك بالفعل في OpenCode Go. يمكن لعضو واحد فقط لكل مساحة عمل الاشتراك.",
"workspace.lite.promo.description":
"يبدأ OpenCode Go بسعر {{price}}، ثم $10/شهر، ويوفر وصولا موثوقا لنماذج البرمجة المفتوحة الشهيرة مع حدود استخدام سخية.",
"workspace.lite.promo.price": "$5 للشهر الأول",
"يبلغ سعر OpenCode Go {{price}}، ويوفر وصولا موثوقا لنماذج البرمجة المفتوحة الشهيرة مع حدود استخدام سخية.",
"workspace.lite.promo.price": "$10/شهر",
"workspace.lite.promo.modelsTitle": "ما يتضمنه",
"workspace.lite.promo.footer":
"صُممت الخطة بشكل أساسي للمستخدمين الدوليين، وتوفر وصولًا عالميًا مستقرًا. قد تتغير الأسعار وحدود الاستخدام بينما نتعلم من الاستخدام المبكر والملاحظات.",
@@ -765,6 +807,15 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "رقم الهاتف",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label":
"ما هو الإنفاق الشهري الحالي لشركتك على استدلال الذكاء الاصطناعي (بالدولار الأمريكي)؟",
"enterprise.form.inferenceSpend.placeholder": "اختر نطاقًا (اختياري)",
"enterprise.form.inferenceSpend.none": "لا يوجد إنفاق بعد",
"enterprise.form.inferenceSpend.under1k": "أقل من $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K أو أكثر",
"enterprise.form.message.label": "ما المشكلة التي تحاول حلها؟",
"enterprise.form.message.placeholder": "نحتاج مساعدة في...",
"enterprise.form.send": "إرسال",
@@ -773,6 +824,7 @@ export const dict = {
"enterprise.form.success.submitted": "تم إرسال النموذج بنجاح.",
"enterprise.form.error.allFieldsRequired": "جميع الحقول مطلوبة.",
"enterprise.form.error.invalidEmailFormat": "تنسيق البريد الإلكتروني غير صالح.",
"enterprise.form.error.invalidInferenceSpend": "اختر نطاقًا صالحًا للإنفاق على الاستدلال.",
"enterprise.form.error.internalServer": "خطأ داخلي في الخادم.",
"enterprise.faq.title": "الأسئلة الشائعة",
"enterprise.faq.q1": "ما هو OpenCode Enterprise؟",
+72 -19
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Aviso",
"go.referral.ended":
"O programa de indicação foi encerrado. Links de indicação não geram mais crédito para você nem para quem os compartilhou.",
"go.graph.bonus": "{{count}}× mais uso",
"nav.github": "GitHub",
"nav.docs": "Documentação",
"nav.changelog": "Changelog",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "Cancelar",
"common.creating": "Criando...",
"common.create": "Criar",
"common.contactUs": "Contate-nos",
"common.videoUnsupported": "Seu navegador não suporta a tag de vídeo.",
"common.figure": "Fig {{n}}.",
@@ -228,6 +233,9 @@ export const dict = {
"zen.faq.q8": "Posso usar o Zen com outros agentes de codificação?",
"zen.faq.a8":
"Embora o Zen funcione muito bem com o OpenCode, você pode usar o Zen com qualquer agente. Siga as instruções de configuração no seu agente de codificação preferido.",
"zen.faq.q9": "Posso receber um reembolso?",
"zen.faq.a9":
"Você pode ter direito a um reembolso se a cobrança foi feita nos últimos 14 dias e você não usou os créditos dessa compra. {{contact}} para solicitar um reembolso.",
"zen.cta.start": "Comece com o Zen",
"zen.pricing.title": "Adicionar $20 de saldo pré-pago",
@@ -256,10 +264,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "seguintes exceções",
"go.title": "OpenCode Go | Modelos de codificação de baixo custo para todos",
"go.banner.text": "Hy3 tem limites de uso 8x maiores por tempo limitado",
"go.meta.description":
"O Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos de uso e acesso confiável aos principais modelos de codificação.",
"O Go custa $10/mês, com limites generosos de uso e acesso confiável aos principais modelos de codificação.",
"go.hero.title": "Modelos de codificação de baixo custo para todos",
"go.hero.tagline": "Use com qualquer agente. Adicione créditos se precisar. Cancele quando quiser.",
"go.hero.body":
"O Go traz a codificação com agentes para programadores em todo o mundo. Oferecendo limites generosos e acesso confiável aos modelos de código aberto mais capazes, para que você possa construir com agentes poderosos sem se preocupar com custos ou disponibilidade.",
@@ -267,13 +275,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Assinar o Go",
"go.cta.price": "$10/mês",
"go.cta.promo": "$5 no primeiro mês",
"go.plans.month": "por mês",
"go.plans.plus.cta": "Assinar Go Plus",
"go.plans.plus.description": "O Go Plus custa $40/mês e oferece limites maiores.",
"go.plans.go.feature1": "Modelos selecionados e acessíveis",
"go.plans.go.feature2": "Testados para programação com agentes",
"go.plans.go.feature3": "Limites generosos e acesso confiável",
"go.plans.plus.feature1": "Tudo o que está incluído no Go",
"go.plans.plus.feature2": "Limites maiores para sessões de programação mais longas e focadas",
"go.plans.plus.feature3": "Para projetos maiores e exigentes",
"go.plans.limits": "Limites",
"go.plans.description": "Solicitações estimadas a cada 5 horas e limites mensais por modelo",
"go.plans.legend": "Planos",
"go.pricing.body":
"Use com qualquer agente. $5 no primeiro mês, depois $10/mês. Recarregue o crédito se necessário. Cancele a qualquer momento.",
"Use com qualquer agente. $10/mês. Recarregue o crédito se necessário. Cancele a qualquer momento.",
"go.graph.free": "Grátis",
"go.graph.freePill": "Big Pickle e modelos gratuitos",
"go.graph.go": "Go",
"go.graph.label": "Requisições por 5 horas",
"go.graph.period": "Uso",
"go.graph.model": "Modelo",
"go.graph.requests": "Requisições estimadas / 5 h",
"go.graph.allowance": "Uso mensal",
"go.graph.new": "Novo",
"go.graph.scale": "Escala não linear de requisições",
"go.graph.showAll": "Ver todos os {{count}} modelos",
"go.graph.showLess": "Mostrar menos modelos",
"go.graph.limitedRegions": "regiões limitadas",
"go.graph.limitedTime": "tempo limitado",
"go.graph.usageLimits": "Limites de uso",
"go.graph.aria": "Requisições por 5h: {{free}} vs {{go}}",
@@ -301,21 +330,20 @@ export const dict = {
"go.testimonials.frank.quote": "Eu queria ainda estar na Nvidia.",
"go.problem.title": "Que problema o Go resolve?",
"go.problem.body":
"Estamos focados em levar a experiência do OpenCode para o maior número de pessoas possível. OpenCode Go é uma assinatura de baixo custo: $5 no primeiro mês, depois $10/mês. Oferece limites generosos e acesso confiável aos modelos open source mais capazes.",
"Estamos focados em levar a experiência do OpenCode para o maior número de pessoas possível. OpenCode Go é uma assinatura de baixo custo de $10/mês. Oferece limites generosos e acesso confiável aos modelos open source mais capazes.",
"go.problem.subtitle": " ",
"go.problem.item1": "Preço de assinatura de baixo custo",
"go.problem.item2": "Limites generosos e acesso confiável",
"go.problem.item3": "Feito para o maior número possível de programadores",
"go.problem.item4": "Uma seleção de modelos testados para codificação com agentes",
"go.how.title": "Como o Go funciona",
"go.how.body":
"O Go começa em $5 no primeiro mês, depois $10/mês. Você pode usá-lo com o OpenCode ou qualquer agente.",
"go.how.body": "O Go custa $10/mês. Você pode usá-lo com o OpenCode ou qualquer agente.",
"go.how.step1.title": "Crie uma conta",
"go.how.step1.beforeLink": "siga as",
"go.how.step1.link": "instruções de configuração",
"go.how.step2.title": "Assinar o Go",
"go.how.step2.link": "$5 no primeiro mês",
"go.how.step2.afterLink": "depois $10/mês com limites generosos",
"go.how.step2.link": "$10/mês",
"go.how.step2.afterLink": "com limites generosos",
"go.how.step3.title": "Comece a codificar",
"go.how.step3.body": "com acesso confiável a modelos de código aberto",
"go.privacy.title": "Sua privacidade é importante para nós",
@@ -332,11 +360,11 @@ export const dict = {
"go.faq.a2": "O Go inclui os modelos listados abaixo, com limites generosos e acesso confiável.",
"go.faq.q3": "O Go é o mesmo que o Zen?",
"go.faq.a3":
"Não. Zen é pay-as-you-go, enquanto o Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos e acesso confiável a uma seleção de modelos.",
"Não. Zen é pay-as-you-go, enquanto o Go custa $10/mês, com limites generosos e acesso confiável a uma seleção de modelos.",
"go.faq.q4": "Quanto custa o Go?",
"go.faq.a4.p1.beforePricing": "O Go custa",
"go.faq.a4.p1.pricingLink": "$5 no primeiro mês",
"go.faq.a4.p1.afterPricing": "depois $10/mês com limites generosos.",
"go.faq.a4.p1.pricingLink": "$10/mês",
"go.faq.a4.p1.afterPricing": "com limites generosos.",
"go.faq.a4.p2.beforeAccount": "Você pode gerenciar sua assinatura em sua",
"go.faq.a4.p2.accountLink": "conta",
"go.faq.a4.p3": "Cancele a qualquer momento.",
@@ -346,15 +374,19 @@ export const dict = {
"go.faq.a5.retention": "Retenção de dados",
"go.faq.a5.retention30": "30 dias",
"go.faq.a5.retention0": "0 dias",
"go.faq.a5.used": "Usado",
"go.faq.a5.notUsed": "Não usado",
"go.faq.a5.noAgreement": "Sem acordo",
"go.faq.a5.notZdr": "Não é ZDR",
"go.faq.a5.grokRetention":
"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.",
"go.faq.a5.gptRetention":
"Logs de monitoramento de abuso são gerados para todo uso de recursos da API e retidos por até 30 dias.",
"go.faq.a5.museRetention":
"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.",
"go.faq.a5.learnMore": "Saiba mais",
"go.faq.a5.deepseekRetention":
"O acordo de ZDR é renovado mensalmente. O acordo atual é válido até 31 de agosto de 2026.",
"O acordo de ZDR é renovado mensalmente. O acordo atual é válido até 30 de setembro de 2026.",
"go.faq.a5.beforeExceptions":
"Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
"go.faq.a5.exceptionsLink": "seguintes exceções",
@@ -368,7 +400,10 @@ export const dict = {
"go.faq.q9": "Qual a diferença entre os modelos gratuitos e o Go?",
"go.faq.a9":
"Os modelos gratuitos incluem Big Pickle e modelos promocionais disponíveis no momento, com uma cota de 200 requisições/dia. O Go oferece uma seleção de modelos com cotas de requisição mais altas aplicadas em janelas móveis (5 horas, semanal e mensal), aproximadamente equivalentes a $12 por 5 horas, $30 por semana e $60 por mês (as contagens reais de requisições variam de acordo com o modelo e o uso).",
"Os modelos gratuitos incluem Big Pickle e modelos promocionais disponíveis no momento, com uma cota de 200 requisições/dia. O Go oferece uma seleção de modelos com cotas de requisição mais altas em janelas móveis: 20% da cota mensal a cada 5 horas, 50% por semana e 100% por mês. As cotas específicas podem variar por modelo (as contagens reais de requisições variam de acordo com o modelo e o uso).",
"go.faq.q10": "Posso receber um reembolso?",
"go.faq.a10":
"Você pode ter direito a um reembolso se a cobrança foi feita nos últimos 14 dias e você não usou sua cota do Go durante esse período de faturamento. {{contact}} para solicitar um reembolso.",
"zen.api.error.rateLimitExceeded": "Limite de taxa excedido. Por favor, tente novamente mais tarde.",
"zen.api.error.modelNotSupported": "Modelo {{model}} não suportado",
@@ -632,7 +667,6 @@ export const dict = {
"workspace.payments.type.subscription": "assinatura",
"workspace.payments.view": "Ver",
"workspace.black.loading": "Carregando...",
"workspace.black.time.day": "dia",
"workspace.black.time.days": "dias",
"workspace.black.time.hour": "hora",
@@ -642,7 +676,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "alguns segundos",
"workspace.black.subscription.title": "Assinatura",
"workspace.black.subscription.message": "Você assina o OpenCode Black por ${{plan}} por mês.",
"workspace.black.subscription.manage": "Gerenciar Assinatura",
"workspace.black.subscription.ending":
"O OpenCode Black termina com o seu período de cobrança atual e não será renovado. Vamos migrar você para o novo console.",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso Semanal",
"workspace.black.subscription.resetsIn": "Reinicia em",
@@ -669,23 +704,32 @@ 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.',
"workspace.lite.providers.title": "Provedores",
"workspace.lite.providers.description": "Controle quais provedores são usados para roteamento.",
"workspace.lite.providers.allowTraining": "Permitir modelos que usam dados de solicitações para treinamento",
"workspace.lite.providers.useChina": "Ativar modelos hospedados na China",
"workspace.lite.black.message":
"Você está atualmente inscrito no OpenCode Black ou na lista de espera. Por favor, cancele a assinatura primeiro se desejar mudar para o Go.",
"workspace.lite.other.message":
"Outro membro neste workspace já assina o OpenCode Go. Apenas um membro por workspace pode assinar.",
"workspace.lite.promo.description":
"O OpenCode Go começa em {{price}}, depois $10/mês, e oferece acesso confiável a modelos de codificação abertos populares com limites de uso generosos.",
"workspace.lite.promo.price": "$5 no primeiro mês",
"O OpenCode Go custa {{price}} e oferece acesso confiável a modelos de codificação abertos populares com limites de uso generosos.",
"workspace.lite.promo.price": "$10/mês",
"workspace.lite.promo.modelsTitle": "O que está incluído",
"workspace.lite.promo.footer":
"O plano foi desenvolvido principalmente para usuários internacionais e oferece acesso global estável. Os preços e limites de uso podem mudar à medida que aprendemos com o uso inicial e o feedback recebido.",
@@ -779,6 +823,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefone",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Qual é o gasto mensal atual da sua empresa com inferência (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Selecione uma faixa (opcional)",
"enterprise.form.inferenceSpend.none": "Ainda não gastamos",
"enterprise.form.inferenceSpend.under1k": "Menos de $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K ou mais",
"enterprise.form.message.label": "Qual problema você está tentando resolver?",
"enterprise.form.message.placeholder": "Precisamos de ajuda com...",
"enterprise.form.send": "Enviar",
@@ -787,6 +839,7 @@ export const dict = {
"enterprise.form.success.submitted": "Formulário enviado com sucesso.",
"enterprise.form.error.allFieldsRequired": "Todos os campos são obrigatórios.",
"enterprise.form.error.invalidEmailFormat": "Formato de e-mail inválido.",
"enterprise.form.error.invalidInferenceSpend": "Selecione uma faixa de gasto com inferência válida.",
"enterprise.form.error.internalServer": "Erro interno do servidor.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "O que é OpenCode Enterprise?",
+73 -21
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Advarsel",
"go.referral.ended":
"Henvisningsprogrammet er afsluttet. Henvisningslinks giver ikke længere kredit til dig eller den, der delte dem.",
"go.graph.bonus": "{{count}}× forbrug",
"nav.github": "GitHub",
"nav.docs": "Dokumentation",
"nav.changelog": "Changelog",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "Annuller",
"common.creating": "Opretter...",
"common.create": "Opret",
"common.contactUs": "Kontakt os",
"common.videoUnsupported": "Din browser understøtter ikke video-tagget.",
"common.figure": "Fig {{n}}.",
@@ -226,6 +231,9 @@ export const dict = {
"zen.faq.q8": "Kan jeg bruge Zen med andre kodningsagenter?",
"zen.faq.a8":
"Selvom Zen fungerer godt med OpenCode, kan du bruge Zen med enhver agent. Følg opsætningsinstruktionerne i din foretrukne kodningsagent.",
"zen.faq.q9": "Kan jeg få en refusion?",
"zen.faq.a9":
"Du kan muligvis få en refusion, hvis opkrævningen blev foretaget inden for de seneste 14 dage, og du ikke har brugt kreditten fra dette køb. {{contact}} for at anmode om en refusion.",
"zen.cta.start": "Kom godt i gang med Zen",
"zen.pricing.title": "Tilføj $20 Pay as you go-saldo",
@@ -254,10 +262,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "følgende undtagelser",
"go.title": "OpenCode Go | Kodningsmodeller til lav pris for alle",
"go.banner.text": "Hy3 får 8x højere brugsgrænser i en begrænset periode",
"go.meta.description":
"Go starter ved $5 for den første måned, derefter $10/måned, med generøse brugsgrænser og pålidelig adgang til førende kodningsmodeller.",
"Go koster $10/måned, med generøse brugsgrænser og pålidelig adgang til førende kodningsmodeller.",
"go.hero.title": "Kodningsmodeller til lav pris for alle",
"go.hero.tagline": "Brug med enhver agent. Tank op med kredit efter behov. Afmeld når som helst.",
"go.hero.body":
"Go bringer agentisk kodning til programmører over hele verden. Med generøse grænser og pålidelig adgang til de mest kapable open source-modeller, så du kan bygge med kraftfulde agenter uden at bekymre dig om omkostninger eller tilgængelighed.",
@@ -265,14 +273,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Abonner på Go",
"go.cta.price": "$10/måned",
"go.cta.promo": "$5 første måned",
"go.pricing.body":
"Brug med enhver agent. $5 første måned, derefter $10/måned. Tank op med kredit efter behov. Afmeld når som helst.",
"go.plans.month": "om måneden",
"go.plans.plus.cta": "Abonnér på Go Plus",
"go.plans.plus.description": "Go Plus koster $40/måned og giver højere brugsgrænser.",
"go.plans.go.feature1": "Udvalgte, prisvenlige modeller",
"go.plans.go.feature2": "Testet til agentbaseret kodning",
"go.plans.go.feature3": "Generøse grænser og pålidelig adgang",
"go.plans.plus.feature1": "Alt i Go er inkluderet",
"go.plans.plus.feature2": "Højere grænser til længere, fokuserede kodningsforløb",
"go.plans.plus.feature3": "Til større, krævende projekter",
"go.plans.limits": "Grænser",
"go.plans.description": "Anslåede anmodninger pr. 5 timer og månedlige grænser pr. model",
"go.plans.legend": "Abonnementer",
"go.pricing.body": "Brug med enhver agent. $10/måned. Tank op med kredit efter behov. Afmeld når som helst.",
"go.graph.free": "Gratis",
"go.graph.freePill": "Big Pickle og gratis modeller",
"go.graph.go": "Go",
"go.graph.label": "Forespørgsler pr. 5 timer",
"go.graph.usageLimits": "Brugsgrænser",
"go.graph.period": "Forbrug",
"go.graph.model": "Model",
"go.graph.requests": "Estimerede anmodninger / 5 timer",
"go.graph.allowance": "Månedligt forbrug",
"go.graph.new": "Ny",
"go.graph.scale": "Ikke-lineær skala for anmodninger",
"go.graph.showAll": "Vis alle {{count}} modeller",
"go.graph.showLess": "Vis færre modeller",
"go.graph.limitedRegions": "begrænsede regioner",
"go.graph.limitedTime": "begrænset periode",
"go.graph.usageLimits": "Forbrugsgrænser",
"go.graph.aria": "Forespørgsler pr. 5t: {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
@@ -298,21 +326,20 @@ export const dict = {
"go.testimonials.frank.quote": "Jeg ville ønske, jeg stadig var hos Nvidia.",
"go.problem.title": "Hvilket problem løser Go?",
"go.problem.body":
"Vi fokuserer på at bringe OpenCode-oplevelsen ud til så mange som muligt. OpenCode Go er et lavprisabonnement: $5 for den første måned, derefter $10/måned. Det giver generøse grænser og pålidelig adgang til de mest kapable open source-modeller.",
"Vi fokuserer på at bringe OpenCode-oplevelsen ud til så mange som muligt. OpenCode Go er et lavprisabonnement til $10/måned. Det giver generøse grænser og pålidelig adgang til de mest kapable open source-modeller.",
"go.problem.subtitle": " ",
"go.problem.item1": "Lavpris abonnementspriser",
"go.problem.item2": "Generøse grænser og pålidelig adgang",
"go.problem.item3": "Bygget til så mange programmører som muligt",
"go.problem.item4": "Et kurateret modeludvalg testet til agentisk kodning",
"go.how.title": "Hvordan Go virker",
"go.how.body":
"Go starter ved $5 for den første måned, derefter $10/måned. Du kan bruge det med OpenCode eller enhver agent.",
"go.how.body": "Go koster $10/måned. Du kan bruge det med OpenCode eller enhver agent.",
"go.how.step1.title": "Opret en konto",
"go.how.step1.beforeLink": "følg",
"go.how.step1.link": "opsætningsinstruktionerne",
"go.how.step2.title": "Abonner på Go",
"go.how.step2.link": "$5 første måned",
"go.how.step2.afterLink": "derefter $10/måned med generøse grænser",
"go.how.step2.link": "$10/måned",
"go.how.step2.afterLink": "med generøse grænser",
"go.how.step3.title": "Start kodning",
"go.how.step3.body": "med pålidelig adgang til open source-modeller",
"go.privacy.title": "Dit privatliv er vigtigt for os",
@@ -329,11 +356,11 @@ export const dict = {
"go.faq.a2": "Go inkluderer modellerne nedenfor med generøse grænser og pålidelig adgang.",
"go.faq.q3": "Er Go det samme som Zen?",
"go.faq.a3":
"Nej. Zen er pay-as-you-go, mens Go starter ved $5 for den første måned, derefter $10/måned, med generøse grænser og pålidelig adgang til et kurateret modeludvalg.",
"Nej. Zen er pay-as-you-go, mens Go koster $10/måned, med generøse grænser og pålidelig adgang til et kurateret modeludvalg.",
"go.faq.q4": "Hvad koster Go?",
"go.faq.a4.p1.beforePricing": "Go koster",
"go.faq.a4.p1.pricingLink": "$5 første måned",
"go.faq.a4.p1.afterPricing": "derefter $10/måned med generøse grænser.",
"go.faq.a4.p1.pricingLink": "$10/måned",
"go.faq.a4.p1.afterPricing": "med generøse grænser.",
"go.faq.a4.p2.beforeAccount": "Du kan administrere dit abonnement i din",
"go.faq.a4.p2.accountLink": "konto",
"go.faq.a4.p3": "Annuller til enhver tid.",
@@ -343,15 +370,19 @@ export const dict = {
"go.faq.a5.retention": "Dataopbevaring",
"go.faq.a5.retention30": "30 dage",
"go.faq.a5.retention0": "0 dage",
"go.faq.a5.used": "Brugt",
"go.faq.a5.notUsed": "Ikke brugt",
"go.faq.a5.noAgreement": "Ingen aftale",
"go.faq.a5.notZdr": "Ikke ZDR",
"go.faq.a5.grokRetention":
"ZDR deaktiverer vigtige API-funktioner, der afhænger af lagrede data, herunder den tilstandsbevarende Responses API, Files and Collections og Batch API.",
"go.faq.a5.gptRetention":
"Logfiler til overvågning af misbrug genereres ved al brug af API-funktioner og opbevares i op til 30 dage.",
"go.faq.a5.museRetention":
"Kraftigt nedsatte tokenpriser til gengæld for tilladelse til at bruge dine prompts og modelsvar til at træne fremtidige Meta-modeller.",
"go.faq.a5.learnMore": "Læs mere",
"go.faq.a5.deepseekRetention":
"ZDR-aftalen fornyes månedligt. Den nuværende aftale er gyldig til og med 31. august 2026.",
"ZDR-aftalen fornyes månedligt. Den nuværende aftale er gyldig til og med 30. september 2026.",
"go.faq.a5.beforeExceptions":
"Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de",
@@ -365,7 +396,10 @@ export const dict = {
"go.faq.q9": "Hvad er forskellen på gratis modeller og Go?",
"go.faq.a9":
"Gratis modeller inkluderer Big Pickle plus kampagnemodeller, der er tilgængelige på det pågældende tidspunkt, med en kvote på 200 forespørgsler/dag. Go tilbyder et kurateret modeludvalg med højere forespørgselskvoter håndhævet over rullende perioder (5 timer, ugentligt og månedligt), omtrent svarende til $12 pr. 5 timer, $30 pr. uge og $60 pr. måned (det faktiske antal forespørgsler varierer efter model og brug).",
"Gratis modeller inkluderer Big Pickle plus kampagnemodeller, der er tilgængelige på det pågældende tidspunkt, med en kvote på 200 forespørgsler/dag. Go tilbyder et kurateret modeludvalg med højere forespørgselskvoter i rullende perioder: 20 % af den månedlige kvote pr. 5 timer, 50 % pr. uge og 100 % pr. måned. Modelspecifikke kvoter kan variere (det faktiske antal forespørgsler varierer efter model og brug).",
"go.faq.q10": "Kan jeg få en refusion?",
"go.faq.a10":
"Du kan muligvis få en refusion, hvis opkrævningen blev foretaget inden for de seneste 14 dage, og du ikke har brugt din Go-kvote i den pågældende faktureringsperiode. {{contact}} for at anmode om en refusion.",
"zen.api.error.rateLimitExceeded": "Hastighedsgrænse overskredet. Prøv venligst igen senere.",
"zen.api.error.modelNotSupported": "Model {{model}} understøttes ikke",
@@ -629,7 +663,6 @@ export const dict = {
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Vis",
"workspace.black.loading": "Indlæser...",
"workspace.black.time.day": "dag",
"workspace.black.time.days": "dage",
"workspace.black.time.hour": "time",
@@ -639,7 +672,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "et par sekunder",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} om måneden.",
"workspace.black.subscription.manage": "Administrer abonnement",
"workspace.black.subscription.ending":
"OpenCode Black slutter med din nuværende faktureringsperiode og fornyes ikke. Vi flytter dig til den nye konsol.",
"workspace.black.subscription.rollingUsage": "5-timers brug",
"workspace.black.subscription.weeklyUsage": "Ugentlig brug",
"workspace.black.subscription.resetsIn": "Nulstiller i",
@@ -666,23 +700,32 @@ 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.',
"workspace.lite.providers.title": "Udbydere",
"workspace.lite.providers.description": "Styr, hvilke udbydere der bruges til routing.",
"workspace.lite.providers.allowTraining": "Tillad modeller, der træner på anmodningsdata",
"workspace.lite.providers.useChina": "Aktivér modeller hostet i Kina",
"workspace.lite.black.message":
"Du abonnerer i øjeblikket på OpenCode Black eller er på venteliste. Afmeld venligst først, hvis du vil skifte til Go.",
"workspace.lite.other.message":
"Et andet medlem i dette workspace abonnerer allerede på OpenCode Go. Kun ét medlem pr. workspace kan abonnere.",
"workspace.lite.promo.description":
"OpenCode Go starter ved {{price}}, derefter $10/måned, og giver pålidelig adgang til populære åbne kodningsmodeller med generøse brugsgrænser.",
"workspace.lite.promo.price": "$5 for den første måned",
"OpenCode Go koster {{price}} og giver pålidelig adgang til populære åbne kodningsmodeller med generøse brugsgrænser.",
"workspace.lite.promo.price": "$10/måned",
"workspace.lite.promo.modelsTitle": "Hvad er inkluderet",
"workspace.lite.promo.footer":
"Planen er primært udviklet til internationale brugere og giver stabil adgang i hele verden. Priser og forbrugsgrænser kan ændre sig, efterhånden som vi lærer af de første brugserfaringer og tilbagemeldinger.",
@@ -773,6 +816,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefonnummer",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Hvad er jeres virksomheds nuværende månedlige forbrug på inferens (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Vælg et interval (valgfrit)",
"enterprise.form.inferenceSpend.none": "Intet forbrug endnu",
"enterprise.form.inferenceSpend.under1k": "Under $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K eller mere",
"enterprise.form.message.label": "Hvilket problem prøver du at løse?",
"enterprise.form.message.placeholder": "Vi har brug for hjælp med...",
"enterprise.form.send": "Send",
@@ -781,6 +832,7 @@ export const dict = {
"enterprise.form.success.submitted": "Formular indsendt med succes.",
"enterprise.form.error.allFieldsRequired": "Alle felter er påkrævet.",
"enterprise.form.error.invalidEmailFormat": "Ugyldigt e-mailformat.",
"enterprise.form.error.invalidInferenceSpend": "Vælg et gyldigt interval for inferensforbrug.",
"enterprise.form.error.internalServer": "Intern serverfejl.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Hvad er OpenCode Enterprise?",
+73 -20
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Warnung",
"go.referral.ended":
"Das Empfehlungsprogramm wurde beendet. Empfehlungslinks bringen weder dir noch der Person, die sie geteilt hat, Guthaben.",
"go.graph.bonus": "{{count}}× Nutzung",
"nav.github": "GitHub",
"nav.docs": "Dokumentation",
"nav.changelog": "Changelog",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "Abbrechen",
"common.creating": "Erstelle...",
"common.create": "Erstellen",
"common.contactUs": "Kontaktiere uns",
"common.videoUnsupported": "Dein Browser unterstützt das Video-Tag nicht.",
"common.figure": "Abb. {{n}}.",
@@ -228,6 +233,9 @@ export const dict = {
"zen.faq.q8": "Kann ich Zen mit anderen Coding-Agents nutzen?",
"zen.faq.a8":
"Während Zen großartig mit OpenCode funktioniert, kannst du Zen mit jedem Agent nutzen. Folge den Einrichtungsanweisungen in deinem bevorzugten Coding-Agent.",
"zen.faq.q9": "Kann ich eine Rückerstattung erhalten?",
"zen.faq.a9":
"Du hast möglicherweise Anspruch auf eine Rückerstattung, wenn die Zahlung innerhalb der letzten 14 Tage erfolgt ist und du das Guthaben aus diesem Kauf nicht verwendet hast. {{contact}}, um eine Rückerstattung anzufordern.",
"zen.cta.start": "Starte mit Zen",
"zen.pricing.title": "Füge $20 Pay-as-you-go Guthaben hinzu",
@@ -256,10 +264,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "folgenden Ausnahmen",
"go.title": "OpenCode Go | Kostengünstige Coding-Modelle für alle",
"go.banner.text": "Hy3 erhält für begrenzte Zeit 8x Nutzungslimits",
"go.meta.description":
"Go beginnt bei $5 für deinen ersten Monat, danach $10/Monat, mit großzügigen Nutzungslimits und zuverlässigem Zugang zu führenden Coding-Modellen.",
"Go kostet $10/Monat, mit großzügigen Nutzungslimits und zuverlässigem Zugang zu führenden Coding-Modellen.",
"go.hero.title": "Kostengünstige Coding-Modelle für alle",
"go.hero.tagline": "Mit jedem Agenten nutzbar. Guthaben bei Bedarf aufladen. Jederzeit kündbar.",
"go.hero.body":
"Go bringt Agentic Coding zu Programmierern auf der ganzen Welt. Mit großzügigen Limits und zuverlässigem Zugang zu den leistungsfähigsten Open-Source-Modellen, damit du mit leistungsstarken Agenten entwickeln kannst, ohne dir Gedanken über Kosten oder Verfügbarkeit zu machen.",
@@ -267,13 +275,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Go abonnieren",
"go.cta.price": "$10/Monat",
"go.cta.promo": "$5 im ersten Monat",
"go.pricing.body":
"Mit jedem Agenten nutzbar. $5 im ersten Monat, danach $10/Monat. Guthaben bei Bedarf aufladen. Jederzeit kündbar.",
"go.plans.month": "pro Monat",
"go.plans.plus.cta": "Go Plus abonnieren",
"go.plans.plus.description": "Go Plus kostet $40/Monat und bietet höhere Nutzungslimits.",
"go.plans.go.feature1": "Ausgewählte, erschwingliche Modelle",
"go.plans.go.feature2": "Für agentisches Programmieren getestet",
"go.plans.go.feature3": "Großzügige Limits und zuverlässiger Zugriff",
"go.plans.plus.feature1": "Alle Vorteile von Go",
"go.plans.plus.feature2": "Höhere Limits für längere, konzentrierte Coding-Sessions",
"go.plans.plus.feature3": "Für größere, anspruchsvolle Projekte",
"go.plans.limits": "Limits",
"go.plans.description": "Geschätzte Anfragen pro 5 Stunden und monatliche Nutzungslimits je Modell",
"go.plans.legend": "Tarife",
"go.pricing.body": "Mit jedem Agenten nutzbar. $10/Monat. Guthaben bei Bedarf aufladen. Jederzeit kündbar.",
"go.graph.free": "Kostenlos",
"go.graph.freePill": "Big Pickle und kostenlose Modelle",
"go.graph.go": "Go",
"go.graph.label": "Anfragen pro 5 Stunden",
"go.graph.period": "Nutzung",
"go.graph.model": "Modell",
"go.graph.requests": "Geschätzte Anfragen / 5 Std.",
"go.graph.allowance": "Monatliche Nutzung",
"go.graph.new": "Neu",
"go.graph.scale": "Nichtlineare Skala für Anfragen",
"go.graph.showAll": "Alle {{count}} Modelle anzeigen",
"go.graph.showLess": "Weniger Modelle anzeigen",
"go.graph.limitedRegions": "begrenzte Regionen",
"go.graph.limitedTime": "begrenzte Zeit",
"go.graph.usageLimits": "Nutzungslimits",
"go.graph.aria": "Anfragen pro 5h: {{free}} vs {{go}}",
@@ -300,21 +328,20 @@ export const dict = {
"go.testimonials.frank.quote": "Ich wünschte, ich wäre noch bei Nvidia.",
"go.problem.title": "Welches Problem löst Go?",
"go.problem.body":
"Wir konzentrieren uns darauf, die OpenCode-Erfahrung so vielen Menschen wie möglich zugänglich zu machen. OpenCode Go ist ein kostengünstiges Abonnement: $5 im ersten Monat, danach $10/Monat. Es bietet großzügige Limits und zuverlässigen Zugang zu den leistungsfähigsten Open-Source-Modellen.",
"Wir konzentrieren uns darauf, die OpenCode-Erfahrung so vielen Menschen wie möglich zugänglich zu machen. OpenCode Go ist ein kostengünstiges Abonnement für $10/Monat. Es bietet großzügige Limits und zuverlässigen Zugang zu den leistungsfähigsten Open-Source-Modellen.",
"go.problem.subtitle": " ",
"go.problem.item1": "Kostengünstiges Abonnement",
"go.problem.item2": "Großzügige Limits und zuverlässiger Zugang",
"go.problem.item3": "Für so viele Programmierer wie möglich gebaut",
"go.problem.item4": "Eine kuratierte, für Agentic Coding getestete Modellauswahl",
"go.how.title": "Wie Go funktioniert",
"go.how.body":
"Go beginnt bei $5 für den ersten Monat, danach $10/Monat. Du kannst es mit OpenCode oder jedem Agenten nutzen.",
"go.how.body": "Go kostet $10/Monat. Du kannst es mit OpenCode oder jedem Agenten nutzen.",
"go.how.step1.title": "Konto erstellen",
"go.how.step1.beforeLink": "folge den",
"go.how.step1.link": "Einrichtungsanweisungen",
"go.how.step2.title": "Go abonnieren",
"go.how.step2.link": "$5 im ersten Monat",
"go.how.step2.afterLink": "danach $10/Monat mit großzügigen Limits",
"go.how.step2.link": "$10/Monat",
"go.how.step2.afterLink": "mit großzügigen Limits",
"go.how.step3.title": "Loslegen mit Coding",
"go.how.step3.body": "mit zuverlässigem Zugang zu Open-Source-Modellen",
"go.privacy.title": "Deine Privatsphäre ist uns wichtig",
@@ -331,11 +358,11 @@ export const dict = {
"go.faq.a2": "Go umfasst die unten aufgeführten Modelle mit großzügigen Limits und zuverlässigem Zugriff.",
"go.faq.q3": "Ist Go dasselbe wie Zen?",
"go.faq.a3":
"Nein. Zen ist Pay-as-you-go, während Go bei $5 für deinen ersten Monat beginnt, danach $10/Monat, mit großzügigen Limits und zuverlässigem Zugang zu einer kuratierten Modellauswahl.",
"Nein. Zen ist Pay-as-you-go, während Go $10/Monat kostet, mit großzügigen Limits und zuverlässigem Zugang zu einer kuratierten Modellauswahl.",
"go.faq.q4": "Wie viel kostet Go?",
"go.faq.a4.p1.beforePricing": "Go kostet",
"go.faq.a4.p1.pricingLink": "$5 im ersten Monat",
"go.faq.a4.p1.afterPricing": "danach $10/Monat mit großzügigen Limits.",
"go.faq.a4.p1.pricingLink": "$10/Monat",
"go.faq.a4.p1.afterPricing": "mit großzügigen Limits.",
"go.faq.a4.p2.beforeAccount": "Du kannst dein Abonnement in deinem",
"go.faq.a4.p2.accountLink": "Konto verwalten",
"go.faq.a4.p3": "Jederzeit kündbar.",
@@ -345,15 +372,19 @@ export const dict = {
"go.faq.a5.retention": "Datenaufbewahrung",
"go.faq.a5.retention30": "30 Tage",
"go.faq.a5.retention0": "0 Tage",
"go.faq.a5.used": "Verwendet",
"go.faq.a5.notUsed": "Nicht verwendet",
"go.faq.a5.noAgreement": "Keine Vereinbarung",
"go.faq.a5.notZdr": "Kein ZDR",
"go.faq.a5.grokRetention":
"ZDR deaktiviert wichtige API-Funktionen, die von gespeicherten Daten abhängen, einschließlich der zustandsbehafteten Responses API, Files and Collections und der Batch API.",
"go.faq.a5.gptRetention":
"Für die Nutzung aller API-Funktionen werden Protokolle zur Missbrauchsüberwachung erstellt und bis zu 30 Tage lang aufbewahrt.",
"go.faq.a5.museRetention":
"Stark vergünstigte Tokenpreise im Gegenzug für die Erlaubnis, deine Prompts und Vervollständigungen zum Trainieren zukünftiger Meta-Modelle zu verwenden.",
"go.faq.a5.learnMore": "Mehr erfahren",
"go.faq.a5.deepseekRetention":
"Die ZDR-Vereinbarung wird monatlich erneuert. Die aktuelle Vereinbarung gilt bis einschließlich 31. August 2026.",
"Die ZDR-Vereinbarung wird monatlich erneuert. Die aktuelle Vereinbarung gilt bis einschließlich 30. September 2026.",
"go.faq.a5.beforeExceptions":
"Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den",
"go.faq.a5.exceptionsLink": "folgenden Ausnahmen",
@@ -367,7 +398,10 @@ export const dict = {
"go.faq.q9": "Was ist der Unterschied zwischen kostenlosen Modellen und Go?",
"go.faq.a9":
"Kostenlose Modelle beinhalten Big Pickle sowie Werbemodelle, die zum jeweiligen Zeitpunkt verfügbar sind, mit einem Kontingent von 200 Anfragen/Tag. Go bietet eine kuratierte Modellauswahl mit höheren Anfragekontingenten, die über rollierende Zeitfenster (5 Stunden, wöchentlich und monatlich) durchgesetzt werden, grob äquivalent zu $12 pro 5 Stunden, $30 pro Woche und $60 pro Monat (tatsächliche Anfragezahlen variieren je nach Modell und Nutzung).",
"Kostenlose Modelle beinhalten Big Pickle sowie Werbemodelle, die zum jeweiligen Zeitpunkt verfügbar sind, mit einem Kontingent von 200 Anfragen/Tag. Go bietet eine kuratierte Modellauswahl mit höheren Anfragekontingenten in rollierenden Zeitfenstern: 20 % des monatlichen Kontingents pro 5 Stunden, 50 % pro Woche und 100 % pro Monat. Modellspezifische Kontingente können abweichen (tatsächliche Anfragezahlen variieren je nach Modell und Nutzung).",
"go.faq.q10": "Kann ich eine Rückerstattung erhalten?",
"go.faq.a10":
"Du hast möglicherweise Anspruch auf eine Rückerstattung, wenn die Zahlung innerhalb der letzten 14 Tage erfolgt ist und du dein Go-Kontingent in diesem Abrechnungszeitraum nicht genutzt hast. {{contact}}, um eine Rückerstattung anzufordern.",
"zen.api.error.rateLimitExceeded": "Ratenlimit überschritten. Bitte versuche es später erneut.",
"zen.api.error.modelNotSupported": "Modell {{model}} wird nicht unterstützt",
@@ -631,7 +665,6 @@ export const dict = {
"workspace.payments.type.subscription": "Abonnement",
"workspace.payments.view": "Ansehen",
"workspace.black.loading": "Lade...",
"workspace.black.time.day": "Tag",
"workspace.black.time.days": "Tage",
"workspace.black.time.hour": "Stunde",
@@ -641,7 +674,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "einige Sekunden",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du hast OpenCode Black für ${{plan}} pro Monat abonniert.",
"workspace.black.subscription.manage": "Abo verwalten",
"workspace.black.subscription.ending":
"OpenCode Black endet mit deinem aktuellen Abrechnungszeitraum und wird nicht verlängert. Wir ziehen dich in die neue Konsole um.",
"workspace.black.subscription.rollingUsage": "5-Stunden-Nutzung",
"workspace.black.subscription.weeklyUsage": "Wöchentliche Nutzung",
"workspace.black.subscription.resetsIn": "Setzt zurück in",
@@ -668,23 +702,32 @@ 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.',
"workspace.lite.providers.title": "Anbieter",
"workspace.lite.providers.description": "Steuere, welche Anbieter für das Routing verwendet werden.",
"workspace.lite.providers.allowTraining": "Modelle zulassen, die mit Anfragedaten trainieren",
"workspace.lite.providers.useChina": "In China gehostete Modelle aktivieren",
"workspace.lite.black.message":
"Du hast derzeit OpenCode Black abonniert oder stehst auf der Warteliste. Bitte kündige zuerst, wenn du zu Go wechseln möchtest.",
"workspace.lite.other.message":
"Ein anderes Mitglied in diesem Workspace hat OpenCode Go bereits abonniert. Nur ein Mitglied pro Workspace kann abonnieren.",
"workspace.lite.promo.description":
"OpenCode Go startet bei {{price}}, danach $10/Monat, und bietet zuverlässigen Zugang zu beliebten offenen Coding-Modellen mit großzügigen Nutzungslimits.",
"workspace.lite.promo.price": "$5 im ersten Monat",
"OpenCode Go kostet {{price}} und bietet zuverlässigen Zugang zu beliebten offenen Coding-Modellen mit großzügigen Nutzungslimits.",
"workspace.lite.promo.price": "$10/Monat",
"workspace.lite.promo.modelsTitle": "Was enthalten ist",
"workspace.lite.promo.footer":
"Der Plan richtet sich in erster Linie an internationale Nutzer und bietet stabilen weltweiten Zugriff. Preise und Nutzungslimits können sich ändern, wenn wir Erkenntnisse aus der ersten Nutzung und dem Feedback gewinnen.",
@@ -779,6 +822,15 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefonnummer",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label":
"Wie hoch sind die aktuellen monatlichen Inferenzausgaben Ihres Unternehmens (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Bereich auswählen (optional)",
"enterprise.form.inferenceSpend.none": "Noch keine Ausgaben",
"enterprise.form.inferenceSpend.under1k": "Unter $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K oder mehr",
"enterprise.form.message.label": "Welches Problem versuchen Sie zu lösen?",
"enterprise.form.message.placeholder": "Wir brauchen Hilfe bei...",
"enterprise.form.send": "Senden",
@@ -787,6 +839,7 @@ export const dict = {
"enterprise.form.success.submitted": "Formular erfolgreich gesendet.",
"enterprise.form.error.allFieldsRequired": "Alle Felder sind erforderlich.",
"enterprise.form.error.invalidEmailFormat": "Ungültiges E-Mail-Format.",
"enterprise.form.error.invalidInferenceSpend": "Wählen Sie einen gültigen Bereich für die Inferenzausgaben.",
"enterprise.form.error.internalServer": "Interner Serverfehler.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Was ist OpenCode Enterprise?",
+73 -20
View File
@@ -1,4 +1,8 @@
export const dict = {
"go.referral.ended.label": "Warning",
"go.referral.ended":
"The referral program has ended. Referral links no longer earn credit for you or the person who shared them.",
"go.graph.bonus": "{{count}}× usage",
"nav.github": "GitHub",
"nav.docs": "Docs",
"nav.data": "Data",
@@ -7,6 +11,8 @@ export const dict = {
"nav.x": "X",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.models": "Models",
"nav.teams": "Teams",
"nav.go": "Go",
"nav.login": "Login",
"nav.free": "Download",
@@ -225,6 +231,9 @@ export const dict = {
"zen.faq.q8": "Can I use Zen with other coding agents?",
"zen.faq.a8":
"While Zen works great with OpenCode, you can use Zen with any agent. Follow the setup instructions in your preferred coding agent.",
"zen.faq.q9": "Can I get a refund?",
"zen.faq.a9":
"You may qualify for a refund if the charge was made within the last 14 days and you have not used the credits from that purchase. {{contact}} to request a refund.",
"zen.cta.start": "Get started with Zen",
"zen.pricing.title": "Add $20 Pay as you go balance",
@@ -253,10 +262,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "following exceptions",
"go.title": "OpenCode Go | Low cost coding models for everyone",
"go.banner.text": "Hy3 gets 8× usage limits for a limited time",
"go.meta.description":
"Go starts at $5 for your first month, then $10/month, with generous usage limits and reliable access to leading coding models.",
"go.meta.description": "Go costs $10/month, with generous usage limits and reliable access to leading coding models.",
"go.hero.title": "Low cost coding models for everyone",
"go.hero.tagline": "Use with any agent. Top up credit if needed. Cancel any time.",
"go.hero.body":
"Go brings agentic coding to programmers around the world. Offering generous limits and reliable access to the most capable open-source models, so you can build with powerful agents without worrying about cost or availability.",
@@ -264,12 +272,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Subscribe to Go",
"go.cta.price": "$10/month",
"go.cta.promo": "$5 first month",
"go.pricing.body": "Use with any agent. $5 first month, then $10/month. Top up credit if needed. Cancel any time.",
"go.plans.month": "per month",
"go.plans.plus.cta": "Subscribe to Go Plus",
"go.plans.plus.description": "Go Plus costs $40/month with higher limits.",
"go.plans.go.feature1": "Curated, affordable models",
"go.plans.go.feature2": "Tested for agentic coding",
"go.plans.go.feature3": "Generous limits and reliable access",
"go.plans.plus.feature1": "Everything included in Go",
"go.plans.plus.feature2": "Higher limits and fewer interruptions",
"go.plans.plus.feature3": "Built for larger, demanding projects",
"go.plans.limits": "Limits",
"go.plans.description": "Estimated requests per 5 hours and monthly usage limits by model",
"go.plans.legend": "Plans",
"go.pricing.body": "Use with any agent. $10/month. Top up credit if needed. Cancel any time.",
"go.graph.free": "Free",
"go.graph.freePill": "Big Pickle and free models",
"go.graph.go": "Go",
"go.graph.label": "Requests per 5 hour",
"go.graph.label": "Requests / 5 hours",
"go.graph.period": "Usage",
"go.graph.model": "Model",
"go.graph.requests": "Est. requests / 5h",
"go.graph.allowance": "Monthly usage",
"go.graph.new": "New",
"go.graph.scale": "Nonlinear request scale",
"go.graph.showAll": "View all {{count}} models",
"go.graph.showLess": "Show fewer models",
"go.graph.limitedRegions": "Limited Regions",
"go.graph.limitedTime": "Limited Time",
"go.graph.tick": "{{n}}x",
"go.graph.usageLimits": "Usage limits",
"go.graph.aria": "Requests per 5h: {{free}} vs {{go}}",
@@ -297,20 +326,20 @@ export const dict = {
"go.testimonials.frank.quote": "I wish I was still at Nvidia.",
"go.problem.title": "What problem is Go solving?",
"go.problem.body":
"We're focused on bringing the OpenCode experience to as many people as possible. OpenCode Go is a low cost subscription: $5 for your first month, then $10/month. It provides generous limits and reliable access to the most capable open source models.",
"We're focused on bringing the OpenCode experience to as many people as possible. OpenCode Go is a low cost $10/month subscription. It provides generous limits and reliable access to the most capable open source models.",
"go.problem.subtitle": " ",
"go.problem.item1": "Low cost subscription pricing",
"go.problem.item2": "Generous limits and reliable access",
"go.problem.item3": "Built for as many programmers as possible",
"go.problem.item4": "A curated model lineup tested for agentic coding",
"go.how.title": "How Go works",
"go.how.body": "Go starts at $5 for your first month, then $10/month. You can use it with OpenCode or any agent.",
"go.how.body": "Go costs $10/month. You can use it with OpenCode or any agent.",
"go.how.step1.title": "Create an account",
"go.how.step1.beforeLink": "follow the",
"go.how.step1.link": "setup instructions",
"go.how.step2.title": "Subscribe to Go",
"go.how.step2.link": "$5 first month",
"go.how.step2.afterLink": "then $10/month with generous limits",
"go.how.step2.link": "$10/month",
"go.how.step2.afterLink": "with generous limits",
"go.how.step3.title": "Start coding",
"go.how.step3.body": "with reliable access to open-source models",
"go.privacy.title": "Your privacy is important to us",
@@ -327,11 +356,11 @@ export const dict = {
"go.faq.a2": "Go includes the models listed below, with generous limits and reliable access.",
"go.faq.q3": "Is Go the same as Zen?",
"go.faq.a3":
"No. Zen is pay-as-you-go, while Go starts at $5 for your first month, then $10/month, with generous limits and reliable access to a curated model lineup.",
"No. Zen is pay-as-you-go, while Go costs $10/month, with generous limits and reliable access to a curated model lineup.",
"go.faq.q4": "How much does Go cost?",
"go.faq.a4.p1.beforePricing": "Go costs",
"go.faq.a4.p1.pricingLink": "$5 first month",
"go.faq.a4.p1.afterPricing": "then $10/month with generous limits.",
"go.faq.a4.p1.pricingLink": "$10/month",
"go.faq.a4.p1.afterPricing": "with generous limits.",
"go.faq.a4.p2.beforeAccount": "You can manage your subscription in your",
"go.faq.a4.p2.accountLink": "account",
"go.faq.a4.p3": "Cancel any time.",
@@ -341,14 +370,18 @@ export const dict = {
"go.faq.a5.retention": "Data retention",
"go.faq.a5.retention30": "30 days",
"go.faq.a5.retention0": "0 days",
"go.faq.a5.used": "Used",
"go.faq.a5.notUsed": "Not used",
"go.faq.a5.noAgreement": "No agreement",
"go.faq.a5.notZdr": "Not ZDR",
"go.faq.a5.grokRetention":
"ZDR disables important API features that depend on stored data, including the stateful Responses API, Files and Collections, and the Batch API.",
"go.faq.a5.gptRetention":
"Abuse monitoring logs are generated for all API feature usage and retained for up to 30 days.",
"go.faq.a5.museRetention":
"Heavily discounted token pricing in exchange for permission to use your prompts and completions to train future Meta models.",
"go.faq.a5.deepseekRetention":
"ZDR agreement is renewed monthly. The current agreement is valid through August 31, 2026.",
"ZDR agreement is renewed monthly. The current agreement is valid through September 30, 2026.",
"go.faq.a5.learnMore": "Learn more",
"go.faq.a5.beforeExceptions":
@@ -363,7 +396,10 @@ export const dict = {
"go.faq.q9": "What is the difference between free models and Go?",
"go.faq.a9":
"Free models include Big Pickle plus promotional models available at the time, with a quota of 200 requests/day. Go offers a curated model lineup with higher request quotas enforced across rolling windows (5-hour, weekly, and monthly), roughly equivalent to $12 per 5 hours, $30 per week, and $60 per month (actual request counts vary by model and usage).",
"Free models include Big Pickle plus promotional models available at the time, with a quota of 200 requests/day. Go offers a curated model lineup with higher request quotas enforced across rolling windows: 20% of the monthly allowance per 5 hours, 50% per week, and 100% per month. Model-specific allowances may differ (actual request counts vary by model and usage).",
"go.faq.q10": "Can I get a refund?",
"go.faq.a10":
"You may qualify for a refund if the charge was made within the last 14 days and you have not used your Go allowance during that billing period. {{contact}} to request a refund.",
"zen.api.error.rateLimitExceeded": "Rate limit exceeded. Please try again later.",
"zen.api.error.modelNotSupported": "Model {{model}} is not supported",
@@ -628,7 +664,6 @@ export const dict = {
"workspace.payments.type.subscription": "subscription",
"workspace.payments.view": "View",
"workspace.black.loading": "Loading...",
"workspace.black.time.day": "day",
"workspace.black.time.days": "days",
"workspace.black.time.hour": "hour",
@@ -638,7 +673,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "a few seconds",
"workspace.black.subscription.title": "Subscription",
"workspace.black.subscription.message": "You are subscribed to OpenCode Black for ${{plan}} per month.",
"workspace.black.subscription.manage": "Manage Subscription",
"workspace.black.subscription.ending":
"OpenCode Black ends with your current billing period and won't renew. We'll move you to the new console.",
"workspace.black.subscription.rollingUsage": "5-hour Usage",
"workspace.black.subscription.weeklyUsage": "Weekly Usage",
"workspace.black.subscription.resetsIn": "Resets in",
@@ -665,10 +701,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.',
@@ -681,8 +725,8 @@ export const dict = {
"workspace.lite.other.message":
"Another member in this workspace is already subscribed to OpenCode Go. Only one member per workspace can subscribe.",
"workspace.lite.promo.description":
"OpenCode Go starts at {{price}}, then $10/month, and provides reliable access to popular open coding models with generous usage limits.",
"workspace.lite.promo.price": "$5 for your first month",
"OpenCode Go costs {{price}} and provides reliable access to popular open coding models with generous usage limits.",
"workspace.lite.promo.price": "$10/month",
"workspace.lite.promo.modelsTitle": "What's Included",
"workspace.lite.promo.footer":
"The plan is designed primarily for international users and provides stable global access. Pricing and usage limits may change as we learn from early usage and feedback.",
@@ -773,6 +817,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Phone number",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "What is your company's current monthly inference spend (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Select a range (optional)",
"enterprise.form.inferenceSpend.none": "Not spending yet",
"enterprise.form.inferenceSpend.under1k": "Under $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K or more",
"enterprise.form.message.label": "What problem are you trying to solve?",
"enterprise.form.message.placeholder": "We need help with...",
"enterprise.form.send": "Send",
@@ -781,6 +833,7 @@ export const dict = {
"enterprise.form.success.submitted": "Form submitted successfully.",
"enterprise.form.error.allFieldsRequired": "All fields are required.",
"enterprise.form.error.invalidEmailFormat": "Invalid email format.",
"enterprise.form.error.invalidInferenceSpend": "Select a valid inference spend range.",
"enterprise.form.error.internalServer": "Internal server error.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "What is OpenCode Enterprise?",
+72 -18
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Advertencia",
"go.referral.ended":
"El programa de referidos ha terminado. Los enlaces de referido ya no otorgan crédito ni a ti ni a quien los compartió.",
"go.graph.bonus": "{{count}}× de uso",
"nav.github": "GitHub",
"nav.docs": "Documentación",
"nav.changelog": "Registro de cambios",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "Cancelar",
"common.creating": "Creando...",
"common.create": "Crear",
"common.contactUs": "Contáctanos",
"common.videoUnsupported": "Tu navegador no soporta la etiqueta de video.",
"common.figure": "Fig {{n}}.",
@@ -229,6 +234,9 @@ export const dict = {
"zen.faq.q8": "¿Puedo usar Zen con otros agentes de codificación?",
"zen.faq.a8":
"Aunque Zen funciona genial con OpenCode, puedes usar Zen con cualquier agente. Sigue las instrucciones de configuración en tu agente de codificación preferido.",
"zen.faq.q9": "¿Puedo obtener un reembolso?",
"zen.faq.a9":
"Podrías tener derecho a un reembolso si el cargo se realizó en los últimos 14 días y no has utilizado el crédito de esa compra. {{contact}} para solicitar un reembolso.",
"zen.cta.start": "Empieza con Zen",
"zen.pricing.title": "Añade $20 de saldo prepago",
@@ -257,10 +265,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "siguientes excepciones",
"go.title": "OpenCode Go | Modelos de programación de bajo coste para todos",
"go.banner.text": "Hy3 tiene límites de uso 8x mayores por tiempo limitado",
"go.meta.description":
"Go comienza en $5 el primer mes, luego 10 $/mes, con límites de uso generosos y acceso fiable a modelos de programación líderes.",
"Go cuesta 10 $/mes, con límites de uso generosos y acceso fiable a modelos de programación líderes.",
"go.hero.title": "Modelos de programación de bajo coste para todos",
"go.hero.tagline": "Úsalo con cualquier agente. Recarga crédito si lo necesitas. Cancela cuando quieras.",
"go.hero.body":
"Go lleva la programación agéntica a programadores de todo el mundo. Ofrece límites generosos y acceso fiable a los modelos de código abierto más capaces, para que puedas crear con agentes potentes sin preocuparte por el coste o la disponibilidad.",
@@ -268,13 +276,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Suscribirse a Go",
"go.cta.price": "10 $/mes",
"go.cta.promo": "$5 el primer mes",
"go.plans.month": "al mes",
"go.plans.plus.cta": "Suscribirse a Go Plus",
"go.plans.plus.description": "Go Plus cuesta 40 $/mes y ofrece límites más altos.",
"go.plans.go.feature1": "Modelos seleccionados y asequibles",
"go.plans.go.feature2": "Probados para programación con agentes",
"go.plans.go.feature3": "Límites generosos y acceso fiable",
"go.plans.plus.feature1": "Todo lo incluido en Go",
"go.plans.plus.feature2": "Límites más altos para programar durante más tiempo con concentración",
"go.plans.plus.feature3": "Para proyectos más grandes y exigentes",
"go.plans.limits": "Límites",
"go.plans.description": "Solicitudes estimadas cada 5 horas y límites mensuales por modelo",
"go.plans.legend": "Planes",
"go.pricing.body":
"Úsalo con cualquier agente. $5 el primer mes, luego 10 $/mes. Recarga crédito si es necesario. Cancela en cualquier momento.",
"Úsalo con cualquier agente. 10 $/mes. Recarga crédito si es necesario. Cancela en cualquier momento.",
"go.graph.free": "Gratis",
"go.graph.freePill": "Big Pickle y modelos gratuitos",
"go.graph.go": "Go",
"go.graph.label": "Solicitudes por 5 horas",
"go.graph.period": "Uso",
"go.graph.model": "Modelo",
"go.graph.requests": "Peticiones estimadas / 5 h",
"go.graph.allowance": "Uso mensual",
"go.graph.new": "Nuevo",
"go.graph.scale": "Escala no lineal de peticiones",
"go.graph.showAll": "Ver los {{count}} modelos",
"go.graph.showLess": "Mostrar menos modelos",
"go.graph.limitedRegions": "regiones limitadas",
"go.graph.limitedTime": "tiempo limitado",
"go.graph.usageLimits": "Límites de uso",
"go.graph.aria": "Solicitudes por 5h: {{free}} vs {{go}}",
@@ -302,20 +331,20 @@ export const dict = {
"go.testimonials.frank.quote": "Ojalá siguiera en Nvidia.",
"go.problem.title": "¿Qué problema resuelve Go?",
"go.problem.body":
"Nos enfocamos en llevar la experiencia de OpenCode a tantas personas como sea posible. OpenCode Go es una suscripción de bajo coste: $5 el primer mes, luego 10 $/mes. Proporciona límites generosos y acceso fiable a los modelos de código abierto más capaces.",
"Nos enfocamos en llevar la experiencia de OpenCode a tantas personas como sea posible. OpenCode Go es una suscripción de bajo coste de 10 $/mes. Proporciona límites generosos y acceso fiable a los modelos de código abierto más capaces.",
"go.problem.subtitle": " ",
"go.problem.item1": "Precios de suscripción de bajo coste",
"go.problem.item2": "Límites generosos y acceso fiable",
"go.problem.item3": "Creado para tantos programadores como sea posible",
"go.problem.item4": "Una selección de modelos probados para programación agéntica",
"go.how.title": "Cómo funciona Go",
"go.how.body": "Go comienza en $5 el primer mes, luego 10 $/mes. Puedes usarlo con OpenCode o cualquier agente.",
"go.how.body": "Go cuesta 10 $/mes. Puedes usarlo con OpenCode o cualquier agente.",
"go.how.step1.title": "Crear una cuenta",
"go.how.step1.beforeLink": "sigue las",
"go.how.step1.link": "instrucciones de configuración",
"go.how.step2.title": "Suscribirse a Go",
"go.how.step2.link": "$5 el primer mes",
"go.how.step2.afterLink": "luego 10 $/mes con límites generosos",
"go.how.step2.link": "10 $/mes",
"go.how.step2.afterLink": "con límites generosos",
"go.how.step3.title": "Empezar a programar",
"go.how.step3.body": "con acceso fiable a modelos de código abierto",
"go.privacy.title": "Tu privacidad es importante para nosotros",
@@ -332,11 +361,11 @@ export const dict = {
"go.faq.a2": "Go incluye los modelos que se indican abajo, con límites generosos y acceso confiable.",
"go.faq.q3": "¿Es Go lo mismo que Zen?",
"go.faq.a3":
"No. Zen es de pago por uso, mientras que Go comienza en $5 el primer mes, luego 10 $/mes, con límites generosos y acceso fiable a una selección de modelos.",
"No. Zen es de pago por uso, mientras que Go cuesta 10 $/mes, con límites generosos y acceso fiable a una selección de modelos.",
"go.faq.q4": "¿Cuánto cuesta Go?",
"go.faq.a4.p1.beforePricing": "Go cuesta",
"go.faq.a4.p1.pricingLink": "$5 el primer mes",
"go.faq.a4.p1.afterPricing": "luego 10 $/mes con límites generosos.",
"go.faq.a4.p1.pricingLink": "10 $/mes",
"go.faq.a4.p1.afterPricing": "con límites generosos.",
"go.faq.a4.p2.beforeAccount": "Puedes gestionar tu suscripción en tu",
"go.faq.a4.p2.accountLink": "cuenta",
"go.faq.a4.p3": "Cancela en cualquier momento.",
@@ -346,15 +375,19 @@ export const dict = {
"go.faq.a5.retention": "Retención de datos",
"go.faq.a5.retention30": "30 días",
"go.faq.a5.retention0": "0 días",
"go.faq.a5.used": "Utilizado",
"go.faq.a5.notUsed": "No utilizado",
"go.faq.a5.noAgreement": "Sin acuerdo",
"go.faq.a5.notZdr": "Sin ZDR",
"go.faq.a5.grokRetention":
"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.",
"go.faq.a5.gptRetention":
"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.",
"go.faq.a5.museRetention":
"Precios de tokens muy reducidos a cambio de permitir que tus prompts y las respuestas generadas se utilicen para entrenar futuros modelos de Meta.",
"go.faq.a5.learnMore": "Más información",
"go.faq.a5.deepseekRetention":
"El acuerdo de ZDR se renueva mensualmente. El acuerdo actual es válido hasta el 31 de agosto de 2026.",
"El acuerdo de ZDR se renueva mensualmente. El acuerdo actual es válido hasta el 30 de septiembre de 2026.",
"go.faq.a5.beforeExceptions":
"Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las",
"go.faq.a5.exceptionsLink": "siguientes excepciones",
@@ -368,7 +401,10 @@ export const dict = {
"go.faq.q9": "¿Cuál es la diferencia entre los modelos gratuitos y Go?",
"go.faq.a9":
"Los modelos gratuitos incluyen Big Pickle y los modelos promocionales disponibles en ese momento, con una cuota de 200 solicitudes/día. Go ofrece una selección de modelos con cuotas de solicitudes más altas aplicadas en ventanas móviles (de 5 horas, semanales y mensuales), aproximadamente equivalentes a 12 $ por 5 horas, 30 $ por semana y 60 $ por mes (la cantidad real de solicitudes varía según el modelo y el uso).",
"Los modelos gratuitos incluyen Big Pickle y los modelos promocionales disponibles en ese momento, con una cuota de 200 solicitudes/día. Go ofrece una selección de modelos con cuotas de solicitudes más altas en ventanas móviles: el 20 % de la cuota mensual cada 5 horas, el 50 % por semana y el 100 % por mes. Las cuotas específicas pueden variar según el modelo (la cantidad real de solicitudes varía según el modelo y el uso).",
"go.faq.q10": "¿Puedo obtener un reembolso?",
"go.faq.a10":
"Podrías tener derecho a un reembolso si el cargo se realizó en los últimos 14 días y no has utilizado tu cuota de Go durante ese periodo de facturación. {{contact}} para solicitar un reembolso.",
"zen.api.error.rateLimitExceeded": "Límite de tasa excedido. Por favor, inténtalo de nuevo más tarde.",
"zen.api.error.modelNotSupported": "Modelo {{model}} no soportado",
@@ -632,7 +668,6 @@ export const dict = {
"workspace.payments.type.subscription": "suscripción",
"workspace.payments.view": "Ver",
"workspace.black.loading": "Cargando...",
"workspace.black.time.day": "día",
"workspace.black.time.days": "días",
"workspace.black.time.hour": "hora",
@@ -642,7 +677,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "unos pocos segundos",
"workspace.black.subscription.title": "Suscripción",
"workspace.black.subscription.message": "Estás suscrito a OpenCode Black por ${{plan}} al mes.",
"workspace.black.subscription.manage": "Gestionar Suscripción",
"workspace.black.subscription.ending":
"OpenCode Black finaliza con tu periodo de facturación actual y no se renovará. Te trasladaremos a la nueva consola.",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso Semanal",
"workspace.black.subscription.resetsIn": "Se reinicia en",
@@ -669,23 +705,32 @@ 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.',
"workspace.lite.providers.title": "Proveedores",
"workspace.lite.providers.description": "Controla qué proveedores se usan para el enrutamiento.",
"workspace.lite.providers.allowTraining": "Permitir modelos que se entrenan con los datos de las solicitudes",
"workspace.lite.providers.useChina": "Activar modelos alojados en China",
"workspace.lite.black.message":
"Actualmente estás suscrito a OpenCode Black o estás en la lista de espera. Por favor, cancela la suscripción primero si deseas cambiar a Go.",
"workspace.lite.other.message":
"Otro miembro de este espacio de trabajo ya está suscrito a OpenCode Go. Solo un miembro por espacio de trabajo puede suscribirse.",
"workspace.lite.promo.description":
"OpenCode Go comienza en {{price}}, luego $10/mes, y ofrece acceso confiable a modelos de codificación abiertos populares con límites de uso generosos.",
"workspace.lite.promo.price": "$5 el primer mes",
"OpenCode Go cuesta {{price}} y ofrece acceso confiable a modelos de codificación abiertos populares con límites de uso generosos.",
"workspace.lite.promo.price": "$10/mes",
"workspace.lite.promo.modelsTitle": "Qué incluye",
"workspace.lite.promo.footer":
"El plan está diseñado principalmente para usuarios internacionales y ofrece un acceso global estable. Los precios y los límites de uso pueden cambiar a medida que aprendemos del uso inicial y de los comentarios recibidos.",
@@ -778,6 +823,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Teléfono",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "¿Cuál es el gasto mensual actual de tu empresa en inferencia (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Selecciona un rango (opcional)",
"enterprise.form.inferenceSpend.none": "Aún sin gasto",
"enterprise.form.inferenceSpend.under1k": "Menos de $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K o más",
"enterprise.form.message.label": "¿Qué problema estás intentando resolver?",
"enterprise.form.message.placeholder": "Necesitamos ayuda con...",
"enterprise.form.send": "Enviar",
@@ -786,6 +839,7 @@ export const dict = {
"enterprise.form.success.submitted": "Formulario enviado con éxito.",
"enterprise.form.error.allFieldsRequired": "Todos los campos son obligatorios.",
"enterprise.form.error.invalidEmailFormat": "Formato de correo inválido.",
"enterprise.form.error.invalidInferenceSpend": "Selecciona un rango de gasto en inferencia válido.",
"enterprise.form.error.internalServer": "Error interno del servidor.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "¿Qué es OpenCode Enterprise?",
+74 -20
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Avertissement",
"go.referral.ended":
"Le programme de parrainage est terminé. Les liens de parrainage ne donnent plus de crédit, ni à vous ni à la personne qui les a partagés.",
"go.graph.bonus": "{{count}}× d’utilisation",
"app.meta.description": "OpenCode - L'agent de code open source.",
"nav.github": "GitHub",
"nav.docs": "Documentation",
@@ -57,6 +61,7 @@ export const dict = {
"common.cancel": "Annuler",
"common.creating": "Création...",
"common.create": "Créer",
"common.contactUs": "Contactez-nous",
"common.videoUnsupported": "Votre navigateur ne prend pas en charge la balise vidéo.",
"common.figure": "Fig {{n}}.",
@@ -227,6 +232,9 @@ export const dict = {
"zen.faq.q8": "Puis-je utiliser Zen avec d'autres agents de code ?",
"zen.faq.a8":
"Zen fonctionne très bien avec OpenCode, mais vous pouvez utiliser Zen avec n'importe quel agent. Suivez les instructions de configuration dans votre agent préféré.",
"zen.faq.q9": "Puis-je obtenir un remboursement ?",
"zen.faq.a9":
"Vous pourriez avoir droit à un remboursement si le paiement a été effectué au cours des 14 derniers jours et que vous n’avez pas utilisé le crédit de cet achat. {{contact}} pour demander un remboursement.",
"zen.cta.start": "Commencez avec Zen",
"zen.pricing.title": "Ajoutez 20 $ de solde Pay as you go",
@@ -258,10 +266,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "exceptions suivantes",
"go.title": "OpenCode Go | Modèles de code à faible coût pour tous",
"go.banner.text": "Hy3 bénéficie de limites d’utilisation 8x supérieures pour une durée limitée",
"go.meta.description":
"Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites d'utilisation généreuses et un accès fiable aux principaux modèles de codage.",
"Go coûte 10 $/mois, avec des limites d'utilisation généreuses et un accès fiable aux principaux modèles de codage.",
"go.hero.title": "Modèles de code à faible coût pour tous",
"go.hero.tagline": "Utilisable avec n'importe quel agent. Rechargez du crédit si besoin. Résiliez à tout moment.",
"go.hero.body":
"Go apporte le codage agentique aux programmeurs du monde entier. Offrant des limites généreuses et un accès fiable aux modèles open source les plus capables, pour que vous puissiez construire avec des agents puissants sans vous soucier du coût ou de la disponibilité.",
@@ -269,14 +277,35 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "S'abonner à Go",
"go.cta.price": "10 $/mois",
"go.cta.promo": "$5 le premier mois",
"go.plans.month": "par mois",
"go.plans.plus.cta": "S'abonner à Go Plus",
"go.plans.plus.description": "Go Plus coûte 40 $/mois et offre des limites plus élevées.",
"go.plans.go.feature1": "Modèles sélectionnés et abordables",
"go.plans.go.feature2": "Testés pour le codage agentique",
"go.plans.go.feature3": "Limites généreuses et accès fiable",
"go.plans.plus.feature1": "Tous les avantages de Go",
"go.plans.plus.feature2": "Des limites plus élevées pour coder plus longtemps sans perdre le fil",
"go.plans.plus.feature3": "Pour les projets plus vastes et exigeants",
"go.plans.limits": "Limites",
"go.plans.description": "Requêtes estimées par 5 heures et limites mensuelles par modèle",
"go.plans.legend": "Offres",
"go.pricing.body":
"Utilisez-le avec n'importe quel agent. $5 le premier mois, puis 10 $/mois. Rechargez du crédit si nécessaire. Annulez à tout moment.",
"Utilisez-le avec n'importe quel agent. 10 $/mois. Rechargez du crédit si nécessaire. Annulez à tout moment.",
"go.graph.free": "Gratuit",
"go.graph.freePill": "Big Pickle et modèles gratuits",
"go.graph.go": "Go",
"go.graph.label": "Requêtes par tranche de 5 heures",
"go.graph.usageLimits": "Limites d'utilisation",
"go.graph.period": "Utilisation",
"go.graph.model": "Modèle",
"go.graph.requests": "Requêtes estimées / 5 h",
"go.graph.allowance": "Utilisation mensuelle",
"go.graph.new": "Nouveau",
"go.graph.scale": "Échelle non linéaire des requêtes",
"go.graph.showAll": "Voir les {{count}} modèles",
"go.graph.showLess": "Afficher moins de modèles",
"go.graph.limitedRegions": "régions limitées",
"go.graph.limitedTime": "durée limitée",
"go.graph.usageLimits": "Limites d’utilisation",
"go.graph.aria": "Requêtes par 5h : {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
@@ -302,21 +331,20 @@ export const dict = {
"go.testimonials.frank.quote": "J'aimerais être encore chez Nvidia.",
"go.problem.title": "Quel problème Go résout-il ?",
"go.problem.body":
"Nous nous efforçons d'apporter l'expérience OpenCode au plus grand nombre. OpenCode Go est un abonnement à faible coût : $5 pour le premier mois, puis 10 $/mois. Il offre des limites généreuses et un accès fiable aux modèles open source les plus performants.",
"Nous nous efforçons d'apporter l'expérience OpenCode au plus grand nombre. OpenCode Go est un abonnement à faible coût de 10 $/mois. Il offre des limites généreuses et un accès fiable aux modèles open source les plus performants.",
"go.problem.subtitle": " ",
"go.problem.item1": "Prix d'abonnement bas",
"go.problem.item2": "Limites généreuses et accès fiable",
"go.problem.item3": "Conçu pour autant de programmeurs que possible",
"go.problem.item4": "Une sélection de modèles testés pour le codage agentique",
"go.how.title": "Comment fonctionne Go",
"go.how.body":
"Go commence à $5 pour le premier mois, puis 10 $/mois. Vous pouvez l'utiliser avec OpenCode ou n'importe quel agent.",
"go.how.body": "Go coûte 10 $/mois. Vous pouvez l'utiliser avec OpenCode ou n'importe quel agent.",
"go.how.step1.title": "Créez un compte",
"go.how.step1.beforeLink": "suivez les",
"go.how.step1.link": "instructions de configuration",
"go.how.step2.title": "Abonnez-vous à Go",
"go.how.step2.link": "$5 le premier mois",
"go.how.step2.afterLink": "puis 10 $/mois avec des limites généreuses",
"go.how.step2.link": "10 $/mois",
"go.how.step2.afterLink": "avec des limites généreuses",
"go.how.step3.title": "Commencez à coder",
"go.how.step3.body": "avec un accès fiable aux modèles open source",
"go.privacy.title": "Votre vie privée est importante pour nous",
@@ -333,11 +361,11 @@ export const dict = {
"go.faq.a2": "Go inclut les modèles ci-dessous, avec des limites généreuses et un accès fiable.",
"go.faq.q3": "Est-ce que Go est la même chose que Zen ?",
"go.faq.a3":
"Non. Zen est un paiement à l'utilisation, tandis que Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites généreuses et un accès fiable à une sélection de modèles.",
"Non. Zen est un paiement à l'utilisation, tandis que Go coûte 10 $/mois, avec des limites généreuses et un accès fiable à une sélection de modèles.",
"go.faq.q4": "Combien coûte Go ?",
"go.faq.a4.p1.beforePricing": "Go coûte",
"go.faq.a4.p1.pricingLink": "$5 le premier mois",
"go.faq.a4.p1.afterPricing": "puis 10 $/mois avec des limites généreuses.",
"go.faq.a4.p1.pricingLink": "10 $/mois",
"go.faq.a4.p1.afterPricing": "avec des limites généreuses.",
"go.faq.a4.p2.beforeAccount": "Vous pouvez gérer votre abonnement dans votre",
"go.faq.a4.p2.accountLink": "compte",
"go.faq.a4.p3": "Annulez à tout moment.",
@@ -347,15 +375,19 @@ export const dict = {
"go.faq.a5.retention": "Conservation des données",
"go.faq.a5.retention30": "30 jours",
"go.faq.a5.retention0": "0 jour",
"go.faq.a5.used": "Utilisé",
"go.faq.a5.notUsed": "Non utilisé",
"go.faq.a5.noAgreement": "Aucun accord",
"go.faq.a5.notZdr": "Pas de ZDR",
"go.faq.a5.grokRetention":
"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.",
"go.faq.a5.gptRetention":
"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.",
"go.faq.a5.museRetention":
"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.",
"go.faq.a5.learnMore": "En savoir plus",
"go.faq.a5.deepseekRetention":
"L’accord ZDR est renouvelé chaque mois. L’accord actuel est valable jusqu’au 31 août 2026.",
"L’accord ZDR est renouvelé chaque mois. L’accord actuel est valable jusqu’au 30 septembre 2026.",
"go.faq.a5.beforeExceptions":
"Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
@@ -369,7 +401,10 @@ export const dict = {
"Oui, vous pouvez utiliser Go avec n'importe quel agent. Suivez les instructions de configuration dans votre agent de code préféré.",
"go.faq.q9": "Quelle est la différence entre les modèles gratuits et Go ?",
"go.faq.a9":
"Les modèles gratuits incluent Big Pickle ainsi que les modèles promotionnels disponibles à ce moment-là, avec un quota de 200 requêtes/jour. Go propose une sélection de modèles avec des quotas de requêtes plus élevés appliqués sur des fenêtres glissantes (5 heures, hebdomadaire et mensuelle), à peu près équivalents à 12 $ par 5 heures, 30 $ par semaine et 60 $ par mois (le nombre réel de requêtes varie selon le modèle et l'utilisation).",
"Les modèles gratuits incluent Big Pickle ainsi que les modèles promotionnels disponibles à ce moment-là, avec un quota de 200 requêtes/jour. Go propose une sélection de modèles avec des quotas de requêtes plus élevés sur des fenêtres glissantes : 20 % du quota mensuel par 5 heures, 50 % par semaine et 100 % par mois. Les quotas propres à chaque modèle peuvent varier (le nombre réel de requêtes varie selon le modèle et l'utilisation).",
"go.faq.q10": "Puis-je obtenir un remboursement ?",
"go.faq.a10":
"Vous pourriez avoir droit à un remboursement si le paiement a été effectué au cours des 14 derniers jours et que vous n’avez pas utilisé votre quota Go pendant cette période de facturation. {{contact}} pour demander un remboursement.",
"zen.api.error.rateLimitExceeded": "Limite de débit dépassée. Veuillez réessayer plus tard.",
"zen.api.error.modelNotSupported": "Modèle {{model}} non pris en charge",
@@ -635,7 +670,6 @@ export const dict = {
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Voir",
"workspace.black.loading": "Chargement...",
"workspace.black.time.day": "jour",
"workspace.black.time.days": "jours",
"workspace.black.time.hour": "heure",
@@ -645,7 +679,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "quelques secondes",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Vous êtes abonné à OpenCode Black pour {{plan}} $ par mois.",
"workspace.black.subscription.manage": "Gérer l'abonnement",
"workspace.black.subscription.ending":
"OpenCode Black prend fin avec votre période de facturation actuelle et ne sera pas renouvelé. Nous vous migrerons vers la nouvelle console.",
"workspace.black.subscription.rollingUsage": "Utilisation 5 heures",
"workspace.black.subscription.weeklyUsage": "Utilisation hebdomadaire",
"workspace.black.subscription.resetsIn": "Réinitialisation dans",
@@ -675,24 +710,33 @@ 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":
'Sélectionnez "OpenCode Go" comme fournisseur dans votre configuration opencode pour utiliser les modèles Go.',
"workspace.lite.providers.title": "Fournisseurs",
"workspace.lite.providers.description": "Contrôlez les fournisseurs utilisés pour le routage.",
"workspace.lite.providers.allowTraining": "Autoriser les modèles qui s’entraînent sur les données des requêtes",
"workspace.lite.providers.useChina": "Activer les modèles hébergés en Chine",
"workspace.lite.black.message":
"Vous êtes actuellement abonné à OpenCode Black ou sur liste d'attente. Veuillez d'abord vous désabonner si vous souhaitez passer à Go.",
"workspace.lite.other.message":
"Un autre membre de cet espace de travail est déjà abonné à OpenCode Go. Un seul membre par espace de travail peut s'abonner.",
"workspace.lite.promo.description":
"OpenCode Go commence à {{price}}, puis 10 $/mois, et offre un accès fiable aux modèles de code ouverts populaires avec des limites d'utilisation généreuses.",
"workspace.lite.promo.price": "$5 le premier mois",
"OpenCode Go coûte {{price}} et offre un accès fiable aux modèles de code ouverts populaires avec des limites d'utilisation généreuses.",
"workspace.lite.promo.price": "10 $/mois",
"workspace.lite.promo.modelsTitle": "Ce qui est inclus",
"workspace.lite.promo.footer":
"Ce forfait est principalement conçu pour les utilisateurs internationaux et offre un accès mondial stable. Les tarifs et les limites d'utilisation peuvent évoluer à mesure que nous tirons les enseignements des premières utilisations et des retours reçus.",
@@ -787,6 +831,15 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Téléphone",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label":
"Quelles sont les dépenses mensuelles actuelles de votre entreprise en inférence (USD) ?",
"enterprise.form.inferenceSpend.placeholder": "Sélectionnez une tranche (facultatif)",
"enterprise.form.inferenceSpend.none": "Aucune dépense pour l'instant",
"enterprise.form.inferenceSpend.under1k": "Moins de $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K ou plus",
"enterprise.form.message.label": "Quel problème essayez-vous de résoudre ?",
"enterprise.form.message.placeholder": "Nous avons besoin d'aide pour...",
"enterprise.form.send": "Envoyer",
@@ -795,6 +848,7 @@ export const dict = {
"enterprise.form.success.submitted": "Formulaire soumis avec succès.",
"enterprise.form.error.allFieldsRequired": "Tous les champs sont requis.",
"enterprise.form.error.invalidEmailFormat": "Format d'e-mail invalide.",
"enterprise.form.error.invalidInferenceSpend": "Sélectionnez une tranche de dépenses d'inférence valide.",
"enterprise.form.error.internalServer": "Erreur interne du serveur.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Qu'est-ce que OpenCode Enterprise ?",
+72 -18
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Avviso",
"go.referral.ended":
"Il programma referral è terminato. I link referral non danno più credito né a te né a chi li ha condivisi.",
"go.graph.bonus": "Utilizzo {{count}}×",
"nav.github": "GitHub",
"nav.docs": "Documentazione",
"nav.changelog": "Changelog",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "Annulla",
"common.creating": "Creazione...",
"common.create": "Crea",
"common.contactUs": "Contattaci",
"common.videoUnsupported": "Il tuo browser non supporta il tag video.",
"common.figure": "Fig {{n}}.",
@@ -226,6 +231,9 @@ export const dict = {
"zen.faq.q8": "Posso usare Zen con altri agenti di coding?",
"zen.faq.a8":
"Anche se Zen funziona alla grande con OpenCode, puoi usare Zen con qualsiasi agente. Segui le istruzioni di configurazione nel tuo agente di coding preferito.",
"zen.faq.q9": "Posso ottenere un rimborso?",
"zen.faq.a9":
"Potresti avere diritto a un rimborso se l'addebito è stato effettuato negli ultimi 14 giorni e non hai utilizzato il credito di quell'acquisto. {{contact}} per richiedere un rimborso.",
"zen.cta.start": "Inizia con Zen",
"zen.pricing.title": "Aggiungi $20 di saldo a consumo",
@@ -254,10 +262,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "seguenti eccezioni",
"go.title": "OpenCode Go | Modelli di coding a basso costo per tutti",
"go.banner.text": "Hy3 offre limiti di utilizzo 8x superiori per un periodo limitato",
"go.meta.description":
"Go inizia a $5 per il primo mese, poi $10/mese, con limiti di utilizzo generosi e un accesso affidabile ai principali modelli di coding.",
"Go costa $10/mese, con limiti di utilizzo generosi e un accesso affidabile ai principali modelli di coding.",
"go.hero.title": "Modelli di coding a basso costo per tutti",
"go.hero.tagline": "Usalo con qualsiasi agente. Ricarica il credito se necessario. Annulla quando vuoi.",
"go.hero.body":
"Go porta il coding agentico ai programmatori di tutto il mondo. Offrendo limiti generosi e un accesso affidabile ai modelli open source più capaci, in modo da poter costruire con agenti potenti senza preoccuparsi dei costi o della disponibilità.",
@@ -265,13 +273,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Abbonati a Go",
"go.cta.price": "$10/mese",
"go.cta.promo": "$5 il primo mese",
"go.plans.month": "al mese",
"go.plans.plus.cta": "Abbonati a Go Plus",
"go.plans.plus.description": "Go Plus costa $40/mese e offre limiti più alti.",
"go.plans.go.feature1": "Modelli selezionati e convenienti",
"go.plans.go.feature2": "Testati per la programmazione agentica",
"go.plans.go.feature3": "Limiti generosi e accesso affidabile",
"go.plans.plus.feature1": "Tutto ciò che include Go",
"go.plans.plus.feature2": "Limiti più alti per sessioni di coding più lunghe e concentrate",
"go.plans.plus.feature3": "Per progetti più grandi e impegnativi",
"go.plans.limits": "Limiti",
"go.plans.description": "Richieste stimate ogni 5 ore e limiti mensili per modello",
"go.plans.legend": "Piani",
"go.pricing.body":
"Usalo con qualsiasi agente. $5 il primo mese, poi $10/mese. Ricarica il credito se necessario. Annulla in qualsiasi momento.",
"Usalo con qualsiasi agente. $10/mese. Ricarica il credito se necessario. Annulla in qualsiasi momento.",
"go.graph.free": "Gratis",
"go.graph.freePill": "Big Pickle e modelli gratuiti",
"go.graph.go": "Go",
"go.graph.label": "Richieste ogni 5 ore",
"go.graph.period": "Utilizzo",
"go.graph.model": "Modello",
"go.graph.requests": "Richieste stimate / 5 ore",
"go.graph.allowance": "Utilizzo mensile",
"go.graph.new": "Nuovo",
"go.graph.scale": "Scala non lineare delle richieste",
"go.graph.showAll": "Mostra tutti i {{count}} modelli",
"go.graph.showLess": "Mostra meno modelli",
"go.graph.limitedRegions": "regioni limitate",
"go.graph.limitedTime": "periodo limitato",
"go.graph.usageLimits": "Limiti di utilizzo",
"go.graph.aria": "Richieste ogni 5h: {{free}} vs {{go}}",
@@ -298,20 +327,20 @@ export const dict = {
"go.testimonials.frank.quote": "Vorrei essere ancora a Nvidia.",
"go.problem.title": "Quale problema risolve Go?",
"go.problem.body":
"Ci concentriamo nel portare l'esperienza OpenCode a quante più persone possibile. OpenCode Go è un abbonamento a basso costo: $5 il primo mese, poi $10/mese. Offre limiti generosi e accesso affidabile ai modelli open source più capaci.",
"Ci concentriamo nel portare l'esperienza OpenCode a quante più persone possibile. OpenCode Go è un abbonamento a basso costo da $10/mese. Offre limiti generosi e accesso affidabile ai modelli open source più capaci.",
"go.problem.subtitle": " ",
"go.problem.item1": "Prezzo di abbonamento a basso costo",
"go.problem.item2": "Limiti generosi e accesso affidabile",
"go.problem.item3": "Costruito per il maggior numero possibile di programmatori",
"go.problem.item4": "Una selezione curata di modelli testati per il coding agentico",
"go.how.title": "Come funziona Go",
"go.how.body": "Go inizia a $5 per il primo mese, poi $10/mese. Puoi usarlo con OpenCode o qualsiasi agente.",
"go.how.body": "Go costa $10/mese. Puoi usarlo con OpenCode o qualsiasi agente.",
"go.how.step1.title": "Crea un account",
"go.how.step1.beforeLink": "segui le",
"go.how.step1.link": "istruzioni di configurazione",
"go.how.step2.title": "Abbonati a Go",
"go.how.step2.link": "$5 il primo mese",
"go.how.step2.afterLink": "poi $10/mese con limiti generosi",
"go.how.step2.link": "$10/mese",
"go.how.step2.afterLink": "con limiti generosi",
"go.how.step3.title": "Inizia a programmare",
"go.how.step3.body": "con accesso affidabile ai modelli open source",
"go.privacy.title": "La tua privacy è importante per noi",
@@ -328,11 +357,11 @@ export const dict = {
"go.faq.a2": "Go include i modelli elencati di seguito, con limiti generosi e accesso affidabile.",
"go.faq.q3": "Go è lo stesso di Zen?",
"go.faq.a3":
"No. Zen è a consumo, mentre Go inizia a $5 per il primo mese, poi $10/mese, con limiti generosi e un accesso affidabile a una selezione curata di modelli.",
"No. Zen è a consumo, mentre Go costa $10/mese, con limiti generosi e un accesso affidabile a una selezione curata di modelli.",
"go.faq.q4": "Quanto costa Go?",
"go.faq.a4.p1.beforePricing": "Go costa",
"go.faq.a4.p1.pricingLink": "$5 il primo mese",
"go.faq.a4.p1.afterPricing": "poi $10/mese con limiti generosi.",
"go.faq.a4.p1.pricingLink": "$10/mese",
"go.faq.a4.p1.afterPricing": "con limiti generosi.",
"go.faq.a4.p2.beforeAccount": "Puoi gestire il tuo abbonamento nel tuo",
"go.faq.a4.p2.accountLink": "account",
"go.faq.a4.p3": "Annulla in qualsiasi momento.",
@@ -342,15 +371,19 @@ export const dict = {
"go.faq.a5.retention": "Conservazione dei dati",
"go.faq.a5.retention30": "30 giorni",
"go.faq.a5.retention0": "0 giorni",
"go.faq.a5.used": "Utilizzato",
"go.faq.a5.notUsed": "Non utilizzato",
"go.faq.a5.noAgreement": "Nessun accordo",
"go.faq.a5.notZdr": "Non ZDR",
"go.faq.a5.grokRetention":
"ZDR disabilita importanti funzionalità API che dipendono dai dati archiviati, tra cui la Responses API con stato, Files and Collections e Batch API.",
"go.faq.a5.gptRetention":
"I log di monitoraggio degli abusi vengono generati per l'utilizzo di tutte le funzionalità API e conservati per un massimo di 30 giorni.",
"go.faq.a5.learnMore": "Scopri di più",
"go.faq.a5.deepseekRetention":
"L'accordo ZDR viene rinnovato mensilmente. L'accordo attuale è valido fino al 31 agosto 2026.",
"L'accordo ZDR viene rinnovato mensilmente. L'accordo attuale è valido fino al 30 settembre 2026.",
"go.faq.a5.museRetention":
"Prezzi dei token fortemente scontati in cambio dell'autorizzazione a utilizzare i tuoi prompt e completamenti per addestrare futuri modelli Meta.",
"go.faq.a5.beforeExceptions":
"I modelli Go sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le",
"go.faq.a5.exceptionsLink": "seguenti eccezioni",
@@ -364,7 +397,10 @@ export const dict = {
"go.faq.q9": "Qual è la differenza tra i modelli gratuiti e Go?",
"go.faq.a9":
"I modelli gratuiti includono Big Pickle più i modelli promozionali disponibili al momento, con una quota di 200 richieste/giorno. Go offre una selezione curata di modelli con quote di richiesta più elevate applicate su finestre mobili (5 ore, settimanale e mensile), approssimativamente equivalenti a $12 ogni 5 ore, $30 a settimana e $60 al mese (il conteggio effettivo delle richieste varia in base al modello e all'utilizzo).",
"I modelli gratuiti includono Big Pickle più i modelli promozionali disponibili al momento, con una quota di 200 richieste/giorno. Go offre una selezione curata di modelli con quote di richiesta più elevate su finestre mobili: il 20% della quota mensile ogni 5 ore, il 50% a settimana e il 100% al mese. Le quote specifiche possono variare in base al modello (il conteggio effettivo delle richieste varia in base al modello e all'utilizzo).",
"go.faq.q10": "Posso ottenere un rimborso?",
"go.faq.a10":
"Potresti avere diritto a un rimborso se l'addebito è stato effettuato negli ultimi 14 giorni e non hai utilizzato la tua quota Go durante quel periodo di fatturazione. {{contact}} per richiedere un rimborso.",
"zen.api.error.rateLimitExceeded": "Limite di richieste superato. Riprova più tardi.",
"zen.api.error.modelNotSupported": "Modello {{model}} non supportato",
@@ -630,7 +666,6 @@ export const dict = {
"workspace.payments.type.subscription": "abbonamento",
"workspace.payments.view": "Visualizza",
"workspace.black.loading": "Caricamento...",
"workspace.black.time.day": "giorno",
"workspace.black.time.days": "giorni",
"workspace.black.time.hour": "ora",
@@ -640,7 +675,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "pochi secondi",
"workspace.black.subscription.title": "Abbonamento",
"workspace.black.subscription.message": "Sei abbonato a OpenCode Black per ${{plan}} al mese.",
"workspace.black.subscription.manage": "Gestisci Abbonamento",
"workspace.black.subscription.ending":
"OpenCode Black termina con il periodo di fatturazione in corso e non verrà rinnovato. Ti trasferiremo nella nuova console.",
"workspace.black.subscription.rollingUsage": "Utilizzo 5-ore",
"workspace.black.subscription.weeklyUsage": "Utilizzo Settimanale",
"workspace.black.subscription.resetsIn": "Si resetta tra",
@@ -667,23 +703,32 @@ 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.',
"workspace.lite.providers.title": "Provider",
"workspace.lite.providers.description": "Controlla quali provider vengono usati per il routing.",
"workspace.lite.providers.allowTraining": "Consenti i modelli che si addestrano sui dati delle richieste",
"workspace.lite.providers.useChina": "Abilita modelli ospitati in Cina",
"workspace.lite.black.message":
"Attualmente sei abbonato a OpenCode Black o sei in lista d'attesa. Annulla l'iscrizione prima se desideri passare a Go.",
"workspace.lite.other.message":
"Un altro membro in questo workspace è già abbonato a OpenCode Go. Solo un membro per workspace può abbonarsi.",
"workspace.lite.promo.description":
"OpenCode Go parte da {{price}}, poi $10/mese, e offre un accesso affidabile a popolari modelli di coding aperti con generosi limiti di utilizzo.",
"workspace.lite.promo.price": "$5 il primo mese",
"OpenCode Go costa {{price}} e offre un accesso affidabile a popolari modelli di coding aperti con generosi limiti di utilizzo.",
"workspace.lite.promo.price": "$10/mese",
"workspace.lite.promo.modelsTitle": "Cosa è incluso",
"workspace.lite.promo.footer":
"Il piano è pensato principalmente per gli utenti internazionali e offre un accesso globale stabile. I prezzi e i limiti di utilizzo potrebbero cambiare in base a quanto apprenderemo dall'utilizzo iniziale e dai feedback.",
@@ -775,6 +820,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Numero di telefono",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Qual è l'attuale spesa mensile della tua azienda per l'inferenza (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Seleziona una fascia (facoltativo)",
"enterprise.form.inferenceSpend.none": "Nessuna spesa al momento",
"enterprise.form.inferenceSpend.under1k": "Meno di $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K o più",
"enterprise.form.message.label": "Quale problema stai cercando di risolvere?",
"enterprise.form.message.placeholder": "Abbiamo bisogno di aiuto con...",
"enterprise.form.send": "Invia",
@@ -783,6 +836,7 @@ export const dict = {
"enterprise.form.success.submitted": "Modulo inviato con successo.",
"enterprise.form.error.allFieldsRequired": "Tutti i campi sono obbligatori.",
"enterprise.form.error.invalidEmailFormat": "Formato email non valido.",
"enterprise.form.error.invalidInferenceSpend": "Seleziona una fascia di spesa per l'inferenza valida.",
"enterprise.form.error.internalServer": "Errore interno del server.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Cos'è OpenCode Enterprise?",
+72 -18
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "警告",
"go.referral.ended":
"紹介プログラムは終了しました。紹介リンクを使っても、あなたや共有した人にクレジットは付与されません。",
"go.graph.bonus": "利用枠{{count}}倍",
"nav.github": "GitHub",
"nav.docs": "ドキュメント",
"nav.changelog": "変更履歴",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "キャンセル",
"common.creating": "作成中...",
"common.create": "作成",
"common.contactUs": "お問い合わせ",
"common.videoUnsupported": "お使いのブラウザは video タグをサポートしていません。",
"common.figure": "図 {{n}}.",
@@ -224,6 +229,9 @@ export const dict = {
"zen.faq.q8": "他のコーディングエージェントでもZenを使えますか?",
"zen.faq.a8":
"ZenはOpenCodeとの相性が良いですが、どのエージェントでもZenを利用できます。お使いのコーディングエージェントのセットアップ手順に従ってください。",
"zen.faq.q9": "返金を受けられますか?",
"zen.faq.a9":
"請求から14日以内で、その購入分のクレジットを一切使用していない場合、返金の対象となる可能性があります。返金を希望する場合は、{{contact}}ください。",
"zen.cta.start": "Zenをはじめる",
"zen.pricing.title": "$20の従量課金制残高を追加",
@@ -253,10 +261,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "以下の例外",
"go.title": "OpenCode Go | すべての人のための低価格なコーディングモデル",
"go.banner.text": "Hy3の利用上限が期間限定で8倍に",
"go.meta.description":
"Goは最初の月$5、その後$10/月で、主要なコーディングモデルへのゆとりある利用上限と安定したアクセスを提供します。",
"Goは月額$10で、主要なコーディングモデルへのゆとりある利用上限と安定したアクセスを提供します。",
"go.hero.title": "すべての人のための低価格なコーディングモデル",
"go.hero.tagline": "どのエージェントでも利用できます。必要に応じてクレジットをチャージ。いつでもキャンセル可能。",
"go.hero.body":
"Goは、世界中のプログラマーにエージェント型コーディングをもたらします。最も高性能なオープンソースモデルへの十分な制限と安定したアクセスを提供し、コストや可用性を気にすることなく強力なエージェントで構築できます。",
@@ -264,13 +272,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Goを購読する",
"go.cta.price": "$10/月",
"go.cta.promo": "初月 $5",
"go.plans.month": "/月",
"go.plans.plus.cta": "Go Plus に登録",
"go.plans.plus.description": "Go Plus は月額$40で、より高い利用枠を提供します。",
"go.plans.go.feature1": "厳選された手頃なモデル",
"go.plans.go.feature2": "エージェント型コーディングで検証済み",
"go.plans.go.feature3": "十分な利用枠と安定したアクセス",
"go.plans.plus.feature1": "Go のすべての特典を含む",
"go.plans.plus.feature2": "より高い利用枠で、長時間のコーディングに集中",
"go.plans.plus.feature3": "大規模で高度なプロジェクト向け",
"go.plans.limits": "利用枠",
"go.plans.description": "モデル別の5時間あたりの推定リクエスト数と月間利用枠",
"go.plans.legend": "プラン",
"go.pricing.body":
"どのエージェントでも使えます。最初の月$5、その後$10/月。必要に応じてクレジットを追加。いつでもキャンセルできます。",
"どのエージェントでも使えます。月額$10。必要に応じてクレジットを追加。いつでもキャンセルできます。",
"go.graph.free": "無料",
"go.graph.freePill": "Big Pickleと無料モデル",
"go.graph.go": "Go",
"go.graph.label": "5時間あたりのリクエスト数",
"go.graph.period": "利用枠",
"go.graph.model": "モデル",
"go.graph.requests": "推定リクエスト数 / 5時間",
"go.graph.allowance": "月間利用枠",
"go.graph.new": "新着",
"go.graph.scale": "リクエスト数は非線形目盛りで表示",
"go.graph.showAll": "全{{count}}モデルを表示",
"go.graph.showLess": "折りたたむ",
"go.graph.limitedRegions": "一部の地域に限定",
"go.graph.limitedTime": "期間限定",
"go.graph.usageLimits": "利用制限",
"go.graph.aria": "5時間あたりのリクエスト数: {{free}} 対 {{go}}",
@@ -298,20 +327,20 @@ export const dict = {
"go.testimonials.frank.quote": "まだNvidiaにいられたらよかったのに。",
"go.problem.title": "Goはどのような問題を解決していますか?",
"go.problem.body":
"私たちはOpenCodeの体験をできるだけ多くの人に届けることに注力しています。OpenCode Goは低価格のサブスクリプションで、最初の月は$5、その後は$10/月です。ゆとりある上限と、最も高性能なオープンソースモデルへの信頼できるアクセスを提供します。",
"私たちはOpenCodeの体験をできるだけ多くの人に届けることに注力しています。OpenCode Goは月額$10の低価格なサブスクリプションです。ゆとりある上限と、最も高性能なオープンソースモデルへの信頼できるアクセスを提供します。",
"go.problem.subtitle": " ",
"go.problem.item1": "低価格なサブスクリプション料金",
"go.problem.item2": "十分な制限と安定したアクセス",
"go.problem.item3": "できるだけ多くのプログラマーのために構築",
"go.problem.item4": "エージェント型コーディング向けにテストされた厳選モデルラインナップ",
"go.how.title": "Goの仕組み",
"go.how.body": "Goは最初の月$5、その後$10/月で始まります。OpenCodeまたは任意のエージェントで使えます。",
"go.how.body": "Goは月額$10です。OpenCodeまたは任意のエージェントで使えます。",
"go.how.step1.title": "アカウントを作成",
"go.how.step1.beforeLink": "",
"go.how.step1.link": "セットアップ手順はこちら",
"go.how.step2.title": "Goを購読する",
"go.how.step2.link": "最初の月$5",
"go.how.step2.afterLink": "その後$10/月、ゆとりある上限付き",
"go.how.step2.link": "月額$10",
"go.how.step2.afterLink": "ゆとりある上限付き",
"go.how.step3.title": "コーディングを開始",
"go.how.step3.body": "オープンソースモデルへの安定したアクセスで",
"go.privacy.title": "あなたのプライバシーは私たちにとって重要です",
@@ -328,11 +357,11 @@ export const dict = {
"go.faq.a2": "Go には、十分な利用上限と安定したアクセスを備えた、以下のモデルが含まれます。",
"go.faq.q3": "GoはZenと同じですか?",
"go.faq.a3":
"いいえ。Zenは従量課金制ですが、Goは最初の月$5、その後$10/月で、厳選されたモデルラインナップへのゆとりある上限と安定したアクセスを提供します。",
"いいえ。Zenは従量課金制ですが、Goは月額$10で、厳選されたモデルラインナップへのゆとりある上限と安定したアクセスを提供します。",
"go.faq.q4": "Goの料金は?",
"go.faq.a4.p1.beforePricing": "Goは",
"go.faq.a4.p1.pricingLink": "最初の月$5",
"go.faq.a4.p1.afterPricing": "その後$10/月、ゆとりある上限付き。",
"go.faq.a4.p1.pricingLink": "月額$10",
"go.faq.a4.p1.afterPricing": "ゆとりある上限付き。",
"go.faq.a4.p2.beforeAccount": "管理画面:",
"go.faq.a4.p2.accountLink": "アカウント",
"go.faq.a4.p3": "いつでもキャンセル可能です。",
@@ -342,13 +371,17 @@ export const dict = {
"go.faq.a5.retention": "データ保持",
"go.faq.a5.retention30": "30日",
"go.faq.a5.retention0": "0日",
"go.faq.a5.used": "使用あり",
"go.faq.a5.notUsed": "使用なし",
"go.faq.a5.noAgreement": "契約なし",
"go.faq.a5.notZdr": "ZDRではない",
"go.faq.a5.grokRetention":
"ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。",
"go.faq.a5.gptRetention": "不正使用監視ログはすべてのAPI機能の使用時に生成され、最大30日間保持されます。",
"go.faq.a5.museRetention":
"将来のMetaモデルのトレーニングにプロンプトと生成結果を使用する許可と引き換えに、トークン料金が大幅に割引されます。",
"go.faq.a5.learnMore": "詳しく見る",
"go.faq.a5.deepseekRetention": "ZDR契約は毎月更新されます。現在の契約は2026年8月31日まで有効です。",
"go.faq.a5.deepseekRetention": "ZDR契約は毎月更新されます。現在の契約は2026年9月30日まで有効です。",
"go.faq.a5.beforeExceptions":
"Goのモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(",
"go.faq.a5.exceptionsLink": "以下の例外",
@@ -362,7 +395,10 @@ export const dict = {
"go.faq.q9": "無料モデルとGoの違いは何ですか?",
"go.faq.a9":
"無料モデルにはBig Pickleと、その時点で利用可能なプロモーションモデルが含まれ、1日200リクエストの制限があります。Goでは厳選されたモデルラインナップを利用でき、ローリングウィンドウ(5時間、週間、月間)全体でより高いリクエスト制限が適用されます。これは概算で5時間あたり$12、週間$30、月間$60相当です(実際のリクエスト数はモデルと使用状況により異なります)。",
"無料モデルにはBig Pickleと、その時点で利用可能なプロモーションモデルが含まれ、1日200リクエストの制限があります。Goでは厳選されたモデルラインナップを利用でき、ローリングウィンドウで月間利用枠の20%を5時間ごと、50%を週ごと、100%を月ごとの上限として適用します。モデル別の利用枠は異なる場合があります(実際のリクエスト数はモデルと使用状況により異なります)。",
"go.faq.q10": "返金を受けられますか?",
"go.faq.a10":
"請求から14日以内で、その請求期間中にGoの利用枠を一切使用していない場合、返金の対象となる可能性があります。返金を希望する場合は、{{contact}}ください。",
"zen.api.error.rateLimitExceeded": "レート制限を超えました。後でもう一度お試しください。",
"zen.api.error.modelNotSupported": "モデル {{model}} はサポートされていません",
@@ -627,7 +663,6 @@ export const dict = {
"workspace.payments.type.subscription": "サブスクリプション",
"workspace.payments.view": "表示",
"workspace.black.loading": "読み込み中...",
"workspace.black.time.day": "日",
"workspace.black.time.days": "日",
"workspace.black.time.hour": "時間",
@@ -637,7 +672,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "数秒",
"workspace.black.subscription.title": "サブスクリプション",
"workspace.black.subscription.message": "あなたは OpenCode Black を月額 ${{plan}} で購読しています。",
"workspace.black.subscription.manage": "サブスクリプションの管理",
"workspace.black.subscription.ending":
"OpenCode Black は現在の請求期間の終了とともに終了し、更新されません。新しいコンソールへ移行いたします。",
"workspace.black.subscription.rollingUsage": "5時間利用",
"workspace.black.subscription.weeklyUsage": "週間利用量",
"workspace.black.subscription.resetsIn": "リセットまで",
@@ -665,23 +701,32 @@ 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」をプロバイダーとして選択してください。",
"workspace.lite.providers.title": "プロバイダー",
"workspace.lite.providers.description": "ルーティングに使用するプロバイダーを管理します。",
"workspace.lite.providers.allowTraining": "リクエストデータを学習に使用するモデルを許可",
"workspace.lite.providers.useChina": "中国でホストされているモデルを有効にする",
"workspace.lite.black.message":
"現在 OpenCode Black を購読中、またはウェイティングリストに登録されています。Go に切り替える場合は、先に登録を解除してください。",
"workspace.lite.other.message":
"このワークスペースの別のメンバーが既に OpenCode Go を購読しています。ワークスペースにつき1人のメンバーのみが購読できます。",
"workspace.lite.promo.description":
"OpenCode Goは{{price}}で始まり、その後は$10/月で、人気の高いオープンコーディングモデルへの安定したアクセスと余裕のある利用枠を提供します。",
"workspace.lite.promo.price": "初月$5",
"OpenCode Goは{{price}}で、人気の高いオープンコーディングモデルへの安定したアクセスと余裕のある利用枠を提供します。",
"workspace.lite.promo.price": "$10/月",
"workspace.lite.promo.modelsTitle": "含まれるもの",
"workspace.lite.promo.footer":
"このプランは主に海外のユーザー向けに設計されており、世界中から安定してご利用いただけます。料金と利用上限は、初期の利用状況やフィードバックを踏まえて変更される場合があります。",
@@ -773,6 +818,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "電話番号",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "貴社の現在の月間 AI 推論費用(USD)はどのくらいですか?",
"enterprise.form.inferenceSpend.placeholder": "範囲を選択(任意)",
"enterprise.form.inferenceSpend.none": "まだ費用は発生していない",
"enterprise.form.inferenceSpend.under1k": "$1K 未満",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K 以上",
"enterprise.form.message.label": "どのような課題を解決したいですか?",
"enterprise.form.message.placeholder": "これについて支援が必要です...",
"enterprise.form.send": "送信",
@@ -781,6 +834,7 @@ export const dict = {
"enterprise.form.success.submitted": "フォームが正常に送信されました。",
"enterprise.form.error.allFieldsRequired": "すべての項目は必須です。",
"enterprise.form.error.invalidEmailFormat": "無効なメール形式です。",
"enterprise.form.error.invalidInferenceSpend": "有効な推論費用の範囲を選択してください。",
"enterprise.form.error.internalServer": "内部サーバーエラー。",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "OpenCode Enterpriseとは?",
+72 -19
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "경고",
"go.referral.ended":
"추천 프로그램이 종료되었습니다. 추천 링크로는 더 이상 본인이나 링크를 공유한 사람에게 크레딧이 지급되지 않습니다.",
"go.graph.bonus": "사용량 {{count}}배",
"nav.github": "GitHub",
"nav.docs": "문서",
"nav.changelog": "변경 내역",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "취소",
"common.creating": "생성 중...",
"common.create": "만들기",
"common.contactUs": "문의하기",
"common.videoUnsupported": "브라우저가 비디오 태그를 지원하지 않습니다.",
"common.figure": "그림 {{n}}.",
@@ -222,6 +227,9 @@ export const dict = {
"zen.faq.q8": "다른 코딩 에이전트와 Zen을 사용할 수 있나요?",
"zen.faq.a8":
"Zen은 OpenCode와 훌륭하게 작동하지만, 어떤 에이전트와도 Zen을 사용할 수 있습니다. 선호하는 코딩 에이전트의 설정 지침을 따르세요.",
"zen.faq.q9": "환불받을 수 있나요?",
"zen.faq.a9":
"결제일로부터 14일 이내이며 해당 구매로 받은 크레딧을 전혀 사용하지 않은 경우 환불 대상이 될 수 있습니다. 환불을 요청하려면 {{contact}}를 선택해 주세요.",
"zen.cta.start": "Zen 시작하기",
"zen.pricing.title": "$20 선불 잔액 추가",
@@ -250,10 +258,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "다음 예외",
"go.title": "OpenCode Go | 모두를 위한 저비용 코딩 모델",
"go.banner.text": "Hy3 사용 한도가 한시적으로 8배 확대됩니다",
"go.meta.description":
"Go는 첫 달 $5, 이후 $10/월로 시작하며, 넉넉한 사용 한도와 주요 코딩 모델에 대한 안정적인 액세스를 제공합니다.",
"go.meta.description": "Go는 월 $10이며, 넉넉한 사용 한도와 주요 코딩 모델에 대한 안정적인 액세스를 제공합니다.",
"go.hero.title": "모두를 위한 저비용 코딩 모델",
"go.hero.tagline": "어떤 에이전트와도 사용할 수 있습니다. 필요하면 크레딧을 충전하세요. 언제든지 취소할 수 있습니다.",
"go.hero.body":
"Go는 전 세계 프로그래머들에게 에이전트 코딩을 제공합니다. 가장 유능한 오픈 소스 모델에 대한 넉넉한 한도와 안정적인 액세스를 제공하므로, 비용이나 가용성 걱정 없이 강력한 에이전트로 빌드할 수 있습니다.",
@@ -261,13 +268,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Go 구독하기",
"go.cta.price": "$10/월",
"go.cta.promo": "첫 달 $5",
"go.plans.month": "/월",
"go.plans.plus.cta": "Go Plus 구독하기",
"go.plans.plus.description": "Go Plus는 월 $40로 더 높은 사용 한도를 제공합니다.",
"go.plans.go.feature1": "엄선된 합리적인 가격의 모델",
"go.plans.go.feature2": "에이전트 코딩에 최적화된 테스트",
"go.plans.go.feature3": "넉넉한 한도와 안정적인 접근",
"go.plans.plus.feature1": "Go의 모든 혜택 포함",
"go.plans.plus.feature2": "더 높은 한도로 장시간 코딩에 집중",
"go.plans.plus.feature3": "더 크고 복잡한 프로젝트에 적합",
"go.plans.limits": "사용 한도",
"go.plans.description": "모델별 5시간당 예상 요청 횟수 및 월간 사용 한도",
"go.plans.legend": "요금제",
"go.pricing.body":
"어떤 에이전트와도 사용할 수 있습니다. 첫 달 $5, 이후 $10/월. 필요하면 크레딧을 충전하세요. 언제든지 취소할 수 있습니다.",
"어떤 에이전트와도 사용할 수 있습니다. 월 $10. 필요하면 크레딧을 충전하세요. 언제든지 취소할 수 있습니다.",
"go.graph.free": "무료",
"go.graph.freePill": "Big Pickle 및 무료 모델",
"go.graph.go": "Go",
"go.graph.label": "5시간당 요청 수",
"go.graph.period": "사용량",
"go.graph.model": "모델",
"go.graph.requests": "예상 요청 횟수 / 5시간",
"go.graph.allowance": "월간 사용량",
"go.graph.new": "신규",
"go.graph.scale": "요청 수는 비선형 눈금으로 표시됩니다",
"go.graph.showAll": "전체 {{count}}개 모델 보기",
"go.graph.showLess": "접기",
"go.graph.limitedRegions": "일부 지역에서만 제공",
"go.graph.limitedTime": "한정된 기간",
"go.graph.usageLimits": "사용 한도",
"go.graph.aria": "5시간당 요청 수: {{free}} 대 {{go}}",
@@ -295,20 +323,20 @@ export const dict = {
"go.testimonials.frank.quote": "아직 Nvidia에 있었으면 좋았을 텐데요.",
"go.problem.title": "Go는 어떤 문제를 해결하나요?",
"go.problem.body":
"우리는 가능한 많은 사람들에게 OpenCode 경험을 제공하는 데 집중하고 있습니다. OpenCode Go는 저렴한 구독 서비스로, 첫 달 $5, 이후 $10/월입니다. 넉넉한 한도와 가장 뛰어난 오픈 소스 모델에 대한 안정적인 액세스를 제공합니다.",
"우리는 가능한 많은 사람들에게 OpenCode 경험을 제공하는 데 집중하고 있습니다. OpenCode Go는 월 $10의 저렴한 구독 서비스입니다. 넉넉한 한도와 가장 뛰어난 오픈 소스 모델에 대한 안정적인 액세스를 제공합니다.",
"go.problem.subtitle": " ",
"go.problem.item1": "저렴한 구독 가격",
"go.problem.item2": "넉넉한 한도와 안정적인 액세스",
"go.problem.item3": "가능한 한 많은 프로그래머를 위해 제작됨",
"go.problem.item4": "에이전트 코딩용으로 테스트된 엄선된 모델 라인업",
"go.how.title": "Go 작동 방식",
"go.how.body": "Go는 첫 달 $5, 이후 $10/월로 시작합니다. OpenCode 또는 어떤 에이전트와도 함께 사용할 수 있습니다.",
"go.how.body": "Go는 월 $10입니다. OpenCode 또는 어떤 에이전트와도 함께 사용할 수 있습니다.",
"go.how.step1.title": "계정 생성",
"go.how.step1.beforeLink": "",
"go.how.step1.link": "설정 지침을 따르세요",
"go.how.step2.title": "Go 구독",
"go.how.step2.link": "첫 달 $5",
"go.how.step2.afterLink": "이후 $10/월, 넉넉한 한도 포함",
"go.how.step2.link": "월 $10",
"go.how.step2.afterLink": "넉넉한 한도 포함",
"go.how.step3.title": "코딩 시작",
"go.how.step3.body": "오픈 소스 모델에 대한 안정적인 액세스와 함께",
"go.privacy.title": "귀하의 프라이버시는 우리에게 중요합니다",
@@ -324,11 +352,11 @@ export const dict = {
"go.faq.a2": "Go에는 넉넉한 한도와 안정적인 액세스를 제공하는 아래 모델이 포함됩니다.",
"go.faq.q3": "Go는 Zen과 같은가요?",
"go.faq.a3":
"아니요. Zen은 종량제인 반면, Go는 첫 달 $5, 이후 $10/월로 시작하며, 엄선된 모델 라인업에 대한 넉넉한 한도와 안정적인 액세스를 제공합니다.",
"아니요. Zen은 종량제인 반면, Go는 월 $10이며, 엄선된 모델 라인업에 대한 넉넉한 한도와 안정적인 액세스를 제공합니다.",
"go.faq.q4": "Go 비용은 얼마인가요?",
"go.faq.a4.p1.beforePricing": "Go 비용은",
"go.faq.a4.p1.pricingLink": "첫 달 $5",
"go.faq.a4.p1.afterPricing": "이후 $10/월, 넉넉한 한도 포함.",
"go.faq.a4.p1.pricingLink": "월 $10",
"go.faq.a4.p1.afterPricing": "넉넉한 한도 포함.",
"go.faq.a4.p2.beforeAccount": "구독 관리는 다음에서 가능합니다:",
"go.faq.a4.p2.accountLink": "계정",
"go.faq.a4.p3": "언제든지 취소할 수 있습니다.",
@@ -338,13 +366,17 @@ export const dict = {
"go.faq.a5.retention": "데이터 보존",
"go.faq.a5.retention30": "30일",
"go.faq.a5.retention0": "0일",
"go.faq.a5.used": "사용됨",
"go.faq.a5.notUsed": "사용되지 않음",
"go.faq.a5.noAgreement": "합의 없음",
"go.faq.a5.notZdr": "ZDR 아님",
"go.faq.a5.grokRetention":
"ZDR은 저장된 데이터에 의존하는 중요한 API 기능(상태 저장형 Responses API, Files and Collections, Batch API 포함)을 비활성화합니다.",
"go.faq.a5.gptRetention": "모든 API 기능 사용에 대해 악용 모니터링 로그가 생성되며 최대 30일 동안 보존됩니다.",
"go.faq.a5.museRetention":
"향후 Meta 모델 학습에 사용자의 프롬프트와 생성 결과를 사용할 수 있도록 허용하는 대신 토큰 가격이 대폭 할인됩니다.",
"go.faq.a5.learnMore": "자세히 알아보기",
"go.faq.a5.deepseekRetention": "ZDR 계약은 매월 갱신됩니다. 현재 계약은 2026년 8월 31일까지 유효합니다.",
"go.faq.a5.deepseekRetention": "ZDR 계약은 매월 갱신됩니다. 현재 계약은 2026년 9월 30일까지 유효합니다.",
"go.faq.a5.beforeExceptions":
"Go 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,",
"go.faq.a5.exceptionsLink": "다음 예외",
@@ -357,7 +389,10 @@ export const dict = {
"go.faq.q9": "무료 모델과 Go의 차이점은 무엇인가요?",
"go.faq.a9":
"무료 모델에는 Big Pickle과 당시 사용 가능한 프로모션 모델이 포함되며, 하루 200회 요청 할당량이 적용됩니다. Go는 엄선된 모델 라인업을 제공하며, 롤링 윈도우(5시간, 주간, 월간)에 걸쳐 더 높은 요청 할당량을 적용합니다. 이는 대략 5시간당 $12, 주당 $30, 월 $60에 해당합니다(실제 요청 수는 모델 및 사용량에 따라 다름).",
"무료 모델에는 Big Pickle과 당시 사용 가능한 프로모션 모델이 포함되며, 하루 200회 요청 할당량이 적용됩니다. Go는 엄선된 모델 라인업을 제공하며, 이동 기간별 요청 한도는 5시간당 월간 한도의 20%, 주간 50%, 월간 100%입니다. 모델별 한도는 다를 수 있습니다(실제 요청 수는 모델 및 사용량에 따라 다름).",
"go.faq.q10": "환불받을 수 있나요?",
"go.faq.a10":
"결제일로부터 14일 이내이며 해당 결제 기간에 Go 사용 한도를 전혀 사용하지 않은 경우 환불 대상이 될 수 있습니다. 환불을 요청하려면 {{contact}}를 선택해 주세요.",
"zen.api.error.rateLimitExceeded": "속도 제한을 초과했습니다. 나중에 다시 시도해 주세요.",
"zen.api.error.modelNotSupported": "{{model}} 모델은 지원되지 않습니다",
@@ -621,7 +656,6 @@ export const dict = {
"workspace.payments.type.subscription": "구독",
"workspace.payments.view": "보기",
"workspace.black.loading": "로드 중...",
"workspace.black.time.day": "일",
"workspace.black.time.days": "일",
"workspace.black.time.hour": "시간",
@@ -631,7 +665,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "몇 초",
"workspace.black.subscription.title": "구독",
"workspace.black.subscription.message": "현재 월 ${{plan}} OpenCode Black 플랜을 구독 중입니다.",
"workspace.black.subscription.manage": "구독 관리",
"workspace.black.subscription.ending":
"OpenCode Black은 현재 결제 기간이 끝나면 종료되며 갱신되지 않습니다. 새 콘솔로 옮겨 드리겠습니다.",
"workspace.black.subscription.rollingUsage": "5시간 사용량",
"workspace.black.subscription.weeklyUsage": "주간 사용량",
"workspace.black.subscription.resetsIn": "초기화까지 남은 시간:",
@@ -657,23 +692,32 @@ 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"를 공급자로 선택하세요.',
"workspace.lite.providers.title": "공급자",
"workspace.lite.providers.description": "라우팅에 사용할 공급자를 제어합니다.",
"workspace.lite.providers.allowTraining": "요청 데이터를 학습에 사용하는 모델 허용",
"workspace.lite.providers.useChina": "중국에서 호스팅되는 모델 활성화",
"workspace.lite.black.message":
"현재 OpenCode Black을 구독 중이거나 대기 명단에 등록되어 있습니다. Go로 전환하려면 먼저 구독을 취소해 주세요.",
"workspace.lite.other.message":
"이 워크스페이스의 다른 멤버가 이미 OpenCode Go를 구독 중입니다. 워크스페이스당 한 명의 멤버만 구독할 수 있습니다.",
"workspace.lite.promo.description":
"OpenCode Go는 {{price}}부터 시작하며, 이후 $10/월로 넉넉한 사용량 한도와 함께 인기 있는 오픈 코딩 모델에 대한 안정적인 액세스를 제공합니다.",
"workspace.lite.promo.price": "첫 달 $5",
"OpenCode Go는 {{price}}로 넉넉한 사용량 한도와 함께 인기 있는 오픈 코딩 모델에 대한 안정적인 액세스를 제공합니다.",
"workspace.lite.promo.price": "$10/월",
"workspace.lite.promo.modelsTitle": "포함 내역",
"workspace.lite.promo.footer":
"이 플랜은 주로 해외 사용자를 위해 설계되었으며, 전 세계에서 안정적으로 이용할 수 있습니다. 초기 이용 현황과 피드백을 반영하는 과정에서 가격과 사용 한도가 변경될 수 있습니다.",
@@ -764,6 +808,14 @@ export const dict = {
"enterprise.form.email.placeholder": "name@company.com",
"enterprise.form.phone.label": "전화번호",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "귀사의 현재 월간 AI 추론 비용(USD)은 얼마인가요?",
"enterprise.form.inferenceSpend.placeholder": "범위 선택 (선택 사항)",
"enterprise.form.inferenceSpend.none": "아직 지출 없음",
"enterprise.form.inferenceSpend.under1k": "$1K 미만",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K 이상",
"enterprise.form.message.label": "어떤 문제를 해결하고 싶으신가요?",
"enterprise.form.message.placeholder": "도움이 필요한 부분은...",
"enterprise.form.send": "전송",
@@ -772,6 +824,7 @@ export const dict = {
"enterprise.form.success.submitted": "양식이 성공적으로 제출되었습니다.",
"enterprise.form.error.allFieldsRequired": "모든 필드는 필수 항목입니다.",
"enterprise.form.error.invalidEmailFormat": "유효하지 않은 이메일 형식입니다.",
"enterprise.form.error.invalidInferenceSpend": "유효한 추론 비용 범위를 선택하세요.",
"enterprise.form.error.internalServer": "내부 서버 오류입니다.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "OpenCode 엔터프라이즈란 무엇인가요?",
+72 -20
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Advarsel",
"go.referral.ended":
"Henvisningsprogrammet er avsluttet. Henvisningslenker gir ikke lenger kreditt til deg eller den som delte dem.",
"go.graph.bonus": "{{count}}× bruk",
"nav.github": "GitHub",
"nav.docs": "Dokumentasjon",
"nav.changelog": "Endringslogg",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "Avbryt",
"common.creating": "Oppretter...",
"common.create": "Opprett",
"common.contactUs": "Kontakt oss",
"common.videoUnsupported": "Nettleseren din støtter ikke video-taggen.",
"common.figure": "Fig {{n}}.",
@@ -226,6 +231,9 @@ export const dict = {
"zen.faq.q8": "Kan jeg bruke Zen med andre kodeagenter?",
"zen.faq.a8":
"Selv om Zen fungerer veldig bra med OpenCode, kan du bruke Zen med hvilken som helst agent. Følg oppsettinstruksjonene i din foretrukne kodeagent.",
"zen.faq.q9": "Kan jeg få refusjon?",
"zen.faq.a9":
"Du kan ha rett på refusjon hvis belastningen ble gjort i løpet av de siste 14 dagene og du ikke har brukt noe av kreditten fra kjøpet. {{contact}} for å be om refusjon.",
"zen.cta.start": "Kom i gang med Zen",
"zen.pricing.title": "Legg til $20 Pay as you go-saldo",
@@ -254,10 +262,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "følgende unntak",
"go.title": "OpenCode Go | Rimelige kodemodeller for alle",
"go.banner.text": "Hy3 får 8x bruksgrense i en begrenset periode",
"go.meta.description":
"Go starter på $5 for den første måneden, deretter $10/måned, med sjenerøse bruksgrenser og pålitelig tilgang til ledende kodemodeller.",
"Go koster $10/måned, med sjenerøse bruksgrenser og pålitelig tilgang til ledende kodemodeller.",
"go.hero.title": "Rimelige kodemodeller for alle",
"go.hero.tagline": "Bruk med hvilken som helst agent. Fyll på kreditt ved behov. Avslutt når som helst.",
"go.hero.body":
"Go bringer agent-koding til programmerere over hele verden. Med rause grenser og pålitelig tilgang til de mest kapable åpen kildekode-modellene, kan du bygge med kraftige agenter uten å bekymre deg for kostnader eller tilgjengelighet.",
@@ -265,13 +273,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Abonner på Go",
"go.cta.price": "$10/måned",
"go.cta.promo": "$5 første måned",
"go.pricing.body":
"Bruk med hvilken som helst agent. $5 første måned, deretter $10/måned. Fyll på kreditt ved behov. Avslutt når som helst.",
"go.plans.month": "per måned",
"go.plans.plus.cta": "Abonner på Go Plus",
"go.plans.plus.description": "Go Plus koster $40/måned og gir høyere bruksgrenser.",
"go.plans.go.feature1": "Utvalgte, rimelige modeller",
"go.plans.go.feature2": "Testet for agentbasert koding",
"go.plans.go.feature3": "Romslige grenser og pålitelig tilgang",
"go.plans.plus.feature1": "Alt i Go er inkludert",
"go.plans.plus.feature2": "Høyere grenser for lengre, fokuserte kodeøkter",
"go.plans.plus.feature3": "For større, krevende prosjekter",
"go.plans.limits": "Grenser",
"go.plans.description": "Anslåtte forespørsler per 5 timer og månedlige grenser per modell",
"go.plans.legend": "Abonnementer",
"go.pricing.body": "Bruk med hvilken som helst agent. $10/måned. Fyll på kreditt ved behov. Avslutt når som helst.",
"go.graph.free": "Gratis",
"go.graph.freePill": "Big Pickle og gratis modeller",
"go.graph.go": "Go",
"go.graph.label": "Forespørsler per 5 timer",
"go.graph.period": "Bruk",
"go.graph.model": "Modell",
"go.graph.requests": "Estimerte forespørsler / 5 timer",
"go.graph.allowance": "Månedlig bruk",
"go.graph.new": "Ny",
"go.graph.scale": "Ikke-lineær skala for forespørsler",
"go.graph.showAll": "Vis alle {{count}} modeller",
"go.graph.showLess": "Vis færre modeller",
"go.graph.limitedRegions": "begrensede regioner",
"go.graph.limitedTime": "begrenset periode",
"go.graph.usageLimits": "Bruksgrenser",
"go.graph.aria": "Forespørsler per 5t: {{free}} vs {{go}}",
@@ -298,21 +326,20 @@ export const dict = {
"go.testimonials.frank.quote": "Jeg skulle ønske jeg fortsatt var hos Nvidia.",
"go.problem.title": "Hvilket problem løser Go?",
"go.problem.body":
"Vi fokuserer på å bringe OpenCode-opplevelsen til så mange som mulig. OpenCode Go er et rimelig abonnement: $5 for den første måneden, deretter $10/måned. Det gir sjenerøse grenser og pålitelig tilgang til de mest kapable åpen kildekode-modellene.",
"Vi fokuserer på å bringe OpenCode-opplevelsen til så mange som mulig. OpenCode Go er et rimelig abonnement til $10/måned. Det gir sjenerøse grenser og pålitelig tilgang til de mest kapable åpen kildekode-modellene.",
"go.problem.subtitle": " ",
"go.problem.item1": "Rimelig abonnementspris",
"go.problem.item2": "Rause grenser og pålitelig tilgang",
"go.problem.item3": "Bygget for så mange programmerere som mulig",
"go.problem.item4": "Et kuratert modellutvalg testet for agent-koding",
"go.how.title": "Hvordan Go fungerer",
"go.how.body":
"Go starter på $5 for den første måneden, deretter $10/måned. Du kan bruke det med OpenCode eller hvilken som helst agent.",
"go.how.body": "Go koster $10/måned. Du kan bruke det med OpenCode eller hvilken som helst agent.",
"go.how.step1.title": "Opprett en konto",
"go.how.step1.beforeLink": "følg",
"go.how.step1.link": "oppsettsinstruksjonene",
"go.how.step2.title": "Abonner på Go",
"go.how.step2.link": "$5 første måned",
"go.how.step2.afterLink": "deretter $10/måned med sjenerøse grenser",
"go.how.step2.link": "$10/måned",
"go.how.step2.afterLink": "med sjenerøse grenser",
"go.how.step3.title": "Begynn å kode",
"go.how.step3.body": "med pålitelig tilgang til åpen kildekode-modeller",
"go.privacy.title": "Personvernet ditt er viktig for oss",
@@ -329,11 +356,11 @@ export const dict = {
"go.faq.a2": "Go inkluderer modellene nedenfor, med høye grenser og pålitelig tilgang.",
"go.faq.q3": "Er Go det samme som Zen?",
"go.faq.a3":
"Nei. Zen er betaling etter bruk, mens Go starter på $5 for den første måneden, deretter $10/måned, med sjenerøse grenser og pålitelig tilgang til et kuratert modellutvalg.",
"Nei. Zen er betaling etter bruk, mens Go koster $10/måned, med sjenerøse grenser og pålitelig tilgang til et kuratert modellutvalg.",
"go.faq.q4": "Hva koster Go?",
"go.faq.a4.p1.beforePricing": "Go koster",
"go.faq.a4.p1.pricingLink": "$5 første måned",
"go.faq.a4.p1.afterPricing": "deretter $10/måned med sjenerøse grenser.",
"go.faq.a4.p1.pricingLink": "$10/måned",
"go.faq.a4.p1.afterPricing": "med sjenerøse grenser.",
"go.faq.a4.p2.beforeAccount": "Du kan administrere abonnementet ditt i din",
"go.faq.a4.p2.accountLink": "konto",
"go.faq.a4.p3": "Avslutt når som helst.",
@@ -343,15 +370,19 @@ export const dict = {
"go.faq.a5.retention": "Dataoppbevaring",
"go.faq.a5.retention30": "30 dager",
"go.faq.a5.retention0": "0 dager",
"go.faq.a5.used": "Brukes",
"go.faq.a5.notUsed": "Brukes ikke",
"go.faq.a5.noAgreement": "Ingen avtale",
"go.faq.a5.notZdr": "Ikke ZDR",
"go.faq.a5.grokRetention":
"ZDR deaktiverer viktige API-funksjoner som er avhengige av lagrede data, inkludert den tilstandsbaserte Responses API, Files and Collections og Batch API.",
"go.faq.a5.gptRetention":
"Logger for overvåking av misbruk genereres for all bruk av API-funksjoner og oppbevares i opptil 30 dager.",
"go.faq.a5.learnMore": "Les mer",
"go.faq.a5.deepseekRetention":
"ZDR-avtalen fornyes månedlig. Den gjeldende avtalen er gyldig til og med 31. august 2026.",
"ZDR-avtalen fornyes månedlig. Den gjeldende avtalen er gyldig til og med 30. september 2026.",
"go.faq.a5.museRetention":
"Kraftig rabatterte tokenpriser i bytte mot tillatelse til å bruke ledetekstene og fullføringene dine til å trene fremtidige Meta-modeller.",
"go.faq.a5.beforeExceptions":
"Go-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med",
@@ -366,7 +397,10 @@ export const dict = {
"go.faq.q9": "Hva er forskjellen mellom gratis modeller og Go?",
"go.faq.a9":
"Gratis modeller inkluderer Big Pickle pluss kampanjemodeller som er tilgjengelige på det tidspunktet, med en kvote på 200 forespørsler/dag. Go tilbyr et kuratert modellutvalg med høyere forespørselskvoter som håndheves over rullerende vinduer (5 timer, ukentlig og månedlig), omtrent tilsvarende $12 per 5 timer, $30 per uke og $60 per måned (faktiske forespørselsantall varierer etter modell og bruk).",
"Gratis modeller inkluderer Big Pickle pluss kampanjemodeller som er tilgjengelige på det tidspunktet, med en kvote på 200 forespørsler/dag. Go tilbyr et kuratert modellutvalg med høyere forespørselskvoter i rullerende perioder: 20 % av den månedlige kvoten per 5 timer, 50 % per uke og 100 % per måned. Modellspesifikke kvoter kan variere (faktisk antall forespørsler varierer etter modell og bruk).",
"go.faq.q10": "Kan jeg få refusjon?",
"go.faq.a10":
"Du kan ha rett på refusjon hvis belastningen ble gjort i løpet av de siste 14 dagene og du ikke har brukt noe av Go-kvoten i den faktureringsperioden. {{contact}} for å be om refusjon.",
"zen.api.error.rateLimitExceeded": "Rate limit overskredet. Vennligst prøv igjen senere.",
"zen.api.error.modelNotSupported": "Modell {{model}} støttes ikke",
@@ -630,7 +664,6 @@ export const dict = {
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Vis",
"workspace.black.loading": "Laster...",
"workspace.black.time.day": "dag",
"workspace.black.time.days": "dager",
"workspace.black.time.hour": "time",
@@ -640,7 +673,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "noen få sekunder",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} per måned.",
"workspace.black.subscription.manage": "Administrer abonnement",
"workspace.black.subscription.ending":
"OpenCode Black avsluttes med gjeldende faktureringsperiode og fornyes ikke. Vi flytter deg til den nye konsollen.",
"workspace.black.subscription.rollingUsage": "5-timers bruk",
"workspace.black.subscription.weeklyUsage": "Ukentlig bruk",
"workspace.black.subscription.resetsIn": "Nullstilles om",
@@ -667,23 +701,32 @@ 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.',
"workspace.lite.providers.title": "Leverandører",
"workspace.lite.providers.description": "Kontroller hvilke leverandører som brukes til ruting.",
"workspace.lite.providers.allowTraining": "Tillat modeller som trener på forespørselsdata",
"workspace.lite.providers.useChina": "Aktiver modeller hostet i Kina",
"workspace.lite.black.message":
"Du abonnerer for øyeblikket på OpenCode Black eller står på venteliste. Vennligst avslutt abonnementet først hvis du vil bytte til Go.",
"workspace.lite.other.message":
"Et annet medlem i dette arbeidsområdet abonnerer allerede på OpenCode Go. Kun ett medlem per arbeidsområde kan abonnere.",
"workspace.lite.promo.description":
"OpenCode Go starter på {{price}}, deretter $10/måned, og gir pålitelig tilgang til populære åpne kodingsmodeller med sjenerøse bruksgrenser.",
"workspace.lite.promo.price": "$5 for den første måneden",
"OpenCode Go koster {{price}} og gir pålitelig tilgang til populære åpne kodingsmodeller med sjenerøse bruksgrenser.",
"workspace.lite.promo.price": "$10/måned",
"workspace.lite.promo.modelsTitle": "Hva som er inkludert",
"workspace.lite.promo.footer":
"Planen er primært utviklet for internasjonale brukere og gir stabil global tilgang. Priser og bruksgrenser kan endres etter hvert som vi lærer av tidlig bruk og tilbakemeldinger.",
@@ -774,6 +817,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefonnummer",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Hva er bedriftens nåværende månedlige forbruk på inferens (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Velg et intervall (valgfritt)",
"enterprise.form.inferenceSpend.none": "Ingen forbruk ennå",
"enterprise.form.inferenceSpend.under1k": "Under $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K eller mer",
"enterprise.form.message.label": "Hvilket problem prøver dere å løse?",
"enterprise.form.message.placeholder": "Vi trenger hjelp med...",
"enterprise.form.send": "Send",
@@ -782,6 +833,7 @@ export const dict = {
"enterprise.form.success.submitted": "Skjemaet ble sendt inn.",
"enterprise.form.error.allFieldsRequired": "Alle felt er obligatoriske.",
"enterprise.form.error.invalidEmailFormat": "Ugyldig e-postformat.",
"enterprise.form.error.invalidInferenceSpend": "Velg et gyldig intervall for inferensforbruk.",
"enterprise.form.error.internalServer": "Intern serverfeil.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Hva er OpenCode Enterprise?",
+72 -19
View File
@@ -2,6 +2,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Ostrzeżenie",
"go.referral.ended":
"Program poleceń został zakończony. Linki polecające nie dają już środków ani Tobie, ani osobie, która je udostępniła.",
"go.graph.bonus": "{{count}}× większy limit",
"nav.github": "GitHub",
"nav.docs": "Dokumentacja",
"nav.changelog": "Dziennik zmian",
@@ -57,6 +61,7 @@ export const dict = {
"common.cancel": "Anuluj",
"common.creating": "Tworzenie...",
"common.create": "Utwórz",
"common.contactUs": "Skontaktuj się z nami",
"common.videoUnsupported": "Twoja przeglądarka nie obsługuje znacznika wideo.",
"common.figure": "Rys. {{n}}.",
@@ -227,6 +232,9 @@ export const dict = {
"zen.faq.q8": "Czy mogę używać Zen z innymi agentami kodującymi?",
"zen.faq.a8":
"Chociaż Zen świetnie działa z OpenCode, możesz używać Zen z dowolnym agentem. Postępuj zgodnie z instrukcjami konfiguracji w swoim preferowanym agencie.",
"zen.faq.q9": "Czy mogę otrzymać zwrot pieniędzy?",
"zen.faq.a9":
"Możesz kwalifikować się do zwrotu, jeśli opłata została pobrana w ciągu ostatnich 14 dni i nie wykorzystano żadnych środków z tego zakupu. {{contact}}, aby poprosić o zwrot.",
"zen.cta.start": "Zacznij korzystać z Zen",
"zen.pricing.title": "Dodaj 20$ salda Pay as you go",
@@ -255,10 +263,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "następującymi wyjątkami",
"go.title": "OpenCode Go | Niskokosztowe modele do kodowania dla każdego",
"go.banner.text": "Hy3 oferuje 8x wyższe limity użycia przez ograniczony czas",
"go.meta.description":
"Go kosztuje $5 za pierwszy miesiąc, a następnie $10/miesiąc, oferując hojne limity użycia i niezawodny dostęp do wiodących modeli do kodowania.",
"Go kosztuje $10/miesiąc, oferując hojne limity użycia i niezawodny dostęp do wiodących modeli do kodowania.",
"go.hero.title": "Niskokosztowe modele do kodowania dla każdego",
"go.hero.tagline": "Używaj z dowolnym agentem. Doładuj środki w razie potrzeby. Anuluj w dowolnym momencie.",
"go.hero.body":
"Go udostępnia programowanie z agentami programistom na całym świecie. Oferuje hojne limity i niezawodny dostęp do najzdolniejszych modeli open source, dzięki czemu możesz budować za pomocą potężnych agentów, nie martwiąc się o koszty czy dostępność.",
@@ -266,13 +274,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Zasubskrybuj Go",
"go.cta.price": "$10/miesiąc",
"go.cta.promo": "$5 pierwszy miesiąc",
"go.plans.month": "miesięcznie",
"go.plans.plus.cta": "Subskrybuj Go Plus",
"go.plans.plus.description": "Go Plus kosztuje $40/miesiąc i oferuje wyższe limity.",
"go.plans.go.feature1": "Wyselekcjonowane, przystępne modele",
"go.plans.go.feature2": "Przetestowane do kodowania agentowego",
"go.plans.go.feature3": "Hojne limity i niezawodny dostęp",
"go.plans.plus.feature1": "Wszystko, co obejmuje Go",
"go.plans.plus.feature2": "Wyższe limity na dłuższe sesje kodowania w skupieniu",
"go.plans.plus.feature3": "Do większych, wymagających projektów",
"go.plans.limits": "Limity",
"go.plans.description": "Szacowana liczba żądań na 5 godzin i miesięczne limity dla modeli",
"go.plans.legend": "Plany",
"go.pricing.body":
"Używaj z dowolnym agentem. $5 za pierwszy miesiąc, potem $10/miesiąc. Doładuj konto w razie potrzeby. Anuluj w dowolnym momencie.",
"Używaj z dowolnym agentem. $10/miesiąc. Doładuj konto w razie potrzeby. Anuluj w dowolnym momencie.",
"go.graph.free": "Darmowe",
"go.graph.freePill": "Big Pickle i darmowe modele",
"go.graph.go": "Go",
"go.graph.label": "Żądania na 5 godzin",
"go.graph.period": "Użycie",
"go.graph.model": "Model",
"go.graph.requests": "Szac. żądania / 5 godz.",
"go.graph.allowance": "Miesięczne użycie",
"go.graph.new": "Nowość",
"go.graph.scale": "Nieliniowa skala liczby żądań",
"go.graph.showAll": "Pokaż wszystkie modele ({{count}})",
"go.graph.showLess": "Pokaż mniej modeli",
"go.graph.limitedRegions": "ograniczone regiony",
"go.graph.limitedTime": "ograniczony czas",
"go.graph.usageLimits": "Limity użycia",
"go.graph.aria": "Żądania na 5h: {{free}} vs {{go}}",
@@ -299,21 +328,20 @@ export const dict = {
"go.testimonials.frank.quote": "Chciałbym wciąż być w Nvidia.",
"go.problem.title": "Jaki problem rozwiązuje Go?",
"go.problem.body":
"Skupiamy się na udostępnieniu doświadczenia OpenCode jak największej liczbie osób. OpenCode Go to tania subskrypcja: $5 za pierwszy miesiąc, potem $10/miesiąc. Zapewnia hojne limity i niezawodny dostęp do najbardziej wydajnych modeli open source.",
"Skupiamy się na udostępnieniu doświadczenia OpenCode jak największej liczbie osób. OpenCode Go to tania subskrypcja za $10/miesiąc. Zapewnia hojne limity i niezawodny dostęp do najbardziej wydajnych modeli open source.",
"go.problem.subtitle": " ",
"go.problem.item1": "Niskokosztowa cena subskrypcji",
"go.problem.item2": "Hojne limity i niezawodny dostęp",
"go.problem.item3": "Stworzony dla jak największej liczby programistów",
"go.problem.item4": "Starannie dobrany zestaw modeli przetestowanych pod kątem kodowania z agentami",
"go.how.title": "Jak działa Go",
"go.how.body":
"Go zaczyna się od $5 za pierwszy miesiąc, potem $10/miesiąc. Możesz go używać z OpenCode lub dowolnym agentem.",
"go.how.body": "Go kosztuje $10/miesiąc. Możesz go używać z OpenCode lub dowolnym agentem.",
"go.how.step1.title": "Załóż konto",
"go.how.step1.beforeLink": "postępuj zgodnie z",
"go.how.step1.link": "instrukcją konfiguracji",
"go.how.step2.title": "Zasubskrybuj Go",
"go.how.step2.link": "$5 za pierwszy miesiąc",
"go.how.step2.afterLink": "potem $10/miesiąc z hojnymi limitami",
"go.how.step2.link": "$10/miesiąc",
"go.how.step2.afterLink": "z hojnymi limitami",
"go.how.step3.title": "Zacznij kodować",
"go.how.step3.body": "z niezawodnym dostępem do modeli open source",
"go.privacy.title": "Twoja prywatność jest dla nas ważna",
@@ -330,11 +358,11 @@ export const dict = {
"go.faq.a2": "Go obejmuje poniższe modele z wysokimi limitami i niezawodnym dostępem.",
"go.faq.q3": "Czy Go to to samo co Zen?",
"go.faq.a3":
"Nie. Zen działa w modelu płatności za użycie, natomiast Go kosztuje $5 za pierwszy miesiąc, a następnie $10/miesiąc, oferując hojne limity i niezawodny dostęp do starannie dobranego zestawu modeli.",
"Nie. Zen działa w modelu płatności za użycie, natomiast Go kosztuje $10/miesiąc, oferując hojne limity i niezawodny dostęp do starannie dobranego zestawu modeli.",
"go.faq.q4": "Ile kosztuje Go?",
"go.faq.a4.p1.beforePricing": "Go kosztuje",
"go.faq.a4.p1.pricingLink": "$5 za pierwszy miesiąc",
"go.faq.a4.p1.afterPricing": "potem $10/miesiąc z hojnymi limitami.",
"go.faq.a4.p1.pricingLink": "$10/miesiąc",
"go.faq.a4.p1.afterPricing": "z hojnymi limitami.",
"go.faq.a4.p2.beforeAccount": "Możesz zarządzać subskrypcją na swoim",
"go.faq.a4.p2.accountLink": "koncie",
"go.faq.a4.p3": "Anuluj w dowolnym momencie.",
@@ -344,14 +372,18 @@ export const dict = {
"go.faq.a5.retention": "Retencja danych",
"go.faq.a5.retention30": "30 dni",
"go.faq.a5.retention0": "0 dni",
"go.faq.a5.used": "Wykorzystywane",
"go.faq.a5.notUsed": "Niewykorzystywane",
"go.faq.a5.noAgreement": "Brak umowy",
"go.faq.a5.notZdr": "Nie ZDR",
"go.faq.a5.grokRetention":
"ZDR wyłącza ważne funkcje API zależne od przechowywanych danych, w tym stanowy Responses API, Files and Collections oraz Batch API.",
"go.faq.a5.gptRetention":
"Dzienniki monitorowania nadużyć są generowane dla każdego użycia funkcji API i przechowywane przez maksymalnie 30 dni.",
"go.faq.a5.learnMore": "Dowiedz się więcej",
"go.faq.a5.deepseekRetention": "Umowa ZDR jest odnawiana co miesiąc. Obecna umowa obowiązuje do 31 sierpnia 2026 r.",
"go.faq.a5.deepseekRetention": "Umowa ZDR jest odnawiana co miesiąc. Obecna umowa obowiązuje do 30 września 2026 r.",
"go.faq.a5.museRetention":
"Znacznie obniżone ceny tokenów w zamian za zgodę na wykorzystanie Twoich promptów i odpowiedzi do trenowania przyszłych modeli Meta.",
"go.faq.a5.beforeExceptions":
"Modele Go są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli, z",
@@ -366,7 +398,10 @@ export const dict = {
"go.faq.q9": "Jaka jest różnica między darmowymi modelami a Go?",
"go.faq.a9":
"Darmowe modele obejmują Big Pickle oraz modele promocyjne dostępne w danym momencie, z limitem 200 zapytań/dzień. Go oferuje starannie dobrany zestaw modeli z wyższymi limitami zapytań egzekwowanymi w oknach kroczących (5-godzinnych, tygodniowych i miesięcznych), odpowiadającymi w przybliżeniu $12 na 5 godzin, $30 tygodniowo i $60 miesięcznie (rzeczywista liczba zapytań zależy od modelu i użycia).",
"Darmowe modele obejmują Big Pickle oraz modele promocyjne dostępne w danym momencie, z limitem 200 zapytań/dzień. Go oferuje starannie dobrany zestaw modeli z wyższymi limitami zapytań w oknach kroczących: 20% miesięcznego limitu na 5 godzin, 50% na tydzień i 100% na miesiąc. Limity mogą się różnić zależnie od modelu (rzeczywista liczba zapytań zależy od modelu i użycia).",
"go.faq.q10": "Czy mogę otrzymać zwrot pieniędzy?",
"go.faq.a10":
"Możesz kwalifikować się do zwrotu, jeśli opłata została pobrana w ciągu ostatnich 14 dni i nie wykorzystano żadnej części limitu Go w tym okresie rozliczeniowym. {{contact}}, aby poprosić o zwrot.",
"zen.api.error.rateLimitExceeded": "Przekroczono limit zapytań. Spróbuj ponownie później.",
"zen.api.error.modelNotSupported": "Model {{model}} nie jest obsługiwany",
@@ -630,7 +665,6 @@ export const dict = {
"workspace.payments.type.subscription": "subskrypcja",
"workspace.payments.view": "Zobacz",
"workspace.black.loading": "Ładowanie...",
"workspace.black.time.day": "dzień",
"workspace.black.time.days": "dni",
"workspace.black.time.hour": "godzina",
@@ -640,7 +674,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "kilka sekund",
"workspace.black.subscription.title": "Subskrypcja",
"workspace.black.subscription.message": "Subskrybujesz OpenCode Black za ${{plan}} miesięcznie.",
"workspace.black.subscription.manage": "Zarządzaj subskrypcją",
"workspace.black.subscription.ending":
"OpenCode Black kończy się wraz z bieżącym okresem rozliczeniowym i nie zostanie odnowiony. Przeniesiemy Cię do nowej konsoli.",
"workspace.black.subscription.rollingUsage": "Użycie (okno 5h)",
"workspace.black.subscription.weeklyUsage": "Użycie tygodniowe",
"workspace.black.subscription.resetsIn": "Resetuje się za",
@@ -667,23 +702,32 @@ 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.',
"workspace.lite.providers.title": "Dostawcy",
"workspace.lite.providers.description": "Kontroluj, którzy dostawcy są używani do routingu.",
"workspace.lite.providers.allowTraining": "Zezwalaj na modele wykorzystujące dane żądań do trenowania",
"workspace.lite.providers.useChina": "Włącz modele hostowane w Chinach",
"workspace.lite.black.message":
"Obecnie subskrybujesz OpenCode Black lub jesteś na liście oczekujących. Jeśli chcesz przejść na Go, najpierw anuluj subskrypcję.",
"workspace.lite.other.message":
"Inny członek tego obszaru roboczego już subskrybuje OpenCode Go. Tylko jeden członek na obszar roboczy może subskrybować.",
"workspace.lite.promo.description":
"OpenCode Go zaczyna się od {{price}}, potem $10/miesiąc, i zapewnia niezawodny dostęp do popularnych otwartych modeli kodowania z hojnymi limitami użycia.",
"workspace.lite.promo.price": "$5 za pierwszy miesiąc",
"OpenCode Go kosztuje {{price}} i zapewnia niezawodny dostęp do popularnych otwartych modeli kodowania z hojnymi limitami użycia.",
"workspace.lite.promo.price": "$10/miesiąc",
"workspace.lite.promo.modelsTitle": "Co zawiera",
"workspace.lite.promo.footer":
"Plan został opracowany przede wszystkim z myślą o użytkownikach z całego świata i zapewnia stabilny globalny dostęp. Ceny i limity użycia mogą ulec zmianie w miarę zdobywania doświadczeń na podstawie początkowego korzystania z usługi i otrzymywanych opinii.",
@@ -776,6 +820,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Numer telefonu",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Jakie są obecne miesięczne wydatki Twojej firmy na inferencję (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Wybierz przedział (opcjonalnie)",
"enterprise.form.inferenceSpend.none": "Jeszcze bez wydatków",
"enterprise.form.inferenceSpend.under1k": "Poniżej $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K lub więcej",
"enterprise.form.message.label": "Jaki problem próbujesz rozwiązać?",
"enterprise.form.message.placeholder": "Potrzebujemy pomocy z...",
"enterprise.form.send": "Wyślij",
@@ -784,6 +836,7 @@ export const dict = {
"enterprise.form.success.submitted": "Formularz został pomyślnie wysłany.",
"enterprise.form.error.allFieldsRequired": "Wszystkie pola są wymagane.",
"enterprise.form.error.invalidEmailFormat": "Nieprawidłowy format adresu e-mail.",
"enterprise.form.error.invalidInferenceSpend": "Wybierz prawidłowy przedział wydatków na inferencję.",
"enterprise.form.error.internalServer": "Wewnętrzny błąd serwera.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Czym jest OpenCode Enterprise?",
+72 -19
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Предупреждение",
"go.referral.ended":
"Реферальная программа завершена. Реферальные ссылки больше не начисляют кредиты ни вам, ни тому, кто ими поделился.",
"go.graph.bonus": "Лимит ×{{count}}",
"nav.github": "GitHub",
"nav.docs": "Документация",
"nav.changelog": "Список изменений",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "Отмена",
"common.creating": "Создание...",
"common.create": "Создать",
"common.contactUs": "Свяжитесь с нами",
"common.videoUnsupported": "Ваш браузер не поддерживает видео тег.",
"common.figure": "Рис {{n}}.",
@@ -230,6 +235,9 @@ export const dict = {
"zen.faq.q8": "Могу ли я использовать Zen с другими кодинг-агентами?",
"zen.faq.a8":
"Хотя Zen отлично работает с OpenCode, вы можете использовать Zen с любым агентом. Следуйте инструкциям по настройке в вашем любимом агенте.",
"zen.faq.q9": "Могу ли я получить возврат средств?",
"zen.faq.a9":
"Вы можете претендовать на возврат, если списание произошло в течение последних 14 дней и средства, полученные при этой покупке, не были использованы. {{contact}}, чтобы запросить возврат.",
"zen.cta.start": "Начать работу с Zen",
"zen.pricing.title": "Пополнить баланс на $20 (Pay as you go)",
@@ -258,10 +266,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "следующими исключениями",
"go.title": "OpenCode Go | Недорогие модели для кодинга для всех",
"go.banner.text": "Hy3 получает 8x лимиты использования на ограниченное время",
"go.meta.description":
"Go стоит $5 за первый месяц, затем $10/месяц и предлагает щедрые лимиты использования и надежный доступ к ведущим моделям для кодинга.",
"Go стоит $10/месяц и предлагает щедрые лимиты использования и надежный доступ к ведущим моделям для кодинга.",
"go.hero.title": "Недорогие модели для кодинга для всех",
"go.hero.tagline": "Работает с любым агентом. Пополняйте баланс при необходимости. Отменить можно в любой момент.",
"go.hero.body":
"Go открывает доступ к агентам-программистам разработчикам по всему миру. Предлагая щедрые лимиты и надежный доступ к наиболее способным моделям с открытым исходным кодом, вы можете создавать проекты с мощными агентами, не беспокоясь о затратах или доступности.",
@@ -269,13 +277,34 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Подписаться на Go",
"go.cta.price": "$10/месяц",
"go.cta.promo": "$5 первый месяц",
"go.plans.month": "в месяц",
"go.plans.plus.cta": "Подписаться на Go Plus",
"go.plans.plus.description": "Go Plus стоит $40/месяц и предлагает более высокие лимиты.",
"go.plans.go.feature1": "Отобранные доступные модели",
"go.plans.go.feature2": "Проверены для агентного программирования",
"go.plans.go.feature3": "Щедрые лимиты и надёжный доступ",
"go.plans.plus.feature1": "Все возможности Go",
"go.plans.plus.feature2": "Повышенные лимиты для длительной сосредоточенной работы над кодом",
"go.plans.plus.feature3": "Для крупных и сложных проектов",
"go.plans.limits": "Лимиты",
"go.plans.description": "Примерное число запросов за 5 часов и месячные лимиты по моделям",
"go.plans.legend": "Тарифы",
"go.pricing.body":
"Используйте с любым агентом. $5 за первый месяц, затем $10/месяц. Пополняйте баланс при необходимости. Отменить можно в любое время.",
"Используйте с любым агентом. $10/месяц. Пополняйте баланс при необходимости. Отменить можно в любое время.",
"go.graph.free": "Бесплатно",
"go.graph.freePill": "Big Pickle и бесплатные модели",
"go.graph.go": "Go",
"go.graph.label": "Запросов за 5 часов",
"go.graph.period": "Использование",
"go.graph.model": "Модель",
"go.graph.requests": "Примерное число запросов / 5 ч",
"go.graph.allowance": "Использование за месяц",
"go.graph.new": "Новое",
"go.graph.scale": "Нелинейная шкала числа запросов",
"go.graph.showAll": "Показать все модели ({{count}})",
"go.graph.showLess": "Показать меньше моделей",
"go.graph.limitedRegions": "доступно в отдельных регионах",
"go.graph.limitedTime": "ограниченное время",
"go.graph.usageLimits": "Лимиты использования",
"go.graph.aria": "Запросов за 5ч: {{free}} против {{go}}",
@@ -303,21 +332,20 @@ export const dict = {
"go.testimonials.frank.quote": "Жаль, что я больше не в Nvidia.",
"go.problem.title": "Какую проблему решает Go?",
"go.problem.body":
"Мы стремимся сделать OpenCode доступным для как можно большего числа людей. OpenCode Go - это недорогая подписка: $5 за первый месяц, затем $10/месяц. Она предоставляет щедрые лимиты и надежный доступ к самым мощным моделям с открытым исходным кодом.",
"Мы стремимся сделать OpenCode доступным для как можно большего числа людей. OpenCode Go - это недорогая подписка за $10/месяц. Она предоставляет щедрые лимиты и надежный доступ к самым мощным моделям с открытым исходным кодом.",
"go.problem.subtitle": " ",
"go.problem.item1": "Недорогая подписка",
"go.problem.item2": "Щедрые лимиты и надежный доступ",
"go.problem.item3": "Создан для максимального числа программистов",
"go.problem.item4": "Отобранные модели, протестированные для агентного программирования",
"go.how.title": "Как работает Go",
"go.how.body":
"Go начинается с $5 за первый месяц, затем $10/месяц. Вы можете использовать его с OpenCode или любым агентом.",
"go.how.body": "Go стоит $10/месяц. Вы можете использовать его с OpenCode или любым агентом.",
"go.how.step1.title": "Создайте аккаунт",
"go.how.step1.beforeLink": "следуйте",
"go.how.step1.link": "инструкциям по настройке",
"go.how.step2.title": "Подпишитесь на Go",
"go.how.step2.link": "$5 за первый месяц",
"go.how.step2.afterLink": "затем $10/месяц с щедрыми лимитами",
"go.how.step2.link": "$10/месяц",
"go.how.step2.afterLink": "с щедрыми лимитами",
"go.how.step3.title": "Начните кодить",
"go.how.step3.body": "с надежным доступом к open-source моделям",
"go.privacy.title": "Ваша приватность важна для нас",
@@ -334,11 +362,11 @@ export const dict = {
"go.faq.a2": "Go включает перечисленные ниже модели с щедрыми лимитами и надежным доступом.",
"go.faq.q3": "Go — это то же самое, что и Zen?",
"go.faq.a3":
"Нет. Zen оплачивается по мере использования, а Go стоит $5 за первый месяц, затем $10/месяц и предлагает щедрые лимиты и надежный доступ к отобранным моделям.",
"Нет. Zen оплачивается по мере использования, а Go стоит $10/месяц и предлагает щедрые лимиты и надежный доступ к отобранным моделям.",
"go.faq.q4": "Сколько стоит Go?",
"go.faq.a4.p1.beforePricing": "Go стоит",
"go.faq.a4.p1.pricingLink": "$5 за первый месяц",
"go.faq.a4.p1.afterPricing": "затем $10/месяц с щедрыми лимитами.",
"go.faq.a4.p1.pricingLink": "$10/месяц",
"go.faq.a4.p1.afterPricing": "с щедрыми лимитами.",
"go.faq.a4.p2.beforeAccount": "Вы можете управлять подпиской в своем",
"go.faq.a4.p2.accountLink": "аккаунте",
"go.faq.a4.p3": "Отмена в любое время.",
@@ -348,15 +376,19 @@ export const dict = {
"go.faq.a5.retention": "Хранение данных",
"go.faq.a5.retention30": "30 дней",
"go.faq.a5.retention0": "0 дней",
"go.faq.a5.used": "Используется",
"go.faq.a5.notUsed": "Не используется",
"go.faq.a5.noAgreement": "Нет соглашения",
"go.faq.a5.notZdr": "Не ZDR",
"go.faq.a5.grokRetention":
"ZDR отключает важные функции API, зависящие от сохраненных данных, включая Responses API с сохранением состояния, Files and Collections и Batch API.",
"go.faq.a5.gptRetention":
"Журналы мониторинга злоупотреблений создаются при любом использовании функций API и хранятся до 30 дней.",
"go.faq.a5.learnMore": "Подробнее",
"go.faq.a5.deepseekRetention":
"Соглашение ZDR продлевается ежемесячно. Текущее соглашение действует до 31 августа 2026 года.",
"Соглашение ZDR продлевается ежемесячно. Текущее соглашение действует до 30 сентября 2026 года.",
"go.faq.a5.museRetention":
"Значительно сниженная стоимость токенов в обмен на разрешение использовать ваши промпты и ответы для обучения будущих моделей Meta.",
"go.faq.a5.beforeExceptions":
"Модели Go размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за",
@@ -371,7 +403,10 @@ export const dict = {
"go.faq.q9": "В чем разница между бесплатными моделями и Go?",
"go.faq.a9":
"Бесплатные модели включают Big Pickle и доступные на данный момент промо-модели с квотой 200 запросов/день. Go предлагает набор отобранных моделей с более высокими квотами запросов, применяемыми в скользящих окнах (5 часов, неделя и месяц), что примерно эквивалентно $12 за 5 часов, $30 в неделю и $60 в месяц (фактическое количество запросов зависит от модели и использования).",
"Бесплатные модели включают Big Pickle и доступные на данный момент промо-модели с квотой 200 запросов/день. Go предлагает набор отобранных моделей с более высокими квотами запросов в скользящих окнах: 20% месячного лимита за 5 часов, 50% за неделю и 100% за месяц. Лимиты для отдельных моделей могут отличаться (фактическое количество запросов зависит от модели и использования).",
"go.faq.q10": "Могу ли я получить возврат средств?",
"go.faq.a10":
"Вы можете претендовать на возврат, если списание произошло в течение последних 14 дней и вы не использовали лимит Go в этом расчетном периоде. {{contact}}, чтобы запросить возврат.",
"zen.api.error.rateLimitExceeded": "Превышен лимит запросов. Пожалуйста, попробуйте позже.",
"zen.api.error.modelNotSupported": "Модель {{model}} не поддерживается",
@@ -637,7 +672,6 @@ export const dict = {
"workspace.payments.type.subscription": "подписка",
"workspace.payments.view": "Просмотр",
"workspace.black.loading": "Загрузка...",
"workspace.black.time.day": "день",
"workspace.black.time.days": "дней",
"workspace.black.time.hour": "час",
@@ -647,7 +681,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "несколько секунд",
"workspace.black.subscription.title": "Подписка",
"workspace.black.subscription.message": "Вы подписаны на OpenCode Black за ${{plan}} в месяц.",
"workspace.black.subscription.manage": "Управление подпиской",
"workspace.black.subscription.ending":
"OpenCode Black завершится в конце текущего расчётного периода и не будет продлён. Мы перенесём вас в новую консоль.",
"workspace.black.subscription.rollingUsage": "5-часовое использование",
"workspace.black.subscription.weeklyUsage": "Недельное использование",
"workspace.black.subscription.resetsIn": "Сброс через",
@@ -674,23 +709,32 @@ 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.',
"workspace.lite.providers.title": "Провайдеры",
"workspace.lite.providers.description": "Управляйте провайдерами, используемыми для маршрутизации.",
"workspace.lite.providers.allowTraining": "Разрешить модели, обучающиеся на данных запросов",
"workspace.lite.providers.useChina": "Включить модели, размещенные в Китае",
"workspace.lite.black.message":
"Вы подписаны на OpenCode Black или находитесь в списке ожидания. Пожалуйста, сначала отмените подписку, если хотите перейти на Go.",
"workspace.lite.other.message":
"Другой участник в этом рабочем пространстве уже подписан на OpenCode Go. Только один участник в рабочем пространстве может оформить подписку.",
"workspace.lite.promo.description":
"OpenCode Go начинается с {{price}}, затем $10/месяц и предоставляет надежный доступ к популярным открытым моделям кодирования с щедрыми лимитами использования.",
"workspace.lite.promo.price": "$5 за первый месяц",
"OpenCode Go стоит {{price}} и предоставляет надежный доступ к популярным открытым моделям кодирования с щедрыми лимитами использования.",
"workspace.lite.promo.price": "$10/месяц",
"workspace.lite.promo.modelsTitle": "Что включено",
"workspace.lite.promo.footer":
"План предназначен в первую очередь для пользователей по всему миру и обеспечивает стабильный глобальный доступ. Цены и лимиты использования могут меняться по мере изучения первых результатов использования и отзывов.",
@@ -784,6 +828,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Номер телефона",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Каковы текущие ежемесячные расходы вашей компании на инференс (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Выберите диапазон (необязательно)",
"enterprise.form.inferenceSpend.none": "Расходов пока нет",
"enterprise.form.inferenceSpend.under1k": "Менее $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K или больше",
"enterprise.form.message.label": "Какую проблему вы пытаетесь решить?",
"enterprise.form.message.placeholder": "Нам нужна помощь с...",
"enterprise.form.send": "Отправить",
@@ -792,6 +844,7 @@ export const dict = {
"enterprise.form.success.submitted": "Форма успешно отправлена.",
"enterprise.form.error.allFieldsRequired": "Все поля обязательны.",
"enterprise.form.error.invalidEmailFormat": "Неверный формат email.",
"enterprise.form.error.invalidInferenceSpend": "Выберите допустимый диапазон расходов на инференс.",
"enterprise.form.error.internalServer": "Внутренняя ошибка сервера.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Что такое OpenCode Enterprise?",
+71 -18
View File
@@ -3,6 +3,9 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "คำเตือน",
"go.referral.ended": "โปรแกรมแนะนำเพื่อนสิ้นสุดแล้ว ลิงก์แนะนำจะไม่ให้เครดิตแก่คุณหรือผู้ที่แชร์ลิงก์อีกต่อไป",
"go.graph.bonus": "ใช้งาน {{count}} เท่า",
"nav.github": "GitHub",
"nav.docs": "เอกสาร",
"nav.changelog": "บันทึกการเปลี่ยนแปลง",
@@ -58,6 +61,7 @@ export const dict = {
"common.cancel": "ยกเลิก",
"common.creating": "กำลังสร้าง...",
"common.create": "สร้าง",
"common.contactUs": "ติดต่อเรา",
"common.videoUnsupported": "เบราว์เซอร์ของคุณไม่รองรับแท็ก video",
"common.figure": "รูปที่ {{n}}",
@@ -225,6 +229,9 @@ export const dict = {
"zen.faq.q8": "ฉันสามารถใช้ Zen กับเอเจนต์เขียนโค้ดอื่นได้หรือไม่?",
"zen.faq.a8":
"แม้ว่า Zen จะทำงานได้ดีเยี่ยมกับ OpenCode แต่คุณสามารถใช้ Zen กับเอเจนต์ใดก็ได้ เพียงทำตามคำแนะนำการตั้งค่าในเอเจนต์เขียนโค้ดที่คุณต้องการ",
"zen.faq.q9": "ฉันขอเงินคืนได้หรือไม่?",
"zen.faq.a9":
"หากมีการเรียกเก็บเงินภายใน 14 วันที่ผ่านมาและคุณยังไม่ได้ใช้เครดิตใดๆ จากการซื้อนั้น คุณอาจมีสิทธิ์ได้รับเงินคืน {{contact}}เพื่อขอเงินคืน",
"zen.cta.start": "เริ่มต้นใช้งาน Zen",
"zen.pricing.title": "เติมเงิน $20 แบบ Pay as you go",
@@ -253,10 +260,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "ข้อยกเว้นดังนี้",
"go.title": "OpenCode Go | โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
"go.banner.text": "Hy3 เพิ่มโควตาการใช้งานเป็น 8 เท่าในช่วงเวลาจำกัด",
"go.meta.description":
"Go เริ่มต้นที่ $5 สำหรับเดือนแรก จากนั้น $10/เดือน พร้อมขีดจำกัดการใช้งานที่เอื้อเฟื้อและการเข้าถึงโมเดลเขียนโค้ดชั้นนำอย่างเชื่อถือได้",
"Go มีราคา $10/เดือน พร้อมขีดจำกัดการใช้งานที่เอื้อเฟื้อและการเข้าถึงโมเดลเขียนโค้ดชั้นนำอย่างเชื่อถือได้",
"go.hero.title": "โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
"go.hero.tagline": "ใช้กับเอเจนต์ใดก็ได้ เติมเครดิตหากจำเป็น ยกเลิกได้ตลอดเวลา",
"go.hero.body":
"Go นำการเขียนโค้ดแบบเอเจนต์มาสู่นักเขียนโปรแกรมทั่วโลก เสนอขีดจำกัดที่กว้างขวางและการเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสูงสุดได้อย่างน่าเชื่อถือ เพื่อให้คุณสามารถสร้างสรรค์ด้วยเอเจนต์ที่ทรงพลังโดยไม่ต้องกังวลเรื่องค่าใช้จ่ายหรือความพร้อมใช้งาน",
@@ -264,12 +271,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "สมัครสมาชิก Go",
"go.cta.price": "$10/เดือน",
"go.cta.promo": "$5 เดือนแรก",
"go.pricing.body": "ใช้กับเอเจนต์ใดก็ได้ $5 ในเดือนแรก จากนั้น $10/เดือน เติมเครดิตหากจำเป็น ยกเลิกได้ตลอดเวลา",
"go.plans.month": "ต่อเดือน",
"go.plans.plus.cta": "สมัคร Go Plus",
"go.plans.plus.description": "Go Plus ราคา $40/เดือน พร้อมขีดจำกัดการใช้งานที่สูงขึ้น",
"go.plans.go.feature1": "โมเดลคัดสรรในราคาคุ้มค่า",
"go.plans.go.feature2": "ทดสอบสำหรับการเขียนโค้ดด้วยเอเจนต์",
"go.plans.go.feature3": "ขีดจำกัดสูงและเข้าถึงได้อย่างเสถียร",
"go.plans.plus.feature1": "รวมทุกสิ่งที่มีใน Go",
"go.plans.plus.feature2": "ขีดจำกัดสูงขึ้น เพื่อเขียนโค้ดอย่างต่อเนื่องและมีสมาธิได้นานขึ้น",
"go.plans.plus.feature3": "เหมาะสำหรับโปรเจกต์ขนาดใหญ่ที่ซับซ้อน",
"go.plans.limits": "ขีดจำกัด",
"go.plans.description": "จำนวนคำขอโดยประมาณต่อ 5 ชั่วโมงและขีดจำกัดรายเดือนแยกตามโมเดล",
"go.plans.legend": "แพ็กเกจ",
"go.pricing.body": "ใช้กับเอเจนต์ใดก็ได้ $10/เดือน เติมเครดิตหากจำเป็น ยกเลิกได้ตลอดเวลา",
"go.graph.free": "ฟรี",
"go.graph.freePill": "Big Pickle และโมเดลฟรี",
"go.graph.go": "Go",
"go.graph.label": "คำขอต่อ 5 ชั่วโมง",
"go.graph.period": "การใช้งาน",
"go.graph.model": "โมเดล",
"go.graph.requests": "requests โดยประมาณ / 5 ชม.",
"go.graph.allowance": "ปริมาณการใช้งานรายเดือน",
"go.graph.new": "ใหม่",
"go.graph.scale": "มาตราส่วนจำนวนคำขอแบบไม่เป็นเชิงเส้น",
"go.graph.showAll": "ดูโมเดลทั้งหมด {{count}} โมเดล",
"go.graph.showLess": "แสดงโมเดลน้อยลง",
"go.graph.limitedRegions": "เฉพาะบางภูมิภาค",
"go.graph.limitedTime": "ช่วงเวลาจำกัด",
"go.graph.usageLimits": "ขีดจำกัดการใช้งาน",
"go.graph.aria": "คำขอต่อ 5 ชม.: {{free}} vs {{go}}",
@@ -296,20 +324,20 @@ export const dict = {
"go.testimonials.frank.quote": "ผมหวังว่าผมจะยังอยู่ที่ Nvidia",
"go.problem.title": "Go แก้ปัญหาอะไร?",
"go.problem.body":
"เรามุ่งมั่นที่จะนำประสบการณ์ OpenCode ไปสู่ผู้คนให้ได้มากที่สุด OpenCode Go เป็นการสมัครสมาชิกราคาประหยัด: $5 สำหรับเดือนแรก จากนั้น $10/เดือน โดยมอบขีดจำกัดที่เอื้อเฟื้อและการเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสูงสุดอย่างเชื่อถือได้",
"เรามุ่งมั่นที่จะนำประสบการณ์ OpenCode ไปสู่ผู้คนให้ได้มากที่สุด OpenCode Go เป็นการสมัครสมาชิกราคาประหยัด $10/เดือน โดยมอบขีดจำกัดที่เอื้อเฟื้อและการเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสูงสุดอย่างเชื่อถือได้",
"go.problem.subtitle": " ",
"go.problem.item1": "ราคาการสมัครสมาชิกที่ต่ำ",
"go.problem.item2": "ขีดจำกัดที่กว้างขวางและการเข้าถึงที่เชื่อถือได้",
"go.problem.item3": "สร้างขึ้นเพื่อโปรแกรมเมอร์จำนวนมากที่สุดเท่าที่จะเป็นไปได้",
"go.problem.item4": "ชุดโมเดลที่คัดสรรและผ่านการทดสอบสำหรับการเขียนโค้ดแบบเอเจนต์",
"go.how.title": "Go ทำงานอย่างไร",
"go.how.body": "Go เริ่มต้นที่ $5 สำหรับเดือนแรก จากนั้น $10/เดือน คุณสามารถใช้กับ OpenCode หรือเอเจนต์ใดก็ได้",
"go.how.body": "Go มีราคา $10/เดือน คุณสามารถใช้กับ OpenCode หรือเอเจนต์ใดก็ได้",
"go.how.step1.title": "สร้างบัญชี",
"go.how.step1.beforeLink": "ทำตาม",
"go.how.step1.link": "คำแนะนำการตั้งค่า",
"go.how.step2.title": "สมัครสมาชิก Go",
"go.how.step2.link": "$5 เดือนแรก",
"go.how.step2.afterLink": "จากนั้น $10/เดือน พร้อมขีดจำกัดที่เอื้อเฟื้อ",
"go.how.step2.link": "$10/เดือน",
"go.how.step2.afterLink": "พร้อมขีดจำกัดที่เอื้อเฟื้อ",
"go.how.step3.title": "เริ่มเขียนโค้ด",
"go.how.step3.body": "ด้วยการเข้าถึงโมเดลโอเพนซอร์สที่เชื่อถือได้",
"go.privacy.title": "ความเป็นส่วนตัวของคุณสำคัญสำหรับเรา",
@@ -326,11 +354,11 @@ export const dict = {
"go.faq.a2": "Go รวมโมเดลด้านล่างนี้ พร้อมขีดจำกัดที่มากและการเข้าถึงที่เชื่อถือได้",
"go.faq.q3": "Go เหมือนกับ Zen หรือไม่?",
"go.faq.a3":
"ไม่ Zen เป็นแบบจ่ายตามการใช้งาน ขณะที่ Go เริ่มต้นที่ $5 สำหรับเดือนแรก จากนั้น $10/เดือน พร้อมขีดจำกัดที่เอื้อเฟื้อและการเข้าถึงชุดโมเดลที่คัดสรรอย่างเชื่อถือได้",
"ไม่ Zen เป็นแบบจ่ายตามการใช้งาน ขณะที่ Go มีราคา $10/เดือน พร้อมขีดจำกัดที่เอื้อเฟื้อและการเข้าถึงชุดโมเดลที่คัดสรรอย่างเชื่อถือได้",
"go.faq.q4": "Go ราคาเท่าไหร่?",
"go.faq.a4.p1.beforePricing": "Go ราคา",
"go.faq.a4.p1.pricingLink": "$5 เดือนแรก",
"go.faq.a4.p1.afterPricing": "จากนั้น $10/เดือน พร้อมขีดจำกัดที่เอื้อเฟื้อ",
"go.faq.a4.p1.pricingLink": "$10/เดือน",
"go.faq.a4.p1.afterPricing": "พร้อมขีดจำกัดที่เอื้อเฟื้อ",
"go.faq.a4.p2.beforeAccount": "คุณสามารถจัดการการสมัครสมาชิกของคุณได้ใน",
"go.faq.a4.p2.accountLink": "บัญชีของคุณ",
"go.faq.a4.p3": "ยกเลิกได้ตลอดเวลา",
@@ -340,14 +368,18 @@ export const dict = {
"go.faq.a5.retention": "การเก็บรักษาข้อมูล",
"go.faq.a5.retention30": "30 วัน",
"go.faq.a5.retention0": "0 วัน",
"go.faq.a5.used": "นำไปใช้",
"go.faq.a5.notUsed": "ไม่นำไปใช้",
"go.faq.a5.noAgreement": "ไม่มีข้อตกลง",
"go.faq.a5.notZdr": "ไม่ใช่ ZDR",
"go.faq.a5.grokRetention":
"ZDR ปิดใช้งานฟีเจอร์ API สำคัญที่ต้องอาศัยข้อมูลที่จัดเก็บไว้ ซึ่งรวมถึง Responses API แบบมีสถานะ, Files and Collections และ Batch API",
"go.faq.a5.gptRetention":
"ระบบจะสร้างบันทึกการตรวจสอบการใช้งานในทางที่ผิดสำหรับการใช้งานฟีเจอร์ API ทั้งหมด และเก็บรักษาไว้นานสูงสุด 30 วัน",
"go.faq.a5.museRetention":
"ราคาของ token ลดลงอย่างมาก โดยแลกกับการอนุญาตให้นำพรอมต์และผลลัพธ์ที่สร้างขึ้นของคุณไปใช้ฝึกโมเดล Meta ในอนาคต",
"go.faq.a5.learnMore": "ดูข้อมูลเพิ่มเติม",
"go.faq.a5.deepseekRetention": "ข้อตกลง ZDR จะต่ออายุทุกเดือน ข้อตกลงปัจจุบันมีผลใช้ถึงวันที่ 31 สิงหาคม 2026",
"go.faq.a5.deepseekRetention": "ข้อตกลง ZDR จะต่ออายุทุกเดือน ข้อตกลงปัจจุบันมีผลใช้ถึงวันที่ 30 กันยายน 2026",
"go.faq.a5.beforeExceptions":
"โมเดล Go โฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี",
@@ -361,7 +393,10 @@ export const dict = {
"go.faq.q9": "ความแตกต่างระหว่างโมเดลฟรีและ Go คืออะไร?",
"go.faq.a9":
"โมเดลฟรีประกอบด้วย Big Pickle และโมเดลโปรโมชันที่มีให้บริการในขณะนั้น โดยมีโควตา 200 คำขอ/วัน Go นำเสนอชุดโมเดลที่คัดสรร พร้อมโควตาคำขอที่สูงกว่าซึ่งบังคับใช้ตามกรอบเวลาแบบต่อเนื่อง (5 ชั่วโมง, รายสัปดาห์ และรายเดือน) เทียบเท่าประมาณ $12 ต่อ 5 ชั่วโมง, $30 ต่อสัปดาห์ และ $60 ต่อเดือน (จำนวนคำขอจริงแตกต่างกันไปตามโมเดลและการใช้งาน)",
"โมเดลฟรีประกอบด้วย Big Pickle และโมเดลโปรโมชันที่มีให้บริการในขณะนั้น โดยมีโควตา 200 คำขอ/วัน Go นำเสนอชุดโมเดลที่คัดสรร พร้อมโควตาคำขอที่สูงกว่าในกรอบเวลาแบบต่อเนื่อง ได้แก่ 20% ของโควตารายเดือนต่อ 5 ชั่วโมง 50% ต่อสัปดาห์ และ 100% ต่อเดือน โควตาเฉพาะอาจแตกต่างกันไปตามโมเดล (จำนวนคำขอจริงแตกต่างกันไปตามโมเดลและการใช้งาน)",
"go.faq.q10": "ฉันขอเงินคืนได้หรือไม่?",
"go.faq.a10":
"หากมีการเรียกเก็บเงินภายใน 14 วันที่ผ่านมาและคุณยังไม่ได้ใช้สิทธิ์การใช้งาน Go เลยในรอบการเรียกเก็บเงินนั้น คุณอาจมีสิทธิ์ได้รับเงินคืน {{contact}}เพื่อขอเงินคืน",
"zen.api.error.rateLimitExceeded": "เกินขีดจำกัดอัตราการใช้งาน กรุณาลองใหม่ในภายหลัง",
"zen.api.error.modelNotSupported": "ไม่รองรับโมเดล {{model}}",
@@ -625,7 +660,6 @@ export const dict = {
"workspace.payments.type.subscription": "subscription",
"workspace.payments.view": "ดู",
"workspace.black.loading": "กำลังโหลด...",
"workspace.black.time.day": "วัน",
"workspace.black.time.days": "วัน",
"workspace.black.time.hour": "ชั่วโมง",
@@ -635,7 +669,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "ไม่กี่วินาที",
"workspace.black.subscription.title": "การสมัครสมาชิก",
"workspace.black.subscription.message": "คุณสมัครสมาชิก OpenCode Black ในราคา ${{plan}} ต่อเดือน",
"workspace.black.subscription.manage": "จัดการการสมัครสมาชิก",
"workspace.black.subscription.ending":
"OpenCode Black จะสิ้นสุดเมื่อครบรอบการเรียกเก็บเงินปัจจุบันและจะไม่ต่ออายุ เราจะย้ายคุณไปยังคอนโซลใหม่",
"workspace.black.subscription.rollingUsage": "การใช้งาน 5 ชั่วโมง",
"workspace.black.subscription.weeklyUsage": "การใช้งานรายสัปดาห์",
"workspace.black.subscription.resetsIn": "รีเซ็ตใน",
@@ -662,23 +697,32 @@ 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',
"workspace.lite.providers.title": "ผู้ให้บริการ",
"workspace.lite.providers.description": "ควบคุมผู้ให้บริการที่ใช้สำหรับการกำหนดเส้นทาง",
"workspace.lite.providers.allowTraining": "อนุญาตโมเดลที่ฝึกด้วยข้อมูลคำขอ",
"workspace.lite.providers.useChina": "เปิดใช้โมเดลที่โฮสต์ในจีน",
"workspace.lite.black.message":
"ขณะนี้คุณสมัครสมาชิก OpenCode Black หรืออยู่ในรายการรอ โปรดยกเลิกการสมัครก่อนหากต้องการเปลี่ยนไปใช้ Go",
"workspace.lite.other.message":
"สมาชิกคนอื่นใน Workspace นี้ได้สมัคร OpenCode Go แล้ว สามารถสมัครได้เพียงหนึ่งคนต่อหนึ่ง Workspace เท่านั้น",
"workspace.lite.promo.description":
"OpenCode Go เริ่มต้นที่ {{price}} จากนั้น $10/เดือน และมอบการเข้าถึงโมเดลการเขียนโค้ดแบบเปิดยอดนิยมอย่างเสถียรพร้อมขีดจำกัดการใช้งานที่ให้มาอย่างเหลือเฟือ",
"workspace.lite.promo.price": "$5 สำหรับเดือนแรก",
"OpenCode Go ราคา {{price}} และมอบการเข้าถึงโมเดลการเขียนโค้ดแบบเปิดยอดนิยมอย่างเสถียรพร้อมขีดจำกัดการใช้งานที่ให้มาอย่างเหลือเฟือ",
"workspace.lite.promo.price": "$10/เดือน",
"workspace.lite.promo.modelsTitle": "สิ่งที่รวมอยู่ด้วย",
"workspace.lite.promo.footer":
"แผนนี้ออกแบบมาสำหรับผู้ใช้งานต่างประเทศเป็นหลักและให้การเข้าถึงที่เสถียรทั่วโลก ราคาและขีดจำกัดการใช้งานอาจเปลี่ยนแปลงได้ตามสิ่งที่เราเรียนรู้จากการใช้งานและข้อเสนอแนะในช่วงแรก",
@@ -769,6 +813,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "หมายเลขโทรศัพท์",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "ค่าใช้จ่ายด้าน AI inference รายเดือนในปัจจุบันของบริษัทคุณคือเท่าไร (USD)?",
"enterprise.form.inferenceSpend.placeholder": "เลือกช่วง (ไม่บังคับ)",
"enterprise.form.inferenceSpend.none": "ยังไม่มีค่าใช้จ่าย",
"enterprise.form.inferenceSpend.under1k": "ต่ำกว่า $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K ขึ้นไป",
"enterprise.form.message.label": "คุณกำลังพยายามแก้ปัญหาอะไร?",
"enterprise.form.message.placeholder": "เราต้องการความช่วยเหลือเรื่อง...",
"enterprise.form.send": "ส่ง",
@@ -777,6 +829,7 @@ export const dict = {
"enterprise.form.success.submitted": "ส่งแบบฟอร์มสำเร็จแล้ว",
"enterprise.form.error.allFieldsRequired": "จำเป็นต้องกรอกทุกช่อง",
"enterprise.form.error.invalidEmailFormat": "รูปแบบอีเมลไม่ถูกต้อง",
"enterprise.form.error.invalidInferenceSpend": "เลือกช่วงค่าใช้จ่ายด้าน inference ที่ถูกต้อง",
"enterprise.form.error.internalServer": "เกิดข้อผิดพลาดภายในเซิร์ฟเวอร์",
"enterprise.faq.title": "คำถามที่พบบ่อย",
"enterprise.faq.q1": "OpenCode Enterprise คืออะไร?",
+72 -20
View File
@@ -3,6 +3,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Uyarı",
"go.referral.ended":
"Tavsiye programı sona erdi. Tavsiye bağlantıları artık size veya bağlantıyı paylaşan kişiye kredi kazandırmıyor.",
"go.graph.bonus": "{{count}}× kullanım",
"nav.github": "GitHub",
"nav.docs": "Dokümantasyon",
"nav.changelog": "Değişiklik günlüğü",
@@ -58,6 +62,7 @@ export const dict = {
"common.cancel": "İptal",
"common.creating": "Oluşturuluyor...",
"common.create": "Oluştur",
"common.contactUs": "Bize ulaşın",
"common.videoUnsupported": "Tarayıcınız video etiketini desteklemiyor.",
"common.figure": "Şekil {{n}}.",
@@ -227,6 +232,9 @@ export const dict = {
"zen.faq.q8": "Zen'i diğer kodlama ajanlarıyla kullanabilir miyim?",
"zen.faq.a8":
"Zen OpenCode ile harika çalışır, ama Zen'i herhangi bir ajan ile kullanabilirsiniz. Tercih ettiğiniz kodlama ajanında kurulum talimatlarını izleyin.",
"zen.faq.q9": "Para iadesi alabilir miyim?",
"zen.faq.a9":
"Ücret son 14 gün içinde tahsil edildiyse ve bu satın alımdan gelen kredilerin hiçbirini kullanmadıysanız para iadesine hak kazanabilirsiniz. {{contact}} ve para iadesi talep edin.",
"zen.cta.start": "Zen'i kullanmaya başlayın",
"zen.pricing.title": "20$ Kullandıkça öde bakiyesi ekle",
@@ -256,10 +264,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "aşağıdaki istisnalar",
"go.title": "OpenCode Go | Herkes için düşük maliyetli kodlama modelleri",
"go.banner.text": "Hy3 sınırlı bir süre için 8x kullanım limiti sunuyor",
"go.meta.description":
"Go ilk ay $5, sonrasında ayda 10$ fiyatıyla başlar; cömert kullanım limitleri ve önde gelen kodlama modellerine güvenilir erişim sunar.",
"Go ayda 10$'dır; cömert kullanım limitleri ve önde gelen kodlama modellerine güvenilir erişim sunar.",
"go.hero.title": "Herkes için düşük maliyetli kodlama modelleri",
"go.hero.tagline": "Herhangi bir ajanla kullanın. Gerekirse kredi yükleyin. İstediğiniz zaman iptal edin.",
"go.hero.body":
"Go, dünya çapındaki programcılara ajan tabanlı kodlama getiriyor. En yetenekli açık kaynaklı modellere cömert limitler ve güvenilir erişim sunarak, maliyet veya erişilebilirlik konusunda endişelenmeden güçlü ajanlarla geliştirme yapmanızı sağlar.",
@@ -267,13 +275,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Go'ya abone ol",
"go.cta.price": "Ayda 10$",
"go.cta.promo": "İlk ay $5",
"go.pricing.body":
"Herhangi bir ajanla kullanın. İlk ay $5, sonrasında ayda 10$. Gerekirse kredi yükleyin. İstediğiniz zaman iptal edin.",
"go.plans.month": "aylık",
"go.plans.plus.cta": "Go Plus'a abone ol",
"go.plans.plus.description": "Go Plus ayda 40$'dır ve daha yüksek limitler sunar.",
"go.plans.go.feature1": "Seçilmiş, uygun fiyatlı modeller",
"go.plans.go.feature2": "Ajan destekli kodlama için test edildi",
"go.plans.go.feature3": "Cömert limitler ve güvenilir erişim",
"go.plans.plus.feature1": "Go'daki her şey dahil",
"go.plans.plus.feature2": "Daha uzun, odaklı kodlama oturumları için daha yüksek limitler",
"go.plans.plus.feature3": "Daha büyük ve zorlu projeler için",
"go.plans.limits": "Limitler",
"go.plans.description": "Model başına 5 saatlik tahmini istek ve aylık kullanım limitleri",
"go.plans.legend": "Planlar",
"go.pricing.body": "Herhangi bir ajanla kullanın. Ayda 10$. Gerekirse kredi yükleyin. İstediğiniz zaman iptal edin.",
"go.graph.free": "Ücretsiz",
"go.graph.freePill": "Big Pickle ve ücretsiz modeller",
"go.graph.go": "Go",
"go.graph.label": "5 saat başına istekler",
"go.graph.period": "Kullanım",
"go.graph.model": "Model",
"go.graph.requests": "Tahmini istek / 5 saat",
"go.graph.allowance": "Aylık kullanım",
"go.graph.new": "Yeni",
"go.graph.scale": "Doğrusal olmayan istek ölçeği",
"go.graph.showAll": "{{count}} modelin tümünü göster",
"go.graph.showLess": "Daha az model göster",
"go.graph.limitedRegions": "sınırlı bölgeler",
"go.graph.limitedTime": "sınırlı süre",
"go.graph.usageLimits": "Kullanım limitleri",
"go.graph.aria": "5 saatlik istekler: {{free}} vs {{go}}",
@@ -301,21 +329,20 @@ export const dict = {
"go.testimonials.frank.quote": "Keşke hala Nvidia'da olsaydım.",
"go.problem.title": "Go hangi sorunu çözüyor?",
"go.problem.body":
"OpenCode deneyimini mümkün olduğunca çok kişiye ulaştırmaya odaklandık. OpenCode Go düşük maliyetli bir aboneliktir: İlk ay $5, sonrasında ayda 10$. Cömert limitler ve en yetenekli açık kaynak modellere güvenilir erişim sağlar.",
"OpenCode deneyimini mümkün olduğunca çok kişiye ulaştırmaya odaklandık. OpenCode Go, ayda 10$ olan düşük maliyetli bir aboneliktir. Cömert limitler ve en yetenekli açık kaynak modellere güvenilir erişim sağlar.",
"go.problem.subtitle": " ",
"go.problem.item1": "Düşük maliyetli abonelik fiyatlandırması",
"go.problem.item2": "Cömert limitler ve güvenilir erişim",
"go.problem.item3": "Mümkün olduğunca çok programcı için geliştirildi",
"go.problem.item4": "Ajan tabanlı kodlama için test edilmiş, özenle seçilmiş model seçenekleri",
"go.how.title": "Go nasıl çalışır?",
"go.how.body":
"Go ilk ay $5, sonrasında ayda 10$ fiyatıyla başlar. OpenCode veya herhangi bir ajanla kullanabilirsiniz.",
"go.how.body": "Go ayda 10$'dır. OpenCode veya herhangi bir ajanla kullanabilirsiniz.",
"go.how.step1.title": "Bir hesap oluşturun",
"go.how.step1.beforeLink": "takip edin",
"go.how.step1.link": "kurulum talimatları",
"go.how.step2.title": "Go'ya abone olun",
"go.how.step2.link": "İlk ay $5",
"go.how.step2.afterLink": "sonrasında cömert limitlerle ayda 10$",
"go.how.step2.link": "Ayda 10$",
"go.how.step2.afterLink": "cömert limitlerle",
"go.how.step3.title": "Kodlamaya başlayın",
"go.how.step3.body": "açık kaynaklı modellere güvenilir erişimle",
"go.privacy.title": "Gizliliğiniz bizim için önemlidir",
@@ -332,11 +359,11 @@ export const dict = {
"go.faq.a2": "Go, aşağıda listelenen modelleri cömert limitler ve güvenilir erişimle sunar.",
"go.faq.q3": "Go, Zen ile aynı mı?",
"go.faq.a3":
"Hayır. Zen kullandıkça öde modelidir; Go ise ilk ay $5, sonrasında ayda 10$ fiyatıyla başlar ve özenle seçilmiş model seçeneklerine cömert limitlerle güvenilir erişim sunar.",
"Hayır. Zen kullandıkça öde modelidir; Go ise ayda 10$'dır ve özenle seçilmiş model seçeneklerine cömert limitlerle güvenilir erişim sunar.",
"go.faq.q4": "Go ne kadar?",
"go.faq.a4.p1.beforePricing": "Go'nun maliyeti",
"go.faq.a4.p1.pricingLink": "İlk ay $5",
"go.faq.a4.p1.afterPricing": "sonrasında cömert limitlerle ayda 10$.",
"go.faq.a4.p1.pricingLink": "ayda 10$",
"go.faq.a4.p1.afterPricing": "cömert limitlerle.",
"go.faq.a4.p2.beforeAccount": "Aboneliğinizi",
"go.faq.a4.p2.accountLink": "hesabınızdan",
"go.faq.a4.p3": "yönetebilirsiniz. İstediğiniz zaman iptal edin.",
@@ -346,15 +373,19 @@ export const dict = {
"go.faq.a5.retention": "Veri saklama",
"go.faq.a5.retention30": "30 gün",
"go.faq.a5.retention0": "0 gün",
"go.faq.a5.used": "Kullanılır",
"go.faq.a5.notUsed": "Kullanılmaz",
"go.faq.a5.noAgreement": "Anlaşma yok",
"go.faq.a5.notZdr": "ZDR değil",
"go.faq.a5.grokRetention":
"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.",
"go.faq.a5.gptRetention":
"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.",
"go.faq.a5.learnMore": "Daha fazla bilgi",
"go.faq.a5.deepseekRetention":
"ZDR anlaşması aylık olarak yenilenir. Mevcut anlaşma 31 Ağustos 2026 tarihine kadar geçerlidir.",
"ZDR anlaşması aylık olarak yenilenir. Mevcut anlaşma 30 Eylül 2026 tarihine kadar geçerlidir.",
"go.faq.a5.museRetention":
"İ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ı.",
"go.faq.a5.beforeExceptions":
"Go modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu",
@@ -369,7 +400,10 @@ export const dict = {
"go.faq.q9": "Ücretsiz modeller ve Go arasındaki fark nedir?",
"go.faq.a9":
"Ücretsiz modeller, günlük 200 istek kotasıyla Big Pickle'ı ve o sırada mevcut olan promosyonel modelleri içerir. Go ise kayan zaman aralıklarında (5 saatlik, haftalık ve aylık) uygulanan daha yüksek istek kotalarıyla özenle seçilmiş model seçenekleri sunar. Bu kotalar kabaca her 5 saatte 12$, haftada 30$ ve ayda 60$ değerine eşdeğerdir (gerçek istek sayıları modele ve kullanıma göre değişir).",
"Ücretsiz modeller, günlük 200 istek kotasıyla Big Pickle'ı ve o sırada mevcut olan promosyonel modelleri içerir. Go ise kayan zaman aralıklarında daha yüksek istek kotalarıyla özenle seçilmiş model seçenekleri sunar: aylık kotanın %20'si her 5 saatte, %50'si haftada ve %100'ü ayda kullanılabilir. Modele özgü kullanım hakları farklılık gösterebilir (gerçek istek sayıları modele ve kullanıma göre değişir).",
"go.faq.q10": "Para iadesi alabilir miyim?",
"go.faq.a10":
"Ücret son 14 gün içinde tahsil edildiyse ve ilgili faturalandırma döneminde Go kullanım hakkınızı hiç kullanmadıysanız para iadesine hak kazanabilirsiniz. {{contact}} ve para iadesi talep edin.",
"zen.api.error.rateLimitExceeded": "İstek limiti aşıldı. Lütfen daha sonra tekrar deneyin.",
"zen.api.error.modelNotSupported": "{{model}} modeli desteklenmiyor",
@@ -633,7 +667,6 @@ export const dict = {
"workspace.payments.type.subscription": "abonelik",
"workspace.payments.view": "Görüntüle",
"workspace.black.loading": "Yükleniyor...",
"workspace.black.time.day": "gün",
"workspace.black.time.days": "gün",
"workspace.black.time.hour": "saat",
@@ -643,7 +676,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "birkaç saniye",
"workspace.black.subscription.title": "Abonelik",
"workspace.black.subscription.message": "Aylık ${{plan}} karşılığında OpenCode Black'e abonesiniz.",
"workspace.black.subscription.manage": "Aboneliği Yönet",
"workspace.black.subscription.ending":
"OpenCode Black mevcut fatura döneminizin sonunda sona erer ve yenilenmez. Sizi yeni konsola taşıyacağız.",
"workspace.black.subscription.rollingUsage": "5 Saatlik Kullanım",
"workspace.black.subscription.weeklyUsage": "Haftalık Kullanım",
"workspace.black.subscription.resetsIn": "Sıfırlama süresi",
@@ -670,23 +704,32 @@ 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.',
"workspace.lite.providers.title": "Sağlayıcılar",
"workspace.lite.providers.description": "Yönlendirme için hangi sağlayıcıların kullanılacağını kontrol edin.",
"workspace.lite.providers.allowTraining": "İstek verileriyle eğitilen modellere izin ver",
"workspace.lite.providers.useChina": "Çin'de barındırılan modelleri etkinleştir",
"workspace.lite.black.message":
"Şu anda OpenCode Black abonesisiniz veya bekleme listesindesiniz. Go'ya geçmek istiyorsanız lütfen önce aboneliğinizi iptal edin.",
"workspace.lite.other.message":
"Bu çalışma alanındaki başka bir üye zaten OpenCode Go abonesi. Çalışma alanı başına yalnızca bir üye abone olabilir.",
"workspace.lite.promo.description":
"OpenCode Go {{price}} fiyatından başlar, sonrasında ayda 10$ olur ve cömert kullanım limitleriyle popüler açık kodlama modellerine güvenilir erişim sağlar.",
"workspace.lite.promo.price": "İlk ay $5",
"OpenCode Go {{price}} fiyatıyla cömert kullanım limitleri ve popüler açık kodlama modellerine güvenilir erişim sağlar.",
"workspace.lite.promo.price": "Ayda 10$",
"workspace.lite.promo.modelsTitle": "Neler Dahil",
"workspace.lite.promo.footer":
"Plan öncelikle uluslararası kullanıcılar için tasarlanmıştır ve istikrarlı küresel erişim sağlar. Erken kullanım ve geri bildirimlerden öğrendiklerimiz doğrultusunda fiyatlandırma ve kullanım limitleri değişebilir.",
@@ -780,6 +823,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefon numarası",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Şirketinizin mevcut aylık çıkarım (inference) harcaması nedir (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Bir aralık seçin (isteğe bağlı)",
"enterprise.form.inferenceSpend.none": "Henüz harcama yok",
"enterprise.form.inferenceSpend.under1k": "$1K altı",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K veya daha fazla",
"enterprise.form.message.label": "Hangi problemi çözmeye çalışıyorsunuz?",
"enterprise.form.message.placeholder": "Şu konuda yardıma ihtiyacımız var...",
"enterprise.form.send": "Gönder",
@@ -788,6 +839,7 @@ export const dict = {
"enterprise.form.success.submitted": "Form başarıyla gönderildi.",
"enterprise.form.error.allFieldsRequired": "Tüm alanlar gereklidir.",
"enterprise.form.error.invalidEmailFormat": "Geçersiz e-posta formatı.",
"enterprise.form.error.invalidInferenceSpend": "Geçerli bir çıkarım harcaması aralığı seçin.",
"enterprise.form.error.internalServer": "İç sunucu hatası.",
"enterprise.faq.title": "SSS",
"enterprise.faq.q1": "OpenCode Enterprise nedir?",
+71 -20
View File
@@ -2,6 +2,10 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "Попередження",
"go.referral.ended":
"Реферальну програму завершено. Реферальні посилання більше не нараховують кредити ні вам, ні тому, хто ними поділився.",
"go.graph.bonus": "Ліміт ×{{count}}",
"nav.github": "GitHub",
"nav.docs": "Документація",
"nav.changelog": "Журнал змін",
@@ -226,6 +230,9 @@ export const dict = {
"zen.faq.q8": "Чи можна використовувати Zen з іншими агентами кодування?",
"zen.faq.a8":
"Хоча Zen чудово працює з OpenCode, ви можете використовувати Zen з будь-яким агентом. Дотримуйтесь інструкцій з налаштування у вашому агенті.",
"zen.faq.q9": "Чи можу я отримати повернення коштів?",
"zen.faq.a9":
"Ви можете претендувати на повернення, якщо кошти було списано протягом останніх 14 днів і ви не використали кошти, отримані внаслідок цієї покупки. {{contact}}, щоб подати запит на повернення.",
"zen.cta.start": "Почати з Zen",
"zen.pricing.title": "Додати $20 балансу Pay as you go",
@@ -255,10 +262,10 @@ export const dict = {
"zen.privacy.exceptionsLink": "такими винятками",
"go.title": "OpenCode Go | Недорогі моделі кодування для всіх",
"go.banner.text": "Hy3 отримує 8x ліміти використання протягом обмеженого часу",
"go.meta.description":
"Go починається від $5 за перший місяць, потім $10/місяць, зі щедрими лімітами використання та надійним доступом до провідних моделей для кодування.",
"Go коштує $10/місяць, зі щедрими лімітами використання та надійним доступом до провідних моделей для кодування.",
"go.hero.title": "Недорогі моделі кодування для всіх",
"go.hero.tagline": "Використовуйте з будь-яким агентом. Поповнюйте за потреби. Скасуйте в будь-який час.",
"go.hero.body":
"Go надає агентне програмування програмістам у всьому світі, пропонуючи щедрі ліміти та надійний доступ до найкращих моделей з відкритим кодом.",
@@ -266,13 +273,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Підписатися на Go",
"go.cta.price": "$10/місяць",
"go.cta.promo": "$5 перший місяць",
"go.pricing.body":
"Використовуйте з будь-яким агентом. $5 перший місяць, потім $10/місяць. Поповнюйте за потреби. Скасуйте в будь-який час.",
"go.plans.month": "на місяць",
"go.plans.plus.cta": "Підписатися на Go Plus",
"go.plans.plus.description": "Go Plus коштує $40/місяць і пропонує вищі ліміти.",
"go.plans.go.feature1": "Відібрані доступні моделі",
"go.plans.go.feature2": "Перевірені для агентного програмування",
"go.plans.go.feature3": "Щедрі ліміти й надійний доступ",
"go.plans.plus.feature1": "Усе, що входить до Go",
"go.plans.plus.feature2": "Вищі ліміти для тривалішої зосередженої роботи над кодом",
"go.plans.plus.feature3": "Для більших і складніших проєктів",
"go.plans.limits": "Ліміти",
"go.plans.description": "Орієнтовні запити за 5 годин і місячні ліміти за моделями",
"go.plans.legend": "Плани",
"go.pricing.body": "Використовуйте з будь-яким агентом. $10/місяць. Поповнюйте за потреби. Скасуйте в будь-який час.",
"go.graph.free": "Безкоштовно",
"go.graph.freePill": "Big Pickle та безкоштовні моделі",
"go.graph.go": "Go",
"go.graph.label": "Запитів за 5 годин",
"go.graph.period": "Використання",
"go.graph.model": "Модель",
"go.graph.requests": "Оцінка запитів / 5 год",
"go.graph.allowance": "Використання за місяць",
"go.graph.new": "Нове",
"go.graph.scale": "Нелінійна шкала кількості запитів",
"go.graph.showAll": "Показати всі моделі ({{count}})",
"go.graph.showLess": "Показати менше моделей",
"go.graph.limitedRegions": "обмежені регіони",
"go.graph.limitedTime": "обмежений час",
"go.graph.usageLimits": "Ліміти використання",
"go.graph.aria": "Запитів за 5 год: {{free}} vs {{go}}",
@@ -299,21 +326,20 @@ export const dict = {
"go.testimonials.frank.quote": "Хотів би я досі бути в Nvidia.",
"go.problem.title": "Яку проблему вирішує Go?",
"go.problem.body":
"Ми зосереджені на тому, щоб зробити досвід OpenCode доступним для якомога більшої кількості людей. OpenCode Go — це недорога підписка: $5 за перший місяць, потім $10/місяць. Вона надає щедрі ліміти та надійний доступ до найкращих моделей з відкритим кодом.",
"Ми зосереджені на тому, щоб зробити досвід OpenCode доступним для якомога більшої кількості людей. OpenCode Go — це недорога підписка за $10/місяць. Вона надає щедрі ліміти та надійний доступ до найкращих моделей з відкритим кодом.",
"go.problem.subtitle": " ",
"go.problem.item1": "Недорога підписка",
"go.problem.item2": "Щедрі ліміти та надійний доступ",
"go.problem.item3": "Створено для якомога більшої кількості програмістів",
"go.problem.item4": "Добірка моделей, протестованих для агентного кодування",
"go.how.title": "Як працює Go",
"go.how.body":
"Go починається від $5 за перший місяць, потім $10/місяць. Використовуйте з OpenCode або будь-яким агентом.",
"go.how.body": "Go коштує $10/місяць. Використовуйте з OpenCode або будь-яким агентом.",
"go.how.step1.title": "Створіть обліковий запис",
"go.how.step1.beforeLink": "дотримуйтесь",
"go.how.step1.link": "інструкцій з налаштування",
"go.how.step2.title": "Підпишіться на Go",
"go.how.step2.link": "$5 перший місяць",
"go.how.step2.afterLink": "потім $10/місяць із щедрими лімітами",
"go.how.step2.link": "$10/місяць",
"go.how.step2.afterLink": "із щедрими лімітами",
"go.how.step3.title": "Почніть кодувати",
"go.how.step3.body": "з надійним доступом до моделей з відкритим кодом",
"go.privacy.title": "Ваша конфіденційність важлива для нас",
@@ -330,11 +356,11 @@ export const dict = {
"go.faq.a2": "Go включає моделі, перелічені нижче, із щедрими лімітами та надійним доступом.",
"go.faq.q3": "Чи Go те саме, що Zen?",
"go.faq.a3":
"Ні. Zen — це плата за використання, тоді як Go починається від $5 за перший місяць, потім $10/місяць, із щедрими лімітами та надійним доступом до добірки моделей.",
"Ні. Zen — це плата за використання, тоді як Go коштує $10/місяць, із щедрими лімітами та надійним доступом до добірки моделей.",
"go.faq.q4": "Скільки коштує Go?",
"go.faq.a4.p1.beforePricing": "Go коштує",
"go.faq.a4.p1.pricingLink": "$5 за перший місяць",
"go.faq.a4.p1.afterPricing": "потім $10/місяць із щедрими лімітами.",
"go.faq.a4.p1.pricingLink": "$10/місяць",
"go.faq.a4.p1.afterPricing": "із щедрими лімітами.",
"go.faq.a4.p2.beforeAccount": "Ви можете керувати підпискою в",
"go.faq.a4.p2.accountLink": "обліковому записі",
"go.faq.a4.p3": "Скасуйте в будь-який час.",
@@ -344,14 +370,18 @@ export const dict = {
"go.faq.a5.retention": "Зберігання даних",
"go.faq.a5.retention30": "30 днів",
"go.faq.a5.retention0": "0 днів",
"go.faq.a5.used": "Використовується",
"go.faq.a5.notUsed": "Не використовується",
"go.faq.a5.noAgreement": "Немає угоди",
"go.faq.a5.notZdr": "Не ZDR",
"go.faq.a5.grokRetention":
"ZDR вимикає важливі функції API, які залежать від збережених даних, зокрема Responses API зі збереженням стану, Files and Collections та Batch API.",
"go.faq.a5.gptRetention":
"Журнали моніторингу зловживань створюються для всіх випадків використання функцій API та зберігаються до 30 днів.",
"go.faq.a5.learnMore": "Докладніше",
"go.faq.a5.deepseekRetention": "Угода ZDR поновлюється щомісяця. Поточна угода дійсна до 31 серпня 2026 року.",
"go.faq.a5.deepseekRetention": "Угода ZDR поновлюється щомісяця. Поточна угода дійсна до 30 вересня 2026 року.",
"go.faq.a5.museRetention":
"Значно знижені ціни на токени в обмін на дозвіл використовувати ваші промпти та відповіді для навчання майбутніх моделей Meta.",
"go.faq.a5.beforeExceptions":
"Моделі Go розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
@@ -365,7 +395,10 @@ export const dict = {
"go.faq.q9": "Яка різниця між безкоштовними моделями та Go?",
"go.faq.a9":
"Безкоштовні моделі включають Big Pickle та доступні на той момент акційні моделі з квотою 200 запитів/день. Go пропонує добірку моделей із вищими квотами запитів, що застосовуються протягом ковзних періодів (5 годин, тижня та місяця), приблизно еквівалентними $12 за 5 годин, $30 на тиждень і $60 на місяць (фактична кількість запитів залежить від моделі та використання).",
"Безкоштовні моделі включають Big Pickle та доступні на той момент акційні моделі з квотою 200 запитів/день. Go пропонує добірку моделей із вищими квотами запитів протягом ковзних періодів: 20% місячного ліміту за 5 годин, 50% за тиждень і 100% за місяць. Ліміти для окремих моделей можуть відрізнятися (фактична кількість запитів залежить від моделі та використання).",
"go.faq.q10": "Чи можу я отримати повернення коштів?",
"go.faq.a10":
"Ви можете претендувати на повернення, якщо кошти було списано протягом останніх 14 днів і ви не використали ліміт Go протягом цього розрахункового періоду. {{contact}}, щоб подати запит на повернення.",
"zen.api.error.rateLimitExceeded": "Перевищено ліміт запитів. Спробуйте пізніше.",
"zen.api.error.modelNotSupported": "Модель {{model}} не підтримується",
@@ -629,7 +662,6 @@ export const dict = {
"workspace.payments.type.subscription": "підписка",
"workspace.payments.view": "Переглянути",
"workspace.black.loading": "Завантаження...",
"workspace.black.time.day": "день",
"workspace.black.time.days": "дні",
"workspace.black.time.hour": "година",
@@ -639,7 +671,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "кілька секунд",
"workspace.black.subscription.title": "Підписка",
"workspace.black.subscription.message": "Ви підписані на OpenCode Black за ${{plan}} на місяць.",
"workspace.black.subscription.manage": "Керувати підпискою",
"workspace.black.subscription.ending":
"OpenCode Black завершиться наприкінці поточного розрахункового періоду й не буде подовжений. Ми перенесемо вас до нової консолі.",
"workspace.black.subscription.rollingUsage": "Використання (5 год)",
"workspace.black.subscription.weeklyUsage": "Тижневе використання",
"workspace.black.subscription.resetsIn": "Скидається через",
@@ -666,20 +699,29 @@ 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": "Провайдери",
"workspace.lite.providers.description": "Керуйте провайдерами, які використовуються для маршрутизації.",
"workspace.lite.providers.allowTraining": "Дозволити моделі, що навчаються на даних запитів",
"workspace.lite.providers.useChina": "Увімкнути моделі, розміщені в Китаї",
"workspace.lite.black.message":
"Ви вже підписані на OpenCode Black або в списку очікування. Спочатку скасуйте підписку, якщо хочете перейти на Go.",
"workspace.lite.other.message": "Інший учасник цього робочого простору вже підписаний на OpenCode Go.",
"workspace.lite.promo.description": "OpenCode Go починається від {{price}}, потім $10/місяць, із щедрими лімітами.",
"workspace.lite.promo.price": "$5 за перший місяць",
"workspace.lite.promo.description": "OpenCode Go коштує {{price}} і має щедрі ліміти.",
"workspace.lite.promo.price": "$10/місяць",
"workspace.lite.promo.modelsTitle": "Що включено",
"workspace.lite.promo.footer":
"План призначений насамперед для міжнародних користувачів і забезпечує стабільний глобальний доступ. Ціни та ліміти використання можуть змінюватися з урахуванням перших даних про використання та відгуків.",
@@ -738,6 +780,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Номер телефону",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "Які поточні щомісячні витрати вашої компанії на інференс (USD)?",
"enterprise.form.inferenceSpend.placeholder": "Виберіть діапазон (необов'язково)",
"enterprise.form.inferenceSpend.none": "Витрат поки немає",
"enterprise.form.inferenceSpend.under1k": "Менше $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K або більше",
"enterprise.form.message.label": "Яку проблему ви намагаєтеся вирішити?",
"enterprise.form.message.placeholder": "Нам потрібна допомога з...",
"enterprise.form.send": "Надіслати",
@@ -746,6 +796,7 @@ export const dict = {
"enterprise.form.success.submitted": "Форму успішно надіслано.",
"enterprise.form.error.allFieldsRequired": "Усі поля обов'язкові.",
"enterprise.form.error.invalidEmailFormat": "Недійсний формат email.",
"enterprise.form.error.invalidInferenceSpend": "Виберіть допустимий діапазон витрат на інференс.",
"enterprise.form.error.internalServer": "Внутрішня помилка сервера.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Що таке OpenCode Enterprise?",
+70 -18
View File
@@ -3,6 +3,9 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "警告",
"go.referral.ended": "推荐计划已结束。推荐链接不再为你或分享链接的人提供额度。",
"go.graph.bonus": "{{count}} 倍用量",
"nav.github": "GitHub",
"nav.docs": "文档",
"nav.changelog": "更新日志",
@@ -59,6 +62,7 @@ export const dict = {
"common.cancel": "取消",
"common.creating": "正在创建...",
"common.create": "创建",
"common.contactUs": "联系我们",
"common.videoUnsupported": "您的浏览器不支持 video 标签。",
"common.figure": "图 {{n}}.",
@@ -218,6 +222,9 @@ export const dict = {
"zen.faq.q8": "我可以在其他编程代理中使用 Zen 吗?",
"zen.faq.a8":
"虽然 Zen 与 OpenCode 配合效果极佳,但您可以在任何代理中使用 Zen。请按照您首选编程代理中的设置说明进行操作。",
"zen.faq.q9": "我可以退款吗?",
"zen.faq.a9":
"如果扣款发生在过去 14 天内,并且您尚未使用该次购买的任何额度,您可能符合退款条件。请{{contact}}申请退款。",
"zen.cta.start": "开始使用 Zen",
"zen.pricing.title": "充值 $20 (即用即付)",
@@ -244,9 +251,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "以下例外情况除外",
"go.title": "OpenCode Go | 人人可用的低成本编程模型",
"go.banner.text": "Hy3 限时享受 8 倍使用额度",
"go.meta.description": "Go 首月 $5,之后 $10/月,提供充裕的使用限额,并可可靠访问领先的编程模型。",
"go.meta.description": "Go 每月 $10,提供充裕的使用限额,并可可靠访问领先的编程模型。",
"go.hero.title": "人人可用的低成本编程模型",
"go.hero.tagline": "可配合任何代理使用。如有需要可充值。随时取消。",
"go.hero.body":
"Go 将代理编程带给全世界的程序员。提供充裕的限额和对最强大的开源模型的可靠访问,让您可以利用强大的代理进行构建,而无需担心成本或可用性。",
@@ -254,12 +261,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "订阅 Go",
"go.cta.price": "$10/月",
"go.cta.promo": "首月 $5",
"go.pricing.body": "可配合任何代理使用。首月 $5,之后 $10/月。如有需要可充值。随时取消。",
"go.plans.month": "每月",
"go.plans.plus.cta": "订阅 Go Plus",
"go.plans.plus.description": "Go Plus 每月 $40,提供更高的使用额度。",
"go.plans.go.feature1": "精选实惠的模型",
"go.plans.go.feature2": "专为智能体编程测试",
"go.plans.go.feature3": "充足额度与稳定访问",
"go.plans.plus.feature1": "包含 Go 的全部权益",
"go.plans.plus.feature2": "更高额度,支持更长时间的专注编码",
"go.plans.plus.feature3": "适合更大型、更复杂的项目",
"go.plans.limits": "使用额度",
"go.plans.description": "各模型每 5 小时的预计请求次数和每月使用额度",
"go.plans.legend": "套餐",
"go.pricing.body": "可配合任何代理使用。每月 $10。如有需要可充值。随时取消。",
"go.graph.free": "免费",
"go.graph.freePill": "Big Pickle 和免费模型",
"go.graph.go": "Go",
"go.graph.label": "每 5 小时请求数",
"go.graph.period": "使用额度",
"go.graph.model": "模型",
"go.graph.requests": "预估请求数 / 5 小时",
"go.graph.allowance": "每月使用额度",
"go.graph.new": "新",
"go.graph.scale": "请求数采用非线性刻度",
"go.graph.showAll": "查看全部 {{count}} 个模型",
"go.graph.showLess": "收起模型",
"go.graph.limitedRegions": "仅限部分地区",
"go.graph.limitedTime": "限时",
"go.graph.usageLimits": "使用限制",
"go.graph.aria": "每 5 小时请求数: {{free}} vs {{go}}",
@@ -286,20 +314,20 @@ export const dict = {
"go.testimonials.frank.quote": "我希望我还在 Nvidia。",
"go.problem.title": "Go 解决了什么问题?",
"go.problem.body":
"我们致力于将 OpenCode 体验带给尽可能多的人。OpenCode Go 是一款低成本订阅服务:首月 $5,之后 $10/月。它提供充裕的额度,并让您能可靠地使用最强大的开源模型。",
"我们致力于将 OpenCode 体验带给尽可能多的人。OpenCode Go 是一款每月 $10 的低成本订阅服务。它提供充裕的额度,并让您能可靠地使用最强大的开源模型。",
"go.problem.subtitle": " ",
"go.problem.item1": "低成本订阅定价",
"go.problem.item2": "充裕的限额和可靠的访问",
"go.problem.item3": "为尽可能多的程序员打造",
"go.problem.item4": "经过代理编程测试的精选模型阵容",
"go.how.title": "Go 如何工作",
"go.how.body": "Go 起价为首月 $5,之后 $10/月。您可以将其与 OpenCode 或任何代理搭配使用。",
"go.how.body": "Go 每月 $10。您可以将其与 OpenCode 或任何代理搭配使用。",
"go.how.step1.title": "创建账户",
"go.how.step1.beforeLink": "遵循",
"go.how.step1.link": "设置说明",
"go.how.step2.title": "订阅 Go",
"go.how.step2.link": "首月 $5",
"go.how.step2.afterLink": "之后 $10/月,额度充裕",
"go.how.step2.link": "每月 $10",
"go.how.step2.afterLink": "额度充裕",
"go.how.step3.title": "开始编程",
"go.how.step3.body": "可靠访问开源模型",
"go.privacy.title": "您的隐私对我们很重要",
@@ -312,11 +340,11 @@ export const dict = {
"go.faq.q2": "Go 包含哪些模型?",
"go.faq.a2": "Go 包含下方列出的模型,提供充足的限额和可靠的访问。",
"go.faq.q3": "Go 和 Zen 一样吗?",
"go.faq.a3": "不。Zen 是按量付费,而 Go 首月 $5,之后 $10/月,提供充裕的限额,并可可靠访问精选模型阵容。",
"go.faq.a3": "不。Zen 是按量付费,而 Go 每月 $10,提供充裕的限额,并可可靠访问精选模型阵容。",
"go.faq.q4": "Go 多少钱?",
"go.faq.a4.p1.beforePricing": "Go 费用为",
"go.faq.a4.p1.pricingLink": "首月 $5",
"go.faq.a4.p1.afterPricing": "之后 $10/月,额度充裕。",
"go.faq.a4.p1.pricingLink": "每月 $10",
"go.faq.a4.p1.afterPricing": "额度充裕。",
"go.faq.a4.p2.beforeAccount": "您可以在您的",
"go.faq.a4.p2.accountLink": "账户",
"go.faq.a4.p3": "中管理订阅。随时取消。",
@@ -326,13 +354,16 @@ export const dict = {
"go.faq.a5.retention": "数据留存",
"go.faq.a5.retention30": "30 天",
"go.faq.a5.retention0": "0 天",
"go.faq.a5.used": "使用",
"go.faq.a5.notUsed": "不使用",
"go.faq.a5.noAgreement": "无协议",
"go.faq.a5.notZdr": "非 ZDR",
"go.faq.a5.grokRetention":
"ZDR 会禁用依赖所存储数据的重要 API 功能,包括有状态的 Responses API、Files and Collections 和 Batch API。",
"go.faq.a5.gptRetention": "所有 API 功能的使用都会生成滥用监控日志,并最多保留 30 天。",
"go.faq.a5.museRetention": "以允许使用你的提示词和补全结果训练未来的 Meta 模型为交换,token 价格可获得大幅折扣。",
"go.faq.a5.learnMore": "了解更多",
"go.faq.a5.deepseekRetention": "ZDR 协议每月续签。当前协议有效期至 2026 年 8 月 31 日。",
"go.faq.a5.deepseekRetention": "ZDR 协议每月续签。当前协议有效期至 2026 年 9 月 30 日。",
"go.faq.a5.beforeExceptions": "Go 模型托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,",
"go.faq.a5.exceptionsLink": "以下例外情况除外",
"go.faq.q6": "我可以充值余额吗?",
@@ -344,7 +375,10 @@ export const dict = {
"go.faq.q9": "免费模型和 Go 之间的区别是什么?",
"go.faq.a9":
"免费模型包含 Big Pickle 加上当时可用的促销模型,每天有 200 次请求的配额。Go 提供精选模型阵容,并在滚动窗口(5 小时、每周和每月)内执行更高的请求配额,大致相当于每 5 小时 $12、每周 $30 和每月 $60(实际请求计数因模型和使用情况而异)。",
"免费模型包含 Big Pickle 加上当时可用的促销模型,每天有 200 次请求的配额。Go 提供精选模型阵容,并在滚动窗口内执行更高的请求配额:每 5 小时为月额度的 20%,每周为 50%,每月为 100%。具体额度可能因模型而异(实际请求次数因模型和使用情况而异)。",
"go.faq.q10": "我可以退款吗?",
"go.faq.a10":
"如果扣款发生在过去 14 天内,并且您在该计费周期内尚未使用任何 Go 额度,您可能符合退款条件。请{{contact}}申请退款。",
"zen.api.error.rateLimitExceeded": "超出速率限制。请稍后重试。",
"zen.api.error.modelNotSupported": "不支持模型 {{model}}",
@@ -602,7 +636,6 @@ export const dict = {
"workspace.payments.type.subscription": "订阅",
"workspace.payments.view": "查看",
"workspace.black.loading": "加载中...",
"workspace.black.time.day": "天",
"workspace.black.time.days": "天",
"workspace.black.time.hour": "小时",
@@ -612,7 +645,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "几秒钟",
"workspace.black.subscription.title": "订阅",
"workspace.black.subscription.message": "您已订阅 OpenCode Black,价格为每月 ${{plan}}。",
"workspace.black.subscription.manage": "管理订阅",
"workspace.black.subscription.ending":
"OpenCode Black 将在当前计费周期结束时终止,不会续订。我们会将你迁移到新的控制台。",
"workspace.black.subscription.rollingUsage": "5 小时用量",
"workspace.black.subscription.weeklyUsage": "每周用量",
"workspace.black.subscription.resetsIn": "重置于",
@@ -638,21 +672,30 @@ 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 模型。",
"workspace.lite.providers.title": "提供商",
"workspace.lite.providers.description": "控制用于路由的提供商。",
"workspace.lite.providers.allowTraining": "允许使用请求数据进行训练的模型",
"workspace.lite.providers.useChina": "启用部署在中国的模型",
"workspace.lite.black.message": "您当前已订阅 OpenCode Black 或在候补名单中。如需切换到 Go,请先取消订阅。",
"workspace.lite.other.message": "此工作区中的另一位成员已经订阅了 OpenCode Go。每个工作区只有一名成员可以订阅。",
"workspace.lite.promo.description":
"OpenCode Go 起价为 {{price}},之后 $10/月,并提供对流行开放编码模型的可靠访问,同时享有充裕的使用限额。",
"workspace.lite.promo.price": "首月 $5",
"OpenCode Go 每月 {{price}},并提供对流行开放编码模型的可靠访问,同时享有充裕的使用限额。",
"workspace.lite.promo.price": "$10/月",
"workspace.lite.promo.modelsTitle": "包含模型",
"workspace.lite.promo.footer":
"该计划主要面向国际用户,提供稳定的全球访问体验。随着我们持续了解早期使用情况并收集反馈,定价和使用限额可能会有所调整。",
@@ -743,6 +786,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "电话号码",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "贵公司目前每月的 AI 推理支出是多少(美元)?",
"enterprise.form.inferenceSpend.placeholder": "选择范围(可选)",
"enterprise.form.inferenceSpend.none": "尚无支出",
"enterprise.form.inferenceSpend.under1k": "低于 $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K 及以上",
"enterprise.form.message.label": "您想解决什么问题?",
"enterprise.form.message.placeholder": "我们需要帮助...",
"enterprise.form.send": "发送",
@@ -751,6 +802,7 @@ export const dict = {
"enterprise.form.success.submitted": "表单提交成功。",
"enterprise.form.error.allFieldsRequired": "所有字段均为必填项。",
"enterprise.form.error.invalidEmailFormat": "邮箱格式无效。",
"enterprise.form.error.invalidInferenceSpend": "请选择有效的推理支出范围。",
"enterprise.form.error.internalServer": "内部服务器错误。",
"enterprise.faq.title": "常见问题",
"enterprise.faq.q1": "什么是 OpenCode 企业版?",
+69 -18
View File
@@ -3,6 +3,9 @@ import { dict as en } from "./en"
export const dict = {
...en,
"go.referral.ended.label": "警告",
"go.referral.ended": "推薦計畫已結束。推薦連結不再為你或分享連結的人提供額度。",
"go.graph.bonus": "{{count}} 倍用量",
"nav.github": "GitHub",
"nav.docs": "文件",
"nav.changelog": "更新日誌",
@@ -59,6 +62,7 @@ export const dict = {
"common.cancel": "取消",
"common.creating": "正在建立...",
"common.create": "建立",
"common.contactUs": "聯絡我們",
"common.videoUnsupported": "你的瀏覽器不支援 video 標籤。",
"common.figure": "圖 {{n}}.",
@@ -217,6 +221,8 @@ export const dict = {
"zen.faq.q8": "我可以在其他編碼代理中使用 Zen 嗎?",
"zen.faq.a8":
"Zen 與 OpenCode 搭配得很好,但你也可以在任何代理中使用 Zen。請在你偏好的編碼代理中按照設定說明進行配置。",
"zen.faq.q9": "我可以退款嗎?",
"zen.faq.a9": "若扣款發生在過去 14 天內,且你尚未使用該次購買的任何額度,你可能符合退款資格。請{{contact}}申請退款。",
"zen.cta.start": "開始使用 Zen",
"zen.pricing.title": "儲值 $20 即用即付餘額",
@@ -244,9 +250,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "以下例外情況",
"go.title": "OpenCode Go | 低成本全民編碼模型",
"go.banner.text": "Hy3 限時享有 8 倍使用額度",
"go.meta.description": "Go 首月 $5,之後 $10/月,提供充裕的使用限額,並可穩定存取領先的編碼模型。",
"go.meta.description": "Go 每月 $10,提供充裕的使用限額,並可穩定存取領先的編碼模型。",
"go.hero.title": "低成本全民編碼模型",
"go.hero.tagline": "可搭配任何代理使用。如有需要可儲值。隨時取消。",
"go.hero.body":
"Go 將代理編碼帶給全世界的程式設計師。提供寬裕的限額以及對最強大開源模型的穩定存取,讓你可以使用強大的代理進行構建,而無需擔心成本或可用性。",
@@ -254,12 +260,33 @@ export const dict = {
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "訂閱 Go",
"go.cta.price": "$10/月",
"go.cta.promo": "首月 $5",
"go.pricing.body": "可搭配任何代理使用。首月 $5,之後 $10/月。如有需要可儲值。隨時取消。",
"go.plans.month": "每月",
"go.plans.plus.cta": "訂閱 Go Plus",
"go.plans.plus.description": "Go Plus 每月 $40,提供更高的使用額度。",
"go.plans.go.feature1": "精選實惠的模型",
"go.plans.go.feature2": "專為代理程式編碼測試",
"go.plans.go.feature3": "充足額度與穩定存取",
"go.plans.plus.feature1": "包含 Go 的所有權益",
"go.plans.plus.feature2": "更高額度,支援更長時間的專注編碼",
"go.plans.plus.feature3": "適合更大型、更複雜的專案",
"go.plans.limits": "使用額度",
"go.plans.description": "各模型每 5 小時的預估請求次數及每月使用額度",
"go.plans.legend": "方案",
"go.pricing.body": "可搭配任何代理使用。每月 $10。如有需要可儲值。隨時取消。",
"go.graph.free": "免費",
"go.graph.freePill": "Big Pickle 與免費模型",
"go.graph.go": "Go",
"go.graph.label": "每 5 小時請求數",
"go.graph.period": "使用額度",
"go.graph.model": "模型",
"go.graph.requests": "預估請求次數 / 5 小時",
"go.graph.allowance": "每月使用額度",
"go.graph.new": "新",
"go.graph.scale": "請求數採用非線性刻度",
"go.graph.showAll": "查看全部 {{count}} 個模型",
"go.graph.showLess": "收起模型",
"go.graph.limitedRegions": "僅限部分地區",
"go.graph.limitedTime": "限時",
"go.graph.usageLimits": "使用限制",
"go.graph.aria": "每 5 小時請求數:{{free}} vs {{go}}",
@@ -286,20 +313,20 @@ export const dict = {
"go.testimonials.frank.quote": "我希望我還在 Nvidia。",
"go.problem.title": "Go 正在解決什麼問題?",
"go.problem.body":
"我們致力於將 OpenCode 體驗帶給盡可能多的人。OpenCode Go 是一款低成本訂閱服務:首月 $5,之後 $10/月。它提供充裕的額度,並讓您能可靠地使用最強大的開源模型。",
"我們致力於將 OpenCode 體驗帶給盡可能多的人。OpenCode Go 是一款每月 $10 的低成本訂閱服務。它提供充裕的額度,並讓您能可靠地使用最強大的開源模型。",
"go.problem.subtitle": " ",
"go.problem.item1": "低成本訂閱定價",
"go.problem.item2": "寬裕的限額與穩定存取",
"go.problem.item3": "專為盡可能多的程式設計師打造",
"go.problem.item4": "針對代理編碼測試的精選模型陣容",
"go.how.title": "Go 如何運作",
"go.how.body": "Go 起價為首月 $5,之後 $10/月。您可以將其與 OpenCode 或任何代理搭配使用。",
"go.how.body": "Go 每月 $10。您可以將其與 OpenCode 或任何代理搭配使用。",
"go.how.step1.title": "建立帳號",
"go.how.step1.beforeLink": "遵循",
"go.how.step1.link": "設定說明",
"go.how.step2.title": "訂閱 Go",
"go.how.step2.link": "首月 $5",
"go.how.step2.afterLink": "之後 $10/月,額度充裕",
"go.how.step2.link": "每月 $10",
"go.how.step2.afterLink": "額度充裕",
"go.how.step3.title": "開始編碼",
"go.how.step3.body": "穩定存取開源模型",
"go.privacy.title": "你的隱私對我們很重要",
@@ -312,11 +339,11 @@ export const dict = {
"go.faq.q2": "Go 包含哪些模型?",
"go.faq.a2": "Go 包含下方列出的模型,提供充足的額度與穩定的存取。",
"go.faq.q3": "Go 與 Zen 一樣嗎?",
"go.faq.a3": "不。Zen 是按量付費,而 Go 首月 $5,之後 $10/月,提供充裕的限額,並可穩定存取精選模型陣容。",
"go.faq.a3": "不。Zen 是按量付費,而 Go 每月 $10,提供充裕的限額,並可穩定存取精選模型陣容。",
"go.faq.q4": "Go 費用是多少?",
"go.faq.a4.p1.beforePricing": "Go 費用為",
"go.faq.a4.p1.pricingLink": "首月 $5",
"go.faq.a4.p1.afterPricing": "之後 $10/月,額度充裕。",
"go.faq.a4.p1.pricingLink": "每月 $10",
"go.faq.a4.p1.afterPricing": "額度充裕。",
"go.faq.a4.p2.beforeAccount": "你可以在你的",
"go.faq.a4.p2.accountLink": "帳戶",
"go.faq.a4.p3": "中管理訂閱。隨時取消。",
@@ -326,13 +353,16 @@ export const dict = {
"go.faq.a5.retention": "資料保留",
"go.faq.a5.retention30": "30 天",
"go.faq.a5.retention0": "0 天",
"go.faq.a5.used": "使用",
"go.faq.a5.notUsed": "不使用",
"go.faq.a5.noAgreement": "無協議",
"go.faq.a5.notZdr": "非 ZDR",
"go.faq.a5.grokRetention":
"ZDR 會停用依賴儲存資料的重要 API 功能,包括具狀態的 Responses API、Files and Collections 與 Batch API。",
"go.faq.a5.gptRetention": "所有 API 功能的使用都會產生濫用監控日誌,並保留最多 30 天。",
"go.faq.a5.museRetention": "以允許使用您的提示詞和生成結果來訓練未來的 Meta 模型為交換,token 價格可享大幅折扣。",
"go.faq.a5.learnMore": "了解更多",
"go.faq.a5.deepseekRetention": "ZDR 協議每月續簽。目前的協議有效至 2026 年 8 月 31 日。",
"go.faq.a5.deepseekRetention": "ZDR 協議每月續簽。目前的協議有效至 2026 年 9 月 30 日。",
"go.faq.a5.beforeExceptions": "Go 模型託管在美國。供應商遵循零留存政策,不會將你的資料用於模型訓練,但有",
"go.faq.a5.exceptionsLink": "以下例外",
"go.faq.q6": "我可以儲值額度嗎?",
@@ -344,7 +374,10 @@ export const dict = {
"go.faq.q9": "免費模型與 Go 有什麼區別?",
"go.faq.a9":
"免費模型包括 Big Pickle 以及當時可用的促銷模型,配額為 200 次請求/天。Go 提供精選模型陣容,並在滾動視窗(5 小時、每週和每月)內提供更高的請求配額,大約相當於每 5 小時 $12、每週 $30 和每月 $60(實際請求數因模型和使用情況而異)。",
"免費模型包括 Big Pickle 以及當時可用的促銷模型,配額為每天 200 次請求。Go 提供精選模型陣容,並在滾動視窗內執行較高的請求配額:每 5 小時為每月額度的 20%、每週 50%、每月 100%。具體額度可能因模型而異(實際請求次數因模型和使用情況而異)。",
"go.faq.q10": "我可以退款嗎?",
"go.faq.a10":
"若扣款發生在過去 14 天內,且你在該計費期間尚未使用任何 Go 額度,你可能符合退款資格。請{{contact}}申請退款。",
"zen.api.error.rateLimitExceeded": "超出頻率限制。請稍後再試。",
"zen.api.error.modelNotSupported": "不支援模型 {{model}}",
@@ -602,7 +635,6 @@ export const dict = {
"workspace.payments.type.subscription": "訂閱",
"workspace.payments.view": "檢視",
"workspace.black.loading": "載入中...",
"workspace.black.time.day": "天",
"workspace.black.time.days": "天",
"workspace.black.time.hour": "小時",
@@ -612,7 +644,8 @@ export const dict = {
"workspace.black.time.fewSeconds": "幾秒鐘",
"workspace.black.subscription.title": "訂閱",
"workspace.black.subscription.message": "你已訂閱 OpenCode Black,費用為每月 ${{plan}}。",
"workspace.black.subscription.manage": "管理訂閱",
"workspace.black.subscription.ending":
"OpenCode Black 將於目前計費週期結束時終止,不會續訂。我們會將你遷移至新的控制台。",
"workspace.black.subscription.rollingUsage": "5 小時使用量",
"workspace.black.subscription.weeklyUsage": "每週使用量",
"workspace.black.subscription.resetsIn": "重置於",
@@ -638,21 +671,30 @@ 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 模型。",
"workspace.lite.providers.title": "提供商",
"workspace.lite.providers.description": "控制用於路由的提供商。",
"workspace.lite.providers.allowTraining": "允許使用請求資料進行訓練的模型",
"workspace.lite.providers.useChina": "啟用部署在中國的模型",
"workspace.lite.black.message": "您目前已訂閱 OpenCode Black 或在候補名單中。若要切換至 Go,請先取消訂閱。",
"workspace.lite.other.message": "此工作區中的另一位成員已訂閱 OpenCode Go。每個工作區只能有一位成員訂閱。",
"workspace.lite.promo.description":
"OpenCode Go 起價為 {{price}},之後 $10/月,並提供對熱門開放編碼模型的可靠存取,同時享有充裕的使用額度。",
"workspace.lite.promo.price": "首月 $5",
"OpenCode Go 每月 {{price}},並提供對熱門開放編碼模型的可靠存取,同時享有充裕的使用額度。",
"workspace.lite.promo.price": "$10/月",
"workspace.lite.promo.modelsTitle": "包含模型",
"workspace.lite.promo.footer":
"此方案主要為國際使用者設計,提供穩定的全球存取服務。隨著我們從初期使用情況和回饋中持續了解需求,價格和使用額度可能會有所調整。",
@@ -742,6 +784,14 @@ export const dict = {
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "電話號碼",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.inferenceSpend.label": "貴公司目前每月的 AI 推論支出是多少(美元)?",
"enterprise.form.inferenceSpend.placeholder": "選擇範圍(選填)",
"enterprise.form.inferenceSpend.none": "尚無支出",
"enterprise.form.inferenceSpend.under1k": "低於 $1K",
"enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K",
"enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K",
"enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K",
"enterprise.form.inferenceSpend.over100k": "$100K 以上",
"enterprise.form.message.label": "你想解決什麼問題?",
"enterprise.form.message.placeholder": "我們需要幫助來...",
"enterprise.form.send": "傳送",
@@ -750,6 +800,7 @@ export const dict = {
"enterprise.form.success.submitted": "表單已成功送出。",
"enterprise.form.error.allFieldsRequired": "所有欄位均為必填。",
"enterprise.form.error.invalidEmailFormat": "無效的電子郵件格式。",
"enterprise.form.error.invalidInferenceSpend": "請選擇有效的推論支出範圍。",
"enterprise.form.error.internalServer": "內部伺服器錯誤。",
"enterprise.faq.title": "常見問題",
"enterprise.faq.q1": "什麼是 OpenCode Enterprise?",
@@ -0,0 +1,13 @@
// Shared by the console proxy and the stats app so both agree on which requests get Markdown.
export function prefersMarkdown(accept: string | null | undefined) {
if (!accept) return false
const weights = new Map(
accept.split(",").map((part) => {
const fields = part.split(";").map((value) => value.trim().toLowerCase())
const quality = fields.slice(1).find((field) => field.startsWith("q="))
return [fields[0] ?? "", quality ? Number(quality.slice(2)) : 1] as const
}),
)
const markdown = Math.max(weights.get("text/markdown") ?? 0, weights.get("text/x-markdown") ?? 0)
return markdown > 0 && markdown >= (weights.get("text/html") ?? 0)
}
@@ -0,0 +1,127 @@
import { Resource } from "@opencode-ai/console-resource"
import { and, Database, eq, isNotNull, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js"
import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
import { ProviderTable } from "@opencode-ai/console-core/schema/provider.sql.js"
import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
const paths: Record<string, string | undefined> = {
"POST /zen/v1/chat/completions": "/openai/v1/chat/completions",
"POST /zen/v1/responses": "/openai/v1/responses",
"POST /zen/v1/messages": "/anthropic/v1/messages",
"POST /zen/v1/systemone": "/systemone/v1/systemone",
"POST /zen/go/v1/chat/completions": "/go/openai/v1/chat/completions",
"POST /zen/go/v1/responses": "/go/openai/v1/responses",
"POST /zen/go/v1/messages": "/go/anthropic/v1/messages",
"POST /zen/go/v1/systemone": "/go/systemone/v1/systemone",
"GET /zen/v1/models": "/v1/models",
"GET /zen/go/v1/models": "/go/v1/models",
"GET /zen/go/v1/usage": "/go/v1/usage",
}
export async function proxyInference(
request: Request,
generation?: {
provider?: "openai" | "anthropic" | "google"
/** The provider's native model ID, not the public Zen alias. */
model?: string
/** Forward keyless requests for this model anonymously instead of serving them here. */
anonymous?: boolean
body: (model?: string) => ReadableStream<Uint8Array>
},
): Promise<Response | undefined> {
const url = new URL(request.url)
const path =
paths[`${request.method} ${url.pathname}`] ??
(request.method === "POST" &&
/^\/zen\/v1\/models\/[^/]+:(?:generateContent|streamGenerateContent)$/.test(url.pathname)
? url.pathname.replace("/zen/v1/models/", "/google/v1beta/models/")
: undefined)
if (!path) return undefined
const key = url.pathname.endsWith("/messages")
? request.headers.get("x-api-key")
: path.startsWith("/google/")
? request.headers.get("x-goog-api-key")
: request.headers.get("authorization")?.split(" ")[1]
const anonymous = !key || key === "public"
if (anonymous && !generation?.anonymous) return undefined
// New Console keys are never in the legacy key table; every legacy key is `sk-`.
const legacy = !anonymous && !key.startsWith("oc_sk_")
const workspace = legacy ? await migratedWorkspace(key, generation?.provider) : undefined
if (legacy && !workspace) return undefined
const model = workspace?.provider ? generation?.model : undefined
if (workspace?.provider && !model) throw new Error("Legacy BYOK model mapping is unavailable")
const destination = new URL(Resource.ConsoleMigration.inferenceUrl)
// Imported connections must use this same workspace/provider-derived ID.
const target =
model && workspace
? `/custom/conn_${workspace.id.slice(4)}_${workspace.provider}${
path.startsWith("/google/")
? `/models/${encodeURIComponent(model)}${url.pathname.slice(url.pathname.lastIndexOf(":"))}`
: url.pathname.slice("/zen/v1".length)
}`
: path
destination.pathname = `${destination.pathname.replace(/\/$/, "")}${target}`
destination.search = url.search
destination.hash = ""
// Model extraction has already read part of the body; forward its replay stream.
const forwarded = new Request(
destination,
generation ? new Request(request, { method: request.method, body: generation.body(model) }) : request,
)
// Migrated requests use ordinary destination authentication and accounting.
for (const name of [
"x-zen",
"x-zen-model",
"x-zen-ip",
"cf-access-client-id",
"cf-access-client-secret",
"host",
"content-length",
])
forwarded.headers.delete(name)
// Keyless requests must reach new inference without credentials; `public` is not an API key there.
if (anonymous) for (const name of ["authorization", "x-api-key", "x-goog-api-key"]) forwarded.headers.delete(name)
if (!anonymous) forwarded.headers.set("authorization", `Bearer ${key}`)
forwarded.headers.set("CF-Access-Client-Id", Resource.CLOUDFLARE_ACCESS_CLIENT_ID.value)
const ip = request.headers.get("cf-connecting-ip")
if (ip) forwarded.headers.set("x-zen-ip", ip)
const requestID = request.headers.get("x-opencode-request-id") ?? request.headers.get("x-opencode-request")
if (requestID) forwarded.headers.set("x-opencode-request-id", requestID)
return fetch(forwarded, { redirect: "manual" })
}
// Routing only; the destination owns authentication and revocation after cutover.
function migratedWorkspace(key: string, provider?: string) {
return Database.use((tx) =>
tx
.select({ id: WorkspaceTable.id, provider: ProviderTable.provider })
.from(KeyTable)
.innerJoin(WorkspaceTable, eq(WorkspaceTable.id, KeyTable.workspaceID))
.leftJoin(
ProviderTable,
provider
? and(
eq(ProviderTable.workspaceID, KeyTable.workspaceID),
eq(ProviderTable.provider, provider),
isNull(ProviderTable.timeDeleted),
sql`length(${ProviderTable.credentials}) > 0`,
)
: sql`false`,
)
.where(and(eq(KeyTable.key, key), isNotNull(WorkspaceTable.migrated_at)))
.limit(1)
.then((rows) => rows[0]),
)
}
export function inferenceUnavailable() {
return Response.json(
{ error: { type: "api_error", message: "Inference routing is unavailable. Please retry later." } },
{ status: 503, headers: { "Cache-Control": "no-store" } },
)
}
@@ -0,0 +1,9 @@
// salesforceValue must match the restricted Lead picklist, independent of translated UI labels.
export const inferenceSpendOptions = [
{ value: "none", salesforceValue: "Not spending yet", key: "enterprise.form.inferenceSpend.none" },
{ value: "under-1k", salesforceValue: "Under $1K", key: "enterprise.form.inferenceSpend.under1k" },
{ value: "1k-10k", salesforceValue: "$1K–$10K", key: "enterprise.form.inferenceSpend.1kTo10k" },
{ value: "10k-50k", salesforceValue: "$10K–$50K", key: "enterprise.form.inferenceSpend.10kTo50k" },
{ value: "50k-100k", salesforceValue: "$50K–$100K", key: "enterprise.form.inferenceSpend.50kTo100k" },
{ value: "over-100k", salesforceValue: "$100K or more", key: "enterprise.form.inferenceSpend.over100k" },
] as const
+28
View File
@@ -134,6 +134,34 @@ const DOCS_LOCALE = {
"zh-tw": "zht",
} as const satisfies Record<string, Locale>
// Heading IDs from the localized Go documentation.
const GO_USAGE_LIMITS = {
en: "usage-limits",
zh: "使用限制",
zht: "使用限制",
ko: "사용-한도",
de: "nutzungslimits",
es: "límites-de-uso",
fr: "limites-dutilisation",
it: "limiti-di-utilizzo",
da: "forbrugsgrænser",
ja: "利用制限",
pl: "limity-użycia",
ru: "лимиты-использования",
uk: "usage-limits",
ar: "حدود-الاستخدام",
no: "bruksgrenser",
br: "limites-de-uso",
th: "usage-limits",
tr: "kullanım-limitleri",
} satisfies Record<Locale, string>
export function goUsageLimits(locale: Locale) {
// No Ukrainian Go docs yet; the explicit English path overrides the locale cookie.
if (locale === "uk") return "/docs/en/go/#usage-limits"
return docs(locale, `/docs/go/#${GO_USAGE_LIMITS[locale]}`)
}
function suffix(pathname: string) {
const index = pathname.search(/[?#]/)
if (index === -1) {
@@ -0,0 +1,73 @@
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[] }) {
// Legacy usage can resolve to the same rate as a separately grouped recorded multiplier.
const groups = new Map<string, LiteUsageBreakdownSource>()
input.sources.forEach((item) => {
const key = JSON.stringify([item.model, item.multiplier])
const row = groups.get(key)
if (!row) {
groups.set(key, { ...item })
return
}
row.cost += item.cost
row.quotaCost += item.quotaCost
row.estimated ||= item.estimated
})
const rows: LiteUsageBreakdownItem[] = Array.from(groups.values())
.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
}
Loaded 100 of 613 files, more files were not shown because too many files have changed in this diff. Show more