mirror of
https://github.com/anomalyco/opencode.git
synced 2026-08-26 11:36:14 +00:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
01d036eefd | ||
|
|
fd51f04dff | ||
|
|
976e6ad847 | ||
|
|
1df93f3816 | ||
|
|
6eec62a0aa | ||
|
|
c2f36271bb |
@@ -235,7 +235,6 @@
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "catalog:",
|
||||
"@tsconfig/node22": "22.0.2",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/node": "catalog:",
|
||||
"@typescript/native-preview": "catalog:",
|
||||
"openai": "5.11.0",
|
||||
@@ -859,18 +858,25 @@
|
||||
"@solidjs/meta": "catalog:",
|
||||
"@solidjs/router": "catalog:",
|
||||
"@solidjs/start": "catalog:",
|
||||
"d3-geo": "3.1.1",
|
||||
"d3-scale": "4.0.2",
|
||||
"effect": "catalog:",
|
||||
"i18n-iso-countries": "7.14.0",
|
||||
"nitro": "3.0.1-alpha.1",
|
||||
"solid-js": "catalog:",
|
||||
"sst": "catalog:",
|
||||
"topojson-client": "3.1.0",
|
||||
"vite": "catalog:",
|
||||
"world-atlas": "2.0.2",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/d3-geo": "3.1.0",
|
||||
"@types/d3-scale": "4.0.9",
|
||||
"@types/geojson": "7946.0.16",
|
||||
"@types/topojson-client": "3.1.5",
|
||||
"@types/topojson-specification": "1.0.5",
|
||||
"@typescript/native-preview": "catalog:",
|
||||
"typescript": "catalog:",
|
||||
},
|
||||
@@ -2837,6 +2843,8 @@
|
||||
|
||||
"@types/cross-spawn": ["@types/cross-spawn@6.0.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA=="],
|
||||
|
||||
"@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="],
|
||||
|
||||
"@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
|
||||
|
||||
"@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
|
||||
@@ -2857,6 +2865,8 @@
|
||||
|
||||
"@types/fs-extra": ["@types/fs-extra@9.0.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="],
|
||||
|
||||
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
|
||||
|
||||
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
|
||||
|
||||
"@types/http-cache-semantics": ["@types/http-cache-semantics@4.2.0", "", {}, "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q=="],
|
||||
@@ -2935,6 +2945,10 @@
|
||||
|
||||
"@types/ssri": ["@types/ssri@7.1.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-odD/56S3B51liILSk5aXJlnYt99S6Rt9EFDDqGtJM26rKHApHcwyU/UoYHrzKkdkHMAIquGWCuHtQTbes+FRQw=="],
|
||||
|
||||
"@types/topojson-client": ["@types/topojson-client@3.1.5", "", { "dependencies": { "@types/geojson": "*", "@types/topojson-specification": "*" } }, "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw=="],
|
||||
|
||||
"@types/topojson-specification": ["@types/topojson-specification@1.0.5", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ=="],
|
||||
|
||||
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
|
||||
|
||||
"@types/tsscmp": ["@types/tsscmp@1.0.2", "", {}, "sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g=="],
|
||||
@@ -3423,6 +3437,8 @@
|
||||
|
||||
"d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="],
|
||||
|
||||
"d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="],
|
||||
|
||||
"d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
|
||||
|
||||
"d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
|
||||
@@ -5301,6 +5317,8 @@
|
||||
|
||||
"toolbeam-docs-theme": ["toolbeam-docs-theme@0.4.8", "", { "peerDependencies": { "@astrojs/starlight": "^0.34.3", "astro": "^5.7.13" } }, "sha512-b+5ynEFp4Woe5a22hzNQm42lD23t13ZMihVxHbzjA50zdcM9aOSJTIjdJ0PDSd4/50HbBXcpHiQsz6rM4N88ww=="],
|
||||
|
||||
"topojson-client": ["topojson-client@3.1.0", "", { "dependencies": { "commander": "2" }, "bin": { "topo2geo": "bin/topo2geo", "topomerge": "bin/topomerge", "topoquantize": "bin/topoquantize" } }, "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw=="],
|
||||
|
||||
"tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
|
||||
|
||||
"traverse": ["traverse@0.3.9", "", {}, "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ=="],
|
||||
@@ -5543,6 +5561,8 @@
|
||||
|
||||
"workerd": ["workerd@1.20251118.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251118.0", "@cloudflare/workerd-darwin-arm64": "1.20251118.0", "@cloudflare/workerd-linux-64": "1.20251118.0", "@cloudflare/workerd-linux-arm64": "1.20251118.0", "@cloudflare/workerd-windows-64": "1.20251118.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ=="],
|
||||
|
||||
"world-atlas": ["world-atlas@2.0.2", "", {}, "sha512-IXfV0qwlKXpckz1FhwXVwKRjiIhOnWttOskm5CtxMsjgE/MXAYRHWJqgXOpM8IkcPBoXnyTU5lFHcYa5ChG0LQ=="],
|
||||
|
||||
"wrangler": ["wrangler@4.50.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.7.11", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20251118.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251118.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251118.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-+nuZuHZxDdKmAyXOSrHlciGshCoAPiy5dM+t6mEohWm7HpXvTHmWQGUf/na9jjWlWJHCJYOWzkA1P5HBJqrIEA=="],
|
||||
|
||||
"wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
|
||||
@@ -6495,6 +6515,8 @@
|
||||
|
||||
"tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
|
||||
|
||||
"topojson-client/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
|
||||
|
||||
"tree-sitter-bash/node-addon-api": ["node-addon-api@8.8.0", "", {}, "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA=="],
|
||||
|
||||
"tw-to-css/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
|
||||
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"nodeModules": {
|
||||
"x86_64-linux": "sha256-fJ72uEK9rSoFL6eJk0Lwkc2TIMLZyQ7Iz83WrZE2duA=",
|
||||
"aarch64-linux": "sha256-ElEwz5spFa8XFYSBiGjKlTKRFQCju/ZYDlb6h1FaKoI=",
|
||||
"aarch64-darwin": "sha256-RmbrAlggOqxNFdhW+qj2tjRCpRf2NDLe68TikbGtCeA=",
|
||||
"x86_64-darwin": "sha256-ZgYE0J+Dkz/kALK3kZ1jdFIZ5/BEkEaw0mXCqPon0iY="
|
||||
"x86_64-linux": "sha256-Be1I6OG6UitofhcGu2BeNzevmoQXc4Or5r/NPzwtft4=",
|
||||
"aarch64-linux": "sha256-O+d+26CQIjZ08Rn8Qm3IytdDqIMbPdhzaGOZeUKAvIU=",
|
||||
"aarch64-darwin": "sha256-ObS50y/oy6fM9wSGUL/wx6O0+fTWHC04mXJNd7w/2Z0=",
|
||||
"x86_64-darwin": "sha256-eoR7ZSyH62Fq2ZaW2b2QqU2FC97rYxTMeEe+djT0nto="
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,6 +252,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "الاستثناءات التالية",
|
||||
|
||||
"go.title": "OpenCode Go | نماذج برمجة منخفضة التكلفة للجميع",
|
||||
"go.banner.text": "Ox Alpha Free متاح على Go لفترة محدودة",
|
||||
"go.meta.description": "يبلغ سعر Go $10/شهر، مع حدود استخدام سخية ووصول موثوق إلى نماذج البرمجة الرائدة.",
|
||||
"go.hero.title": "نماذج برمجة منخفضة التكلفة للجميع",
|
||||
"go.hero.body":
|
||||
|
||||
@@ -256,6 +256,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "seguintes exceções",
|
||||
|
||||
"go.title": "OpenCode Go | Modelos de codificação de baixo custo para todos",
|
||||
"go.banner.text": "Ox Alpha Free está disponível no Go por tempo limitado",
|
||||
"go.meta.description":
|
||||
"O Go 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",
|
||||
|
||||
@@ -254,6 +254,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "følgende undtagelser",
|
||||
|
||||
"go.title": "OpenCode Go | Kodningsmodeller til lav pris for alle",
|
||||
"go.banner.text": "Ox Alpha Free er tilgængelig på Go i en begrænset periode",
|
||||
"go.meta.description":
|
||||
"Go 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",
|
||||
|
||||
@@ -256,6 +256,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "folgenden Ausnahmen",
|
||||
|
||||
"go.title": "OpenCode Go | Kostengünstige Coding-Modelle für alle",
|
||||
"go.banner.text": "Ox Alpha Free ist für begrenzte Zeit auf Go verfügbar",
|
||||
"go.meta.description":
|
||||
"Go 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",
|
||||
|
||||
@@ -253,6 +253,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "following exceptions",
|
||||
|
||||
"go.title": "OpenCode Go | Low cost coding models for everyone",
|
||||
"go.banner.text": "Ox Alpha Free is available on Go for a limited time",
|
||||
"go.meta.description": "Go 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.body":
|
||||
|
||||
@@ -257,6 +257,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "siguientes excepciones",
|
||||
|
||||
"go.title": "OpenCode Go | Modelos de programación de bajo coste para todos",
|
||||
"go.banner.text": "Ox Alpha Free está disponible en Go por tiempo limitado",
|
||||
"go.meta.description":
|
||||
"Go 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",
|
||||
|
||||
@@ -258,6 +258,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "exceptions suivantes",
|
||||
|
||||
"go.title": "OpenCode Go | Modèles de code à faible coût pour tous",
|
||||
"go.banner.text": "Ox Alpha Free est disponible sur Go pour une durée limitée",
|
||||
"go.meta.description":
|
||||
"Go 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",
|
||||
|
||||
@@ -254,6 +254,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "seguenti eccezioni",
|
||||
|
||||
"go.title": "OpenCode Go | Modelli di coding a basso costo per tutti",
|
||||
"go.banner.text": "Ox Alpha Free è disponibile su Go per un periodo limitato",
|
||||
"go.meta.description":
|
||||
"Go 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",
|
||||
|
||||
@@ -253,6 +253,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "以下の例外",
|
||||
|
||||
"go.title": "OpenCode Go | すべての人のための低価格なコーディングモデル",
|
||||
"go.banner.text": "Ox Alpha Freeは期間限定でGoで利用できます",
|
||||
"go.meta.description":
|
||||
"Goは月額$10で、主要なコーディングモデルへのゆとりある利用上限と安定したアクセスを提供します。",
|
||||
"go.hero.title": "すべての人のための低価格なコーディングモデル",
|
||||
|
||||
@@ -250,6 +250,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "다음 예외",
|
||||
|
||||
"go.title": "OpenCode Go | 모두를 위한 저비용 코딩 모델",
|
||||
"go.banner.text": "Ox Alpha Free가 한정된 기간 동안 Go에서 제공됩니다",
|
||||
"go.meta.description": "Go는 월 $10이며, 넉넉한 사용 한도와 주요 코딩 모델에 대한 안정적인 액세스를 제공합니다.",
|
||||
"go.hero.title": "모두를 위한 저비용 코딩 모델",
|
||||
"go.hero.body":
|
||||
|
||||
@@ -254,6 +254,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "følgende unntak",
|
||||
|
||||
"go.title": "OpenCode Go | Rimelige kodemodeller for alle",
|
||||
"go.banner.text": "Ox Alpha Free er tilgjengelig på Go i en begrenset periode",
|
||||
"go.meta.description":
|
||||
"Go koster $10/måned, med sjenerøse bruksgrenser og pålitelig tilgang til ledende kodemodeller.",
|
||||
"go.hero.title": "Rimelige kodemodeller for alle",
|
||||
|
||||
@@ -255,6 +255,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "następującymi wyjątkami",
|
||||
|
||||
"go.title": "OpenCode Go | Niskokosztowe modele do kodowania dla każdego",
|
||||
"go.banner.text": "Ox Alpha Free jest dostępny w Go przez ograniczony czas",
|
||||
"go.meta.description":
|
||||
"Go kosztuje $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",
|
||||
|
||||
@@ -258,6 +258,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "следующими исключениями",
|
||||
|
||||
"go.title": "OpenCode Go | Недорогие модели для кодинга для всех",
|
||||
"go.banner.text": "Ox Alpha Free доступна в Go в течение ограниченного времени",
|
||||
"go.meta.description":
|
||||
"Go стоит $10/месяц и предлагает щедрые лимиты использования и надежный доступ к ведущим моделям для кодинга.",
|
||||
"go.hero.title": "Недорогие модели для кодинга для всех",
|
||||
|
||||
@@ -253,6 +253,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "ข้อยกเว้นดังนี้",
|
||||
|
||||
"go.title": "OpenCode Go | โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
|
||||
"go.banner.text": "Ox Alpha Free พร้อมใช้งานบน Go ในช่วงเวลาจำกัด",
|
||||
"go.meta.description":
|
||||
"Go มีราคา $10/เดือน พร้อมขีดจำกัดการใช้งานที่เอื้อเฟื้อและการเข้าถึงโมเดลเขียนโค้ดชั้นนำอย่างเชื่อถือได้",
|
||||
"go.hero.title": "โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
|
||||
|
||||
@@ -256,6 +256,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "aşağıdaki istisnalar",
|
||||
|
||||
"go.title": "OpenCode Go | Herkes için düşük maliyetli kodlama modelleri",
|
||||
"go.banner.text": "Ox Alpha Free sınırlı bir süre için Go'da kullanılabilir",
|
||||
"go.meta.description":
|
||||
"Go 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",
|
||||
|
||||
@@ -255,6 +255,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "такими винятками",
|
||||
|
||||
"go.title": "OpenCode Go | Недорогі моделі кодування для всіх",
|
||||
"go.banner.text": "Ox Alpha Free доступна в Go протягом обмеженого часу",
|
||||
"go.meta.description":
|
||||
"Go коштує $10/місяць, зі щедрими лімітами використання та надійним доступом до провідних моделей для кодування.",
|
||||
"go.hero.title": "Недорогі моделі кодування для всіх",
|
||||
|
||||
@@ -244,6 +244,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "以下例外情况除外",
|
||||
|
||||
"go.title": "OpenCode Go | 人人可用的低成本编程模型",
|
||||
"go.banner.text": "Ox Alpha Free 限时加入 Go",
|
||||
"go.meta.description": "Go 每月 $10,提供充裕的使用限额,并可可靠访问领先的编程模型。",
|
||||
"go.hero.title": "人人可用的低成本编程模型",
|
||||
"go.hero.body":
|
||||
|
||||
@@ -244,6 +244,7 @@ export const dict = {
|
||||
"zen.privacy.exceptionsLink": "以下例外情況",
|
||||
|
||||
"go.title": "OpenCode Go | 低成本全民編碼模型",
|
||||
"go.banner.text": "Ox Alpha Free 限時加入 Go",
|
||||
"go.meta.description": "Go 每月 $10,提供充裕的使用限額,並可穩定存取領先的編碼模型。",
|
||||
"go.hero.title": "低成本全民編碼模型",
|
||||
"go.hero.body":
|
||||
|
||||
@@ -327,6 +327,37 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
[data-component="desktop-app-banner"] {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-bottom: 32px;
|
||||
|
||||
[data-slot="badge"] {
|
||||
background: var(--color-background-strong);
|
||||
color: var(--color-text-inverted);
|
||||
font-weight: 500;
|
||||
padding: 4px 8px;
|
||||
line-height: 1;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
[data-slot="content"] {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1ch;
|
||||
}
|
||||
|
||||
[data-slot="text"] {
|
||||
color: var(--color-text-strong);
|
||||
line-height: 1.4;
|
||||
|
||||
@media (max-width: 30.625rem) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[data-slot="hero-copy"] {
|
||||
img {
|
||||
margin-bottom: 24px;
|
||||
|
||||
@@ -81,6 +81,7 @@ function LimitsGraph(props: { href: string }) {
|
||||
{ id: "mimo-v2.5", name: "MiMo-V2.5", req: 30100, d: "340ms" },
|
||||
{ id: "hy3", name: "Hy3", req: 34400, baseReq: 4300, d: "320ms" },
|
||||
{ id: "muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", req: 45300, edge: true, d: "360ms" },
|
||||
{ id: "ox-alpha-free", name: "Ox Alpha Free", req: Infinity, infinite: true, edge: true, d: "400ms" },
|
||||
]
|
||||
|
||||
const w = 1040
|
||||
@@ -269,6 +270,12 @@ export default function Home() {
|
||||
|
||||
<div data-component="content">
|
||||
<section data-component="hero">
|
||||
<div data-component="desktop-app-banner">
|
||||
<span data-slot="badge">{i18n.t("home.banner.badge")}</span>
|
||||
<div data-slot="content">
|
||||
<span data-slot="text">{i18n.t("go.banner.text")}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div data-slot="hero-copy">
|
||||
<img data-slot="zen logo light" src={goLogoLight} alt="" />
|
||||
<img data-slot="zen logo dark" src={goLogoDark} alt="" />
|
||||
|
||||
@@ -662,6 +662,7 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
|
||||
<li>MiMo-V2.5</li>
|
||||
<li>MiMo-V2.5-Pro</li>
|
||||
<li>Hy3</li>
|
||||
<li>Ox Alpha Free</li>
|
||||
</ul>
|
||||
<p data-slot="promo-description">{i18n.t("workspace.lite.promo.footer")}</p>
|
||||
<div data-slot="subscribe-actions">
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "catalog:",
|
||||
"@tsconfig/node22": "22.0.2",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/node": "catalog:",
|
||||
"openai": "5.11.0",
|
||||
"typescript": "catalog:",
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
import { describe, expect, test } from "bun:test"
|
||||
import { isAllowedAuthorizationRedirect } from "./auth-redirect"
|
||||
|
||||
describe("authorization redirect validation", () => {
|
||||
test("allows registered OpenCode callbacks", () => {
|
||||
expect(isAllowedAuthorizationRedirect("app", "https://opencode.ai/auth/callback")).toBe(true)
|
||||
expect(isAllowedAuthorizationRedirect("app", "https://dev.opencode.ai/auth/callback")).toBe(true)
|
||||
expect(isAllowedAuthorizationRedirect("app", "http://localhost:3000/auth/callback")).toBe(true)
|
||||
expect(isAllowedAuthorizationRedirect("app", "http://127.0.0.1:3000/auth/callback")).toBe(true)
|
||||
})
|
||||
|
||||
test("rejects unregistered clients and external redirects", () => {
|
||||
expect(isAllowedAuthorizationRedirect("other", "https://opencode.ai/auth/callback")).toBe(false)
|
||||
expect(isAllowedAuthorizationRedirect("app", "https://evil.example/callback")).toBe(false)
|
||||
expect(isAllowedAuthorizationRedirect("app", "https://opencode.ai.evil.example/callback")).toBe(false)
|
||||
expect(isAllowedAuthorizationRedirect("app", "javascript:alert(1)")).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -1,18 +0,0 @@
|
||||
export const isAllowedAuthorizationRedirect = (clientID: string, redirectURI: string) => {
|
||||
if (clientID !== "app") return false
|
||||
const redirect = (() => {
|
||||
try {
|
||||
return new URL(redirectURI)
|
||||
} catch {
|
||||
return undefined
|
||||
}
|
||||
})()
|
||||
if (redirect === undefined) return false
|
||||
if (redirect.hostname === "localhost" || redirect.hostname === "127.0.0.1") {
|
||||
return redirect.protocol === "http:" || redirect.protocol === "https:"
|
||||
}
|
||||
return (
|
||||
redirect.protocol === "https:" &&
|
||||
(redirect.hostname === "opencode.ai" || redirect.hostname.endsWith(".opencode.ai"))
|
||||
)
|
||||
}
|
||||
@@ -17,7 +17,6 @@ import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.j
|
||||
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
|
||||
import { AuthTable } from "@opencode-ai/console-core/schema/auth.sql.js"
|
||||
import { Identifier } from "@opencode-ai/console-core/identifier.js"
|
||||
import { isAllowedAuthorizationRedirect } from "./auth-redirect.js"
|
||||
|
||||
type Env = {
|
||||
AuthStorage: KVNamespace
|
||||
@@ -42,17 +41,6 @@ const MY_THEME: Theme = {
|
||||
|
||||
export default {
|
||||
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
||||
const requestURL = new URL(request.url)
|
||||
if (requestURL.pathname === "/authorize") {
|
||||
const redirectURI = requestURL.searchParams.get("redirect_uri")
|
||||
if (
|
||||
redirectURI !== null &&
|
||||
!isAllowedAuthorizationRedirect(requestURL.searchParams.get("client_id") ?? "", redirectURI)
|
||||
) {
|
||||
return new Response("Unauthorized client", { status: 400 })
|
||||
}
|
||||
}
|
||||
|
||||
const result = await issuer({
|
||||
theme: MY_THEME,
|
||||
providers: {
|
||||
@@ -114,7 +102,6 @@ export default {
|
||||
namespace: env.AuthStorage,
|
||||
}),
|
||||
subjects,
|
||||
allow: ({ clientID, redirectURI }) => Promise.resolve(isAllowedAuthorizationRedirect(clientID, redirectURI)),
|
||||
async success(ctx, response) {
|
||||
console.log(response)
|
||||
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
"moduleResolution": "bundler",
|
||||
"jsx": "preserve",
|
||||
"jsxImportSource": "react",
|
||||
"types": ["@cloudflare/workers-types", "bun", "node"]
|
||||
"types": ["@cloudflare/workers-types", "node"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,85 @@
|
||||
import { InstallationVersion } from "@opencode-ai/core/installation/version"
|
||||
import type { Hooks, PluginInput } from "@opencode-ai/plugin"
|
||||
import type { Provider } from "@opencode-ai/sdk/v2"
|
||||
import { Effect, Schema } from "effect"
|
||||
import { OAUTH_DUMMY_KEY } from "../auth"
|
||||
|
||||
const AZURE_COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default"
|
||||
const AZURE_FOUNDRY_SCOPE = "https://ai.azure.com/.default"
|
||||
const AZURE_TOKEN_REFRESH_BUFFER = 60_000
|
||||
|
||||
const AzureCliToken = Schema.Struct({
|
||||
accessToken: Schema.NonEmptyString,
|
||||
expires_on: Schema.optional(Schema.Number),
|
||||
expiresOn: Schema.optional(Schema.NonEmptyString),
|
||||
})
|
||||
const decodeAzureCliToken = Schema.decodeUnknownPromise(AzureCliToken)
|
||||
|
||||
const decodeAzureAccounts = Schema.decodeUnknownPromise(
|
||||
Schema.Array(
|
||||
Schema.Struct({
|
||||
name: Schema.NonEmptyString,
|
||||
resourceGroup: Schema.NonEmptyString,
|
||||
}),
|
||||
),
|
||||
)
|
||||
|
||||
const decodeAzureDeployments = Schema.decodeUnknownPromise(
|
||||
Schema.Array(
|
||||
Schema.Struct({
|
||||
name: Schema.NonEmptyString,
|
||||
properties: Schema.Struct({
|
||||
model: Schema.Struct({
|
||||
name: Schema.NonEmptyString,
|
||||
}),
|
||||
provisioningState: Schema.NonEmptyString,
|
||||
}),
|
||||
}),
|
||||
),
|
||||
)
|
||||
|
||||
type AzureCommand = {
|
||||
quiet(): AzureCommand
|
||||
json(): Promise<unknown>
|
||||
}
|
||||
|
||||
type AzureShell = (strings: TemplateStringsArray, ...values: string[]) => AzureCommand
|
||||
type AzureAccount = { readonly name: string; readonly resourceGroup: string }
|
||||
|
||||
export async function AzureAuthPlugin(input: PluginInput): Promise<Hooks> {
|
||||
const available = Boolean(Bun.which("az", { PATH: process.env.PATH }))
|
||||
const accounts =
|
||||
!process.env.AZURE_RESOURCE_NAME && !process.env.AZURE_RESOURCE_GROUP && available
|
||||
? await input.$`az cognitiveservices account list --output json --only-show-errors`
|
||||
.quiet()
|
||||
.json()
|
||||
.then(decodeAzureAccounts)
|
||||
.catch(() => [])
|
||||
: []
|
||||
return createAzureAuthHooks(input.$, fetch, accounts, available)
|
||||
}
|
||||
|
||||
export function createAzureAuthHooks(
|
||||
shell: AzureShell,
|
||||
request: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> = fetch,
|
||||
accounts: readonly AzureAccount[] = [],
|
||||
available = true,
|
||||
): Hooks {
|
||||
const tokens = new Map<string, { token: string; expires: number }>()
|
||||
async function token(scope: string) {
|
||||
const cached = tokens.get(scope)
|
||||
if (cached && cached.expires - Date.now() > AZURE_TOKEN_REFRESH_BUFFER) return cached.token
|
||||
|
||||
const result = await decodeAzureCliToken(
|
||||
await shell`az account get-access-token --scope ${scope} --output json`.quiet().json(),
|
||||
)
|
||||
const expires = result.expires_on !== undefined ? result.expires_on * 1000 : Date.parse(result.expiresOn ?? "")
|
||||
if (!Number.isFinite(expires)) throw new Error("Azure CLI returned an invalid token expiration")
|
||||
const refreshed = { token: result.accessToken, expires }
|
||||
tokens.set(scope, refreshed)
|
||||
return refreshed.token
|
||||
}
|
||||
|
||||
export async function AzureAuthPlugin(_input: PluginInput): Promise<Hooks> {
|
||||
const prompts = []
|
||||
if (!process.env.AZURE_RESOURCE_NAME) {
|
||||
prompts.push({
|
||||
@@ -10,17 +89,150 @@ export async function AzureAuthPlugin(_input: PluginInput): Promise<Hooks> {
|
||||
placeholder: "e.g. my-models",
|
||||
})
|
||||
}
|
||||
const oauthPrompts =
|
||||
accounts.length > 0 && !process.env.AZURE_RESOURCE_NAME
|
||||
? [
|
||||
{
|
||||
type: "select" as const,
|
||||
key: "resourceSelection",
|
||||
message: "Select Azure resource",
|
||||
options: [
|
||||
...accounts.map((account) => ({
|
||||
label: account.name,
|
||||
value: account.name,
|
||||
hint: account.resourceGroup,
|
||||
})),
|
||||
{ label: "Enter another resource name", value: "__manual__" },
|
||||
],
|
||||
},
|
||||
{
|
||||
type: "text" as const,
|
||||
key: "resourceName",
|
||||
message: "Enter Azure Resource Name",
|
||||
placeholder: "e.g. my-models",
|
||||
when: { key: "resourceSelection", op: "eq" as const, value: "__manual__" },
|
||||
},
|
||||
]
|
||||
: prompts
|
||||
|
||||
return {
|
||||
const hooks: Hooks = {
|
||||
provider: {
|
||||
id: "azure",
|
||||
async models(provider, context) {
|
||||
if (context.auth?.type !== "oauth") return provider.models
|
||||
const resource = context.auth.accountId
|
||||
if (!resource) return {}
|
||||
return discoverAzureModels(provider.models, resource, shell).catch((error: unknown) => {
|
||||
Effect.runSync(
|
||||
Effect.logWarning("Azure model discovery failed", {
|
||||
resource,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
}),
|
||||
)
|
||||
return provider.models
|
||||
})
|
||||
},
|
||||
},
|
||||
auth: {
|
||||
provider: "azure",
|
||||
async loader(getAuth) {
|
||||
if ((await getAuth()).type !== "oauth") return {}
|
||||
|
||||
return {
|
||||
apiKey: OAUTH_DUMMY_KEY,
|
||||
async fetch(input: RequestInfo | URL, init?: RequestInit) {
|
||||
const headers = new Headers(input instanceof Request ? input.headers : undefined)
|
||||
new Headers(init?.headers).forEach((value, key) => headers.set(key, value))
|
||||
headers.delete("api-key")
|
||||
headers.delete("x-api-key")
|
||||
headers.set("authorization", `Bearer ${await token(scopeForRequest(input))}`)
|
||||
headers.set("User-Agent", `opencode/${InstallationVersion}`)
|
||||
return request(input, { ...init, headers })
|
||||
},
|
||||
}
|
||||
},
|
||||
methods: [
|
||||
{
|
||||
type: "api",
|
||||
label: "API key",
|
||||
prompts,
|
||||
},
|
||||
{
|
||||
type: "oauth",
|
||||
label: "Microsoft Entra ID (Azure CLI)",
|
||||
prompts: oauthPrompts,
|
||||
async authorize(inputs) {
|
||||
return {
|
||||
url: "",
|
||||
instructions: "Sign in with `az login` before continuing.",
|
||||
method: "auto",
|
||||
callback: async () => {
|
||||
const resourceName =
|
||||
inputs?.resourceName ??
|
||||
(inputs?.resourceSelection === "__manual__" ? undefined : inputs?.resourceSelection) ??
|
||||
process.env.AZURE_RESOURCE_NAME
|
||||
if (!resourceName) throw new Error("Azure Resource Name is required")
|
||||
|
||||
await token(AZURE_COGNITIVE_SERVICES_SCOPE)
|
||||
return {
|
||||
type: "success",
|
||||
access: OAUTH_DUMMY_KEY,
|
||||
refresh: OAUTH_DUMMY_KEY,
|
||||
expires: Date.now() + 365 * 24 * 60 * 60 * 1000,
|
||||
accountId: resourceName,
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
if (!available && hooks.auth) hooks.auth.methods = hooks.auth.methods.filter((method) => method.type !== "oauth")
|
||||
return hooks
|
||||
}
|
||||
|
||||
async function discoverAzureModels(models: Provider["models"], resourceName: string, shell: AzureShell) {
|
||||
const resourceGroup = process.env.AZURE_RESOURCE_GROUP
|
||||
const account = resourceGroup
|
||||
? { name: resourceName, resourceGroup }
|
||||
: (
|
||||
await decodeAzureAccounts(
|
||||
await shell`az cognitiveservices account list --output json --only-show-errors`.quiet().json(),
|
||||
)
|
||||
).find((account) => account.name.toLowerCase() === resourceName.toLowerCase())
|
||||
if (!account) throw new Error(`Azure resource "${resourceName}" was not found in the active subscription`)
|
||||
|
||||
const deployments = await decodeAzureDeployments(
|
||||
await shell`az cognitiveservices account deployment list --name ${account.name} --resource-group ${account.resourceGroup} --output json --only-show-errors`
|
||||
.quiet()
|
||||
.json(),
|
||||
)
|
||||
const found = new Map<string, Provider["models"][string]>()
|
||||
deployments.forEach((deployment) => {
|
||||
if (deployment.properties.provisioningState !== "Succeeded") return
|
||||
const modelID = Object.keys(models).find(
|
||||
(modelID) => modelID.toLowerCase() === deployment.properties.model.name.toLowerCase(),
|
||||
)
|
||||
if (!modelID) return
|
||||
const id = found.has(modelID) ? deployment.name : modelID
|
||||
found.set(id, {
|
||||
...models[modelID],
|
||||
id,
|
||||
name: id === modelID ? models[modelID].name : `${models[modelID].name} (${deployment.name})`,
|
||||
api: {
|
||||
...models[modelID].api,
|
||||
id: deployment.name,
|
||||
},
|
||||
})
|
||||
})
|
||||
return Object.fromEntries(found)
|
||||
}
|
||||
|
||||
function scopeForRequest(input: RequestInfo | URL) {
|
||||
const url = new URL(input instanceof Request ? input.url : input)
|
||||
if (url.hostname.endsWith(".services.ai.azure.com") && !url.pathname.startsWith("/models")) {
|
||||
return AZURE_FOUNDRY_SCOPE
|
||||
}
|
||||
return AZURE_COGNITIVE_SERVICES_SCOPE
|
||||
}
|
||||
|
||||
@@ -250,6 +250,7 @@ function custom(dep: CustomDep): Record<string, CustomLoader> {
|
||||
return [
|
||||
provider.options?.resourceName,
|
||||
auth?.type === "api" ? auth.metadata?.resourceName : undefined,
|
||||
auth?.type === "oauth" ? auth.accountId : undefined,
|
||||
env["AZURE_RESOURCE_NAME"],
|
||||
].find((name) => typeof name === "string" && name.trim() !== "")
|
||||
})
|
||||
|
||||
@@ -0,0 +1,394 @@
|
||||
import { afterEach, describe, expect, test } from "bun:test"
|
||||
import type { Hooks } from "@opencode-ai/plugin"
|
||||
import type { Auth, Provider } from "@opencode-ai/sdk/v2"
|
||||
import { OAUTH_DUMMY_KEY } from "../../src/auth"
|
||||
import { createAzureAuthHooks } from "../../src/plugin/azure"
|
||||
|
||||
const resourceName = process.env.AZURE_RESOURCE_NAME
|
||||
const resourceGroup = process.env.AZURE_RESOURCE_GROUP
|
||||
|
||||
afterEach(() => {
|
||||
if (resourceName === undefined) delete process.env.AZURE_RESOURCE_NAME
|
||||
else process.env.AZURE_RESOURCE_NAME = resourceName
|
||||
if (resourceGroup === undefined) delete process.env.AZURE_RESOURCE_GROUP
|
||||
else process.env.AZURE_RESOURCE_GROUP = resourceGroup
|
||||
})
|
||||
|
||||
const oauth: Auth = {
|
||||
type: "oauth",
|
||||
access: OAUTH_DUMMY_KEY,
|
||||
refresh: OAUTH_DUMMY_KEY,
|
||||
expires: Date.now() + 60 * 60 * 1000,
|
||||
accountId: "test-resource",
|
||||
}
|
||||
|
||||
const provider: Provider = {
|
||||
id: "azure",
|
||||
name: "Azure",
|
||||
source: "custom",
|
||||
env: [],
|
||||
options: {},
|
||||
models: {},
|
||||
}
|
||||
|
||||
function oauthMethod(hooks: Hooks) {
|
||||
const method = hooks.auth?.methods.find((method) => method.type === "oauth")
|
||||
if (!method || method.type !== "oauth") throw new Error("Azure OAuth method is missing")
|
||||
return method
|
||||
}
|
||||
|
||||
function loader(hooks: Hooks) {
|
||||
if (!hooks.auth?.loader) throw new Error("Azure auth loader is missing")
|
||||
return hooks.auth.loader
|
||||
}
|
||||
|
||||
function customFetch(options: Record<string, unknown>) {
|
||||
const result = options["fetch"]
|
||||
if (typeof result !== "function") throw new Error("Azure custom fetch is missing")
|
||||
return async (input: RequestInfo | URL, init?: RequestInit) => {
|
||||
const response: unknown = await Reflect.apply(result, undefined, [input, init])
|
||||
if (!(response instanceof Response)) throw new Error("Azure custom fetch returned an invalid response")
|
||||
return response
|
||||
}
|
||||
}
|
||||
|
||||
function models(...ids: string[]): Provider["models"] {
|
||||
return Object.fromEntries(
|
||||
ids.map((id) => [
|
||||
id,
|
||||
{
|
||||
id,
|
||||
providerID: "azure",
|
||||
name: id,
|
||||
family: "",
|
||||
api: { id, url: "", npm: "@ai-sdk/azure" },
|
||||
status: "active",
|
||||
headers: {},
|
||||
options: {},
|
||||
cost: { input: 0, output: 0, cache: { read: 0, write: 0 } },
|
||||
limit: { context: 0, output: 0 },
|
||||
capabilities: {
|
||||
temperature: true,
|
||||
reasoning: false,
|
||||
attachment: false,
|
||||
toolcall: true,
|
||||
input: { text: true, audio: false, image: false, video: false, pdf: false },
|
||||
output: { text: true, audio: false, image: false, video: false, pdf: false },
|
||||
interleaved: false,
|
||||
},
|
||||
release_date: "",
|
||||
variants: {},
|
||||
},
|
||||
]),
|
||||
)
|
||||
}
|
||||
|
||||
function azureShell(scopes: string[]) {
|
||||
return (_strings: TemplateStringsArray, ...values: string[]) => {
|
||||
const output = {
|
||||
quiet: () => output,
|
||||
json: async () => {
|
||||
const scope = values[0]
|
||||
scopes.push(scope)
|
||||
return {
|
||||
accessToken: `${scope}-token`,
|
||||
expires_on: Math.floor((Date.now() + 60 * 60 * 1000) / 1000),
|
||||
}
|
||||
},
|
||||
}
|
||||
return output
|
||||
}
|
||||
}
|
||||
|
||||
function discoveryShell(accounts: unknown, deployments: unknown, commands: string[]) {
|
||||
return (strings: TemplateStringsArray, ...values: string[]) => {
|
||||
const command = String.raw(strings, ...values)
|
||||
commands.push(command)
|
||||
const output = {
|
||||
quiet: () => output,
|
||||
json: async () => (command.includes("deployment list") ? deployments : accounts),
|
||||
}
|
||||
return output
|
||||
}
|
||||
}
|
||||
|
||||
describe("plugin.azure", () => {
|
||||
test("keeps the existing API-key method and adds Entra ID", () => {
|
||||
delete process.env.AZURE_RESOURCE_NAME
|
||||
const hooks = createAzureAuthHooks(azureShell([]))
|
||||
|
||||
expect(hooks.auth?.provider).toBe("azure")
|
||||
expect(hooks.provider?.id).toBe("azure")
|
||||
expect(hooks.auth?.methods.map((method) => [method.type, method.label])).toEqual([
|
||||
["api", "API key"],
|
||||
["oauth", "Microsoft Entra ID (Azure CLI)"],
|
||||
])
|
||||
expect(hooks.auth?.methods[0]).toEqual({
|
||||
type: "api",
|
||||
label: "API key",
|
||||
prompts: [
|
||||
{
|
||||
type: "text",
|
||||
key: "resourceName",
|
||||
message: "Enter Azure Resource Name",
|
||||
placeholder: "e.g. my-models",
|
||||
},
|
||||
],
|
||||
})
|
||||
expect(hooks.auth?.methods[1].prompts).toEqual(hooks.auth?.methods[0].prompts)
|
||||
})
|
||||
|
||||
test("hides Azure CLI authentication when the Azure CLI is not installed", () => {
|
||||
const hooks = createAzureAuthHooks(azureShell([]), fetch, [], false)
|
||||
|
||||
expect(hooks.auth?.methods.map((method) => method.type)).toEqual(["api"])
|
||||
})
|
||||
|
||||
test("lists Azure CLI resources and allows entering another resource", () => {
|
||||
delete process.env.AZURE_RESOURCE_NAME
|
||||
const hooks = createAzureAuthHooks(azureShell([]), fetch, [
|
||||
{ name: "first-resource", resourceGroup: "first-group" },
|
||||
{ name: "second-resource", resourceGroup: "second-group" },
|
||||
])
|
||||
|
||||
expect(oauthMethod(hooks).prompts).toEqual([
|
||||
{
|
||||
type: "select",
|
||||
key: "resourceSelection",
|
||||
message: "Select Azure resource",
|
||||
options: [
|
||||
{ label: "first-resource", value: "first-resource", hint: "first-group" },
|
||||
{ label: "second-resource", value: "second-resource", hint: "second-group" },
|
||||
{ label: "Enter another resource name", value: "__manual__" },
|
||||
],
|
||||
},
|
||||
{
|
||||
type: "text",
|
||||
key: "resourceName",
|
||||
message: "Enter Azure Resource Name",
|
||||
placeholder: "e.g. my-models",
|
||||
when: { key: "resourceSelection", op: "eq", value: "__manual__" },
|
||||
},
|
||||
])
|
||||
})
|
||||
|
||||
test("uses the selected Azure CLI resource", async () => {
|
||||
const hooks = createAzureAuthHooks(azureShell([]), fetch, [
|
||||
{ name: "selected-resource", resourceGroup: "selected-group" },
|
||||
])
|
||||
const authorization = await oauthMethod(hooks).authorize({ resourceSelection: "selected-resource" })
|
||||
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
|
||||
|
||||
expect(await authorization.callback()).toMatchObject({ type: "success", accountId: "selected-resource" })
|
||||
})
|
||||
|
||||
test("uses a manually entered Azure resource that was not listed", async () => {
|
||||
const hooks = createAzureAuthHooks(azureShell([]), fetch, [{ name: "listed-resource", resourceGroup: "group" }])
|
||||
const authorization = await oauthMethod(hooks).authorize({
|
||||
resourceSelection: "__manual__",
|
||||
resourceName: "unlisted-resource",
|
||||
})
|
||||
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
|
||||
|
||||
expect(await authorization.callback()).toMatchObject({ type: "success", accountId: "unlisted-resource" })
|
||||
})
|
||||
|
||||
test("checks Azure CLI and stores the resource name", async () => {
|
||||
const scopes: string[] = []
|
||||
const hooks = createAzureAuthHooks(azureShell(scopes))
|
||||
const authorization = await oauthMethod(hooks).authorize({ resourceName: "test-resource" })
|
||||
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
|
||||
|
||||
expect(await authorization.callback()).toMatchObject({
|
||||
type: "success",
|
||||
access: OAUTH_DUMMY_KEY,
|
||||
refresh: OAUTH_DUMMY_KEY,
|
||||
accountId: "test-resource",
|
||||
})
|
||||
expect(scopes).toEqual(["https://cognitiveservices.azure.com/.default"])
|
||||
})
|
||||
|
||||
test("supports Azure CLI versions that only provide expiresOn", async () => {
|
||||
const hooks = createAzureAuthHooks(() => {
|
||||
const output = {
|
||||
quiet: () => output,
|
||||
json: async () => ({
|
||||
accessToken: "legacy-token",
|
||||
expiresOn: new Date(Date.now() + 60 * 60 * 1000).toISOString(),
|
||||
}),
|
||||
}
|
||||
return output
|
||||
})
|
||||
const authorization = await oauthMethod(hooks).authorize({ resourceName: "test-resource" })
|
||||
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
|
||||
|
||||
expect(await authorization.callback()).toMatchObject({ type: "success", accountId: "test-resource" })
|
||||
})
|
||||
|
||||
test("rejects Azure CLI tokens without a usable expiration", async () => {
|
||||
const hooks = createAzureAuthHooks(() => {
|
||||
const output = {
|
||||
quiet: () => output,
|
||||
json: async () => ({ accessToken: "invalid-token" }),
|
||||
}
|
||||
return output
|
||||
})
|
||||
const authorization = await oauthMethod(hooks).authorize({ resourceName: "test-resource" })
|
||||
if (authorization.method !== "auto") throw new Error("Unexpected Azure authorization method")
|
||||
|
||||
await expect(authorization.callback()).rejects.toThrow("Azure CLI returned an invalid token expiration")
|
||||
})
|
||||
|
||||
test("discovers deployed models through Azure CLI", async () => {
|
||||
delete process.env.AZURE_RESOURCE_GROUP
|
||||
const commands: string[] = []
|
||||
const hooks = createAzureAuthHooks(
|
||||
discoveryShell(
|
||||
[{ name: "test-resource", resourceGroup: "test-group" }],
|
||||
[
|
||||
{
|
||||
name: "gpt-production",
|
||||
properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" },
|
||||
},
|
||||
{
|
||||
name: "DeepSeek-V4-Flash",
|
||||
properties: { model: { name: "DeepSeek-V4-Flash" }, provisioningState: "Succeeded" },
|
||||
},
|
||||
{
|
||||
name: "phi-production",
|
||||
properties: { model: { name: "Phi-4-mini-instruct" }, provisioningState: "Succeeded" },
|
||||
},
|
||||
{
|
||||
name: "gpt-5-nano",
|
||||
properties: { model: { name: "gpt-5-nano" }, provisioningState: "Creating" },
|
||||
},
|
||||
],
|
||||
commands,
|
||||
),
|
||||
)
|
||||
const list = hooks.provider?.models
|
||||
if (!list) throw new Error("Azure provider model hook is missing")
|
||||
|
||||
const result = await list(
|
||||
{
|
||||
...provider,
|
||||
models: models("gpt-5-mini", "deepseek-v4-flash", "phi-4-mini", "phi-4-mini-instruct", "gpt-5-nano"),
|
||||
},
|
||||
{ auth: oauth },
|
||||
)
|
||||
|
||||
expect(Object.keys(result)).toEqual(["gpt-5-mini", "deepseek-v4-flash", "phi-4-mini-instruct"])
|
||||
expect(result["gpt-5-mini"].api.id).toBe("gpt-production")
|
||||
expect(result["deepseek-v4-flash"].api.id).toBe("DeepSeek-V4-Flash")
|
||||
expect(result["phi-4-mini-instruct"].api.id).toBe("phi-production")
|
||||
expect(commands).toEqual([
|
||||
"az cognitiveservices account list --output json --only-show-errors",
|
||||
"az cognitiveservices account deployment list --name test-resource --resource-group test-group --output json --only-show-errors",
|
||||
])
|
||||
})
|
||||
|
||||
test("discovers models directly when the resource group is configured", async () => {
|
||||
process.env.AZURE_RESOURCE_GROUP = "restricted-group"
|
||||
const commands: string[] = []
|
||||
const hooks = createAzureAuthHooks(
|
||||
discoveryShell(
|
||||
[],
|
||||
[{ name: "gpt-production", properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" } }],
|
||||
commands,
|
||||
),
|
||||
)
|
||||
const list = hooks.provider?.models
|
||||
if (!list) throw new Error("Azure provider model hook is missing")
|
||||
|
||||
const result = await list({ ...provider, models: models("gpt-5-mini") }, { auth: oauth })
|
||||
|
||||
expect(result["gpt-5-mini"].api.id).toBe("gpt-production")
|
||||
expect(commands).toEqual([
|
||||
"az cognitiveservices account deployment list --name test-resource --resource-group restricted-group --output json --only-show-errors",
|
||||
])
|
||||
})
|
||||
|
||||
test("preserves multiple deployments of the same model", async () => {
|
||||
delete process.env.AZURE_RESOURCE_GROUP
|
||||
const hooks = createAzureAuthHooks(
|
||||
discoveryShell(
|
||||
[{ name: "test-resource", resourceGroup: "test-group" }],
|
||||
[
|
||||
{ name: "gpt-production", properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" } },
|
||||
{ name: "gpt-staging", properties: { model: { name: "gpt-5-mini" }, provisioningState: "Succeeded" } },
|
||||
],
|
||||
[],
|
||||
),
|
||||
)
|
||||
const list = hooks.provider?.models
|
||||
if (!list) throw new Error("Azure provider model hook is missing")
|
||||
|
||||
const result = await list({ ...provider, models: models("gpt-5-mini") }, { auth: oauth })
|
||||
|
||||
expect(Object.keys(result)).toEqual(["gpt-5-mini", "gpt-staging"])
|
||||
expect(result["gpt-5-mini"].api.id).toBe("gpt-production")
|
||||
expect(result["gpt-staging"].api.id).toBe("gpt-staging")
|
||||
expect(result["gpt-staging"].name).toBe("gpt-5-mini (gpt-staging)")
|
||||
})
|
||||
|
||||
test("keeps configured models available when Azure discovery fails", async () => {
|
||||
const hooks = createAzureAuthHooks(() => {
|
||||
const output = {
|
||||
quiet: () => output,
|
||||
json: async () => {
|
||||
throw new Error("Azure CLI failed")
|
||||
},
|
||||
}
|
||||
return output
|
||||
})
|
||||
const list = hooks.provider?.models
|
||||
if (!list) throw new Error("Azure provider model hook is missing")
|
||||
|
||||
const catalog = models("gpt-5-mini")
|
||||
expect(await list({ ...provider, models: catalog }, { auth: oauth })).toBe(catalog)
|
||||
})
|
||||
|
||||
test("does not change API-key loading", async () => {
|
||||
const scopes: string[] = []
|
||||
const hooks = createAzureAuthHooks(azureShell(scopes))
|
||||
const catalog = models("gpt-5-mini")
|
||||
const list = hooks.provider?.models
|
||||
if (!list) throw new Error("Azure provider model hook is missing")
|
||||
|
||||
expect(await loader(hooks)(async () => ({ type: "api", key: "test-key" }), provider)).toEqual({})
|
||||
expect(await list({ ...provider, models: catalog }, { auth: { type: "api", key: "test-key" } })).toBe(catalog)
|
||||
expect(scopes).toEqual([])
|
||||
})
|
||||
|
||||
test("uses Azure CLI bearer tokens for Azure inference endpoints", async () => {
|
||||
const scopes: string[] = []
|
||||
const requests: Headers[] = []
|
||||
const hooks = createAzureAuthHooks(azureShell(scopes), async (_input, init) => {
|
||||
requests.push(new Headers(init?.headers))
|
||||
return new Response(null, { status: 200 })
|
||||
})
|
||||
const options = await loader(hooks)(async () => oauth, provider)
|
||||
const request = customFetch(options)
|
||||
|
||||
await request("https://test-resource.openai.azure.com/openai/v1/responses", {
|
||||
headers: { "api-key": OAUTH_DUMMY_KEY, "x-keep": "yes" },
|
||||
})
|
||||
await request("https://test-resource.services.ai.azure.com/models/chat/completions", {
|
||||
headers: { Authorization: `Bearer ${OAUTH_DUMMY_KEY}` },
|
||||
})
|
||||
await request("https://test-resource.services.ai.azure.com/anthropic/v1/messages", {
|
||||
headers: { "x-api-key": OAUTH_DUMMY_KEY },
|
||||
})
|
||||
|
||||
expect(scopes).toEqual(["https://cognitiveservices.azure.com/.default", "https://ai.azure.com/.default"])
|
||||
expect(requests.map((headers) => headers.get("authorization"))).toEqual([
|
||||
"Bearer https://cognitiveservices.azure.com/.default-token",
|
||||
"Bearer https://cognitiveservices.azure.com/.default-token",
|
||||
"Bearer https://ai.azure.com/.default-token",
|
||||
])
|
||||
expect(requests[0].get("api-key")).toBeNull()
|
||||
expect(requests[0].get("x-keep")).toBe("yes")
|
||||
expect(requests[2].get("x-api-key")).toBeNull()
|
||||
expect(requests.every((headers) => headers.get("user-agent")?.startsWith("opencode/"))).toBe(true)
|
||||
})
|
||||
})
|
||||
@@ -19,18 +19,25 @@
|
||||
"@solidjs/meta": "catalog:",
|
||||
"@solidjs/router": "catalog:",
|
||||
"@solidjs/start": "catalog:",
|
||||
"d3-geo": "3.1.1",
|
||||
"d3-scale": "4.0.2",
|
||||
"effect": "catalog:",
|
||||
"i18n-iso-countries": "7.14.0",
|
||||
"nitro": "3.0.1-alpha.1",
|
||||
"solid-js": "catalog:",
|
||||
"sst": "catalog:",
|
||||
"vite": "catalog:"
|
||||
"topojson-client": "3.1.0",
|
||||
"vite": "catalog:",
|
||||
"world-atlas": "2.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/d3-geo": "3.1.0",
|
||||
"@types/d3-scale": "4.0.9",
|
||||
"@types/geojson": "7946.0.16",
|
||||
"@types/topojson-client": "3.1.5",
|
||||
"@types/topojson-specification": "1.0.5",
|
||||
"@typescript/native-preview": "catalog:",
|
||||
"typescript": "catalog:"
|
||||
},
|
||||
|
||||
@@ -126,9 +126,12 @@ const en = {
|
||||
"home.noMarketDescription": "No model rows matched this range.",
|
||||
"home.marketChart": "Market share by model author",
|
||||
"home.noData": "No data",
|
||||
"home.geoTitle": "Geographic Breakdown",
|
||||
"home.geoTitle": "Geo Breakdown",
|
||||
"home.geoDescription": "Tokens used by country.",
|
||||
"home.noGeoTitle": "No geo data",
|
||||
"home.noGeoDescription": "No geo rows matched this range.",
|
||||
"home.worldMap": "World map of token usage by country",
|
||||
"home.geoMapTitle": "Geo Breakdown map",
|
||||
"home.unknown": "Unknown",
|
||||
"home.tokenCostTitle": "Token Cost",
|
||||
"home.tokenCostDescription": "Price per 1M tokens.",
|
||||
@@ -233,8 +236,10 @@ const en = {
|
||||
"model.averageTokensSession": "Average tokens / session",
|
||||
"model.cacheRatio": "Cache Ratio",
|
||||
"model.inputTokens": "input tokens",
|
||||
"model.geoDescription": "OpenCode model tokens used by country.",
|
||||
"model.noGeoTitle": "No geo data",
|
||||
"model.noGeoDescription": "No OpenCode geo rows matched this model.",
|
||||
"model.worldMap": "World map of model token usage by country",
|
||||
"model.peersDescription": "Nearby models by recent OpenCode token volume.",
|
||||
"model.noPeersTitle": "No peers",
|
||||
"model.noPeersDescription": "Peer rankings appear after usage lands.",
|
||||
|
||||
@@ -108,8 +108,11 @@ export const dict = {
|
||||
"home.marketChart": "حصة السوق حسب مؤلف النموذج",
|
||||
"home.noData": "لا توجد بيانات",
|
||||
"home.geoTitle": "التوزيع الجغرافي",
|
||||
"home.geoDescription": "الرموز المستخدمة حسب البلد.",
|
||||
"home.noGeoTitle": "لا توجد بيانات جغرافية",
|
||||
"home.noGeoDescription": "لم تطابق أي صفوف جغرافية هذا النطاق.",
|
||||
"home.worldMap": "خريطة عالمية لاستخدام الرموز حسب البلد",
|
||||
"home.geoMapTitle": "خريطة التوزيع الجغرافي",
|
||||
"home.unknown": "غير معروف",
|
||||
"home.tokenCostTitle": "تكلفة الرموز",
|
||||
"home.tokenCostDescription": "السعر لكل مليون رمز.",
|
||||
@@ -213,8 +216,10 @@ export const dict = {
|
||||
"model.tokensSession": "الرموز / الجلسة",
|
||||
"model.cacheRatio": "نسبة التخزين المؤقت",
|
||||
"model.inputTokens": "رموز الإدخال",
|
||||
"model.geoDescription": "رموز نموذج OpenCode المستخدمة حسب البلد.",
|
||||
"model.noGeoTitle": "لا توجد بيانات جغرافية",
|
||||
"model.noGeoDescription": "لم تطابق أي صفوف جغرافية في OpenCode هذا النموذج.",
|
||||
"model.worldMap": "خريطة عالمية لاستخدام رموز النموذج حسب البلد",
|
||||
"model.peersDescription": "نماذج قريبة حسب حجم رموز OpenCode الأخير.",
|
||||
"model.noPeersTitle": "لا توجد نماذج مشابهة",
|
||||
"model.noPeersDescription": "تظهر ترتيبات النماذج المشابهة بعد وصول الاستخدام.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Participação de mercado por autor do modelo",
|
||||
"home.noData": "Sem dados",
|
||||
"home.geoTitle": "Distribuição geográfica",
|
||||
"home.geoDescription": "Tokens usados por país.",
|
||||
"home.noGeoTitle": "Sem dados geográficos",
|
||||
"home.noGeoDescription": "Nenhuma linha geográfica correspondeu a este intervalo.",
|
||||
"home.worldMap": "Mapa-múndi do uso de tokens por país",
|
||||
"home.geoMapTitle": "Mapa da distribuição geográfica",
|
||||
"home.unknown": "Desconhecido",
|
||||
"home.tokenCostTitle": "Custo de tokens",
|
||||
"home.tokenCostDescription": "Preço por 1 milhão de tokens.",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "Tokens / sessão",
|
||||
"model.cacheRatio": "Taxa de cache",
|
||||
"model.inputTokens": "tokens de entrada",
|
||||
"model.geoDescription": "Tokens do modelo OpenCode usados por país.",
|
||||
"model.noGeoTitle": "Sem dados geográficos",
|
||||
"model.noGeoDescription": "Nenhuma linha geográfica do OpenCode correspondeu a este modelo.",
|
||||
"model.worldMap": "Mapa-múndi do uso de tokens do modelo por país",
|
||||
"model.peersDescription": "Modelos próximos por volume recente de tokens do OpenCode.",
|
||||
"model.noPeersTitle": "Sem pares",
|
||||
"model.noPeersDescription": "Os rankings de pares aparecem depois que o uso chega.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Markedsandel efter modelforfatter",
|
||||
"home.noData": "Ingen data",
|
||||
"home.geoTitle": "Geografisk opdeling",
|
||||
"home.geoDescription": "Tokens brugt efter land.",
|
||||
"home.noGeoTitle": "Ingen geodata",
|
||||
"home.noGeoDescription": "Ingen georækker matchede dette interval.",
|
||||
"home.worldMap": "Verdenskort over tokenbrug efter land",
|
||||
"home.geoMapTitle": "Kort over geografisk opdeling",
|
||||
"home.unknown": "Ukendt",
|
||||
"home.tokenCostTitle": "Tokenomkostning",
|
||||
"home.tokenCostDescription": "Pris pr. 1 mio. tokens.",
|
||||
@@ -214,8 +217,10 @@ export const dict = {
|
||||
"model.tokensSession": "Tokens / session",
|
||||
"model.cacheRatio": "Cacheandel",
|
||||
"model.inputTokens": "inputtokens",
|
||||
"model.geoDescription": "OpenCode-modeltokens brugt efter land.",
|
||||
"model.noGeoTitle": "Ingen geodata",
|
||||
"model.noGeoDescription": "Ingen OpenCode-georækker matchede denne model.",
|
||||
"model.worldMap": "Verdenskort over modeltokenbrug efter land",
|
||||
"model.peersDescription": "Nærliggende modeller efter seneste OpenCode-tokenvolumen.",
|
||||
"model.noPeersTitle": "Ingen lignende modeller",
|
||||
"model.noPeersDescription": "Ranglister over lignende modeller vises, når brug lander.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Marktanteil nach Modellautor",
|
||||
"home.noData": "Keine Daten",
|
||||
"home.geoTitle": "Geografische Aufschlüsselung",
|
||||
"home.geoDescription": "Nach Land verwendete Tokens.",
|
||||
"home.noGeoTitle": "Keine Geodaten",
|
||||
"home.noGeoDescription": "Keine Geozeilen passten zu diesem Zeitraum.",
|
||||
"home.worldMap": "Weltkarte der Tokennutzung nach Land",
|
||||
"home.geoMapTitle": "Karte der geografischen Aufschlüsselung",
|
||||
"home.unknown": "Unbekannt",
|
||||
"home.tokenCostTitle": "Tokenkosten",
|
||||
"home.tokenCostDescription": "Preis pro 1 Mio. Tokens.",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "Tokens / Sitzung",
|
||||
"model.cacheRatio": "Cache-Anteil",
|
||||
"model.inputTokens": "Eingabetokens",
|
||||
"model.geoDescription": "OpenCode-Modelltokens nach Land.",
|
||||
"model.noGeoTitle": "Keine Geodaten",
|
||||
"model.noGeoDescription": "Keine OpenCode-Geozeilen passten zu diesem Modell.",
|
||||
"model.worldMap": "Weltkarte der Modelltokennutzung nach Land",
|
||||
"model.peersDescription": "Nahe Modelle nach aktuellem OpenCode-Tokenvolumen.",
|
||||
"model.noPeersTitle": "Keine Vergleichsmodelle",
|
||||
"model.noPeersDescription": "Vergleichsrankings erscheinen, nachdem Nutzung eingegangen ist.",
|
||||
|
||||
@@ -108,8 +108,11 @@ export const dict = {
|
||||
"home.marketChart": "Cuota de mercado por autor del modelo",
|
||||
"home.noData": "Sin datos",
|
||||
"home.geoTitle": "Desglose geográfico",
|
||||
"home.geoDescription": "Tokens usados por país.",
|
||||
"home.noGeoTitle": "Sin datos geográficos",
|
||||
"home.noGeoDescription": "Ninguna fila geográfica coincidió con este rango.",
|
||||
"home.worldMap": "Mapa mundial del uso de tokens por país",
|
||||
"home.geoMapTitle": "Mapa de desglose geográfico",
|
||||
"home.unknown": "Desconocido",
|
||||
"home.tokenCostTitle": "Coste de tokens",
|
||||
"home.tokenCostDescription": "Precio por 1 M de tokens.",
|
||||
@@ -215,8 +218,10 @@ export const dict = {
|
||||
"model.tokensSession": "Tokens / sesión",
|
||||
"model.cacheRatio": "Ratio de caché",
|
||||
"model.inputTokens": "tokens de entrada",
|
||||
"model.geoDescription": "Tokens del modelo de OpenCode usados por país.",
|
||||
"model.noGeoTitle": "Sin datos geográficos",
|
||||
"model.noGeoDescription": "Ninguna fila geográfica de OpenCode coincidió con este modelo.",
|
||||
"model.worldMap": "Mapa mundial del uso de tokens del modelo por país",
|
||||
"model.peersDescription": "Modelos cercanos por volumen reciente de tokens de OpenCode.",
|
||||
"model.noPeersTitle": "Sin modelos similares",
|
||||
"model.noPeersDescription": "Las clasificaciones de modelos similares aparecen después de que llegue uso.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Part de marché par auteur de modèle",
|
||||
"home.noData": "Aucune donnée",
|
||||
"home.geoTitle": "Répartition géographique",
|
||||
"home.geoDescription": "Tokens utilisés par pays.",
|
||||
"home.noGeoTitle": "Aucune donnée géographique",
|
||||
"home.noGeoDescription": "Aucune ligne géographique ne correspondait à cette période.",
|
||||
"home.worldMap": "Carte mondiale de l'utilisation des tokens par pays",
|
||||
"home.geoMapTitle": "Carte de répartition géographique",
|
||||
"home.unknown": "Inconnu",
|
||||
"home.tokenCostTitle": "Coût des tokens",
|
||||
"home.tokenCostDescription": "Prix par million de tokens.",
|
||||
@@ -217,8 +220,10 @@ export const dict = {
|
||||
"model.tokensSession": "Tokens / session",
|
||||
"model.cacheRatio": "Taux de cache",
|
||||
"model.inputTokens": "tokens d'entrée",
|
||||
"model.geoDescription": "Tokens du modèle OpenCode utilisés par pays.",
|
||||
"model.noGeoTitle": "Aucune donnée géographique",
|
||||
"model.noGeoDescription": "Aucune ligne géographique OpenCode ne correspondait à ce modèle.",
|
||||
"model.worldMap": "Carte mondiale de l'utilisation des tokens du modèle par pays",
|
||||
"model.peersDescription": "Modèles proches par volume récent de tokens OpenCode.",
|
||||
"model.noPeersTitle": "Aucun modèle proche",
|
||||
"model.noPeersDescription": "Les classements de modèles proches apparaissent après l'arrivée de l'utilisation.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Quota di mercato per autore del modello",
|
||||
"home.noData": "Nessun dato",
|
||||
"home.geoTitle": "Ripartizione geografica",
|
||||
"home.geoDescription": "Token usati per paese.",
|
||||
"home.noGeoTitle": "Nessun dato geografico",
|
||||
"home.noGeoDescription": "Nessuna riga geografica corrispondeva a questo intervallo.",
|
||||
"home.worldMap": "Mappa mondiale dell'utilizzo dei token per paese",
|
||||
"home.geoMapTitle": "Mappa della ripartizione geografica",
|
||||
"home.unknown": "Sconosciuto",
|
||||
"home.tokenCostTitle": "Costo token",
|
||||
"home.tokenCostDescription": "Prezzo per 1 M di token.",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "Token / sessione",
|
||||
"model.cacheRatio": "Rapporto cache",
|
||||
"model.inputTokens": "token di input",
|
||||
"model.geoDescription": "Token del modello OpenCode usati per paese.",
|
||||
"model.noGeoTitle": "Nessun dato geografico",
|
||||
"model.noGeoDescription": "Nessuna riga geografica OpenCode corrispondeva a questo modello.",
|
||||
"model.worldMap": "Mappa mondiale dell'utilizzo dei token del modello per paese",
|
||||
"model.peersDescription": "Modelli vicini per volume recente di token OpenCode.",
|
||||
"model.noPeersTitle": "Nessun modello simile",
|
||||
"model.noPeersDescription": "Le classifiche dei modelli simili appaiono dopo l'arrivo dell'utilizzo.",
|
||||
|
||||
@@ -111,8 +111,11 @@ export const dict = {
|
||||
"home.marketChart": "モデル作者別マーケットシェア",
|
||||
"home.noData": "データなし",
|
||||
"home.geoTitle": "地域別内訳",
|
||||
"home.geoDescription": "国別のトークン使用量。",
|
||||
"home.noGeoTitle": "地域データがありません",
|
||||
"home.noGeoDescription": "この期間に一致する地域行はありません。",
|
||||
"home.worldMap": "国別トークン使用量の世界地図",
|
||||
"home.geoMapTitle": "地域別内訳マップ",
|
||||
"home.unknown": "不明",
|
||||
"home.tokenCostTitle": "トークンコスト",
|
||||
"home.tokenCostDescription": "100万トークンあたりの価格。",
|
||||
@@ -217,8 +220,10 @@ export const dict = {
|
||||
"model.tokensSession": "トークン / セッション",
|
||||
"model.cacheRatio": "キャッシュ比率",
|
||||
"model.inputTokens": "入力トークン",
|
||||
"model.geoDescription": "国別のOpenCodeモデルのトークン使用量。",
|
||||
"model.noGeoTitle": "地域データがありません",
|
||||
"model.noGeoDescription": "このモデルに一致するOpenCode地域行はありません。",
|
||||
"model.worldMap": "国別モデル別トークン使用量の世界地図",
|
||||
"model.peersDescription": "最近のOpenCodeトークン量が近いモデル。",
|
||||
"model.noPeersTitle": "類似モデルがありません",
|
||||
"model.noPeersDescription": "使用量が届くと類似モデルのランキングが表示されます。",
|
||||
|
||||
@@ -111,8 +111,11 @@ export const dict = {
|
||||
"home.marketChart": "모델 작성자별 시장 점유율",
|
||||
"home.noData": "데이터 없음",
|
||||
"home.geoTitle": "지역별 분포",
|
||||
"home.geoDescription": "국가별 사용 토큰입니다.",
|
||||
"home.noGeoTitle": "지역 데이터 없음",
|
||||
"home.noGeoDescription": "이 범위에 맞는 지역 행이 없습니다.",
|
||||
"home.worldMap": "국가별 토큰 사용량 세계 지도",
|
||||
"home.geoMapTitle": "지역별 분포 지도",
|
||||
"home.unknown": "알 수 없음",
|
||||
"home.tokenCostTitle": "토큰 비용",
|
||||
"home.tokenCostDescription": "100만 토큰당 가격입니다.",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "토큰 / 세션",
|
||||
"model.cacheRatio": "캐시 비율",
|
||||
"model.inputTokens": "입력 토큰",
|
||||
"model.geoDescription": "국가별 OpenCode 모델 토큰 사용량입니다.",
|
||||
"model.noGeoTitle": "지역 데이터 없음",
|
||||
"model.noGeoDescription": "이 모델과 일치하는 OpenCode 지역 행이 없습니다.",
|
||||
"model.worldMap": "국가별 모델 토큰 사용량 세계 지도",
|
||||
"model.peersDescription": "최근 OpenCode 토큰 볼륨이 가까운 모델입니다.",
|
||||
"model.noPeersTitle": "비슷한 모델 없음",
|
||||
"model.noPeersDescription": "사용량이 들어오면 비슷한 모델 순위가 표시됩니다.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Markedsandel etter modellforfatter",
|
||||
"home.noData": "Ingen data",
|
||||
"home.geoTitle": "Geografisk fordeling",
|
||||
"home.geoDescription": "Tokens brukt etter land.",
|
||||
"home.noGeoTitle": "Ingen geodata",
|
||||
"home.noGeoDescription": "Ingen georader matchet dette intervallet.",
|
||||
"home.worldMap": "Verdenskart over tokenbruk etter land",
|
||||
"home.geoMapTitle": "Kart over geografisk fordeling",
|
||||
"home.unknown": "Ukjent",
|
||||
"home.tokenCostTitle": "Tokenkostnad",
|
||||
"home.tokenCostDescription": "Pris per 1 mill. tokens.",
|
||||
@@ -215,8 +218,10 @@ export const dict = {
|
||||
"model.tokensSession": "Tokens / økt",
|
||||
"model.cacheRatio": "Cacheandel",
|
||||
"model.inputTokens": "inndata-tokens",
|
||||
"model.geoDescription": "OpenCode-modelltokens brukt etter land.",
|
||||
"model.noGeoTitle": "Ingen geodata",
|
||||
"model.noGeoDescription": "Ingen OpenCode-georader matchet denne modellen.",
|
||||
"model.worldMap": "Verdenskart over modelltokenbruk etter land",
|
||||
"model.peersDescription": "Nærliggende modeller etter nylig OpenCode-tokenvolum.",
|
||||
"model.noPeersTitle": "Ingen lignende modeller",
|
||||
"model.noPeersDescription": "Rangeringer for lignende modeller vises etter at bruk lander.",
|
||||
|
||||
@@ -108,8 +108,11 @@ export const dict = {
|
||||
"home.marketChart": "Udział w rynku według autora modelu",
|
||||
"home.noData": "Brak danych",
|
||||
"home.geoTitle": "Podział geograficzny",
|
||||
"home.geoDescription": "Tokeny użyte według kraju.",
|
||||
"home.noGeoTitle": "Brak danych geograficznych",
|
||||
"home.noGeoDescription": "Żadne wiersze geograficzne nie pasowały do tego zakresu.",
|
||||
"home.worldMap": "Mapa świata użycia tokenów według kraju",
|
||||
"home.geoMapTitle": "Mapa podziału geograficznego",
|
||||
"home.unknown": "Nieznane",
|
||||
"home.tokenCostTitle": "Koszt tokenów",
|
||||
"home.tokenCostDescription": "Cena za 1 mln tokenów.",
|
||||
@@ -214,8 +217,10 @@ export const dict = {
|
||||
"model.tokensSession": "Tokeny / sesja",
|
||||
"model.cacheRatio": "Współczynnik cache",
|
||||
"model.inputTokens": "tokeny wejściowe",
|
||||
"model.geoDescription": "Tokeny modelu OpenCode użyte według kraju.",
|
||||
"model.noGeoTitle": "Brak danych geograficznych",
|
||||
"model.noGeoDescription": "Żadne wiersze geograficzne OpenCode nie pasowały do tego modelu.",
|
||||
"model.worldMap": "Mapa świata użycia tokenów modelu według kraju",
|
||||
"model.peersDescription": "Pobliskie modele według ostatniego wolumenu tokenów OpenCode.",
|
||||
"model.noPeersTitle": "Brak podobnych modeli",
|
||||
"model.noPeersDescription": "Rankingi podobnych modeli pojawią się po nadejściu użycia.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Доля рынка по автору модели",
|
||||
"home.noData": "Нет данных",
|
||||
"home.geoTitle": "Географический разрез",
|
||||
"home.geoDescription": "Токены, использованные по странам.",
|
||||
"home.noGeoTitle": "Нет геоданных",
|
||||
"home.noGeoDescription": "Нет географических строк для этого диапазона.",
|
||||
"home.worldMap": "Карта мира использования токенов по странам",
|
||||
"home.geoMapTitle": "Карта географического разреза",
|
||||
"home.unknown": "Неизвестно",
|
||||
"home.tokenCostTitle": "Стоимость токенов",
|
||||
"home.tokenCostDescription": "Цена за 1 млн токенов.",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "Токены / сеанс",
|
||||
"model.cacheRatio": "Доля кэша",
|
||||
"model.inputTokens": "входные токены",
|
||||
"model.geoDescription": "Токены модели OpenCode, использованные по странам.",
|
||||
"model.noGeoTitle": "Нет геоданных",
|
||||
"model.noGeoDescription": "Нет географических строк OpenCode для этой модели.",
|
||||
"model.worldMap": "Карта мира использования токенов модели по странам",
|
||||
"model.peersDescription": "Близкие модели по недавнему объему токенов OpenCode.",
|
||||
"model.noPeersTitle": "Нет похожих моделей",
|
||||
"model.noPeersDescription": "Рейтинги похожих моделей появятся после использования.",
|
||||
|
||||
@@ -110,8 +110,11 @@ export const dict = {
|
||||
"home.marketChart": "ส่วนแบ่งตลาดตามผู้สร้างโมเดล",
|
||||
"home.noData": "ไม่มีข้อมูล",
|
||||
"home.geoTitle": "แยกตามภูมิศาสตร์",
|
||||
"home.geoDescription": "token ที่ใช้แยกตามประเทศ",
|
||||
"home.noGeoTitle": "ไม่มีข้อมูลภูมิศาสตร์",
|
||||
"home.noGeoDescription": "ไม่มีแถวภูมิศาสตร์ที่ตรงกับช่วงเวลานี้",
|
||||
"home.worldMap": "แผนที่โลกของการใช้ token แยกตามประเทศ",
|
||||
"home.geoMapTitle": "แผนที่แยกตามภูมิศาสตร์",
|
||||
"home.unknown": "ไม่ทราบ",
|
||||
"home.tokenCostTitle": "ต้นทุน Token",
|
||||
"home.tokenCostDescription": "ราคาต่อ 1 ล้าน token",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "Token / เซสชัน",
|
||||
"model.cacheRatio": "อัตราแคช",
|
||||
"model.inputTokens": "input token",
|
||||
"model.geoDescription": "token ของโมเดล OpenCode ที่ใช้แยกตามประเทศ",
|
||||
"model.noGeoTitle": "ไม่มีข้อมูลภูมิศาสตร์",
|
||||
"model.noGeoDescription": "ไม่มีแถวภูมิศาสตร์ของ OpenCode ที่ตรงกับโมเดลนี้",
|
||||
"model.worldMap": "แผนที่โลกของการใช้ token ของโมเดลแยกตามประเทศ",
|
||||
"model.peersDescription": "โมเดลใกล้เคียงตามปริมาณ token ล่าสุดของ OpenCode",
|
||||
"model.noPeersTitle": "ไม่มีโมเดลใกล้เคียง",
|
||||
"model.noPeersDescription": "อันดับโมเดลใกล้เคียงจะแสดงหลังจากมีการใช้งานเข้ามา",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Model yazarına göre pazar payı",
|
||||
"home.noData": "Veri yok",
|
||||
"home.geoTitle": "Coğrafi Dağılım",
|
||||
"home.geoDescription": "Ülkeye göre kullanılan tokenlar.",
|
||||
"home.noGeoTitle": "Coğrafi veri yok",
|
||||
"home.noGeoDescription": "Bu aralıkla eşleşen coğrafi satır yok.",
|
||||
"home.worldMap": "Ülkeye göre token kullanımının dünya haritası",
|
||||
"home.geoMapTitle": "Coğrafi Dağılım haritası",
|
||||
"home.unknown": "Bilinmiyor",
|
||||
"home.tokenCostTitle": "Token Maliyeti",
|
||||
"home.tokenCostDescription": "1 milyon token başına fiyat.",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "Token / Oturum",
|
||||
"model.cacheRatio": "Önbellek Oranı",
|
||||
"model.inputTokens": "giriş tokenları",
|
||||
"model.geoDescription": "Ülkeye göre kullanılan OpenCode model tokenları.",
|
||||
"model.noGeoTitle": "Coğrafi veri yok",
|
||||
"model.noGeoDescription": "Bu modelle eşleşen OpenCode coğrafi satırı yok.",
|
||||
"model.worldMap": "Ülkeye göre model token kullanımının dünya haritası",
|
||||
"model.peersDescription": "Son OpenCode token hacmine göre yakındaki modeller.",
|
||||
"model.noPeersTitle": "Benzer yok",
|
||||
"model.noPeersDescription": "Benzer model sıralamaları kullanım geldikten sonra görünür.",
|
||||
|
||||
@@ -109,8 +109,11 @@ export const dict = {
|
||||
"home.marketChart": "Частка ринку за автором моделі",
|
||||
"home.noData": "Немає даних",
|
||||
"home.geoTitle": "Географічний розріз",
|
||||
"home.geoDescription": "Токени, використані за країнами.",
|
||||
"home.noGeoTitle": "Немає геоданих",
|
||||
"home.noGeoDescription": "Жодні географічні рядки не відповідали цьому діапазону.",
|
||||
"home.worldMap": "Карта світу використання токенів за країнами",
|
||||
"home.geoMapTitle": "Карта географічного розрізу",
|
||||
"home.unknown": "Невідомо",
|
||||
"home.tokenCostTitle": "Вартість токенів",
|
||||
"home.tokenCostDescription": "Ціна за 1 млн токенів.",
|
||||
@@ -216,8 +219,10 @@ export const dict = {
|
||||
"model.tokensSession": "Токени / сеанс",
|
||||
"model.cacheRatio": "Частка кешу",
|
||||
"model.inputTokens": "вхідні токени",
|
||||
"model.geoDescription": "Токени моделі OpenCode, використані за країнами.",
|
||||
"model.noGeoTitle": "Немає геоданих",
|
||||
"model.noGeoDescription": "Жодні географічні рядки OpenCode не відповідали цій моделі.",
|
||||
"model.worldMap": "Карта світу використання токенів моделі за країнами",
|
||||
"model.peersDescription": "Близькі моделі за нещодавнім обсягом токенів OpenCode.",
|
||||
"model.noPeersTitle": "Немає схожих моделей",
|
||||
"model.noPeersDescription": "Рейтинги схожих моделей з'являться після використання.",
|
||||
|
||||
@@ -110,8 +110,11 @@ export const dict = {
|
||||
"home.marketChart": "按模型作者显示的市场份额",
|
||||
"home.noData": "无数据",
|
||||
"home.geoTitle": "地理分布",
|
||||
"home.geoDescription": "按国家/地区统计的 token 使用量。",
|
||||
"home.noGeoTitle": "无地理数据",
|
||||
"home.noGeoDescription": "没有符合该时间范围的地理行。",
|
||||
"home.worldMap": "按国家/地区显示 token 使用量的世界地图",
|
||||
"home.geoMapTitle": "地理分布地图",
|
||||
"home.unknown": "未知",
|
||||
"home.tokenCostTitle": "Token 成本",
|
||||
"home.tokenCostDescription": "每 100 万 token 的价格。",
|
||||
@@ -215,8 +218,10 @@ export const dict = {
|
||||
"model.tokensSession": "Token / 会话",
|
||||
"model.cacheRatio": "缓存比例",
|
||||
"model.inputTokens": "输入 token",
|
||||
"model.geoDescription": "按国家/地区统计的 OpenCode 模型 token 使用量。",
|
||||
"model.noGeoTitle": "无地理数据",
|
||||
"model.noGeoDescription": "没有符合此模型的 OpenCode 地理行。",
|
||||
"model.worldMap": "按国家/地区显示模型 token 使用量的世界地图",
|
||||
"model.peersDescription": "按近期 OpenCode token 用量排列的相近模型。",
|
||||
"model.noPeersTitle": "无同类模型",
|
||||
"model.noPeersDescription": "使用量到达后会显示同类模型排名。",
|
||||
|
||||
@@ -110,8 +110,11 @@ export const dict = {
|
||||
"home.marketChart": "按模型作者顯示的市場佔有率",
|
||||
"home.noData": "無數據",
|
||||
"home.geoTitle": "地理分布",
|
||||
"home.geoDescription": "按國家/地區統計的 token 使用量。",
|
||||
"home.noGeoTitle": "無地理數據",
|
||||
"home.noGeoDescription": "沒有符合該時間範圍的地理列。",
|
||||
"home.worldMap": "按國家/地區顯示 token 使用量的世界地圖",
|
||||
"home.geoMapTitle": "地理分布地圖",
|
||||
"home.unknown": "未知",
|
||||
"home.tokenCostTitle": "Token 成本",
|
||||
"home.tokenCostDescription": "每 100 萬 token 的價格。",
|
||||
@@ -215,8 +218,10 @@ export const dict = {
|
||||
"model.tokensSession": "Token / 工作階段",
|
||||
"model.cacheRatio": "快取比例",
|
||||
"model.inputTokens": "輸入 token",
|
||||
"model.geoDescription": "按國家/地區統計的 OpenCode 模型 token 使用量。",
|
||||
"model.noGeoTitle": "無地理數據",
|
||||
"model.noGeoDescription": "沒有符合此模型的 OpenCode 地理列。",
|
||||
"model.worldMap": "按國家/地區顯示模型 token 使用量的世界地圖",
|
||||
"model.peersDescription": "按近期 OpenCode token 用量排列的相近模型。",
|
||||
"model.noPeersTitle": "無同類模型",
|
||||
"model.noPeersDescription": "使用量到達後會顯示同類模型排名。",
|
||||
|
||||
@@ -17,6 +17,7 @@ import { useI18n } from "../../context/i18n"
|
||||
import { useLanguage } from "../../context/language"
|
||||
import { localizedUrl } from "../../lib/language"
|
||||
import { findModelCatalogEntry, formatCatalogLabName, loadModelCatalog, type ModelCatalogEntry } from "../model-catalog"
|
||||
import { geoMapHeight, geoMapWidth, worldBorderPath, worldCountryMarkers, worldCountryPaths } from "../geo-map"
|
||||
import { SectionHeading } from "../section-heading"
|
||||
import { runStatsEffect } from "../../stats-runtime"
|
||||
import { setStatsPageCacheHeaders } from "../stats-cache"
|
||||
@@ -891,10 +892,21 @@ function ModelEfficiencySection(props: { data: StatsModelPageData | null; catalo
|
||||
|
||||
function ModelGeoBreakdownSection(props: { data: CountryEntry[] }) {
|
||||
const i18n = useI18n()
|
||||
const language = useLanguage()
|
||||
const [activeCountry, setActiveCountry] = createSignal<string>()
|
||||
const data = createMemo(() => props.data)
|
||||
const countryById = createMemo(
|
||||
() =>
|
||||
new Map(
|
||||
data().flatMap((country) => {
|
||||
const id = countryNumericId(country.country)
|
||||
return id ? [[id, country] as const] : []
|
||||
}),
|
||||
),
|
||||
)
|
||||
const maxTokens = createMemo(() => Math.max(0, ...data().map((country) => country.tokens)) || 1)
|
||||
const topCountries = createMemo(() => data().slice(0, 15))
|
||||
const active = createMemo(() => data().find((country) => country.country === activeCountry()) ?? data()[0])
|
||||
|
||||
return (
|
||||
<section
|
||||
@@ -905,12 +917,36 @@ function ModelGeoBreakdownSection(props: { data: CountryEntry[] }) {
|
||||
setActiveCountry(undefined)
|
||||
}}
|
||||
>
|
||||
<SectionTitle href="#geo-breakdown" title={i18n.t("home.geoTitle")} />
|
||||
<SectionTitle
|
||||
href="#geo-breakdown"
|
||||
title={i18n.t("nav.geoBreakdown")}
|
||||
description={i18n.t("model.geoDescription")}
|
||||
/>
|
||||
<Show
|
||||
when={data().length > 0}
|
||||
fallback={<ModelEmptyState title={i18n.t("model.noGeoTitle")} description={i18n.t("model.noGeoDescription")} />}
|
||||
>
|
||||
<div data-component="geo-breakdown">
|
||||
<div data-slot="geo-map-panel">
|
||||
<GeoWorldMap
|
||||
countryById={countryById()}
|
||||
activeCountry={activeCountry()}
|
||||
maxTokens={maxTokens()}
|
||||
onActiveCountryChange={setActiveCountry}
|
||||
/>
|
||||
<Show when={active()}>
|
||||
{(country) => (
|
||||
<div data-slot="geo-active-country">
|
||||
<span>#{String(country().rank).padStart(2, "0")}</span>
|
||||
<strong>{formatCountryName(country().country, language.tag(language.locale()), i18n)}</strong>
|
||||
<p>
|
||||
<b>{formatGeoTokens(country().tokens)}</b>
|
||||
<em>{formatGeoShare(country().share)}</em>
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</Show>
|
||||
</div>
|
||||
<GeoCountryList
|
||||
data={topCountries()}
|
||||
activeCountry={activeCountry()}
|
||||
@@ -923,6 +959,92 @@ function ModelGeoBreakdownSection(props: { data: CountryEntry[] }) {
|
||||
)
|
||||
}
|
||||
|
||||
function GeoWorldMap(props: {
|
||||
countryById: Map<string, CountryEntry>
|
||||
activeCountry: string | undefined
|
||||
maxTokens: number
|
||||
onActiveCountryChange: (country: string | undefined) => void
|
||||
}) {
|
||||
const i18n = useI18n()
|
||||
const opacityScale = createMemo(() => scaleSqrt().domain([0, props.maxTokens]).range([0.26, 0.96]).clamp(true))
|
||||
const countryOpacity = (country: CountryEntry | undefined) => {
|
||||
if (!country || country.tokens <= 0) return 0
|
||||
const opacity = opacityScale()(country.tokens)
|
||||
if (props.activeCountry === country.country) return 1
|
||||
if (!props.activeCountry) return opacity
|
||||
return Math.max(0.18, opacity * 0.36)
|
||||
}
|
||||
|
||||
return (
|
||||
<svg
|
||||
data-component="geo-world-map"
|
||||
viewBox={`0 0 ${geoMapWidth} ${geoMapHeight}`}
|
||||
role="img"
|
||||
aria-label={i18n.t("model.worldMap")}
|
||||
>
|
||||
<title>{i18n.t("home.geoMapTitle")}</title>
|
||||
<g data-slot="geo-countries">
|
||||
<For each={worldCountryPaths}>
|
||||
{(country) => {
|
||||
const entry = () => props.countryById.get(country.id)
|
||||
return (
|
||||
<path
|
||||
d={country.path}
|
||||
data-country-id={country.id}
|
||||
data-has-data={entry() ? "true" : undefined}
|
||||
data-active={entry()?.country === props.activeCountry ? "true" : undefined}
|
||||
style={{ "--geo-country-opacity": String(countryOpacity(entry())) } as JSX.CSSProperties}
|
||||
aria-hidden="true"
|
||||
onPointerEnter={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
onClick={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
/>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
</g>
|
||||
<g data-slot="geo-country-markers">
|
||||
<For each={worldCountryMarkers}>
|
||||
{(country) => {
|
||||
const entry = () => props.countryById.get(country.id)
|
||||
return (
|
||||
<Show when={entry()}>
|
||||
<circle
|
||||
cx={country.marker.x}
|
||||
cy={country.marker.y}
|
||||
data-country-id={country.id}
|
||||
r={entry()?.country === props.activeCountry ? 3.4 : 2.4}
|
||||
data-active={entry()?.country === props.activeCountry ? "true" : undefined}
|
||||
style={{ "--geo-country-opacity": String(countryOpacity(entry())) } as JSX.CSSProperties}
|
||||
aria-hidden="true"
|
||||
onPointerEnter={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
onClick={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
/>
|
||||
</Show>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
</g>
|
||||
<path data-slot="geo-borders" d={worldBorderPath} aria-hidden="true" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
function GeoCountryList(props: {
|
||||
data: CountryEntry[]
|
||||
activeCountry: string | undefined
|
||||
@@ -1015,7 +1137,7 @@ function PeerRow(props: { peer: ModelPeerEntry; active: boolean }) {
|
||||
)
|
||||
}
|
||||
|
||||
function SectionTitle(props: { href: string; title: string; description?: string }) {
|
||||
function SectionTitle(props: { href: string; title: string; description: string }) {
|
||||
return <SectionHeading href={props.href} title={props.title} description={props.description} />
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
import { geoEquirectangular, geoPath } from "d3-geo"
|
||||
import { feature, mesh } from "topojson-client"
|
||||
import countriesTopologySource from "world-atlas/countries-110m.json?raw"
|
||||
import type { FeatureCollection, GeometryObject, GeoJsonProperties } from "geojson"
|
||||
import type { GeometryCollection, Topology } from "topojson-specification"
|
||||
|
||||
export const geoMapWidth = 960
|
||||
export const geoMapHeight = 430
|
||||
|
||||
type WorldCountryProperties = GeoJsonProperties & { name?: string }
|
||||
type WorldTopology = Topology<{ countries: GeometryCollection<WorldCountryProperties> }>
|
||||
|
||||
const worldTopology = JSON.parse(countriesTopologySource) as WorldTopology
|
||||
const worldCountryGeometries: GeometryCollection<WorldCountryProperties> = {
|
||||
...worldTopology.objects.countries,
|
||||
geometries: worldTopology.objects.countries.geometries.filter((country) => String(country.id ?? "") !== "010"),
|
||||
}
|
||||
const worldCountries = feature<WorldCountryProperties>(worldTopology, worldCountryGeometries) as FeatureCollection<
|
||||
GeometryObject,
|
||||
WorldCountryProperties
|
||||
>
|
||||
const worldProjection = geoEquirectangular().fitExtent(
|
||||
[
|
||||
[10, 12],
|
||||
[geoMapWidth - 10, geoMapHeight - 12],
|
||||
],
|
||||
worldCountries,
|
||||
)
|
||||
const worldPath = geoPath(worldProjection)
|
||||
|
||||
export const worldCountryPaths = worldCountries.features.map((country) => ({
|
||||
id: String(country.id ?? "").padStart(3, "0"),
|
||||
path: worldPath(country) ?? "",
|
||||
}))
|
||||
|
||||
export const worldBorderPath = worldPath(mesh(worldTopology, worldCountryGeometries, (a, b) => a !== b)) ?? ""
|
||||
|
||||
function geoCountryMarker(country: (typeof worldCountries.features)[number]) {
|
||||
const bounds = worldPath.bounds(country)
|
||||
const [x, y] = worldPath.centroid(country)
|
||||
if (!Number.isFinite(x) || !Number.isFinite(y)) return undefined
|
||||
if (bounds[1][0] - bounds[0][0] >= 3 && bounds[1][1] - bounds[0][1] >= 3) return undefined
|
||||
return { x, y }
|
||||
}
|
||||
|
||||
// The 110m topology omits small regions. Geographic centroids keep those countries interactive without shipping 50m paths.
|
||||
const fallbackCountryMarkerCoordinates = [
|
||||
["016", -170.7179, -14.3046],
|
||||
["020", 1.5606, 42.542],
|
||||
["028", -61.7945, 17.2762],
|
||||
["048", 50.5425, 26.0417],
|
||||
["052", -59.5602, 13.1811],
|
||||
["060", -64.7558, 32.3131],
|
||||
["086", 72.4453, -7.3312],
|
||||
["092", -64.4704, 18.5276],
|
||||
["132", -23.9576, 15.9551],
|
||||
["136", -80.9129, 19.43],
|
||||
["174", 43.6844, -11.879],
|
||||
["184", -159.7871, -21.2195],
|
||||
["212", -61.3576, 15.4394],
|
||||
["234", -6.8808, 62.0527],
|
||||
["239", -36.4863, -54.4641],
|
||||
["248", 19.9528, 60.2153],
|
||||
["258", -144.8045, -14.7283],
|
||||
["296", -167.9217, 0.893],
|
||||
["308", -61.6818, 12.1174],
|
||||
["316", 144.767, 13.4406],
|
||||
["334", 73.52, -53.0872],
|
||||
["336", 12.4343, 41.9021],
|
||||
["344", 114.1143, 22.3983],
|
||||
["438", 9.5357, 47.1367],
|
||||
["446", 113.509, 22.2231],
|
||||
["462", 73.4573, 3.7316],
|
||||
["470", 14.405, 35.9215],
|
||||
["480", 57.5714, -20.2779],
|
||||
["492", 7.4073, 43.7526],
|
||||
["500", -62.1856, 16.7404],
|
||||
["520", 166.9326, -0.5189],
|
||||
["531", -68.9721, 12.1957],
|
||||
["533", -69.9827, 12.521],
|
||||
["534", -63.0572, 18.0509],
|
||||
["570", -169.8704, -19.0489],
|
||||
["574", 167.9497, -29.0516],
|
||||
["580", 145.6193, 15.8288],
|
||||
["583", 153.2966, 7.5361],
|
||||
["584", 170.3313, 7.015],
|
||||
["585", 134.4056, 7.286],
|
||||
["612", -128.3167, -24.3649],
|
||||
["652", -62.841, 17.8988],
|
||||
["654", -9.7009, -12.3548],
|
||||
["659", -62.6873, 17.2647],
|
||||
["660", -63.066, 18.2243],
|
||||
["662", -60.9696, 13.8946],
|
||||
["663", -63.0599, 18.0888],
|
||||
["666", -56.3037, 46.9187],
|
||||
["670", -61.2008, 13.2251],
|
||||
["674", 12.4594, 43.9415],
|
||||
["678", 6.7235, 0.4434],
|
||||
["690", 55.476, -4.6601],
|
||||
["702", 103.817, 1.359],
|
||||
["776", -174.7998, -20.4161],
|
||||
["796", -71.9734, 21.8312],
|
||||
["831", -2.5726, 49.4678],
|
||||
["832", -2.1272, 49.2181],
|
||||
["833", -4.5388, 54.224],
|
||||
["850", -64.8028, 17.9555],
|
||||
["876", -177.3469, -13.8898],
|
||||
["882", -172.1649, -13.7536],
|
||||
] as const
|
||||
|
||||
export const worldCountryMarkers = [
|
||||
...worldCountries.features.flatMap((country) => {
|
||||
const marker = geoCountryMarker(country)
|
||||
return marker ? [{ id: String(country.id ?? "").padStart(3, "0"), marker }] : []
|
||||
}),
|
||||
...fallbackCountryMarkerCoordinates.flatMap(([id, longitude, latitude]) => {
|
||||
const marker = worldProjection([longitude, latitude])
|
||||
return marker ? [{ id, marker: { x: marker[0], y: marker[1] } }] : []
|
||||
}),
|
||||
]
|
||||
@@ -2264,6 +2264,121 @@ body {
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-map-panel"] {
|
||||
position: relative;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
background: var(--stats-layer);
|
||||
border: 1px solid var(--stats-line);
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-component="geo-world-map"] {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-countries"] path {
|
||||
fill: var(--stats-layer-2);
|
||||
stroke: var(--stats-bg);
|
||||
stroke-width: 0.45px;
|
||||
transition:
|
||||
fill 140ms ease,
|
||||
opacity 140ms ease;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-countries"] path[data-has-data="true"] {
|
||||
fill: var(--stats-accent);
|
||||
opacity: var(--geo-country-opacity);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-countries"] path[data-active="true"] {
|
||||
fill: color-mix(in srgb, var(--stats-accent) 70%, var(--stats-text));
|
||||
opacity: var(--geo-country-opacity);
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-country-markers"] circle {
|
||||
fill: var(--stats-accent);
|
||||
stroke: var(--stats-bg);
|
||||
stroke-width: 1.1px;
|
||||
opacity: var(--geo-country-opacity);
|
||||
cursor: pointer;
|
||||
transition:
|
||||
fill 140ms ease,
|
||||
opacity 140ms ease,
|
||||
r 140ms ease;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-country-markers"] circle[data-active="true"] {
|
||||
fill: color-mix(in srgb, var(--stats-accent) 70%, var(--stats-text));
|
||||
opacity: var(--geo-country-opacity);
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-borders"] {
|
||||
fill: none;
|
||||
stroke: var(--stats-line-strong);
|
||||
stroke-linejoin: round;
|
||||
stroke-width: 0.6px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] {
|
||||
position: absolute;
|
||||
bottom: 16px;
|
||||
left: 16px;
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
min-width: 168px;
|
||||
max-width: calc(100% - 32px);
|
||||
box-sizing: border-box;
|
||||
padding: 12px;
|
||||
background: color-mix(in srgb, var(--stats-bg) 92%, transparent);
|
||||
box-shadow:
|
||||
0 0 0 0.5px var(--stats-line-strong),
|
||||
0 6px 16px #0000000d,
|
||||
0 2px 6px #0000000f;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] span,
|
||||
[data-page="stats"] [data-slot="geo-active-country"] em {
|
||||
color: var(--stats-faint);
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] span {
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] strong {
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
color: var(--stats-text);
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 1.2;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] p {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
color: var(--stats-muted);
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] b {
|
||||
color: var(--stats-accent-text);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-component="geo-country-list"] {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(min(100%, 212px), 1fr));
|
||||
@@ -8271,6 +8386,13 @@ body {
|
||||
height: 400px;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] {
|
||||
position: static;
|
||||
min-width: 0;
|
||||
max-width: none;
|
||||
margin: 0 12px 12px;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-component="geo-country-list"] button {
|
||||
grid-template-columns: 26px 8px minmax(0, 1fr) auto;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import { useI18n } from "../context/i18n"
|
||||
import { useLanguage } from "../context/language"
|
||||
import { localizedUrl } from "../lib/language"
|
||||
import { findModelCatalogEntry, loadModelCatalog, type ModelCatalog } from "./model-catalog"
|
||||
import { geoMapHeight, geoMapWidth, worldBorderPath, worldCountryMarkers, worldCountryPaths } from "./geo-map"
|
||||
import { SectionHeading } from "./section-heading"
|
||||
import { setStatsPageCacheHeaders } from "./stats-cache"
|
||||
import { ComparisonCardsSection, uniqueComparisonPairs, type ComparisonModelRef } from "./compare-cards"
|
||||
@@ -316,7 +317,7 @@ function ChartSection(props: {
|
||||
)
|
||||
}
|
||||
|
||||
function SectionTitle(props: { id: string; title: string; description?: string }) {
|
||||
function SectionTitle(props: { id: string; title: string; description: string }) {
|
||||
return <SectionHeading href={`#${props.id}`} title={props.title} description={props.description} />
|
||||
}
|
||||
|
||||
@@ -1073,9 +1074,20 @@ function MarketShareList(props: {
|
||||
|
||||
function GeoBreakdownSection(props: { data: CountryEntry[] }) {
|
||||
const i18n = useI18n()
|
||||
const language = useLanguage()
|
||||
const [activeCountry, setActiveCountry] = createSignal<string>()
|
||||
const countryById = createMemo(
|
||||
() =>
|
||||
new Map(
|
||||
props.data.flatMap((country) => {
|
||||
const id = countryNumericId(country.country)
|
||||
return id ? [[id, country] as const] : []
|
||||
}),
|
||||
),
|
||||
)
|
||||
const maxTokens = createMemo(() => Math.max(0, ...props.data.map((country) => country.tokens)) || 1)
|
||||
const topCountries = createMemo(() => props.data.slice(0, 15))
|
||||
const active = createMemo(() => props.data.find((country) => country.country === activeCountry()) ?? props.data[0])
|
||||
|
||||
return (
|
||||
<section
|
||||
@@ -1087,12 +1099,34 @@ function GeoBreakdownSection(props: { data: CountryEntry[] }) {
|
||||
}}
|
||||
>
|
||||
<SectionBridge label={i18n.t("nav.marketShare").toUpperCase()} href="#market-share" />
|
||||
<SectionTitle id="geo-breakdown" title={i18n.t("home.geoTitle")} />
|
||||
<SectionTitle id="geo-breakdown" title={i18n.t("home.geoTitle")} description={i18n.t("home.geoDescription")} />
|
||||
<Show
|
||||
when={props.data.length > 0}
|
||||
fallback={<EmptyState title={i18n.t("home.noGeoTitle")} description={i18n.t("home.noGeoDescription")} />}
|
||||
>
|
||||
<div data-component="geo-breakdown">
|
||||
<div data-slot="geo-map-panel">
|
||||
<GeoWorldMap
|
||||
countryById={countryById()}
|
||||
activeCountry={activeCountry()}
|
||||
maxTokens={maxTokens()}
|
||||
onActiveCountryChange={setActiveCountry}
|
||||
/>
|
||||
<Show when={active()}>
|
||||
{(country) => (
|
||||
<div data-slot="geo-active-country">
|
||||
<span>#{String(country().rank).padStart(2, "0")}</span>
|
||||
<strong>
|
||||
{formatCountryName(country().country, language.tag(language.locale()), i18n.t("home.unknown"))}
|
||||
</strong>
|
||||
<p>
|
||||
<b>{formatGeoTokens(country().tokens)}</b>
|
||||
<em>{formatGeoShare(country().share)}</em>
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</Show>
|
||||
</div>
|
||||
<GeoCountryList
|
||||
data={topCountries()}
|
||||
activeCountry={activeCountry()}
|
||||
@@ -1105,6 +1139,92 @@ function GeoBreakdownSection(props: { data: CountryEntry[] }) {
|
||||
)
|
||||
}
|
||||
|
||||
function GeoWorldMap(props: {
|
||||
countryById: Map<string, CountryEntry>
|
||||
activeCountry: string | undefined
|
||||
maxTokens: number
|
||||
onActiveCountryChange: (country: string | undefined) => void
|
||||
}) {
|
||||
const i18n = useI18n()
|
||||
const opacityScale = createMemo(() => scaleSqrt().domain([0, props.maxTokens]).range([0.26, 0.96]).clamp(true))
|
||||
const countryOpacity = (country: CountryEntry | undefined) => {
|
||||
if (!country || country.tokens <= 0) return 0
|
||||
const opacity = opacityScale()(country.tokens)
|
||||
if (props.activeCountry === country.country) return 1
|
||||
if (!props.activeCountry) return opacity
|
||||
return Math.max(0.18, opacity * 0.36)
|
||||
}
|
||||
|
||||
return (
|
||||
<svg
|
||||
data-component="geo-world-map"
|
||||
viewBox={`0 0 ${geoMapWidth} ${geoMapHeight}`}
|
||||
role="img"
|
||||
aria-label={i18n.t("home.worldMap")}
|
||||
>
|
||||
<title>{i18n.t("home.geoMapTitle")}</title>
|
||||
<g data-slot="geo-countries">
|
||||
<For each={worldCountryPaths}>
|
||||
{(country) => {
|
||||
const entry = () => props.countryById.get(country.id)
|
||||
return (
|
||||
<path
|
||||
d={country.path}
|
||||
data-country-id={country.id}
|
||||
data-has-data={entry() ? "true" : undefined}
|
||||
data-active={entry()?.country === props.activeCountry ? "true" : undefined}
|
||||
style={{ "--geo-country-opacity": String(countryOpacity(entry())) } as JSX.CSSProperties}
|
||||
aria-hidden="true"
|
||||
onPointerEnter={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
onClick={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
/>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
</g>
|
||||
<g data-slot="geo-country-markers">
|
||||
<For each={worldCountryMarkers}>
|
||||
{(country) => {
|
||||
const entry = () => props.countryById.get(country.id)
|
||||
return (
|
||||
<Show when={entry()}>
|
||||
<circle
|
||||
cx={country.marker.x}
|
||||
cy={country.marker.y}
|
||||
data-country-id={country.id}
|
||||
r={entry()?.country === props.activeCountry ? 3.4 : 2.4}
|
||||
data-active={entry()?.country === props.activeCountry ? "true" : undefined}
|
||||
style={{ "--geo-country-opacity": String(countryOpacity(entry())) } as JSX.CSSProperties}
|
||||
aria-hidden="true"
|
||||
onPointerEnter={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
onClick={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
/>
|
||||
</Show>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
</g>
|
||||
<path data-slot="geo-borders" d={worldBorderPath} aria-hidden="true" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
function GeoCountryList(props: {
|
||||
data: CountryEntry[]
|
||||
activeCountry: string | undefined
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
export function SectionHeading(props: {
|
||||
href: string
|
||||
title: string
|
||||
description?: string
|
||||
description: string
|
||||
as?: "h2" | "p"
|
||||
slot?: string
|
||||
}) {
|
||||
@@ -12,16 +12,10 @@ export function SectionHeading(props: {
|
||||
<span data-slot="heading-anchor" aria-hidden="true">
|
||||
#
|
||||
</span>
|
||||
{props.title}
|
||||
{props.description ? "." : ""}
|
||||
{props.title}.
|
||||
</a>
|
||||
</strong>
|
||||
{props.description && (
|
||||
<>
|
||||
{" "}
|
||||
<span>{props.description}</span>
|
||||
</>
|
||||
)}
|
||||
</strong>{" "}
|
||||
<span>{props.description}</span>
|
||||
</>
|
||||
)
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (لفترة محدودة)
|
||||
|
||||
قد تتغير قائمة النماذج مع استمرارنا في اختبار نماذج جديدة وإضافتها.
|
||||
|
||||
@@ -112,6 +113,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
تستند التقديرات إلى أنماط الطلبات المرصودة:
|
||||
|
||||
@@ -169,11 +171,14 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** ساعات Peak هي 01:00-04:00 و06:00-10:00 UTC من الاثنين إلى الجمعة؛ وجميع الساعات الأخرى، بما في ذلك عطلات نهاية الأسبوع، Off-Peak. [اعرف المزيد](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** يتم تحويل الصور إلى رموز بناءً على أبعادها، وتُحتسب كرموز إدخال إلى جانب رموز النص. [اعرف المزيد](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** مجاني لفترة محدودة.
|
||||
|
||||
يمكنك تتبّع استخدامك الحالي في **<a href={console}>console</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ OpenCode Go هو اشتراك منخفض التكلفة بقيمة **$10/شهر
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
يستخدم [model id](/docs/config/#models) في إعدادات OpenCode لديك التنسيق `opencode-go/<model-id>`. على سبيل المثال، بالنسبة إلى Kimi K3، ستستخدم `opencode-go/kimi-k3` في إعداداتك.
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | غير مستخدَمة | 0 أيام |
|
||||
| DeepSeek V4 Flash Vision Exp | غير مستخدَمة | 0 أيام |
|
||||
| Hy3 | غير مستخدَمة | 0 أيام |
|
||||
| Ox Alpha Free | غير مستخدَمة | 0 أيام |
|
||||
|
||||
- **Grok 4.6:** تعطّل ZDR ميزات API مهمة تعتمد على البيانات المخزنة، بما في ذلك Responses API ذات الحالة، وFiles and Collections، وBatch API. [اعرف المزيد](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** تُنشأ سجلات مراقبة إساءة الاستخدام لكل استخدام لميزات API، ويُحتفظ بها لمدة تصل إلى 30 يومًا. [اعرف المزيد](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -112,6 +112,7 @@ OpenCode Zen هي بوابة AI تتيح لك الوصول إلى هذه الن
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -139,6 +140,7 @@ https://opencode.ai/zen/v1/models
|
||||
| النموذج | الإدخال | الإخراج | القراءة المخزنة | الكتابة المخزنة |
|
||||
| --------------------------------- | ------- | ------- | --------------- | --------------- |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -229,6 +231,7 @@ https://opencode.ai/zen/v1/models
|
||||
- Nemotron 3 Ultra Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
|
||||
- Nemotron 3.5 Lightning Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
|
||||
- Big Pickle نموذج خفي ومتاح مجانا على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
|
||||
- Ox Alpha Free نموذج خفي ومتاح مجانا على OpenCode لفترة محدودة. يتبع مزوده سياسة عدم الاحتفاظ بالبيانات ولا يستخدم بياناتك لتدريب النماذج.
|
||||
- Muse Spark 1.2 Contributor Free متاح على OpenCode لفترة محدودة. يستخدم الفريق هذه الفترة لجمع الملاحظات وتحسين النموذج.
|
||||
|
||||
<a href={email}>تواصل معنا</a> إذا كانت لديك أي أسئلة.
|
||||
|
||||
@@ -81,6 +81,7 @@ Trenutna lista modela uključuje:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (ograničeno vrijeme)
|
||||
|
||||
Lista modela se može mijenjati dok testiramo i dodajemo nove.
|
||||
|
||||
@@ -122,6 +123,7 @@ Tabela ispod pruža procijenjeni broj zahtjeva na osnovu tipičnih obrazaca kori
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Procjene se zasnivaju na zapaženim obrascima zahtjeva:
|
||||
|
||||
@@ -179,11 +181,14 @@ Procjene se također zasnivaju na sljedećim cijenama po 1M tokena i mjesečnoj
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak sati su 01:00-04:00 i 06:00-10:00 UTC od ponedjeljka do petka; svi ostali sati, uključujući vikende, su Off-Peak. [Saznajte više](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Slike se pretvaraju u tokene na osnovu svojih dimenzija i naplaćuju kao ulazni tokeni zajedno s tekstualnim tokenima. [Saznajte više](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Besplatan ograničeno vrijeme.
|
||||
|
||||
Svoju trenutnu potrošnju možete pratiti u **<a href={console}>konzoli</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -243,6 +248,7 @@ Također možete pristupiti Go modelima putem sljedećih API endpointa.
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
[Model id](/docs/config/#models) u vašoj OpenCode konfiguraciji
|
||||
koristi format `opencode-go/<model-id>`. Na primjer, za Kimi K3, koristili biste
|
||||
@@ -286,6 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Ne koristi se | 0 dana |
|
||||
| DeepSeek V4 Flash Vision Exp | Ne koristi se | 0 dana |
|
||||
| Hy3 | Ne koristi se | 0 dana |
|
||||
| Ox Alpha Free | Ne koristi se | 0 dana |
|
||||
|
||||
- **Grok 4.6:** ZDR onemogućava važne API funkcije koje zavise od pohranjenih podataka, uključujući Responses API s očuvanjem stanja, Files and Collections i Batch API. [Saznajte više](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Zapisi o nadzoru zloupotrebe generišu se za svako korištenje API funkcija i čuvaju do 30 dana. [Saznajte više](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -117,6 +117,7 @@ Našim modelima možete pristupiti i preko sljedećih API endpointa.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ Podržavamo pay-as-you-go model. Ispod su cijene **po 1M tokena**.
|
||||
| Model | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ Besplatni modeli:
|
||||
- Nemotron 3 Ultra Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
|
||||
- Nemotron 3.5 Lightning Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
|
||||
- Big Pickle je stealth model koji je besplatan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
|
||||
- Ox Alpha Free je stealth model koji je besplatan na OpenCode ograničeno vrijeme. Pružalac usluge slijedi politiku nultog zadržavanja i ne koristi vaše podatke za treniranje modela.
|
||||
- Muse Spark 1.2 Contributor Free je dostupan na OpenCode ograničeno vrijeme. Tim koristi ovo vrijeme da prikupi povratne informacije i poboljša model.
|
||||
|
||||
<a href={email}>Kontaktirajte nas</a> ako imate bilo kakvih pitanja.
|
||||
|
||||
@@ -701,7 +701,6 @@ OpenCode can be configured using environment variables.
|
||||
| `OPENCODE_FAKE_VCS` | string | Fake VCS provider for testing purposes |
|
||||
| `OPENCODE_CLIENT` | string | Client identifier (defaults to `cli`) |
|
||||
| `OPENCODE_ENABLE_EXA` | boolean | Enable Exa web search tools |
|
||||
| `OPENCODE_ENABLE_PARALLEL` | boolean | Enable Parallel web search tools |
|
||||
| `OPENCODE_SERVER_PASSWORD` | string | Enable basic auth for `serve`/`web` |
|
||||
| `OPENCODE_SERVER_USERNAME` | string | Override basic auth username (default `opencode`) |
|
||||
| `OPENCODE_MODELS_URL` | string | Custom URL for fetching models configuration |
|
||||
|
||||
@@ -81,6 +81,7 @@ Den nuværende liste over modeller inkluderer:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (i en begrænset periode)
|
||||
|
||||
Listen over modeller kan ændre sig, efterhånden som vi tester og tilføjer nye.
|
||||
|
||||
@@ -122,6 +123,7 @@ Tabellen nedenfor giver et estimeret antal anmodninger baseret på typiske Go-fo
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Estimaterne er baseret på observerede anmodningsmønstre:
|
||||
|
||||
@@ -179,11 +181,14 @@ Estimaterne er også baseret på følgende priser pr. 1M tokens og det månedlig
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak-tiderne er 01:00-04:00 og 06:00-10:00 UTC fra mandag til fredag; alle andre tider, herunder weekender, er Off-Peak. [Læs mere](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Billeder konverteres til tokens baseret på deres dimensioner og afregnes som inputtokens sammen med teksttokens. [Læs mere](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Gratis i en begrænset periode.
|
||||
|
||||
Du kan spore dit nuværende forbrug i **<a href={console}>konsollen</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -243,6 +248,7 @@ Du kan også få adgang til Go-modeller gennem følgende API-endpoints.
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
Dit [model id](/docs/config/#models) i din OpenCode config
|
||||
bruger formatet `opencode-go/<model-id>`. For eksempel for Kimi K3, vil du
|
||||
@@ -286,6 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Ikke brugt | 0 dage |
|
||||
| DeepSeek V4 Flash Vision Exp | Ikke brugt | 0 dage |
|
||||
| Hy3 | Ikke brugt | 0 dage |
|
||||
| Ox Alpha Free | Ikke brugt | 0 dage |
|
||||
|
||||
- **Grok 4.6:** ZDR deaktiverer vigtige API-funktioner, der afhænger af lagrede data, herunder den tilstandsbevarende Responses API, Files and Collections og Batch API. [Læs mere](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Logfiler til overvågning af misbrug genereres ved al brug af API-funktioner og opbevares i op til 30 dage. [Læs mere](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -117,6 +117,7 @@ Du kan også få adgang til vores modeller gennem følgende API-endpoints.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ Vi understøtter en pay-as-you-go-model. Nedenfor er priserne **pr. 1M tokens**.
|
||||
| Model | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ De gratis modeller:
|
||||
- Nemotron 3 Ultra Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
|
||||
- Nemotron 3.5 Lightning Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
|
||||
- Big Pickle er en stealth-model, som er gratis på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
|
||||
- Ox Alpha Free er en stealth-model, som er gratis på OpenCode i en begrænset periode. Udbyderen følger en nul-opbevaringspolitik og bruger ikke dine data til at træne modeller.
|
||||
- Muse Spark 1.2 Contributor Free er tilgængelig på OpenCode i en begrænset periode. Teamet bruger denne tid til at indsamle feedback og forbedre modellen.
|
||||
|
||||
<a href={email}>Kontakt os</a>, hvis du har spørgsmål.
|
||||
|
||||
@@ -73,6 +73,7 @@ Die aktuelle Liste der Modelle umfasst:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (für begrenzte Zeit)
|
||||
|
||||
Die Liste der Modelle kann sich ändern, während wir neue testen und hinzufügen.
|
||||
|
||||
@@ -114,6 +115,7 @@ Die folgende Tabelle zeigt eine geschätzte Anzahl von Anfragen basierend auf ty
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Die Schätzungen basieren auf beobachteten Anfragemustern:
|
||||
|
||||
@@ -171,11 +173,14 @@ Die Schätzungen basieren außerdem auf den folgenden Preisen pro 1M Tokens und
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Die Peak-Zeiten sind montags bis freitags von 01:00-04:00 und 06:00-10:00 UTC; alle anderen Zeiten, einschließlich der Wochenenden, sind Off-Peak. [Mehr erfahren](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Bilder werden anhand ihrer Abmessungen in Tokens umgewandelt und zusammen mit Text-Tokens als Input-Tokens abgerechnet. [Mehr erfahren](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Für begrenzte Zeit kostenlos.
|
||||
|
||||
Du kannst deine aktuelle Nutzung in der **<a href={console}>Console</a>** verfolgen.
|
||||
|
||||
:::tip
|
||||
@@ -233,6 +238,7 @@ Du kannst auf die Go-Modelle auch über die folgenden API-Endpunkte zugreifen.
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
Die [Modell-ID](/docs/config/#models) in deiner OpenCode Config verwendet das Format `opencode-go/<model-id>`. Für Kimi K3 würdest du beispielsweise `opencode-go/kimi-k3` in deiner Config verwenden.
|
||||
|
||||
@@ -274,6 +280,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Nicht verwendet | 0 Tage |
|
||||
| DeepSeek V4 Flash Vision Exp | Nicht verwendet | 0 Tage |
|
||||
| Hy3 | Nicht verwendet | 0 Tage |
|
||||
| Ox Alpha Free | Nicht verwendet | 0 Tage |
|
||||
|
||||
- **Grok 4.6:** ZDR deaktiviert wichtige API-Funktionen, die von gespeicherten Daten abhängen, einschließlich der zustandsbehafteten Responses API, Files and Collections und der Batch API. [Mehr erfahren](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Für die Nutzung aller API-Funktionen werden Protokolle zur Missbrauchsüberwachung erstellt und bis zu 30 Tage lang aufbewahrt. [Mehr erfahren](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -108,6 +108,7 @@ Du kannst auch über die folgenden API-Endpunkte auf unsere Modelle zugreifen.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -135,6 +136,7 @@ Wir unterstützen ein Pay-as-you-go-Modell. Unten findest du die Preise **pro 1M
|
||||
| Model | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -225,6 +227,7 @@ Die kostenlosen Modelle:
|
||||
- Nemotron 3 Ultra Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
|
||||
- Nemotron 3.5 Lightning Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
|
||||
- Big Pickle ist ein Stealth-Modell, das für begrenzte Zeit kostenlos auf OpenCode verfügbar ist. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
|
||||
- Ox Alpha Free ist ein Stealth-Modell, das für begrenzte Zeit kostenlos auf OpenCode verfügbar ist. Der Anbieter befolgt eine Zero-Retention-Richtlinie und verwendet deine Daten nicht zum Trainieren von Modellen.
|
||||
- Muse Spark 1.2 Contributor Free ist für begrenzte Zeit auf OpenCode verfügbar. Das Team nutzt diese Zeit, um Feedback zu sammeln und das Modell zu verbessern.
|
||||
|
||||
<a href={email}>Kontaktiere uns</a>, wenn du Fragen hast.
|
||||
|
||||
@@ -81,6 +81,7 @@ La lista actual de modelos incluye:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (por tiempo limitado)
|
||||
|
||||
La lista de modelos puede cambiar a medida que probamos y agregamos otros nuevos.
|
||||
|
||||
@@ -122,6 +123,7 @@ La siguiente tabla proporciona una cantidad estimada de peticiones basada en los
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Las estimaciones se basan en los patrones de peticiones observados:
|
||||
|
||||
@@ -179,11 +181,14 @@ Las estimaciones también se basan en los siguientes precios por 1M tokens y en
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Las horas Peak son 01:00-04:00 y 06:00-10:00 UTC, de lunes a viernes; todas las demás horas, incluidos los fines de semana, son Off-Peak. [Más información](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Las imágenes se convierten en tokens según sus dimensiones y se facturan como tokens de entrada junto con los tokens de texto. [Más información](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Gratis por tiempo limitado.
|
||||
|
||||
Puedes realizar un seguimiento de tu uso actual en la **<a href={console}>consola</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -243,6 +248,7 @@ También puedes acceder a los modelos de Go a través de los siguientes endpoint
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
El [ID del modelo](/docs/config/#models) en tu configuración de OpenCode
|
||||
usa el formato `opencode-go/<model-id>`. Por ejemplo, para Kimi K3, usarías
|
||||
@@ -286,6 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | No utilizado | 0 días |
|
||||
| DeepSeek V4 Flash Vision Exp | No utilizado | 0 días |
|
||||
| Hy3 | No utilizado | 0 días |
|
||||
| Ox Alpha Free | No utilizado | 0 días |
|
||||
|
||||
- **Grok 4.6:** ZDR deshabilita funciones importantes de la API que dependen de datos almacenados, incluidas la Responses API con estado, Files and Collections y la Batch API. [Más información](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Se generan registros de supervisión de abusos para todo el uso de funciones de la API y se conservan durante un máximo de 30 días. [Más información](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -117,6 +117,7 @@ También puedes acceder a nuestros modelos a través de los siguientes endpoints
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ Admitimos un modelo de pago por uso. A continuación se muestran los precios **p
|
||||
| Modelo | Entrada | Salida | Lectura en caché | Escritura en caché |
|
||||
| --------------------------------- | ------- | ------- | ---------------- | ------------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ Los modelos gratuitos:
|
||||
- Nemotron 3 Ultra Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
|
||||
- Nemotron 3.5 Lightning Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
|
||||
- Big Pickle es un modelo stealth que es gratuito en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo.
|
||||
- Ox Alpha Free es un modelo stealth que es gratuito en OpenCode por tiempo limitado. Su proveedor sigue una política de retención cero y no utiliza tus datos para entrenar modelos.
|
||||
- Muse Spark 1.2 Contributor Free está disponible en OpenCode por tiempo limitado. El equipo está aprovechando este período para recopilar comentarios y mejorar el modelo.
|
||||
|
||||
<a href={email}>Contáctanos</a> si tienes alguna pregunta.
|
||||
|
||||
@@ -71,6 +71,7 @@ La liste actuelle des modèles comprend :
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (pour une durée limitée)
|
||||
|
||||
La liste des modèles peut changer au fur et à mesure que nous en testons et en ajoutons de nouveaux.
|
||||
|
||||
@@ -112,6 +113,7 @@ Le tableau ci-dessous fournit une estimation du nombre de requêtes basée sur d
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Les estimations sont basées sur les schémas de requêtes observés :
|
||||
|
||||
@@ -169,11 +171,14 @@ Les estimations sont également basées sur les prix suivants par 1M tokens et s
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Les heures Peak sont 01:00-04:00 et 06:00-10:00 UTC, du lundi au vendredi ; toutes les autres heures, y compris le week-end, sont Off-Peak. [En savoir plus](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Les images sont converties en tokens selon leurs dimensions et facturées comme tokens d’entrée avec les tokens de texte. [En savoir plus](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Gratuit pour une durée limitée.
|
||||
|
||||
Vous pouvez suivre votre utilisation actuelle dans la **<a href={console}>console</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ Vous pouvez également accéder aux modèles Go via les points de terminaison d'
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
L'[ID de modèle](/docs/config/#models) dans votre configuration OpenCode utilise le format `opencode-go/<model-id>`. Par exemple, pour Kimi K3, vous utiliseriez `opencode-go/kimi-k3` dans votre configuration.
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Non utilisé | 0 jour |
|
||||
| DeepSeek V4 Flash Vision Exp | Non utilisé | 0 jour |
|
||||
| Hy3 | Non utilisé | 0 jour |
|
||||
| Ox Alpha Free | Non utilisé | 0 jour |
|
||||
|
||||
- **Grok 4.6:** Le ZDR désactive d’importantes fonctionnalités API qui dépendent des données stockées, notamment Responses API avec état, Files and Collections et Batch API. [En savoir plus](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Des journaux de surveillance des abus sont générés pour toute utilisation des fonctionnalités API et conservés pendant un maximum de 30 jours. [En savoir plus](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -108,6 +108,7 @@ Vous pouvez également accéder à nos modèles via les points de terminaison AP
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -135,6 +136,7 @@ Nous prenons en charge un modèle de paiement à l'utilisation. Vous trouverez c
|
||||
| Modèle | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -225,6 +227,7 @@ Les modèles gratuits :
|
||||
- Nemotron 3 Ultra Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
|
||||
- Nemotron 3.5 Lightning Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
|
||||
- Big Pickle est un modèle stealth gratuit sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
|
||||
- Ox Alpha Free est un modèle stealth gratuit sur OpenCode pour une durée limitée. Son fournisseur applique une politique de conservation nulle et n'utilise pas vos données pour entraîner des modèles.
|
||||
- Muse Spark 1.2 Contributor Free est disponible sur OpenCode pour une durée limitée. L'équipe utilise cette période pour recueillir des retours et améliorer le modèle.
|
||||
|
||||
<a href={email}>Contactez-nous</a> si vous avez des questions.
|
||||
|
||||
@@ -81,6 +81,7 @@ The current list of models includes:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (limited time)
|
||||
|
||||
The list of models may change as we test and add new ones.
|
||||
|
||||
@@ -122,6 +123,7 @@ The table below provides an estimated request count based on typical Go usage pa
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
The estimates are based on observed request patterns:
|
||||
|
||||
@@ -179,11 +181,14 @@ The estimates are also based on the following prices per 1M tokens and the month
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak hours are 01:00-04:00 and 06:00-10:00 UTC, Monday through Friday; all other hours, including weekends, are Off-Peak. [Learn more](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Images are converted into tokens based on their dimensions and billed as input tokens alongside text tokens. [Learn more](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Free for a limited time.
|
||||
|
||||
You can track your current usage in the **<a href={console}>console</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -243,6 +248,7 @@ You can also access Go models through the following API endpoints.
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
The [model id](/docs/config/#models) in your OpenCode config
|
||||
uses the format `opencode-go/<model-id>`. For example, for Kimi K3, you would
|
||||
@@ -286,6 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Not used | 0 days\* |
|
||||
| DeepSeek V4 Flash Vision Exp | Not used | 0 days\* |
|
||||
| Hy3 | Not used | 0 days |
|
||||
| Ox Alpha Free | Not used | 0 days |
|
||||
|
||||
- **Grok 4.6:** ZDR disables important API features that depend on stored data, including the stateful Responses API, Files and Collections, and the Batch API. [Learn more](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Abuse monitoring logs are generated for all API feature usage and retained for up to 30 days. [Learn more](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -79,6 +79,7 @@ L'elenco attuale dei modelli include:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (per un periodo limitato)
|
||||
|
||||
L'elenco dei modelli potrebbe cambiare man mano che ne testiamo e aggiungiamo di nuovi.
|
||||
|
||||
@@ -120,6 +121,7 @@ La tabella seguente fornisce una stima del conteggio delle richieste in base a p
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Le stime si basano sui pattern di richieste osservati:
|
||||
|
||||
@@ -177,11 +179,14 @@ Le stime si basano anche sui seguenti prezzi per 1M token e sull'utilizzo mensil
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Gli orari Peak sono 01:00-04:00 e 06:00-10:00 UTC, dal lunedì al venerdì; tutti gli altri orari, inclusi i fine settimana, sono Off-Peak. [Scopri di più](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Le immagini vengono convertite in token in base alle loro dimensioni e fatturate come token di input insieme ai token di testo. [Scopri di più](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Gratis per un periodo limitato.
|
||||
|
||||
Puoi monitorare il tuo utilizzo attuale nella **<a href={console}>console</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -241,6 +246,7 @@ Puoi anche accedere ai modelli Go tramite i seguenti endpoint API.
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
Il [model id](/docs/config/#models) nella tua OpenCode config
|
||||
utilizza il formato `opencode-go/<model-id>`. Ad esempio, per Kimi K3, useresti
|
||||
@@ -284,6 +290,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Non utilizzato | 0 giorni |
|
||||
| DeepSeek V4 Flash Vision Exp | Non utilizzato | 0 giorni |
|
||||
| Hy3 | Non utilizzato | 0 giorni |
|
||||
| Ox Alpha Free | Non utilizzato | 0 giorni |
|
||||
|
||||
- **Grok 4.6:** ZDR disabilita importanti funzionalità API che dipendono dai dati archiviati, tra cui la Responses API con stato, Files and Collections e Batch API. [Scopri di più](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** I log di monitoraggio degli abusi vengono generati per l'utilizzo di tutte le funzionalità API e conservati per un massimo di 30 giorni. [Scopri di più](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -117,6 +117,7 @@ Puoi anche accedere ai nostri modelli tramite i seguenti endpoint API.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ Supportiamo un modello pay-as-you-go. Qui sotto trovi i prezzi **per 1M token**.
|
||||
| Modello | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ I modelli gratuiti:
|
||||
- Nemotron 3 Ultra Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
|
||||
- Nemotron 3.5 Lightning Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
|
||||
- Big Pickle è un modello stealth che è gratuito su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
|
||||
- Ox Alpha Free è un modello stealth gratuito su OpenCode per un periodo limitato. Il suo provider segue una politica di conservazione zero e non usa i tuoi dati per addestrare modelli.
|
||||
- Muse Spark 1.2 Contributor Free è disponibile su OpenCode per un periodo limitato. Il team usa questo periodo per raccogliere feedback e migliorare il modello.
|
||||
|
||||
<a href={email}>Contattaci</a> se hai domande.
|
||||
|
||||
@@ -71,6 +71,7 @@ OpenCode Goをサブスクライブできるのは、1つのワークスペー
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (期間限定)
|
||||
|
||||
新しいモデルをテストして追加するにつれて、モデルのリストは変更される場合があります。
|
||||
|
||||
@@ -112,6 +113,7 @@ OpenCode Goには以下の制限が含まれています:
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
推定値は、観測されたリクエストパターンに基づいています:
|
||||
|
||||
@@ -169,11 +171,14 @@ OpenCode Goには以下の制限が含まれています:
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak時間は月曜日から金曜日の01:00-04:00と06:00-10:00 UTCで、週末を含むそれ以外の時間はすべてOff-Peakです。[詳しく見る](https://api-docs.deepseek.com/quick_start/pricing/)。
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** 画像はサイズに基づいてトークンに変換され、テキストトークンと合わせて入力トークンとして課金されます。 [詳しく見る](https://api-docs.deepseek.com/quick_start/pricing/)。
|
||||
|
||||
**Ox Alpha Free:** 期間限定で無料です。
|
||||
|
||||
現在の利用状況は**<a href={console}>コンソール</a>**で追跡できます。
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ Goでは月額$10を支払い、その6倍の利用枠を提供することを
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
OpenCode設定の[model id](/docs/config/#models)は、`opencode-go/<model-id>`という形式を使用します。たとえば、Kimi K3の場合は、設定で`opencode-go/kimi-k3`を使用します。
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | 使用なし | 0日 |
|
||||
| DeepSeek V4 Flash Vision Exp | 使用なし | 0日 |
|
||||
| Hy3 | 使用なし | 0日 |
|
||||
| Ox Alpha Free | 使用なし | 0日 |
|
||||
|
||||
- **Grok 4.6:** ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。[詳しく見る](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **GPT 5.6 Luna:** 不正使用監視ログはすべてのAPI機能の使用時に生成され、最大30日間保持されます。[詳しく見る](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
|
||||
|
||||
@@ -108,6 +108,7 @@ OpenCode Zen は、OpenCode のほかのプロバイダーと同じように動
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -135,6 +136,7 @@ https://opencode.ai/zen/v1/models
|
||||
| Model | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -225,6 +227,7 @@ https://opencode.ai/zen/v1/models
|
||||
- Nemotron 3 Ultra Free は期間限定で OpenCode で利用できます。チームはこの期間中にフィードバックを集め、モデルを改善しています。
|
||||
- Nemotron 3.5 Lightning Free は期間限定で OpenCode で利用できます。チームはこの期間中にフィードバックを集め、モデルを改善しています。
|
||||
- Big Pickle はステルスモデルで、期間限定で OpenCode で無料提供されています。チームはこの期間中にフィードバックを集め、モデルを改善しています。
|
||||
- Ox Alpha Free はステルスモデルで、期間限定で OpenCode で無料提供されています。プロバイダーはゼロ保持ポリシーに従い、データをモデルのトレーニングに使用しません。
|
||||
- Muse Spark 1.2 Contributor Free は期間限定で OpenCode で利用できます。チームはこの期間を活用してフィードバックを収集し、モデルを改善しています。
|
||||
|
||||
ご不明な点があれば、<a href={email}>お問い合わせください</a>。
|
||||
|
||||
@@ -71,6 +71,7 @@ workspace당 한 명의 멤버만 OpenCode Go를 구독할 수 있습니다.
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (한정된 기간)
|
||||
|
||||
새로운 모델을 테스트하고 추가함에 따라 이 목록은 변경될 수 있습니다.
|
||||
|
||||
@@ -112,6 +113,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
이 예상치는 관찰된 요청 패턴을 기준으로 합니다.
|
||||
|
||||
@@ -169,11 +171,14 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다.
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak 시간은 월요일부터 금요일까지 01:00-04:00 및 06:00-10:00 UTC이며, 주말을 포함한 그 외 모든 시간은 Off-Peak입니다. [자세히 알아보기](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** 이미지는 크기에 따라 토큰으로 변환되며 텍스트 토큰과 함께 입력 토큰으로 청구됩니다. [자세히 알아보기](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** 한정된 기간 동안 무료입니다.
|
||||
|
||||
현재 사용량은 **<a href={console}>console</a>**에서 확인할 수 있습니다.
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ Go에서는 월 $10를 지불하며, 저희는 그 6배의 사용량을 제공
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
OpenCode config의 [model id](/docs/config/#models)는 `opencode-go/<model-id>` 형식을 사용합니다. 예를 들어 Kimi K3의 경우 config에서 `opencode-go/kimi-k3`를 사용하면 됩니다.
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | 사용되지 않음 | 0일 |
|
||||
| DeepSeek V4 Flash Vision Exp | 사용되지 않음 | 0일 |
|
||||
| Hy3 | 사용되지 않음 | 0일 |
|
||||
| Ox Alpha Free | 사용되지 않음 | 0일 |
|
||||
|
||||
- **Grok 4.6:** ZDR은 저장된 데이터에 의존하는 중요한 API 기능(상태 저장형 Responses API, Files and Collections, Batch API 포함)을 비활성화합니다. [자세히 알아보기](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** 모든 API 기능 사용에 대해 악용 모니터링 로그가 생성되며 최대 30일 동안 보존됩니다. [자세히 알아보기](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -108,6 +108,7 @@ OpenCode Zen은 OpenCode의 다른 provider와 똑같이 작동합니다.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -135,6 +136,7 @@ https://opencode.ai/zen/v1/models
|
||||
| 모델 | 입력 | 출력 | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -225,6 +227,7 @@ https://opencode.ai/zen/v1/models
|
||||
- Nemotron 3 Ultra Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
|
||||
- Nemotron 3.5 Lightning Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
|
||||
- Big Pickle은 한정된 기간 동안 OpenCode에서 무료로 제공되는 stealth model입니다. 팀은 이 기간에 피드백을 수집하고 모델을 개선합니다.
|
||||
- Ox Alpha Free는 한정된 기간 동안 OpenCode에서 무료로 제공되는 stealth model입니다. 제공업체는 데이터 미보관 정책을 따르며 사용자의 데이터를 모델 학습에 사용하지 않습니다.
|
||||
- Muse Spark 1.2 Contributor Free는 한정된 기간 동안 OpenCode에서 제공됩니다. 팀은 이 기간을 활용해 피드백을 수집하고 모델을 개선하고 있습니다.
|
||||
|
||||
궁금한 점이 있으면 <a href={email}>Contact us</a>로 문의해 주세요.
|
||||
|
||||
@@ -81,6 +81,7 @@ Den nåværende listen over modeller inkluderer:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (i en begrenset periode)
|
||||
|
||||
Listen over modeller kan endres etter hvert som vi tester og legger til nye.
|
||||
|
||||
@@ -122,6 +123,7 @@ Tabellen nedenfor gir et estimert antall forespørsler basert på typiske bruksm
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Estimatene er basert på observerte forespørselsmønstre:
|
||||
|
||||
@@ -179,11 +181,14 @@ Estimatene er også basert på følgende priser per 1M tokens og den månedlige
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak-tidene er 01:00-04:00 og 06:00-10:00 UTC fra mandag til fredag; alle andre tider, inkludert helger, er Off-Peak. [Les mer](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Bilder konverteres til tokens basert på dimensjonene og faktureres som input-tokens sammen med tekst-tokens. [Les mer](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Gratis i en begrenset periode.
|
||||
|
||||
Du kan spore din nåværende bruk i **<a href={console}>konsollen</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -243,6 +248,7 @@ Du kan også få tilgang til Go-modeller gjennom følgende API-endepunkter.
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
[Modell-ID-en](/docs/config/#models) i din OpenCode-konfigurasjon
|
||||
bruker formatet `opencode-go/<model-id>`. For eksempel, for Kimi K3, vil du
|
||||
@@ -286,6 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Brukes ikke | 0 dager |
|
||||
| DeepSeek V4 Flash Vision Exp | Brukes ikke | 0 dager |
|
||||
| Hy3 | Brukes ikke | 0 dager |
|
||||
| Ox Alpha Free | Brukes ikke | 0 dager |
|
||||
|
||||
- **Grok 4.6:** ZDR deaktiverer viktige API-funksjoner som er avhengige av lagrede data, inkludert den tilstandsbaserte Responses API, Files and Collections og Batch API. [Les mer](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Logger for overvåking av misbruk genereres for all bruk av API-funksjoner og oppbevares i opptil 30 dager. [Les mer](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -117,6 +117,7 @@ Du kan også få tilgang til modellene våre gjennom følgende API-endepunkter.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ Vi støtter en pay-as-you-go-modell. Nedenfor er prisene **per 1M tokens**.
|
||||
| Modell | Inndata | Utdata | Bufret lesing | Bufret skriving |
|
||||
| --------------------------------- | ------- | ------- | ------------- | --------------- |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ Gratis-modellene:
|
||||
- Nemotron 3 Ultra Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
|
||||
- Nemotron 3.5 Lightning Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
|
||||
- Big Pickle er en stealth-modell som er gratis på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
|
||||
- Ox Alpha Free er en stealth-modell som er gratis på OpenCode i en begrenset periode. Leverandøren følger en nulloppbevaringspolicy og bruker ikke dataene dine til å trene modeller.
|
||||
- Muse Spark 1.2 Contributor Free er tilgjengelig på OpenCode i en begrenset periode. Teamet bruker denne tiden til å samle inn tilbakemeldinger og forbedre modellen.
|
||||
|
||||
<a href={email}>Kontakt oss</a> hvis du har spørsmål.
|
||||
|
||||
@@ -75,6 +75,7 @@ Obecna lista modeli obejmuje:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (przez ograniczony czas)
|
||||
|
||||
Lista modeli może ulec zmianie w miarę testowania i dodawania nowych.
|
||||
|
||||
@@ -116,6 +117,7 @@ Poniższa tabela przedstawia szacunkową liczbę żądań na podstawie typowych
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Szacunki te opierają się na zaobserwowanych wzorcach żądań:
|
||||
|
||||
@@ -173,11 +175,14 @@ Szacunki opierają się również na następujących cenach za 1M tokenów oraz
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Godziny Peak to 01:00-04:00 i 06:00-10:00 UTC od poniedziałku do piątku; wszystkie pozostałe godziny, w tym weekendy, to Off-Peak. [Dowiedz się więcej](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Obrazy są przeliczane na tokeny na podstawie ich wymiarów i rozliczane jako tokeny wejściowe razem z tokenami tekstowymi. [Dowiedz się więcej](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Bezpłatny przez ograniczony czas.
|
||||
|
||||
Możesz śledzić swoje bieżące zużycie w **<a href={console}>konsoli</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -235,6 +240,7 @@ Możesz również uzyskać dostęp do modeli Go za pośrednictwem następującyc
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
[ID modelu](/docs/config/#models) w Twojej konfiguracji OpenCode
|
||||
używa formatu `opencode-go/<model-id>`. Na przykład dla Kimi K3 należy użyć
|
||||
@@ -278,6 +284,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Niewykorzystywane | 0 dni |
|
||||
| DeepSeek V4 Flash Vision Exp | Niewykorzystywane | 0 dni |
|
||||
| Hy3 | Niewykorzystywane | 0 dni |
|
||||
| Ox Alpha Free | Niewykorzystywane | 0 dni |
|
||||
|
||||
- **Grok 4.6:** ZDR wyłącza ważne funkcje API zależne od przechowywanych danych, w tym stanowy Responses API, Files and Collections oraz Batch API. [Dowiedz się więcej](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Dzienniki monitorowania nadużyć są generowane dla każdego użycia funkcji API i przechowywane przez maksymalnie 30 dni. [Dowiedz się więcej](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -117,6 +117,7 @@ Możesz też uzyskać dostęp do naszych modeli przez poniższe endpointy API.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ Obsługujemy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów*
|
||||
| Model | Wejście | Wyjście | Odczyt z cache | Zapis do cache |
|
||||
| --------------------------------- | ------- | ------- | -------------- | -------------- |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ Darmowe modele:
|
||||
- Nemotron 3 Ultra Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
|
||||
- Nemotron 3.5 Lightning Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
|
||||
- Big Pickle to stealth model, który jest darmowy w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
|
||||
- Ox Alpha Free to stealth model, który jest darmowy w OpenCode przez ograniczony czas. Dostawca stosuje zasadę zerowego przechowywania i nie używa twoich danych do trenowania modeli.
|
||||
- Muse Spark 1.2 Contributor Free jest dostępny w OpenCode przez ograniczony czas. Zespół wykorzystuje ten czas do zbierania opinii i ulepszania modelu.
|
||||
|
||||
<a href={email}>Skontaktuj się z nami</a>, jeśli masz pytania.
|
||||
|
||||
@@ -457,6 +457,39 @@ If you encounter "I'm sorry, but I cannot assist with that request" errors, try
|
||||
/models
|
||||
```
|
||||
|
||||
#### Microsoft Entra ID (Azure CLI)
|
||||
|
||||
You can use your Azure CLI session instead of an API key. [Install the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli), run `az login`, then run `/connect`, select **Azure**, and choose **Microsoft Entra ID (Azure CLI)**. OpenCode lists the Resources visible to your Azure CLI session and their Resource groups. Select a Resource, or choose **Enter another resource name** to enter one manually. If resource listing is unavailable, OpenCode asks for the name directly. Use `az login --tenant TENANT_ID` if the Resource belongs to a different tenant.
|
||||
|
||||
Find the Resource name by opening your Azure OpenAI or Foundry Resource in the [Azure portal](https://portal.azure.com/) or [Microsoft Foundry](https://ai.azure.com/). It is also the first part of the endpoint: `my-models` in `https://my-models.openai.azure.com/` or `https://my-models.services.ai.azure.com/`. If your identity can list Resources, you can also find their names and Resource groups with:
|
||||
|
||||
```bash
|
||||
az cognitiveservices account list \
|
||||
--query "[].{name:name,resourceGroup:resourceGroup}" \
|
||||
--output table
|
||||
```
|
||||
|
||||
OpenCode finds the Resource group and discovers its deployed models from the active Azure CLI subscription. Run `az account set --subscription NAME_OR_ID` first if the Resource is in a different subscription. Set `AZURE_RESOURCE_GROUP` to skip listing the subscription and query a known Resource directly.
|
||||
|
||||
Model discovery requires Azure control-plane permissions, which are separate from inference permissions. If your identity cannot list deployments, OpenCode keeps the Azure model catalog available instead. Select a model whose name matches your deployment, or configure its deployment name explicitly:
|
||||
|
||||
```json title="opencode.json"
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"provider": {
|
||||
"azure": {
|
||||
"models": {
|
||||
"gpt-5-mini": {
|
||||
"id": "gpt-production"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Assign your identity the inference role required by the deployment: **Cognitive Services OpenAI User** for Azure OpenAI models or **Cognitive Services User** for other Foundry models. OpenCode refreshes access tokens through the Azure CLI, including versions earlier than 2.54.0, so you only need to sign in again when the CLI session expires.
|
||||
|
||||
---
|
||||
|
||||
### Azure Cognitive Services
|
||||
|
||||
@@ -81,6 +81,7 @@ A lista atual de modelos inclui:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (por tempo limitado)
|
||||
|
||||
A lista de modelos pode mudar conforme testamos e adicionamos novos.
|
||||
|
||||
@@ -122,6 +123,7 @@ A tabela abaixo fornece uma contagem estimada de requisições com base nos padr
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
As estimativas se baseiam nos padrões de requisições observados:
|
||||
|
||||
@@ -179,11 +181,14 @@ As estimativas também se baseiam nos seguintes preços por 1M tokens e no uso m
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Os horários Peak são 01:00-04:00 e 06:00-10:00 UTC, de segunda a sexta-feira; todos os demais horários, incluindo os fins de semana, são Off-Peak. [Saiba mais](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** As imagens são convertidas em tokens com base em suas dimensões e cobradas como tokens de entrada junto com os tokens de texto. [Saiba mais](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Gratuito por tempo limitado.
|
||||
|
||||
Você pode acompanhar o seu uso atual no **<a href={console}>console</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -243,6 +248,7 @@ Você também pode acessar os modelos do Go através dos seguintes endpoints de
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
O [ID do modelo](/docs/config/#models) na sua configuração do OpenCode
|
||||
usa o formato `opencode-go/<model-id>`. Por exemplo, para o Kimi K3, você usaria
|
||||
@@ -286,6 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Não usado | 0 dias |
|
||||
| DeepSeek V4 Flash Vision Exp | Não usado | 0 dias |
|
||||
| Hy3 | Não usado | 0 dias |
|
||||
| Ox Alpha Free | Não usado | 0 dias |
|
||||
|
||||
- **Grok 4.6:** O ZDR desativa recursos importantes da API que dependem de dados armazenados, incluindo a Responses API com estado, Files and Collections e a Batch API. [Saiba mais](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Logs de monitoramento de abuso são gerados para todo uso de recursos da API e retidos por até 30 dias. [Saiba mais](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -108,6 +108,7 @@ Você também pode acessar nossos modelos pelos seguintes endpoints de API.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -135,6 +136,7 @@ Oferecemos um modelo pay-as-you-go. Abaixo estão os preços **por 1M tokens**.
|
||||
| Modelo | Entrada | Saída | Leitura em cache | Escrita em cache |
|
||||
| --------------------------------- | ------- | ------- | ---------------- | ---------------- |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -225,6 +227,7 @@ Os modelos gratuitos:
|
||||
- Nemotron 3 Ultra Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
|
||||
- Nemotron 3.5 Lightning Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
|
||||
- Big Pickle é um modelo stealth que está gratuito no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
|
||||
- Ox Alpha Free é um modelo stealth gratuito no OpenCode por tempo limitado. Seu provedor segue uma política de retenção zero e não usa seus dados para treinar modelos.
|
||||
- Muse Spark 1.2 Contributor Free está disponível no OpenCode por tempo limitado. A equipe está usando esse período para coletar feedback e melhorar o modelo.
|
||||
|
||||
<a href={email}>Entre em contato</a> se você tiver alguma dúvida.
|
||||
|
||||
@@ -81,6 +81,7 @@ OpenCode Go работает так же, как и любой другой пр
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (ограниченное время)
|
||||
|
||||
Список моделей может меняться по мере того, как мы тестируем и добавляем новые.
|
||||
|
||||
@@ -122,6 +123,7 @@ OpenCode Go включает следующие лимиты:
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Эти оценки основаны на наблюдаемых показателях запросов:
|
||||
|
||||
@@ -179,11 +181,14 @@ OpenCode Go включает следующие лимиты:
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Часы Peak с понедельника по пятницу: 01:00-04:00 и 06:00-10:00 UTC; все остальные часы, включая выходные, относятся к Off-Peak. [Подробнее](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Изображения преобразуются в токены с учётом их размеров и оплачиваются как входные токены вместе с текстовыми токенами. [Подробнее](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Бесплатно в течение ограниченного времени.
|
||||
|
||||
Вы можете отслеживать текущее использование в **<a href={console}>консоли</a>**.
|
||||
|
||||
:::tip
|
||||
@@ -243,6 +248,7 @@ OpenCode Go включает следующие лимиты:
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
[ID модели](/docs/config/#models) в вашем конфиге OpenCode
|
||||
использует формат `opencode-go/<model-id>`. Например, для Kimi K3 вам нужно
|
||||
@@ -286,6 +292,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Не используется | 0 дней |
|
||||
| DeepSeek V4 Flash Vision Exp | Не используется | 0 дней |
|
||||
| Hy3 | Не используется | 0 дней |
|
||||
| Ox Alpha Free | Не используется | 0 дней |
|
||||
|
||||
- **Grok 4.6:** ZDR отключает важные функции API, зависящие от сохраненных данных, включая Responses API с сохранением состояния, Files and Collections и Batch API. [Подробнее](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Журналы мониторинга злоупотреблений создаются при любом использовании функций API и хранятся до 30 дней. [Подробнее](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -117,6 +117,7 @@ OpenCode Zen работает как любой другой провайдер
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ https://opencode.ai/zen/v1/models
|
||||
| Модель | Вход | Выход | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ https://opencode.ai/zen/v1/models
|
||||
- Nemotron 3 Ultra Free доступна в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
|
||||
- Nemotron 3.5 Lightning Free доступна в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
|
||||
- Big Pickle — это скрытая модель, которая доступна бесплатно в OpenCode ограниченное время. Команда использует это время, чтобы собирать отзывы и улучшать модель.
|
||||
- Ox Alpha Free — это скрытая модель, которая доступна бесплатно в OpenCode ограниченное время. Поставщик соблюдает политику нулевого хранения и не использует ваши данные для обучения моделей.
|
||||
- Muse Spark 1.2 Contributor Free доступна в OpenCode в течение ограниченного времени. Команда использует этот период для сбора отзывов и улучшения модели.
|
||||
|
||||
<a href={email}>Свяжитесь с нами</a>, если у вас есть вопросы.
|
||||
|
||||
@@ -71,6 +71,7 @@ OpenCode Go ทำงานเหมือนกับผู้ให้บร
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (ในช่วงเวลาจำกัด)
|
||||
|
||||
รายชื่อโมเดลอาจมีการเปลี่ยนแปลงเมื่อเราทำการทดสอบและเพิ่มโมเดลใหม่ๆ
|
||||
|
||||
@@ -112,6 +113,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
การประมาณการนี้อ้างอิงจากรูปแบบการใช้งาน request ที่สังเกตพบ:
|
||||
|
||||
@@ -169,11 +171,14 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** ช่วงเวลา Peak คือ 01:00-04:00 และ 06:00-10:00 UTC ตั้งแต่วันจันทร์ถึงวันศุกร์ ส่วนเวลาอื่นทั้งหมด รวมถึงวันหยุดสุดสัปดาห์ เป็น Off-Peak [ดูข้อมูลเพิ่มเติม](https://api-docs.deepseek.com/quick_start/pricing/)
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** รูปภาพจะถูกแปลงเป็น token ตามขนาด และคิดค่าบริการเป็น input token รวมกับ text token [ดูข้อมูลเพิ่มเติม](https://api-docs.deepseek.com/quick_start/pricing/)
|
||||
|
||||
**Ox Alpha Free:** ใช้งานฟรีในช่วงเวลาจำกัด
|
||||
|
||||
คุณสามารถติดตามการใช้งานปัจจุบันของคุณได้ใน **<a href={console}>console</a>**
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้:
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
[model id](/docs/config/#models) ใน OpenCode config ของคุณจะใช้รูปแบบ `opencode-go/<model-id>` ตัวอย่างเช่น สำหรับ Kimi K3 คุณจะใช้ `opencode-go/kimi-k3` ใน config ของคุณ
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | ไม่นำไปใช้ | 0 วัน |
|
||||
| DeepSeek V4 Flash Vision Exp | ไม่นำไปใช้ | 0 วัน |
|
||||
| Hy3 | ไม่นำไปใช้ | 0 วัน |
|
||||
| Ox Alpha Free | ไม่นำไปใช้ | 0 วัน |
|
||||
|
||||
- **Grok 4.6:** ZDR ปิดใช้งานฟีเจอร์ API สำคัญที่ต้องอาศัยข้อมูลที่จัดเก็บไว้ ซึ่งรวมถึง Responses API แบบมีสถานะ, Files and Collections และ Batch API [ดูข้อมูลเพิ่มเติม](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)
|
||||
- **GPT 5.6 Luna:** ระบบจะสร้างบันทึกการตรวจสอบการใช้งานในทางที่ผิดสำหรับการใช้งานฟีเจอร์ API ทั้งหมด และเก็บรักษาไว้นานสูงสุด 30 วัน [ดูข้อมูลเพิ่มเติม](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)
|
||||
|
||||
@@ -110,6 +110,7 @@ OpenCode Zen ทำงานเหมือน provider อื่น ๆ ใน
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -137,6 +138,7 @@ https://opencode.ai/zen/v1/models
|
||||
| Model | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -227,6 +229,7 @@ https://opencode.ai/zen/v1/models
|
||||
- Nemotron 3 Ultra Free เปิดให้ใช้บน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
|
||||
- Nemotron 3.5 Lightning Free เปิดให้ใช้บน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
|
||||
- Big Pickle เป็น stealth model ที่ใช้งานฟรีบน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อเก็บ feedback และปรับปรุงโมเดล
|
||||
- Ox Alpha Free เป็น stealth model ที่ใช้งานฟรีบน OpenCode ในช่วงเวลาจำกัด ผู้ให้บริการใช้นโยบายไม่เก็บรักษาข้อมูลและไม่นำข้อมูลของคุณไปใช้ฝึกโมเดล
|
||||
- Muse Spark 1.2 Contributor Free เปิดให้ใช้งานบน OpenCode ในช่วงเวลาจำกัด ทีมกำลังใช้ช่วงเวลานี้เพื่อรวบรวมความคิดเห็นและปรับปรุงโมเดล
|
||||
|
||||
<a href={email}>ติดต่อเรา</a> หากคุณมีคำถาม
|
||||
|
||||
@@ -257,14 +257,12 @@ Allows the LLM to fetch and read web pages. Useful for looking up documentation
|
||||
Search the web for information.
|
||||
|
||||
:::note
|
||||
This tool is only available when using the OpenCode or OpenCode Go provider, or when either the `OPENCODE_ENABLE_EXA` or `OPENCODE_ENABLE_PARALLEL` environment variable is set to any truthy value (e.g., `true` or `1`).
|
||||
This tool is only available when using the OpenCode or OpenCode Go provider, or when the `OPENCODE_ENABLE_EXA` environment variable is set to any truthy value (e.g., `true` or `1`).
|
||||
|
||||
To enable when launching OpenCode:
|
||||
|
||||
```bash
|
||||
OPENCODE_ENABLE_EXA=1 opencode
|
||||
# or
|
||||
OPENCODE_ENABLE_PARALLEL=1 opencode
|
||||
```
|
||||
|
||||
:::
|
||||
@@ -278,9 +276,9 @@ OPENCODE_ENABLE_PARALLEL=1 opencode
|
||||
}
|
||||
```
|
||||
|
||||
Performs web searches using Exa or Parallel to find relevant information online. Useful for researching topics, finding current events, or gathering information beyond the training data cutoff.
|
||||
Performs web searches using Exa AI to find relevant information online. Useful for researching topics, finding current events, or gathering information beyond the training data cutoff.
|
||||
|
||||
No API key is required — the tool connects directly to the backend's hosted MCP service without authentication.
|
||||
No API key is required — the tool connects directly to Exa AI's hosted MCP service without authentication.
|
||||
|
||||
:::tip
|
||||
Use `websearch` when you need to find information (discovery), and `webfetch` when you need to retrieve content from a specific URL (retrieval).
|
||||
|
||||
@@ -71,6 +71,7 @@ Mevcut model listesi şunları içerir:
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (sınırlı bir süre için)
|
||||
|
||||
Test edip yenilerini ekledikçe model listesi değişebilir.
|
||||
|
||||
@@ -112,6 +113,7 @@ Aşağıdaki tablo, tipik Go kullanım modellerine dayalı tahmini bir istek say
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
Tahminler, gözlemlenen istek modellerine dayanır:
|
||||
|
||||
@@ -169,11 +171,14 @@ Tahminler ayrıca 1M token başına aşağıdaki fiyatlara ve her modelle birlik
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak saatleri pazartesiden cumaya 01:00-04:00 ve 06:00-10:00 UTC'dir; hafta sonları dahil diğer tüm saatler Off-Peak'tir. [Daha fazla bilgi](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** Görseller boyutlarına göre token'lara dönüştürülür ve metin token'larıyla birlikte girdi token'ları olarak ücretlendirilir. [Daha fazla bilgi](https://api-docs.deepseek.com/quick_start/pricing/).
|
||||
|
||||
**Ox Alpha Free:** Sınırlı bir süre için ücretsiz.
|
||||
|
||||
Mevcut kullanımınızı **<a href={console}>konsoldan</a>** takip edebilirsiniz.
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ Go modellerine aşağıdaki API uç noktaları aracılığıyla da erişebilirsi
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
OpenCode yapılandırmanızdaki [model id](/docs/config/#models) formatı `opencode-go/<model-id>` şeklindedir. Örneğin, Kimi K3 için yapılandırmanızda `opencode-go/kimi-k3` kullanmalısınız.
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | Kullanılmaz | 0 gün |
|
||||
| DeepSeek V4 Flash Vision Exp | Kullanılmaz | 0 gün |
|
||||
| Hy3 | Kullanılmaz | 0 gün |
|
||||
| Ox Alpha Free | Kullanılmaz | 0 gün |
|
||||
|
||||
- **Grok 4.6:** ZDR, durum bilgisi tutan Responses API, Files and Collections ve Batch API dahil olmak üzere saklanan verilere bağlı önemli API özelliklerini devre dışı bırakır. [Daha fazla bilgi](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr).
|
||||
- **GPT 5.6 Luna:** Tüm API özelliklerinin kullanımı için kötüye kullanım izleme günlükleri oluşturulur ve 30 güne kadar saklanır. [Daha fazla bilgi](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring).
|
||||
|
||||
@@ -108,6 +108,7 @@ Modellerimize aşağıdaki API uç noktaları aracılığıyla da erişebilirsin
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -135,6 +136,7 @@ Kullandıkça öde modelini destekliyoruz. Aşağıda **1M token başına** fiya
|
||||
| Model | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -225,6 +227,7 @@ Kredi kartı ücretleri maliyet üzerinden yansıtılır (%4.4 + işlem başına
|
||||
- Nemotron 3 Ultra Free, sınırlı bir süre için OpenCode'da ücretsizdir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
|
||||
- Nemotron 3.5 Lightning Free, sınırlı bir süre için OpenCode'da ücretsizdir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
|
||||
- Big Pickle, sınırlı bir süre için OpenCode'da ücretsiz olan gizli bir modeldir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
|
||||
- Ox Alpha Free, sınırlı bir süre için OpenCode'da ücretsiz olan gizli bir modeldir. Sağlayıcısı sıfır saklama politikası uygular ve verilerinizi model eğitimi için kullanmaz.
|
||||
- Muse Spark 1.2 Contributor Free, sınırlı bir süre için OpenCode'da kullanılabilir. Ekip bu süreyi geri bildirim toplamak ve modeli iyileştirmek için kullanıyor.
|
||||
|
||||
Sorularınız varsa <a href={email}>bizimle iletişime geçin</a>.
|
||||
|
||||
@@ -117,6 +117,7 @@ You can also access our models through the following API endpoints.
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -146,6 +147,7 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**.
|
||||
| Model | Input | Output | Cached Read | Cached Write |
|
||||
| --------------------------------- | ------ | ------- | ----------- | ------------ |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -236,6 +238,7 @@ The free models:
|
||||
- Nemotron 3 Ultra Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
|
||||
- Nemotron 3.5 Lightning Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
|
||||
- Big Pickle is a stealth model that's free on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
|
||||
- Ox Alpha Free is a stealth model that's free on OpenCode for a limited time. Its provider follows a zero-retention policy and does not use your data for model training.
|
||||
- Muse Spark 1.2 Contributor Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model.
|
||||
|
||||
<a href={email}>Contact us</a> if you have any questions.
|
||||
|
||||
@@ -71,6 +71,7 @@ OpenCode Go 的工作方式与 OpenCode 中的其他提供商一样。
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (限时)
|
||||
|
||||
随着我们进行测试和添加新模型,该列表可能会发生变化。
|
||||
|
||||
@@ -112,6 +113,7 @@ OpenCode Go 包含以下限制:
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
预估值基于观察到的请求模式:
|
||||
|
||||
@@ -169,11 +171,14 @@ OpenCode Go 包含以下限制:
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak 时段为周一至周五的 01:00-04:00 和 06:00-10:00 UTC;其他所有时段(包括周末)均为 Off-Peak。[了解更多](https://api-docs.deepseek.com/quick_start/pricing/)。
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** 图片会根据尺寸转换为 token,并与文本 token 一起按输入 token 计费。 [了解更多](https://api-docs.deepseek.com/quick_start/pricing/)。
|
||||
|
||||
**Ox Alpha Free:** 限时免费。
|
||||
|
||||
你可以在 **<a href={console}>控制台</a>** 中跟踪你当前的使用情况。
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ OpenCode Go 包含以下限制:
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
你的 OpenCode 配置中的 [模型 ID](/docs/config/#models) 使用 `opencode-go/<model-id>` 格式。例如,对于 Kimi K3,你将在配置中使用 `opencode-go/kimi-k3`。
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | 不使用 | 0 天 |
|
||||
| DeepSeek V4 Flash Vision Exp | 不使用 | 0 天 |
|
||||
| Hy3 | 不使用 | 0 天 |
|
||||
| Ox Alpha Free | 不使用 | 0 天 |
|
||||
|
||||
- **Grok 4.6:** ZDR 会禁用依赖所存储数据的重要 API 功能,包括有状态的 Responses API、Files and Collections 和 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **GPT 5.6 Luna:** 所有 API 功能的使用都会生成滥用监控日志,并最多保留 30 天。[了解更多](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
|
||||
|
||||
@@ -108,6 +108,7 @@ OpenCode Zen 的工作方式与 OpenCode 中的任何其他提供商相同。
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -135,6 +136,7 @@ https://opencode.ai/zen/v1/models
|
||||
| 模型 | 输入 | 输出 | 缓存读取 | 缓存写入 |
|
||||
| --------------------------------- | ------ | ------- | -------- | -------- |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -225,6 +227,7 @@ https://opencode.ai/zen/v1/models
|
||||
- Nemotron 3 Ultra Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
|
||||
- Nemotron 3.5 Lightning Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
|
||||
- Big Pickle 是一个隐身模型,目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
|
||||
- Ox Alpha Free 是一个隐身模型,目前在 OpenCode 上限时免费提供。其提供商遵循零保留策略,不会将你的数据用于模型训练。
|
||||
- Muse Spark 1.2 Contributor Free 目前在 OpenCode 上限时免费提供。团队正在利用这段时间收集反馈并改进模型。
|
||||
|
||||
如果你有任何问题,请<a href={email}>联系我们</a>。
|
||||
|
||||
@@ -71,6 +71,7 @@ OpenCode Go 的運作方式與 OpenCode 中的任何其他供應商相同。
|
||||
- **DeepSeek V4 Flash**
|
||||
- **DeepSeek V4 Flash Vision Exp**
|
||||
- **Hy3**
|
||||
- **Ox Alpha Free** (限時)
|
||||
|
||||
隨著我們測試並加入新模型,模型清單可能會有所變動。
|
||||
|
||||
@@ -112,6 +113,7 @@ OpenCode Go 包含以下限制:
|
||||
| DeepSeek V4 Flash | 7,600 | 18,900 | 37,800 |
|
||||
| DeepSeek V4 Flash Vision Exp | 3,800 | 9,450 | 18,900 |
|
||||
| Hy3 | 4,300 | 10,750 | 21,500 |
|
||||
| Ox Alpha Free | - | - | - |
|
||||
|
||||
這些預估值是基於觀察到的請求模式:
|
||||
|
||||
@@ -169,11 +171,14 @@ OpenCode Go 包含以下限制:
|
||||
| DeepSeek V4 Flash Vision Exp (Off-Peak) | $0.22 | $0.66 | $0.007 | - | $15 |
|
||||
| DeepSeek V4 Flash Vision Exp (Peak) | $0.44 | $1.32 | $0.014 | - | $15 |
|
||||
| Hy3 | $0.14 | $0.58 | $0.035 | - | $60 |
|
||||
| Ox Alpha Free | - | - | - | - | - |
|
||||
|
||||
**DeepSeek V4 Flash / V4 Flash Vision Exp / V4 Pro:** Peak 時段為週一至週五的 01:00-04:00 和 06:00-10:00 UTC;其他所有時段(包括週末)均為 Off-Peak。[了解更多](https://api-docs.deepseek.com/quick_start/pricing/)。
|
||||
|
||||
**DeepSeek V4 Flash Vision Exp:** 圖片會根據尺寸轉換為 token,並與文字 token 一起按輸入 token 計費。 [了解更多](https://api-docs.deepseek.com/quick_start/pricing/)。
|
||||
|
||||
**Ox Alpha Free:** 限時免費。
|
||||
|
||||
您可以在 **<a href={console}>console</a>** 中追蹤您目前的使用量。
|
||||
|
||||
:::tip
|
||||
@@ -231,6 +236,7 @@ OpenCode Go 包含以下限制:
|
||||
| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` |
|
||||
| Hy3 | hy3 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | ox-alpha-free | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
|
||||
您的 OpenCode 設定中的 [model id](/docs/config/#models) 使用 `opencode-go/<model-id>` 格式。例如,Kimi K3 在設定中應使用 `opencode-go/kimi-k3`。
|
||||
|
||||
@@ -272,6 +278,7 @@ https://opencode.ai/zen/go/v1/models
|
||||
| DeepSeek V4 Flash | 不使用 | 0 天 |
|
||||
| DeepSeek V4 Flash Vision Exp | 不使用 | 0 天 |
|
||||
| Hy3 | 不使用 | 0 天 |
|
||||
| Ox Alpha Free | 不使用 | 0 天 |
|
||||
|
||||
- **Grok 4.6:** ZDR 會停用依賴儲存資料的重要 API 功能,包括具狀態的 Responses API、Files and Collections 與 Batch API。[了解更多](https://docs.x.ai/developers/faq/security#what-is-zero-data-retention-zdr)。
|
||||
- **GPT 5.6 Luna:** 所有 API 功能的使用都會產生濫用監控日誌,並保留最多 30 天。[了解更多](https://developers.openai.com/api/docs/guides/your-data#data-retention-controls-for-abuse-monitoring)。
|
||||
|
||||
@@ -112,6 +112,7 @@ OpenCode Zen 的運作方式和 OpenCode 中的其他供應商一樣。
|
||||
| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Kimi K3 | kimi-k3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Ox Alpha Free | x-preview-f-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Hy3 Free | hy3-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
|
||||
@@ -140,6 +141,7 @@ https://opencode.ai/zen/v1/models
|
||||
| 模型 | 輸入 | 輸出 | 快取讀取 | 快取寫入 |
|
||||
| --------------------------------- | ------ | ------- | -------- | -------- |
|
||||
| Big Pickle | Free | Free | Free | - |
|
||||
| Ox Alpha Free | Free | Free | Free | - |
|
||||
| MiMo-V2.5 Free | Free | Free | Free | - |
|
||||
| Hy3 Free | Free | Free | Free | - |
|
||||
| Nemotron 3 Ultra Free | Free | Free | Free | - |
|
||||
@@ -230,6 +232,7 @@ https://opencode.ai/zen/v1/models
|
||||
- Nemotron 3 Ultra Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
|
||||
- Nemotron 3.5 Lightning Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
|
||||
- Big Pickle 是一個隱身模型,在 OpenCode 上限時免費提供。團隊正在利用這段時間收集回饋並改進模型。
|
||||
- Ox Alpha Free 是一個隱身模型,在 OpenCode 上限時免費提供。其供應商遵循零保留政策,不會將你的資料用於模型訓練。
|
||||
- Muse Spark 1.2 Contributor Free 在 OpenCode 上限時提供。團隊正在利用這段時間收集回饋並改進模型。
|
||||
|
||||
如果你有任何問題,請<a href={email}>聯絡我們</a>。
|
||||
|
||||
Reference in New Issue
Block a user