diff --git a/packages/console/app/src/component/go-models.ts b/packages/console/app/src/component/go-models.ts new file mode 100644 index 000000000000..6df79f4a3921 --- /dev/null +++ b/packages/console/app/src/component/go-models.ts @@ -0,0 +1,53 @@ +// Requests are per 5 hours; allowances are monthly usage at official API prices. +export const goModels = [ + { id: "kimi-k3", name: "Kimi K3", requests: 110, allowance: 15, featured: true }, + { id: "qwen3.8-max", name: "Qwen3.8 Max", requests: 160, allowance: 15 }, + { id: "grok-4.6", name: "Grok 4.6", requests: 169, allowance: 15 }, + { id: "qwen3.7-max", name: "Qwen3.7 Max", requests: 170, allowance: 30 }, + { id: "glm-5.3", name: "GLM-5.3", requests: 220, allowance: 15 }, + { id: "glm-5.2", name: "GLM-5.2", requests: 880, allowance: 60 }, + { id: "glm-5.1", name: "GLM-5.1", requests: 880, allowance: 60 }, + { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", requests: 1050, allowance: 15 }, + { id: "kimi-k2.6", name: "Kimi K2.6", requests: 1150, allowance: 60 }, + { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", requests: 1350, allowance: 60, featured: true }, + { id: "hy4-preview", name: "Hy4 preview", requests: 1350, allowance: 30 }, + { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", requests: 2050, allowance: 15, featured: true }, + { id: "minimax-m3", name: "MiniMax M3", requests: 3200, allowance: 60, featured: true }, + { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", requests: 3250, allowance: 15 }, + { id: "qwen3.6-plus", name: "Qwen3.6 Plus", requests: 3300, allowance: 60 }, + { id: "minimax-m2.7", name: "MiniMax M2.7", requests: 3400, allowance: 60 }, + { id: "deepseek-v4-flash-vision-exp", name: "DeepSeek V4 Flash Vision Exp", requests: 6500, allowance: 15 }, + { id: "qwen3.7-plus", name: "Qwen3.7 Plus", requests: 4300, allowance: 60, featured: true }, + { id: "hy3", name: "Hy3", requests: 4300, allowance: 60 }, + { id: "qwen3.8-flash", name: "Qwen3.8 Flash", requests: 5400, allowance: 30 }, + { id: "glm-5.3-flash", name: "GLM-5.3-Flash", requests: 6320, allowance: 60, featured: true }, + { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", requests: 13000, allowance: 30, featured: true }, + { + id: "deepseek-flash", + name: "DeepSeek V4.1 Flash", + requests: 26000, + baseRequests: 6500, + allowance: 60, + baseAllowance: 15, + bonus: 4, + featured: true, + fresh: true, + }, + { id: "longcat-2.0", name: "LongCat-2.0", requests: 11400, allowance: 60 }, + { id: "mimo-v2.5", name: "MiMo-V2.5", requests: 30100, allowance: 60, featured: true }, + { + id: "muse-spark-1.3-contributor", + name: "Muse Spark 1.3 Contributor", + requests: 45300, + allowance: 60, + featured: true, + regions: true, + }, + { + id: "muse-spark-1.2-contributor", + name: "Muse Spark 1.2 Contributor", + requests: 45300, + allowance: 60, + regions: true, + }, +].sort((a, b) => a.requests - b.requests) diff --git a/packages/console/app/src/component/limits-graph.css b/packages/console/app/src/component/limits-graph.css new file mode 100644 index 000000000000..ddcf2dfece52 --- /dev/null +++ b/packages/console/app/src/component/limits-graph.css @@ -0,0 +1,300 @@ +[data-component="go-usage"] { + --model-width: 16.5rem; + --request-width: 5.25rem; + --allowance-width: 6.75rem; + --column-gap: 1.5rem; + --bar-origin: left; + container-type: inline-size; + margin: 0; + padding: 3rem var(--padding) 2.5rem; + font-variant-numeric: tabular-nums; + scroll-margin-top: 6rem; + -webkit-font-smoothing: antialiased; + + &:dir(rtl) { + --bar-origin: right; + } + + [data-slot="heading"] { + padding-bottom: 1.5rem; + + h2 { + color: var(--color-text-strong); + font-size: 1rem; + font-weight: 600; + } + } + + s { + display: block; + color: var(--color-text-weak); + font-size: 0.6875rem; + font-weight: 400; + } + + [data-slot="columns"], + [data-slot="model-row"] { + display: grid; + grid-template-columns: var(--model-width) minmax(0, 1fr) var(--allowance-width); + align-items: center; + column-gap: var(--column-gap); + } + + [data-slot="columns"] { + padding-bottom: 0.875rem; + border-bottom: 1px solid var(--color-border-weak); + font-size: 0.6875rem; + color: var(--color-text); + overflow-wrap: anywhere; + } + + [data-slot="requests-heading"], + [data-slot="allowance-heading"] { + text-align: end; + } + + [data-slot="rows"] { + padding-top: 0.375rem; + } + + [data-slot="model-row"] { + min-height: 2.5rem; + font-size: 0.8125rem; + } + + [data-slot="model"] { + display: flex; + align-items: baseline; + flex-wrap: wrap; + gap: 0.375rem 0.5rem; + min-width: 0; + line-height: 1.5; + color: var(--color-text); + font-weight: 400; + } + + [data-slot="badge"] { + color: var(--color-text-strong); + font-size: 0.625rem; + line-height: 1.3; + border: 1px solid var(--color-border); + padding: 0.0625rem 0.25rem; + } + + [data-slot="region"] { + display: inline-flex; + align-self: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + + &:hover { + color: var(--color-text-strong); + } + } + + [data-slot="usage-value"] { + display: grid; + grid-template-columns: minmax(0, 1fr) var(--request-width); + align-items: center; + gap: var(--column-gap); + align-self: stretch; + } + + [data-slot="track"] { + display: flex; + align-items: center; + align-self: stretch; + position: relative; + isolation: isolate; + } + + [data-slot="gridline"] { + position: absolute; + inset-block: 0; + inset-inline-start: var(--position); + border-inline-start: 1px dotted var(--color-border-weak); + z-index: -1; + } + + [data-slot="bar"] { + width: var(--width); + height: 0.375rem; + background: var(--color-go-2); + transform-origin: var(--bar-origin); + } + + &[data-visible] [data-slot="bar"] { + animation: go-usage-reveal 700ms cubic-bezier(0.22, 1, 0.36, 1) both; + animation-delay: var(--delay); + } + + [data-slot="requests"] { + text-align: end; + font-weight: 600; + color: var(--color-text-strong); + } + + [data-slot="allowance"] { + text-align: end; + color: var(--color-text); + + &[data-high] { + color: var(--color-text-strong); + } + } + + [data-slot="currency"] { + color: var(--color-text-weak); + } + + [data-slot="axis"] { + padding-inline-start: calc(var(--model-width) + var(--column-gap)); + padding-inline-end: calc(var(--request-width) + var(--allowance-width) + 2 * var(--column-gap)); + height: 2.5rem; + } + + [data-slot="ticks"] { + position: relative; + height: 100%; + font-size: 0.625rem; + color: var(--color-text-weak); + + span { + position: absolute; + inset-inline-start: var(--position); + top: 0.75rem; + transform: translateX(-50%); + + &:dir(rtl) { + transform: translateX(50%); + } + } + } + + [data-slot="expand"] { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; + min-height: 2.75rem; + padding: 0.75rem 0; + background: none; + border: none; + color: var(--color-text); + font-family: inherit; + font-size: 0.75rem; + cursor: pointer; + + &:hover { + color: var(--color-text-strong); + } + &[aria-expanded="true"] svg { + transform: rotate(180deg); + } + } + + :is(button, a):focus-visible { + outline: 1px solid var(--color-text-strong); + outline-offset: 4px; + } + + figcaption { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 1rem; + border-top: 1px solid var(--color-border-weak); + font-size: 0.75rem; + color: var(--color-text); + + a { + color: inherit; + white-space: nowrap; + } + } + + @container (max-width: 48rem) { + [data-slot="columns"], + [data-slot="model-row"], + [data-slot="axis"] { + --model-width: 13rem; + --request-width: 4rem; + --allowance-width: 6rem; + --column-gap: 1rem; + } + } + + @container (max-width: 38rem) { + [data-slot="columns"], + [data-slot="model-row"] { + --request-width: 5rem; + --allowance-width: 4.5rem; + --column-gap: 0.75rem; + grid-template-columns: minmax(0, 1fr) var(--request-width) var(--allowance-width); + } + + [data-slot="columns"] { + font-size: 0.625rem; + } + + [data-slot="model-row"] { + min-height: 4rem; + padding-block: 0.375rem; + row-gap: 0.25rem; + font-size: 1rem; + } + + [data-slot="model"] { + grid-column: 1 / -1; + } + [data-slot="usage-value"] { + display: contents; + } + + [data-slot="track"] { + grid-column: 1; + grid-row: 2; + align-self: center; + height: 4px; + } + + [data-slot="bar"] { + height: 4px; + } + [data-slot="requests"] { + grid-column: 2; + grid-row: 2; + } + [data-slot="allowance"] { + grid-column: 3; + grid-row: 2; + } + [data-slot="gridline"], + [data-slot="axis"] { + display: none; + } + [data-slot="expand"] { + font-size: 0.8125rem; + } + figcaption { + margin-top: 1rem; + } + } + + @media (prefers-reduced-motion: reduce) { + &[data-visible] [data-slot="bar"] { + animation: none; + } + } +} + +@keyframes go-usage-reveal { + from { + transform: scaleX(0); + } + to { + transform: scaleX(1); + } +} diff --git a/packages/console/app/src/component/limits-graph.tsx b/packages/console/app/src/component/limits-graph.tsx index aa9744ecbb8a..410fd48e4392 100644 --- a/packages/console/app/src/component/limits-graph.tsx +++ b/packages/console/app/src/component/limits-graph.tsx @@ -1,209 +1,165 @@ -import { For, createSignal, onCleanup, onMount } from "solid-js" +import "./limits-graph.css" +import { For, Show, createMemo, createSignal, createUniqueId, onCleanup, onMount } from "solid-js" import { useI18n } from "~/context/i18n" +import { useLanguage } from "~/context/language" +import { goModels } from "./go-models" -export function LimitsGraph(props: { href: string }) { - let root!: HTMLElement - const [visible, setVisible] = createSignal(false) +// Compress the request range, with the same domain in both views. +const max = Math.max(...goModels.map((model) => model.requests)) +const position = (requests: number) => + 4 + Math.pow(Math.log10(Math.max(requests / 100, 1)) / Math.log10(max / 100), 2.2) * 96 +const ticks = [100, 1000, 10000, 40000] +export function LimitsGraph(props: { href: string }) { const i18n = useI18n() + const language = useLanguage() + const id = createUniqueId() + const [expanded, setExpanded] = createSignal(false) + const [visible, setVisible] = createSignal(false) + const models = createMemo(() => goModels.filter((model) => expanded() || model.featured || model.fresh)) + const format = createMemo(() => new Intl.NumberFormat(language.tag(language.locale()))) + const compact = createMemo( + () => new Intl.NumberFormat(language.tag(language.locale()), { notation: "compact", maximumFractionDigits: 1 }), + ) + const currency = createMemo( + () => + new Intl.NumberFormat(language.tag(language.locale()), { + style: "currency", + currency: "USD", + currencyDisplay: "narrowSymbol", + maximumFractionDigits: 0, + }), + ) + let root!: HTMLElement onMount(() => { - const motion = window.matchMedia("(prefers-reduced-motion: reduce)") - const finish = () => { - if (!motion.matches) return - setVisible(true) - } - motion.addEventListener("change", finish) - onCleanup(() => { - motion.removeEventListener("change", finish) - }) - if (motion.matches) return finish() - if (typeof IntersectionObserver === "undefined") return setVisible(true) + if (!window.IntersectionObserver) return setVisible(true) const observer = new IntersectionObserver( (entries) => { - const entry = entries[0] - if (!entry?.isIntersecting || entry.intersectionRatio < 0.35) return + if (!entries.some((entry) => entry.isIntersecting)) return setVisible(true) observer.disconnect() }, - { threshold: 0.35 }, + { threshold: 0.1 }, ) observer.observe(root) onCleanup(() => observer.disconnect()) }) - const baseline = 100 - const graph = [ - { id: "kimi-k3", name: "Kimi K3", req: 110 }, - { id: "grok-4.6", name: "Grok 4.6", req: 169 }, - { id: "hy4-preview", name: "Hy4 preview", req: 1350 }, - { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", req: 2050 }, - { id: "minimax-m3", name: "MiniMax M3", req: 3200 }, - { id: "qwen3.7-plus", name: "Qwen3.7 Plus", req: 4300 }, - { id: "hy3", name: "Hy3", req: 4300 }, - { id: "qwen3.8-flash", name: "Qwen3.8 Flash", req: 5400 }, - { id: "glm-5.3-flash", name: "GLM-5.3-Flash", req: 6320 }, - { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", req: 7600 }, - { id: "longcat-2.0", name: "LongCat-2.0", req: 11400 }, - { id: "omen-alpha", name: "Omen Alpha", req: 11600 }, - { id: "mimo-v2.5", name: "MiMo-V2.5", req: 30100 }, - { id: "muse-spark-1.3-contributor", name: "Muse Spark 1.3 Contributor", req: 45300, edge: true }, - ].map((model, index) => ({ ...model, d: `${50 + index * 25}ms` })) - - const w = 1040 - const chartW = 720 - const left = 40 - const right = 60 - const top = 18 - const bottom = 44 - const plot = chartW - left - right - const infiniteX = w - 180 - - const ratio = (n: number) => n / baseline - const rmax = Math.max(1, ...graph.filter((m) => !("infinite" in m)).map((m) => ratio(m.req))) - const log = (n: number) => Math.log10(Math.max(n, 1)) - const base = 24 - const p = 2.2 - const x = (r: number) => left + base + Math.pow(log(r) / log(rmax), p) * (plot - base) - const ticks = [1, 5, 10, 25, 50, 100, 250].filter((t) => t <= rmax) - const labels = (() => { - const set = new Set() - let last = -Infinity - for (const t of ticks) { - if (t === 1) { - set.add(t) - last = x(t) - continue - } - const pos = x(t) - if (pos - last < 44) continue - set.add(t) - last = pos - } - return set - })() - const shown = ticks.filter((t) => labels.has(t)) - const bh = 8 - const gap = 20 - const step = bh + gap - const gy = (i: number) => top + 22 + step * i - const h = gy(graph.length - 1) + bottom - const my = graph.length < 2 ? gy(0) : (gy(0) + gy(graph.length - 1)) / 2 - const px = (n: number) => `${(n / w) * 100}%` - const py = (n: number) => `${(n / h) * 100}%` - const lx = px(left - 16) - const ty = py(h - 18) - return (
-
- +
+

{i18n.t("go.graph.period")}

+
-
) diff --git a/packages/console/app/src/i18n/ar.ts b/packages/console/app/src/i18n/ar.ts index 2d792158741f..fac1d6475833 100644 --- a/packages/console/app/src/i18n/ar.ts +++ b/packages/console/app/src/i18n/ar.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "يحصل DeepSeek V4.1 Flash على حدود استخدام مضاعفة 4 مرات لفترة محدودة", + "go.graph.bonus": "استخدام مضاعف {{count}} مرات", "nav.github": "GitHub", "nav.docs": "الوثائق", "nav.changelog": "سجل التغييرات", @@ -270,6 +272,14 @@ export const dict = { "go.graph.freePill": "Big Pickle ونماذج مجانية", "go.graph.go": "Go", "go.graph.label": "الطلبات كل 5 ساعات", + "go.graph.period": "الاستخدام", + "go.graph.model": "النموذج", + "go.graph.requests": "الطلبات المقدّرة / ٥ ساعات", + "go.graph.allowance": "الاستخدام الشهري", + "go.graph.new": "جديد", + "go.graph.scale": "مقياس غير خطي لعدد الطلبات", + "go.graph.showAll": "عرض جميع النماذج ({{count}})", + "go.graph.showLess": "عرض نماذج أقل", "go.graph.limitedRegions": "مناطق محدودة", "go.graph.limitedTime": "لفترة محدودة", "go.graph.usageLimits": "حدود الاستخدام", diff --git a/packages/console/app/src/i18n/br.ts b/packages/console/app/src/i18n/br.ts index ded260326811..a2e5867a63dc 100644 --- a/packages/console/app/src/i18n/br.ts +++ b/packages/console/app/src/i18n/br.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash tem limites de uso 4x maiores por tempo limitado", + "go.graph.bonus": "{{count}}× mais uso", "nav.github": "GitHub", "nav.docs": "Documentação", "nav.changelog": "Changelog", @@ -276,6 +278,14 @@ export const dict = { "go.graph.freePill": "Big Pickle e modelos gratuitos", "go.graph.go": "Go", "go.graph.label": "Requisições por 5 horas", + "go.graph.period": "Uso", + "go.graph.model": "Modelo", + "go.graph.requests": "Requisições estimadas / 5 h", + "go.graph.allowance": "Uso mensal", + "go.graph.new": "Novo", + "go.graph.scale": "Escala não linear de requisições", + "go.graph.showAll": "Ver todos os {{count}} modelos", + "go.graph.showLess": "Mostrar menos modelos", "go.graph.limitedRegions": "regiões limitadas", "go.graph.limitedTime": "tempo limitado", "go.graph.usageLimits": "Limites de uso", diff --git a/packages/console/app/src/i18n/da.ts b/packages/console/app/src/i18n/da.ts index de296cb0f555..d2787bb611eb 100644 --- a/packages/console/app/src/i18n/da.ts +++ b/packages/console/app/src/i18n/da.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash får firedoblet brugsgrænse i en begrænset periode", + "go.graph.bonus": "{{count}}× forbrug", "nav.github": "GitHub", "nav.docs": "Dokumentation", "nav.changelog": "Changelog", @@ -273,9 +275,17 @@ export const dict = { "go.graph.freePill": "Big Pickle og gratis modeller", "go.graph.go": "Go", "go.graph.label": "Forespørgsler pr. 5 timer", + "go.graph.period": "Forbrug", + "go.graph.model": "Model", + "go.graph.requests": "Estimerede anmodninger / 5 timer", + "go.graph.allowance": "Månedligt forbrug", + "go.graph.new": "Ny", + "go.graph.scale": "Ikke-lineær skala for anmodninger", + "go.graph.showAll": "Vis alle {{count}} modeller", + "go.graph.showLess": "Vis færre modeller", "go.graph.limitedRegions": "begrænsede regioner", "go.graph.limitedTime": "begrænset periode", - "go.graph.usageLimits": "Brugsgrænser", + "go.graph.usageLimits": "Forbrugsgrænser", "go.graph.aria": "Forespørgsler pr. 5t: {{free}} vs {{go}}", "go.testimonials.brand.zen": "Zen", diff --git a/packages/console/app/src/i18n/de.ts b/packages/console/app/src/i18n/de.ts index 898a9d87a33a..8fb78e76e611 100644 --- a/packages/console/app/src/i18n/de.ts +++ b/packages/console/app/src/i18n/de.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash erhält für begrenzte Zeit 4x Nutzungslimits", + "go.graph.bonus": "{{count}}× Nutzung", "nav.github": "GitHub", "nav.docs": "Dokumentation", "nav.changelog": "Changelog", @@ -275,6 +277,14 @@ export const dict = { "go.graph.freePill": "Big Pickle und kostenlose Modelle", "go.graph.go": "Go", "go.graph.label": "Anfragen pro 5 Stunden", + "go.graph.period": "Nutzung", + "go.graph.model": "Modell", + "go.graph.requests": "Geschätzte Anfragen / 5 Std.", + "go.graph.allowance": "Monatliche Nutzung", + "go.graph.new": "Neu", + "go.graph.scale": "Nichtlineare Skala für Anfragen", + "go.graph.showAll": "Alle {{count}} Modelle anzeigen", + "go.graph.showLess": "Weniger Modelle anzeigen", "go.graph.limitedRegions": "begrenzte Regionen", "go.graph.limitedTime": "begrenzte Zeit", "go.graph.usageLimits": "Nutzungslimits", diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts index 1031a72e706a..4469c3353c51 100644 --- a/packages/console/app/src/i18n/en.ts +++ b/packages/console/app/src/i18n/en.ts @@ -1,4 +1,6 @@ export const dict = { + "go.promo.deepseek": "DeepSeek V4.1 Flash gets 4× usage limits for a limited time", + "go.graph.bonus": "{{count}}× usage", "nav.github": "GitHub", "nav.docs": "Docs", "nav.data": "Data", @@ -270,6 +272,14 @@ export const dict = { "go.graph.freePill": "Big Pickle and free models", "go.graph.go": "Go", "go.graph.label": "Requests / 5 hours", + "go.graph.period": "Usage", + "go.graph.model": "Model", + "go.graph.requests": "Est. requests / 5 hr", + "go.graph.allowance": "Monthly usage", + "go.graph.new": "New", + "go.graph.scale": "Nonlinear request scale", + "go.graph.showAll": "View all {{count}} models", + "go.graph.showLess": "Show fewer models", "go.graph.limitedRegions": "limited regions", "go.graph.limitedTime": "limited time", "go.graph.tick": "{{n}}x", diff --git a/packages/console/app/src/i18n/es.ts b/packages/console/app/src/i18n/es.ts index 4e3d5cd41cb1..9750bc584e27 100644 --- a/packages/console/app/src/i18n/es.ts +++ b/packages/console/app/src/i18n/es.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash tiene límites de uso 4x mayores por tiempo limitado", + "go.graph.bonus": "{{count}}× de uso", "nav.github": "GitHub", "nav.docs": "Documentación", "nav.changelog": "Registro de cambios", @@ -277,6 +279,14 @@ export const dict = { "go.graph.freePill": "Big Pickle y modelos gratuitos", "go.graph.go": "Go", "go.graph.label": "Solicitudes por 5 horas", + "go.graph.period": "Uso", + "go.graph.model": "Modelo", + "go.graph.requests": "Peticiones estimadas / 5 h", + "go.graph.allowance": "Uso mensual", + "go.graph.new": "Nuevo", + "go.graph.scale": "Escala no lineal de peticiones", + "go.graph.showAll": "Ver los {{count}} modelos", + "go.graph.showLess": "Mostrar menos modelos", "go.graph.limitedRegions": "regiones limitadas", "go.graph.limitedTime": "tiempo limitado", "go.graph.usageLimits": "Límites de uso", diff --git a/packages/console/app/src/i18n/fr.ts b/packages/console/app/src/i18n/fr.ts index fa1de59ee967..5281b6b3e54f 100644 --- a/packages/console/app/src/i18n/fr.ts +++ b/packages/console/app/src/i18n/fr.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash bénéficie de limites d’utilisation 4x supérieures pour une durée limitée", + "go.graph.bonus": "{{count}}× d’utilisation", "app.meta.description": "OpenCode - L'agent de code open source.", "nav.github": "GitHub", "nav.docs": "Documentation", @@ -278,9 +280,17 @@ export const dict = { "go.graph.freePill": "Big Pickle et modèles gratuits", "go.graph.go": "Go", "go.graph.label": "Requêtes par tranche de 5 heures", + "go.graph.period": "Utilisation", + "go.graph.model": "Modèle", + "go.graph.requests": "Requêtes estimées / 5 h", + "go.graph.allowance": "Utilisation mensuelle", + "go.graph.new": "Nouveau", + "go.graph.scale": "Échelle non linéaire des requêtes", + "go.graph.showAll": "Voir les {{count}} modèles", + "go.graph.showLess": "Afficher moins de modèles", "go.graph.limitedRegions": "régions limitées", "go.graph.limitedTime": "durée limitée", - "go.graph.usageLimits": "Limites d'utilisation", + "go.graph.usageLimits": "Limites d’utilisation", "go.graph.aria": "Requêtes par 5h : {{free}} vs {{go}}", "go.testimonials.brand.zen": "Zen", diff --git a/packages/console/app/src/i18n/it.ts b/packages/console/app/src/i18n/it.ts index 0c81b6e94e14..cb2f3d7d7a83 100644 --- a/packages/console/app/src/i18n/it.ts +++ b/packages/console/app/src/i18n/it.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash offre limiti di utilizzo 4x superiori per un periodo limitato", + "go.graph.bonus": "Utilizzo {{count}}×", "nav.github": "GitHub", "nav.docs": "Documentazione", "nav.changelog": "Changelog", @@ -274,6 +276,14 @@ export const dict = { "go.graph.freePill": "Big Pickle e modelli gratuiti", "go.graph.go": "Go", "go.graph.label": "Richieste ogni 5 ore", + "go.graph.period": "Utilizzo", + "go.graph.model": "Modello", + "go.graph.requests": "Richieste stimate / 5 ore", + "go.graph.allowance": "Utilizzo mensile", + "go.graph.new": "Nuovo", + "go.graph.scale": "Scala non lineare delle richieste", + "go.graph.showAll": "Mostra tutti i {{count}} modelli", + "go.graph.showLess": "Mostra meno modelli", "go.graph.limitedRegions": "regioni limitate", "go.graph.limitedTime": "periodo limitato", "go.graph.usageLimits": "Limiti di utilizzo", diff --git a/packages/console/app/src/i18n/ja.ts b/packages/console/app/src/i18n/ja.ts index 534f8a95e948..2ae754c47d90 100644 --- a/packages/console/app/src/i18n/ja.ts +++ b/packages/console/app/src/i18n/ja.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flashの利用上限が期間限定で4倍に", + "go.graph.bonus": "利用枠{{count}}倍", "nav.github": "GitHub", "nav.docs": "ドキュメント", "nav.changelog": "変更履歴", @@ -273,6 +275,14 @@ export const dict = { "go.graph.freePill": "Big Pickleと無料モデル", "go.graph.go": "Go", "go.graph.label": "5時間あたりのリクエスト数", + "go.graph.period": "利用枠", + "go.graph.model": "モデル", + "go.graph.requests": "推定リクエスト数 / 5時間", + "go.graph.allowance": "月間利用枠", + "go.graph.new": "新着", + "go.graph.scale": "リクエスト数は非線形目盛りで表示", + "go.graph.showAll": "全{{count}}モデルを表示", + "go.graph.showLess": "折りたたむ", "go.graph.limitedRegions": "一部の地域に限定", "go.graph.limitedTime": "期間限定", "go.graph.usageLimits": "利用制限", diff --git a/packages/console/app/src/i18n/ko.ts b/packages/console/app/src/i18n/ko.ts index f480675c9f48..e9b5c92071c4 100644 --- a/packages/console/app/src/i18n/ko.ts +++ b/packages/console/app/src/i18n/ko.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash 사용 한도가 한시적으로 4배 확대됩니다", + "go.graph.bonus": "사용량 {{count}}배", "nav.github": "GitHub", "nav.docs": "문서", "nav.changelog": "변경 내역", @@ -269,6 +271,14 @@ export const dict = { "go.graph.freePill": "Big Pickle 및 무료 모델", "go.graph.go": "Go", "go.graph.label": "5시간당 요청 수", + "go.graph.period": "사용량", + "go.graph.model": "모델", + "go.graph.requests": "예상 요청 횟수 / 5시간", + "go.graph.allowance": "월간 사용량", + "go.graph.new": "신규", + "go.graph.scale": "요청 수는 비선형 눈금으로 표시됩니다", + "go.graph.showAll": "전체 {{count}}개 모델 보기", + "go.graph.showLess": "접기", "go.graph.limitedRegions": "일부 지역에서만 제공", "go.graph.limitedTime": "한정된 기간", "go.graph.usageLimits": "사용 한도", diff --git a/packages/console/app/src/i18n/no.ts b/packages/console/app/src/i18n/no.ts index 95fd5f5e9c42..fc2636a30057 100644 --- a/packages/console/app/src/i18n/no.ts +++ b/packages/console/app/src/i18n/no.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash får 4x bruksgrense i en begrenset periode", + "go.graph.bonus": "{{count}}× bruk", "nav.github": "GitHub", "nav.docs": "Dokumentasjon", "nav.changelog": "Endringslogg", @@ -273,6 +275,14 @@ export const dict = { "go.graph.freePill": "Big Pickle og gratis modeller", "go.graph.go": "Go", "go.graph.label": "Forespørsler per 5 timer", + "go.graph.period": "Bruk", + "go.graph.model": "Modell", + "go.graph.requests": "Estimerte forespørsler / 5 timer", + "go.graph.allowance": "Månedlig bruk", + "go.graph.new": "Ny", + "go.graph.scale": "Ikke-lineær skala for forespørsler", + "go.graph.showAll": "Vis alle {{count}} modeller", + "go.graph.showLess": "Vis færre modeller", "go.graph.limitedRegions": "begrensede regioner", "go.graph.limitedTime": "begrenset periode", "go.graph.usageLimits": "Bruksgrenser", diff --git a/packages/console/app/src/i18n/pl.ts b/packages/console/app/src/i18n/pl.ts index b27528fc23cf..4a4e1ba724a6 100644 --- a/packages/console/app/src/i18n/pl.ts +++ b/packages/console/app/src/i18n/pl.ts @@ -2,6 +2,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash oferuje 4x wyższe limity użycia przez ograniczony czas", + "go.graph.bonus": "{{count}}× większy limit", "nav.github": "GitHub", "nav.docs": "Dokumentacja", "nav.changelog": "Dziennik zmian", @@ -275,6 +277,14 @@ export const dict = { "go.graph.freePill": "Big Pickle i darmowe modele", "go.graph.go": "Go", "go.graph.label": "Żądania na 5 godzin", + "go.graph.period": "Użycie", + "go.graph.model": "Model", + "go.graph.requests": "Szac. żądania / 5 godz.", + "go.graph.allowance": "Miesięczne użycie", + "go.graph.new": "Nowość", + "go.graph.scale": "Nieliniowa skala liczby żądań", + "go.graph.showAll": "Pokaż wszystkie modele ({{count}})", + "go.graph.showLess": "Pokaż mniej modeli", "go.graph.limitedRegions": "ograniczone regiony", "go.graph.limitedTime": "ograniczony czas", "go.graph.usageLimits": "Limity użycia", diff --git a/packages/console/app/src/i18n/ru.ts b/packages/console/app/src/i18n/ru.ts index d2154ef83012..37f6e43b06d6 100644 --- a/packages/console/app/src/i18n/ru.ts +++ b/packages/console/app/src/i18n/ru.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash получает 4x лимиты использования на ограниченное время", + "go.graph.bonus": "Лимит ×{{count}}", "nav.github": "GitHub", "nav.docs": "Документация", "nav.changelog": "Список изменений", @@ -278,6 +280,14 @@ export const dict = { "go.graph.freePill": "Big Pickle и бесплатные модели", "go.graph.go": "Go", "go.graph.label": "Запросов за 5 часов", + "go.graph.period": "Использование", + "go.graph.model": "Модель", + "go.graph.requests": "Примерное число запросов / 5 ч", + "go.graph.allowance": "Использование за месяц", + "go.graph.new": "Новое", + "go.graph.scale": "Нелинейная шкала числа запросов", + "go.graph.showAll": "Показать все модели ({{count}})", + "go.graph.showLess": "Показать меньше моделей", "go.graph.limitedRegions": "доступно в отдельных регионах", "go.graph.limitedTime": "ограниченное время", "go.graph.usageLimits": "Лимиты использования", diff --git a/packages/console/app/src/i18n/th.ts b/packages/console/app/src/i18n/th.ts index 9b1f78f52a45..97a80f039418 100644 --- a/packages/console/app/src/i18n/th.ts +++ b/packages/console/app/src/i18n/th.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash เพิ่มโควตาการใช้งานเป็น 4 เท่าในช่วงเวลาจำกัด", + "go.graph.bonus": "ใช้งาน {{count}} เท่า", "nav.github": "GitHub", "nav.docs": "เอกสาร", "nav.changelog": "บันทึกการเปลี่ยนแปลง", @@ -272,6 +274,14 @@ export const dict = { "go.graph.freePill": "Big Pickle และโมเดลฟรี", "go.graph.go": "Go", "go.graph.label": "คำขอต่อ 5 ชั่วโมง", + "go.graph.period": "การใช้งาน", + "go.graph.model": "โมเดล", + "go.graph.requests": "requests โดยประมาณ / 5 ชม.", + "go.graph.allowance": "ปริมาณการใช้งานรายเดือน", + "go.graph.new": "ใหม่", + "go.graph.scale": "มาตราส่วนจำนวนคำขอแบบไม่เป็นเชิงเส้น", + "go.graph.showAll": "ดูโมเดลทั้งหมด {{count}} โมเดล", + "go.graph.showLess": "แสดงโมเดลน้อยลง", "go.graph.limitedRegions": "เฉพาะบางภูมิภาค", "go.graph.limitedTime": "ช่วงเวลาจำกัด", "go.graph.usageLimits": "ขีดจำกัดการใช้งาน", diff --git a/packages/console/app/src/i18n/tr.ts b/packages/console/app/src/i18n/tr.ts index 49f7a788cb7b..4289706cc66e 100644 --- a/packages/console/app/src/i18n/tr.ts +++ b/packages/console/app/src/i18n/tr.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash sınırlı bir süre için 4x kullanım limiti sunuyor", + "go.graph.bonus": "{{count}}× kullanım", "nav.github": "GitHub", "nav.docs": "Dokümantasyon", "nav.changelog": "Değişiklik günlüğü", @@ -275,6 +277,14 @@ export const dict = { "go.graph.freePill": "Big Pickle ve ücretsiz modeller", "go.graph.go": "Go", "go.graph.label": "5 saat başına istekler", + "go.graph.period": "Kullanım", + "go.graph.model": "Model", + "go.graph.requests": "Tahmini istek / 5 saat", + "go.graph.allowance": "Aylık kullanım", + "go.graph.new": "Yeni", + "go.graph.scale": "Doğrusal olmayan istek ölçeği", + "go.graph.showAll": "{{count}} modelin tümünü göster", + "go.graph.showLess": "Daha az model göster", "go.graph.limitedRegions": "sınırlı bölgeler", "go.graph.limitedTime": "sınırlı süre", "go.graph.usageLimits": "Kullanım limitleri", diff --git a/packages/console/app/src/i18n/uk.ts b/packages/console/app/src/i18n/uk.ts index d3002ad84854..4efac1d76762 100644 --- a/packages/console/app/src/i18n/uk.ts +++ b/packages/console/app/src/i18n/uk.ts @@ -2,6 +2,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash отримує 4x ліміти використання протягом обмеженого часу", + "go.graph.bonus": "Ліміт ×{{count}}", "nav.github": "GitHub", "nav.docs": "Документація", "nav.changelog": "Журнал змін", @@ -273,6 +275,14 @@ export const dict = { "go.graph.freePill": "Big Pickle та безкоштовні моделі", "go.graph.go": "Go", "go.graph.label": "Запитів за 5 годин", + "go.graph.period": "Використання", + "go.graph.model": "Модель", + "go.graph.requests": "Оцінка запитів / 5 год", + "go.graph.allowance": "Використання за місяць", + "go.graph.new": "Нове", + "go.graph.scale": "Нелінійна шкала кількості запитів", + "go.graph.showAll": "Показати всі моделі ({{count}})", + "go.graph.showLess": "Показати менше моделей", "go.graph.limitedRegions": "обмежені регіони", "go.graph.limitedTime": "обмежений час", "go.graph.usageLimits": "Ліміти використання", diff --git a/packages/console/app/src/i18n/zh.ts b/packages/console/app/src/i18n/zh.ts index ec6173e2a29a..8c1aff6f6083 100644 --- a/packages/console/app/src/i18n/zh.ts +++ b/packages/console/app/src/i18n/zh.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash 限时享受 4 倍使用额度", + "go.graph.bonus": "{{count}} 倍用量", "nav.github": "GitHub", "nav.docs": "文档", "nav.changelog": "更新日志", @@ -262,6 +264,14 @@ export const dict = { "go.graph.freePill": "Big Pickle 和免费模型", "go.graph.go": "Go", "go.graph.label": "每 5 小时请求数", + "go.graph.period": "使用额度", + "go.graph.model": "模型", + "go.graph.requests": "预估请求数 / 5 小时", + "go.graph.allowance": "每月使用额度", + "go.graph.new": "新", + "go.graph.scale": "请求数采用非线性刻度", + "go.graph.showAll": "查看全部 {{count}} 个模型", + "go.graph.showLess": "收起模型", "go.graph.limitedRegions": "仅限部分地区", "go.graph.limitedTime": "限时", "go.graph.usageLimits": "使用限制", diff --git a/packages/console/app/src/i18n/zht.ts b/packages/console/app/src/i18n/zht.ts index c088b268d8cf..a4a5f4bd4a73 100644 --- a/packages/console/app/src/i18n/zht.ts +++ b/packages/console/app/src/i18n/zht.ts @@ -3,6 +3,8 @@ import { dict as en } from "./en" export const dict = { ...en, + "go.promo.deepseek": "DeepSeek V4.1 Flash 限時享有 4 倍使用額度", + "go.graph.bonus": "{{count}} 倍用量", "nav.github": "GitHub", "nav.docs": "文件", "nav.changelog": "更新日誌", @@ -261,6 +263,14 @@ export const dict = { "go.graph.freePill": "Big Pickle 與免費模型", "go.graph.go": "Go", "go.graph.label": "每 5 小時請求數", + "go.graph.period": "使用額度", + "go.graph.model": "模型", + "go.graph.requests": "預估請求次數 / 5 小時", + "go.graph.allowance": "每月使用額度", + "go.graph.new": "新", + "go.graph.scale": "請求數採用非線性刻度", + "go.graph.showAll": "查看全部 {{count}} 個模型", + "go.graph.showLess": "收起模型", "go.graph.limitedRegions": "僅限部分地區", "go.graph.limitedTime": "限時", "go.graph.usageLimits": "使用限制", diff --git a/packages/console/app/src/lib/language.ts b/packages/console/app/src/lib/language.ts index a196f663db4c..773f63d61508 100644 --- a/packages/console/app/src/lib/language.ts +++ b/packages/console/app/src/lib/language.ts @@ -134,6 +134,34 @@ const DOCS_LOCALE = { "zh-tw": "zht", } as const satisfies Record +// Heading IDs from the localized Go documentation. +const GO_USAGE_LIMITS = { + en: "usage-limits", + zh: "使用限制", + zht: "使用限制", + ko: "사용-한도", + de: "nutzungslimits", + es: "límites-de-uso", + fr: "limites-dutilisation", + it: "limiti-di-utilizzo", + da: "forbrugsgrænser", + ja: "利用制限", + pl: "limity-użycia", + ru: "лимиты-использования", + uk: "usage-limits", + ar: "حدود-الاستخدام", + no: "bruksgrenser", + br: "limites-de-uso", + th: "usage-limits", + tr: "kullanım-limitleri", +} satisfies Record + +export function goUsageLimits(locale: Locale) { + // No Ukrainian Go docs yet; the explicit English path overrides the locale cookie. + if (locale === "uk") return "/docs/en/go/#usage-limits" + return docs(locale, `/docs/go/#${GO_USAGE_LIMITS[locale]}`) +} + function suffix(pathname: string) { const index = pathname.search(/[?#]/) if (index === -1) { diff --git a/packages/console/app/src/routes/go/index.css b/packages/console/app/src/routes/go/index.css index 8193441c941c..6793b6c32bb1 100644 --- a/packages/console/app/src/routes/go/index.css +++ b/packages/console/app/src/routes/go/index.css @@ -363,10 +363,6 @@ body { [data-slot="text"] { color: var(--color-text-strong); line-height: 1.4; - - @media (max-width: 30.625rem) { - display: none; - } } } diff --git a/packages/console/app/src/routes/go/index.tsx b/packages/console/app/src/routes/go/index.tsx index 59bbea8fcbfc..95f0e338947a 100644 --- a/packages/console/app/src/routes/go/index.tsx +++ b/packages/console/app/src/routes/go/index.tsx @@ -17,6 +17,7 @@ import { IconMiniMax, IconMiMo, IconZai, IconAlibaba, IconDeepSeek } from "~/com import { useI18n } from "~/context/i18n" import { useLanguage } from "~/context/language" import { LocaleLinks } from "~/component/locale-links" +import { goUsageLimits } from "~/lib/language" const checkLoggedIn = query(async () => { "use server" @@ -45,11 +46,12 @@ const models = [ { name: "MiniMax M2.7", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, { name: "Muse Spark 1.3 Contributor", training: "go.faq.a5.used", retention: "go.faq.a5.notZdr" }, { name: "Muse Spark 1.2 Contributor", training: "go.faq.a5.used", retention: "go.faq.a5.notZdr" }, + { name: "DeepSeek V4.1 Flash", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, { name: "DeepSeek V4 Pro", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, { name: "DeepSeek V4 Flash", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, + { name: "DeepSeek V4 Flash Vision Exp", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, { name: "Hy4 preview", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, { name: "Hy3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, - { name: "Omen Alpha", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" }, ] as const export default function Home() { @@ -79,6 +81,12 @@ export default function Home() {
+
+ {i18n.t("home.banner.badge")} +
+ {i18n.t("go.promo.deepseek")} +
+
@@ -201,7 +209,7 @@ export default function Home() {
- +
diff --git a/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx b/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx index 868961777ce5..ed3c4d740676 100644 --- a/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx @@ -659,6 +659,7 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
  • Qwen3.7 Max
  • Qwen3.7 Plus
  • Qwen3.6 Plus
  • +
  • DeepSeek V4.1 Flash — {i18n.t("go.graph.bonus", { count: 4 })}
  • DeepSeek V4 Pro
  • DeepSeek V4 Flash
  • DeepSeek V4 Flash Vision Exp
  • @@ -666,8 +667,8 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
  • MiMo-V2.5-Pro
  • Hy4 preview
  • Hy3
  • -
  • Omen Alpha
  • +

    {i18n.t("go.promo.deepseek")}

    {i18n.t("workspace.lite.promo.footer")}