From 794abac482294b7313d56792290af8d249f2355c Mon Sep 17 00:00:00 2001 From: Jason Sujaya Date: Sat, 22 Aug 2026 07:44:34 +0700 Subject: [PATCH] feat(gui): add frontier model shortcuts --- gui/src/i18n/de.ts | 6 ++ gui/src/i18n/en.ts | 6 ++ gui/src/i18n/fr.ts | 6 ++ gui/src/i18n/ja.ts | 6 ++ gui/src/i18n/ko.ts | 6 ++ gui/src/i18n/ru.ts | 6 ++ gui/src/i18n/tr.ts | 6 ++ gui/src/i18n/zh-TW.ts | 6 ++ gui/src/i18n/zh.ts | 6 ++ gui/src/pages/Models.tsx | 63 ++++++++++++++++ gui/src/pages/frontier-route-shortcuts.ts | 87 ++++++++++++++++++++++ gui/src/styles-models-workspace.css | 82 +++++++++++++++++++- gui/tests/frontier-route-shortcuts.test.ts | 45 +++++++++++ gui/tests/models-workspace-panels.test.tsx | 74 ++++++++++++++++-- 14 files changed, 398 insertions(+), 7 deletions(-) create mode 100644 gui/src/pages/frontier-route-shortcuts.ts create mode 100644 gui/tests/frontier-route-shortcuts.test.ts diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 41ae5d02e5..91dfa3b9ef 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -485,6 +485,12 @@ export const de: Record = { "models.nativeHint": "Passthrough-Modelle verwenden die unter Anbieter gewählte Pool- oder Direkt-Option. Ausblenden entfernt sie aus der Codex-Auswahl (Katalogeintrag bleibt, Reaktivierung stellt exakt wieder her). Ein hier hinzugefügtes Modell wird als gerouteter `openai/`-Selektor registriert, nicht als neue reine Passthrough-ID.", "models.active": "{active}/{total} sichtbar", "models.workspace.providers": "Anbieter", + "models.workspace.frontierRoutes": "Frontier-Routen", + "models.workspace.addProvider": "Anbieter hinzufügen", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "Alle Anbieter", "models.workspace.mainAria": "Modelldetails", "models.allOn": "Alle an", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 01d69f0fd1..9a5a1e7e03 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -510,6 +510,12 @@ export const en = { "models.nativeHint": "Passthrough models use the Pool or Direct account option selected on Providers. Toggling one off hides it from the Codex picker (the catalog entry is kept, so re-enabling restores it exactly). Adding a model here registers a routed `openai/` selector, not a new bare passthrough id.", "models.active": "{active}/{total} visible", "models.workspace.providers": "Providers", + "models.workspace.frontierRoutes": "Frontier routes", + "models.workspace.addProvider": "Add provider", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "All providers", "models.workspace.mainAria": "Model details", "models.allOn": "All on", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index 3765f4d95f..9b84873a1f 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -495,6 +495,12 @@ export const fr: Record = { "models.nativeHint": "Les modèles en accès direct utilisent l’option de compte Groupe ou Direct sélectionnée dans Fournisseurs. La désactivation d’un modèle le masque dans le sélecteur Codex (son entrée de catalogue est conservée afin que sa réactivation la restaure à l’identique). Ajouter un modèle ici enregistre un sélecteur routé `openai/`, et non un nouvel identifiant passthrough brut.", "models.active": "{active}/{total} visibles", "models.workspace.providers": "Fournisseurs", + "models.workspace.frontierRoutes": "Modèles de pointe", + "models.workspace.addProvider": "Ajouter un fournisseur", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "Tous les fournisseurs", "models.workspace.mainAria": "Détails du modèle", "models.allOn": "Tout activer", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 63e20efd3b..478d839b34 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -493,6 +493,12 @@ export const ja: Record = { "models.nativeHint": "パススルーモデルはプロバイダーで選択したプールまたはダイレクトアカウントオプションを使用します。一つオフにすると Codex ピッカーから隠します(カタログエントリは保持されるので、再有効化で正確に復元されます)。 ここでモデルを追加すると、bare passthrough id ではなくルーティングされた `openai/` セレクタとして登録されます。", "models.active": "{active}/{total} 表示中", "models.workspace.providers": "プロバイダー", + "models.workspace.frontierRoutes": "最先端モデル", + "models.workspace.addProvider": "プロバイダーを追加", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "すべてのプロバイダー", "models.workspace.mainAria": "モデルの詳細", "models.allOn": "すべてオン", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index b13cd141ff..5eaed1a82d 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -496,6 +496,12 @@ export const ko: Record = { "models.nativeHint": "프로바이더에서 선택한 풀 또는 직접 계정 옵션으로 서빙되는 passthrough 모델입니다. 끄면 Codex 선택기에서 숨겨지고, 카탈로그 항목은 유지되므로 다시 켜면 그대로 복원됩니다. 여기서 모델을 추가하면 bare passthrough id가 아니라 라우팅된 `openai/` selector로 등록됩니다.", "models.active": "{active}/{total} 표시", "models.workspace.providers": "프로바이더", + "models.workspace.frontierRoutes": "프런티어 모델", + "models.workspace.addProvider": "프로바이더 추가", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "모든 프로바이더", "models.workspace.mainAria": "모델 세부정보", "models.allOn": "모두 켜기", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index 05cf793779..89063e3569 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -498,6 +498,12 @@ export const ru: Record = { "models.nativeHint": "Модели сквозного проброса используют режим аккаунта (пул или прямое подключение), выбранный на странице «Провайдеры». Отключение модели скрывает её из селектора Codex (запись в каталоге сохраняется, поэтому при повторном включении она восстанавливается в точности). Добавление модели здесь регистрирует маршрутизируемый селектор `openai/`, а не новый «голый» passthrough-идентификатор.", "models.active": "{active}/{total} видимо", "models.workspace.providers": "Провайдеры", + "models.workspace.frontierRoutes": "Передовые модели", + "models.workspace.addProvider": "Добавить провайдера", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "Все провайдеры", "models.workspace.mainAria": "Сведения о моделях", "models.allOn": "Все вкл.", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index c98421183e..41f16ea7fb 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -501,6 +501,12 @@ export const tr: Record = { "models.nativeHint": "Doğrudan geçiş modelleri Sağlayıcılar bölümünde seçilen Havuz veya Doğrudan seçeneğini kullanır. Buradan model eklemek, yeni bir düz passthrough kimliği değil, yönlendirilmiş bir `openai/` seçici kaydeder.", "models.active": "{active}/{total} görünür", "models.workspace.providers": "Sağlayıcılar", + "models.workspace.frontierRoutes": "Öncü modeller", + "models.workspace.addProvider": "Sağlayıcı ekle", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "Tüm sağlayıcılar", "models.workspace.mainAria": "Model detayları", "models.allOn": "Tümünü aç", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index d35a96bd34..aa648ee4c2 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -377,6 +377,12 @@ export const zhTW: Record = { "models.nativeHint": "Passthrough 模型使用在供應商頁面選擇的帳號池或直連選項。關閉後會從 Codex 選擇器中隱藏(目錄條目保留,重新開啟即可完整恢復)。 在此新增模型會註冊為路由的 `openai/` 選擇器,而非新的裸 passthrough id。", "models.active": "{active}/{total} 已啟用", "models.workspace.providers": "供應商", + "models.workspace.frontierRoutes": "前沿模型", + "models.workspace.addProvider": "新增供應商", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "所有供應商", "models.workspace.mainAria": "模型詳細資料", "models.allOn": "全部開啟", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index dc749ac530..dbddf32e1f 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -493,6 +493,12 @@ export const zh: Record = { "models.nativeHint": "Passthrough 模型使用在提供方页面选择的账户池或直连选项。关闭后会从 Codex 选择器中隐藏(目录条目保留,重新开启即可完整恢复)。 在此添加模型将注册为路由的 `openai/` 选择器,而不是新的裸 passthrough id。", "models.active": "{active}/{total} 可见", "models.workspace.providers": "提供方", + "models.workspace.frontierRoutes": "前沿模型", + "models.workspace.addProvider": "添加提供方", + "models.workspace.xaiGrok": "xAI Grok", + "models.workspace.cursorGrok": "Cursor Grok", + "models.workspace.opus5": "Claude Opus 5", + "models.workspace.fable5": "Claude Fable 5", "models.workspace.allProviders": "所有提供方", "models.workspace.mainAria": "模型详情", "models.allOn": "全部开启", diff --git a/gui/src/pages/Models.tsx b/gui/src/pages/Models.tsx index 13853249a4..db99092e10 100644 --- a/gui/src/pages/Models.tsx +++ b/gui/src/pages/Models.tsx @@ -14,6 +14,7 @@ import { readSessionListCache, writeSessionListCache } from "../session-list-cac import { setClientResourceData } from "../client-resource"; import { createBoundedFetch } from "../bounded-fetch"; import { startVisibilityPoll } from "../visibility-poll"; +import { navigateHash } from "../hash-routing"; import { useDataSurface } from "../data-surface"; import { DataSurfaceSkeleton } from "../components/data-surface"; import ErrorBoundary from "../components/ErrorBoundary"; @@ -68,6 +69,7 @@ import { import { EmptyProviderHint } from "./models-provider-hints"; import { shadowCallModelOptions } from "./dashboard-shared"; import { shadowSourceModelBadge, shadowSourceModelLabel } from "./shadow-call-source"; +import { buildFrontierRouteShortcuts } from "./frontier-route-shortcuts"; type CachedModelsPage = { models: ModelRow[]; @@ -1313,6 +1315,28 @@ export default function Models({ apiBase, restartEpoch = 0 }: { apiBase: string; ? groups.filter(group => group.provider === selectedProvider) : groups; + const frontierShortcuts = useMemo( + () => buildFrontierRouteShortcuts(models, new Set(groups.map(group => group.provider))), + [groups, models], + ); + + const focusFrontierRoute = (provider: string, query: string, providerConfigured: boolean) => { + if (!providerConfigured) { + navigateHash("providers"); + return; + } + setSelectedProvider(provider); + setSearch(previous => ({ ...previous, [provider]: query })); + setLimit(previous => ({ ...previous, [provider]: PAGE })); + setCollapsed(previous => { + if (!previous.has(provider)) return previous; + const next = new Set(previous); + next.delete(provider); + writeCollapsedProviders(next); + return next; + }); + }; + const controlsBlock = ( <>
@@ -1859,6 +1883,45 @@ export default function Models({ apiBase, restartEpoch = 0 }: { apiBase: string; {t("models.workspace.providers")} {groups.length}
+
+ {t("models.workspace.frontierRoutes")} +
+ {frontierShortcuts.map(shortcut => { + const selected = shortcut.providerConfigured + && selectedProvider === shortcut.provider + && (search[shortcut.provider] ?? "") === shortcut.query; + const label = shortcut.id === "xai-grok" + ? t("models.workspace.xaiGrok") + : shortcut.id === "cursor-grok" + ? t("models.workspace.cursorGrok") + : shortcut.id === "opus-5" + ? t("models.workspace.opus5") + : t("models.workspace.fable5"); + return ( + + ); + })} +
+