Skip to content

Commit c41aed9

Browse files
committed
fix(gui): render the intercepted models the runtime reports
The shadow-call badges and tooltips spelled out a model slug in every locale, so each client bump needed six translation edits and the labels were wrong until someone made them. They now read the list the management API sends, with a fallback only for a runtime too old to report it.
1 parent 7d9d260 commit c41aed9

11 files changed

Lines changed: 41 additions & 35 deletions

File tree

gui/src/i18n/de.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,13 @@ export const de: Record<TKey, string> = {
185185
"dash.visionSidecar": "Vision-Sidecar",
186186
"dash.visionSidecarHint": "Backend und Modell zur Bildbeschreibung für reine Textmodelle auswählen.",
187187
"dash.shadowCallIntercept": "Shadow-Call-Abfangen",
188-
"dash.shadowCallInterceptHint": "Fängt die gpt-5.4-mini-Hintergrundaufrufe der Codex-App ab und leitet sie an das gewählte Modell um. Effort wird auf low fixiert.",
189-
"dash.shadowCallWarning": "⚠ Bei Aktivierung werden ALLE gpt-5.4-mini-Anfragen durch das gewählte Modell ersetzt.",
188+
"dash.shadowCallInterceptHint": "Fängt die Hintergrund-Hilfsaufrufe der Codex-App ({models}) ab und leitet sie an das gewählte Modell um. Effort wird auf low fixiert.",
189+
"dash.shadowCallWarning": "⚠ Bei Aktivierung werden ALLE Anfragen an {models} durch das gewählte Modell ersetzt.",
190190
"dash.shadowCallOriginal": "Original",
191191
"dash.shadowCallModel": "Ersatzmodell",
192-
"dash.shadowCallTooltip": "Die Codex-App verwendet gpt-5.4-mini im Hintergrund für Titelgenerierung, Commit-Nachrichten und Skill-Orchestrierung.",
192+
"dash.shadowCallTooltip": "Die Codex-App ruft im Hintergrund ein Hilfsmodell für Titelgenerierung, Commit-Nachrichten und Skill-Orchestrierung auf. Das Modell wechselt zwischen Client-Versionen, daher fängt opencodex diesen Satz ab: {models}.",
193193
"models.shadowCallIntercept": "Shadow-Call-Abfangen",
194-
"models.shadowCallInterceptHint": "Fängt die gpt-5.4-mini-Hintergrundaufrufe der Codex-App ab und leitet sie an das gewählte Modell um.",
194+
"models.shadowCallInterceptHint": "Fängt die Hintergrund-Hilfsaufrufe der Codex-App ({models}) ab und leitet sie an das gewählte Modell um.",
195195
"dash.sidecarBackend": "Backend",
196196
"dash.sidecarModel": "Modell",
197197
"dash.backendAuto": "Automatisch",
@@ -374,7 +374,7 @@ export const de: Record<TKey, string> = {
374374
"models.contextCapped": "350k-Limit",
375375
"models.contextCapLabel": "Kontext-Limit",
376376
"models.v2Label": "Sub-Agent",
377-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
377+
"models.shadowCallOriginal": "⚠ {models} →",
378378
"models.v2DocsLink": "Was ist v1 / v2?",
379379
"models.v2Mode_v1": "v1",
380380
"models.v2Mode_default": "base",

gui/src/i18n/en.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,13 @@ export const en = {
195195
"dash.visionSidecar": "Vision sidecar",
196196
"dash.visionSidecarHint": "Choose the backend and model used to describe images for text-only routed models.",
197197
"dash.shadowCallIntercept": "Shadow Call Intercept",
198-
"dash.shadowCallInterceptHint": "Intercepts Codex App's background gpt-5.4-mini calls (title generation, commit messages) and redirects them to your chosen model. Effort is fixed to low.",
199-
"dash.shadowCallWarning": "⚠ When enabled, ALL gpt-5.4-mini requests will be replaced with the selected model.",
198+
"dash.shadowCallInterceptHint": "Intercepts Codex App's background helper calls ({models}) for title generation and commit messages and redirects them to your chosen model. Effort is fixed to low.",
199+
"dash.shadowCallWarning": "⚠ When enabled, ALL requests for {models} will be replaced with the selected model.",
200200
"dash.shadowCallOriginal": "Original",
201201
"dash.shadowCallModel": "Replacement model",
202-
"dash.shadowCallTooltip": "Codex App uses gpt-5.4-mini in the background for thread title generation, commit message generation, and skill orchestration. Enable this to redirect those calls to your chosen model.",
202+
"dash.shadowCallTooltip": "Codex App makes background helper calls for thread title generation, commit message generation, and skill orchestration. The helper model changed across client versions, so opencodex intercepts every model in this set: {models}. Enable this to redirect those calls to your chosen model.",
203203
"models.shadowCallIntercept": "Shadow Call Intercept",
204-
"models.shadowCallInterceptHint": "Intercepts Codex App's background gpt-5.4-mini calls (titles, commit messages) and redirects them to your chosen model.",
204+
"models.shadowCallInterceptHint": "Intercepts Codex App's background helper calls ({models}) for titles and commit messages and redirects them to your chosen model.",
205205
"dash.sidecarBackend": "Backend",
206206
"dash.sidecarModel": "Model",
207207
"dash.backendAuto": "Auto",
@@ -391,7 +391,7 @@ export const en = {
391391
"models.contextCapped": "350k cap",
392392
"models.contextCapLabel": "Context cap",
393393
"models.v2Label": "Sub-agent",
394-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
394+
"models.shadowCallOriginal": "⚠ {models} →",
395395
"models.v2DocsLink": "What is v1 / v2?",
396396
"models.v2Mode_v1": "v1",
397397
"models.v2Mode_default": "base",

gui/src/i18n/ja.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,13 @@ export const ja: Record<TKey, string> = {
194194
"dash.visionSidecar": "ビジョンサイドカー",
195195
"dash.visionSidecarHint": "テキスト専用ルーティングモデルで画像を説明するために使うバックエンドとモデルを選択します。",
196196
"dash.shadowCallIntercept": "シャドウコール傍受",
197-
"dash.shadowCallInterceptHint": "Codex App のバックグラウンド gpt-5.4-mini 呼び出し(タイトル生成、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。負荷は low に固定されます。",
198-
"dash.shadowCallWarning": "⚠ オンにすると、すべての gpt-5.4-mini リクエストが選択したモデルに置き換えられます。",
197+
"dash.shadowCallInterceptHint": "Codex App のバックグラウンドヘルパー呼び出し({models}: タイトル生成、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。負荷は low に固定されます。",
198+
"dash.shadowCallWarning": "⚠ オンにすると、{models} へのリクエストがすべて選択したモデルに置き換えられます。",
199199
"dash.shadowCallOriginal": "元のモデル",
200200
"dash.shadowCallModel": "差し替えモデル",
201-
"dash.shadowCallTooltip": "Codex App はバックグラウンドでスレッドタイトル生成、コミットメッセージ生成、スキルオーケストレーションに gpt-5.4-mini を使います。これをオンにすると、それらの呼び出しを選択したモデルにリダイレクトします。",
201+
"dash.shadowCallTooltip": "Codex App はスレッドタイトル生成、コミットメッセージ生成、スキルオーケストレーションをバックグラウンドで呼び出します。使われるモデルはクライアントのバージョンによって変わるため、opencodex は {models} をまとめて傍受します。これをオンにすると、それらの呼び出しを選択したモデルにリダイレクトします。",
202202
"models.shadowCallIntercept": "シャドウコール傍受",
203-
"models.shadowCallInterceptHint": "Codex App のバックグラウンド gpt-5.4-mini 呼び出し(タイトル、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。",
203+
"models.shadowCallInterceptHint": "Codex App のバックグラウンドヘルパー呼び出し({models}: タイトル、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。",
204204
"dash.sidecarBackend": "バックエンド",
205205
"dash.sidecarModel": "モデル",
206206
"dash.backendAuto": "自動",
@@ -382,7 +382,7 @@ export const ja: Record<TKey, string> = {
382382
"models.contextCapped": "350k 上限",
383383
"models.contextCapLabel": "コンテキスト上限",
384384
"models.v2Label": "サブエージェント",
385-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
385+
"models.shadowCallOriginal": "⚠ {models} →",
386386
"models.v2DocsLink": "v1 / v2 とは?",
387387
"models.v2Mode_v1": "v1",
388388
"models.v2Mode_default": "ベース",

gui/src/i18n/ko.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,13 @@ export const ko: Record<TKey, string> = {
189189
"dash.visionSidecar": "비전 사이드카",
190190
"dash.visionSidecarHint": "텍스트 전용 라우팅 모델이 이미지를 읽을 때 쓸 백엔드와 모델을 고릅니다.",
191191
"dash.shadowCallIntercept": "쉐도우 호출 가로채기",
192-
"dash.shadowCallInterceptHint": "Codex 앱이 제목·커밋 메시지 생성에 쓰는 gpt-5.4-mini 백그라운드 호출을 가로채 선택한 모델로 바꿉니다. effort는 low로 고정됩니다.",
193-
"dash.shadowCallWarning": "⚠ 활성화하면 모든 gpt-5.4-mini 요청이 선택한 모델로 대체됩니다.",
192+
"dash.shadowCallInterceptHint": "Codex 앱이 제목·커밋 메시지 생성에 쓰는 백그라운드 호출({models})을 가로채 선택한 모델로 바꿉니다. effort는 low로 고정됩니다.",
193+
"dash.shadowCallWarning": "⚠ 활성화하면 {models} 요청이 모두 선택한 모델로 대체됩니다.",
194194
"dash.shadowCallOriginal": "원본",
195195
"dash.shadowCallModel": "대체 모델",
196-
"dash.shadowCallTooltip": "Codex 앱은 스레드 제목 자동 생성, 커밋 메시지 생성, 스킬 오케스트레이션 내부 작업에 gpt-5.4-mini를 백그라운드로 호출합니다. 이 설정을 켜면 해당 호출을 선택한 모델로 리다이렉트합니다.",
196+
"dash.shadowCallTooltip": "Codex 앱은 스레드 제목 자동 생성, 커밋 메시지 생성, 스킬 오케스트레이션 같은 내부 작업을 백그라운드로 호출합니다. 이때 쓰는 모델은 클라이언트 버전마다 달라서 opencodex는 {models}를 모두 가로챕니다. 이 설정을 켜면 해당 호출이 선택한 모델로 넘어갑니다.",
197197
"models.shadowCallIntercept": "쉐도우 호출 가로채기",
198-
"models.shadowCallInterceptHint": "Codex 앱의 백그라운드 gpt-5.4-mini 호출(제목·커밋 메시지)을 가로채 선택한 모델로 바꿉니다.",
198+
"models.shadowCallInterceptHint": "Codex 앱의 백그라운드 호출({models}, 제목·커밋 메시지)을 가로채 선택한 모델로 바꿉니다.",
199199
"dash.sidecarBackend": "백엔드",
200200
"dash.sidecarModel": "모델",
201201
"dash.backendAuto": "자동",
@@ -385,7 +385,7 @@ export const ko: Record<TKey, string> = {
385385
"models.contextCapped": "350k 제한",
386386
"models.contextCapLabel": "컨텍스트 제한",
387387
"models.v2Label": "서브에이전트",
388-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
388+
"models.shadowCallOriginal": "⚠ {models} →",
389389
"models.v2Mode_v1": "v1",
390390
"models.v2Mode_default": "base",
391391
"models.v2Mode_v2": "v2",

gui/src/i18n/ru.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,13 @@ export const ru: Record<TKey, string> = {
194194
"dash.visionSidecar": "Сайдкар для изображений",
195195
"dash.visionSidecarHint": "Выберите бэкенд и модель, которые описывают изображения для маршрутизируемых моделей, работающих только с текстом.",
196196
"dash.shadowCallIntercept": "Перехват теневых вызовов",
197-
"dash.shadowCallInterceptHint": "Перехватывает фоновые вызовы gpt-5.4-mini из Codex App (генерация заголовков, сообщений коммитов) и перенаправляет их на выбранную вами модель. Уровень рассуждений жёстко задан как low.",
198-
"dash.shadowCallWarning": "⚠ Когда функция включена, ВСЕ запросы к gpt-5.4-mini будут заменены выбранной моделью.",
197+
"dash.shadowCallInterceptHint": "Перехватывает фоновые служебные вызовы Codex App ({models}: генерация заголовков, сообщений коммитов) и перенаправляет их на выбранную вами модель. Уровень рассуждений жёстко задан как low.",
198+
"dash.shadowCallWarning": "⚠ Когда функция включена, ВСЕ запросы к {models} будут заменены выбранной моделью.",
199199
"dash.shadowCallOriginal": "Оригинал",
200200
"dash.shadowCallModel": "Модель-замена",
201-
"dash.shadowCallTooltip": "Codex App использует gpt-5.4-mini в фоновом режиме для генерации заголовков тредов, сообщений коммитов и оркестрации навыков. Включите эту функцию, чтобы перенаправлять такие вызовы на выбранную вами модель.",
201+
"dash.shadowCallTooltip": "Codex App в фоновом режиме вызывает служебную модель для генерации заголовков тредов, сообщений коммитов и оркестрации навыков. Эта модель менялась между версиями клиента, поэтому opencodex перехватывает весь набор: {models}. Включите функцию, чтобы перенаправлять такие вызовы на выбранную вами модель.",
202202
"models.shadowCallIntercept": "Перехват теневых вызовов",
203-
"models.shadowCallInterceptHint": "Перехватывает фоновые вызовы gpt-5.4-mini из Codex App (заголовки, сообщения коммитов) и перенаправляет их на выбранную вами модель.",
203+
"models.shadowCallInterceptHint": "Перехватывает фоновые служебные вызовы Codex App ({models}: заголовки, сообщения коммитов) и перенаправляет их на выбранную вами модель.",
204204
"dash.sidecarBackend": "Бэкенд",
205205
"dash.sidecarModel": "Модель",
206206
"dash.backendAuto": "Авто",
@@ -387,7 +387,7 @@ export const ru: Record<TKey, string> = {
387387
"models.contextCapped": "Лимит 350k",
388388
"models.contextCapLabel": "Лимит контекста",
389389
"models.v2Label": "Подагент",
390-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
390+
"models.shadowCallOriginal": "⚠ {models} →",
391391
"models.v2DocsLink": "Что такое v1 / v2?",
392392
"models.v2Mode_v1": "v1",
393393
"models.v2Mode_default": "base",

gui/src/i18n/zh.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,13 @@ export const zh: Record<TKey, string> = {
189189
"dash.visionSidecar": "视觉附属服务",
190190
"dash.visionSidecarHint": "选择纯文本路由模型描述图像时使用的后端和模型。",
191191
"dash.shadowCallIntercept": "影子调用拦截",
192-
"dash.shadowCallInterceptHint": "拦截 Codex 应用的 gpt-5.4-mini 后台调用(标题生成、提交消息)并重定向到所选模型。effort 固定为 low。",
193-
"dash.shadowCallWarning": "⚠ 启用后,所有 gpt-5.4-mini 请求将被替换为所选模型。",
192+
"dash.shadowCallInterceptHint": "拦截 Codex 应用的后台辅助调用({models}:标题生成、提交消息)并重定向到所选模型。effort 固定为 low。",
193+
"dash.shadowCallWarning": "⚠ 启用后,所有对 {models} 的请求都将被替换为所选模型。",
194194
"dash.shadowCallOriginal": "原始",
195195
"dash.shadowCallModel": "替代模型",
196-
"dash.shadowCallTooltip": "Codex 应用在后台使用 gpt-5.4-mini 进行线程标题生成、提交消息生成和技能编排。启用此选项可将这些调用重定向到您选择的模型。",
196+
"dash.shadowCallTooltip": "Codex 应用会在后台调用辅助模型来生成线程标题、提交消息以及进行技能编排。该模型随客户端版本变化,因此 opencodex 会同时拦截这些模型:{models}。启用此选项可将这些调用重定向到您选择的模型。",
197197
"models.shadowCallIntercept": "影子调用拦截",
198-
"models.shadowCallInterceptHint": "拦截 Codex 应用的 gpt-5.4-mini 后台调用并重定向到所选模型。",
198+
"models.shadowCallInterceptHint": "拦截 Codex 应用的后台辅助调用({models})并重定向到所选模型。",
199199
"dash.sidecarBackend": "后端",
200200
"dash.sidecarModel": "模型",
201201
"dash.backendAuto": "自动",
@@ -382,7 +382,7 @@ export const zh: Record<TKey, string> = {
382382
"models.contextCapped": "350k 限制",
383383
"models.contextCapLabel": "上下文限制",
384384
"models.v2Label": "子代理",
385-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
385+
"models.shadowCallOriginal": "⚠ {models} →",
386386
"models.v2Mode_v1": "v1",
387387
"models.v2Mode_default": "base",
388388
"models.v2Mode_v2": "v2",

gui/src/pages/Models.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import {
4545
type V2Status,
4646
} from "./models-shared";
4747
import { EmptyProviderHint } from "./models-provider-hints";
48+
import { shadowSourceModelBadge, shadowSourceModelLabel } from "./shadow-call-source";
4849

4950
type CachedModelsPage = {
5051
models: ModelRow[];
@@ -889,8 +890,8 @@ export default function Models({ apiBase }: { apiBase: string }) {
889890
<>
890891
<div className="models-control-top-row">
891892
<div className="models-shadow-row row muted text-control" aria-busy={!shadowCall || undefined}>
892-
<span className="models-shadow-label">{t("models.shadowCallIntercept")} <Tooltip content={t("models.shadowCallInterceptHint")} side="top" maxWidth={320}><span style={{ cursor: "help" }} aria-label={t("models.shadowCallInterceptHint")}></span></Tooltip></span>
893-
<code className="text-caption models-shadow-warning" style={{ opacity: 0.6 }}>{t("models.shadowCallOriginal")}</code>
893+
<span className="models-shadow-label">{t("models.shadowCallIntercept")} <Tooltip content={t("models.shadowCallInterceptHint", { models: shadowSourceModelLabel(shadowCall?.sourceModels) })} side="top" maxWidth={320}><span style={{ cursor: "help" }} aria-label={t("models.shadowCallInterceptHint", { models: shadowSourceModelLabel(shadowCall?.sourceModels) })}></span></Tooltip></span>
894+
<code className="text-caption models-shadow-warning" style={{ opacity: 0.6 }}>{t("models.shadowCallOriginal", { models: shadowSourceModelBadge(shadowCall?.sourceModels) })}</code>
894895
<Switch on={shadowCall?.enabled ?? false} onClick={() => void saveShadowCall({ enabled: !shadowCall?.enabled })} disabled={!shadowCall || shadowCallSaving} label={t("models.shadowCallIntercept")} />
895896
<div className="models-shadow-model-slot">
896897
<Select value={shadowCall?.model ?? ""} options={[{ value: "", label: "\u2014" }, ...shadowModelOptions]} onChange={v => { setShadowCall(c => c ? { ...c, model: v } : c); void saveShadowCall({ model: v }); }} disabled={!shadowCall || shadowCallSaving || !shadowCall.enabled} label={t("models.shadowCallIntercept")} />

gui/src/pages/dashboard-dialogs.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type UpdateChannel,
66
} from "./dashboard-shared";
77
import type { useDashboardData } from "./use-dashboard-data";
8+
import { shadowSourceModelLabel } from "./shadow-call-source";
89

910
type Dash = ReturnType<typeof useDashboardData>;
1011

@@ -17,6 +18,7 @@ export function DashboardDialogs(d: Dash) {
1718
maHelpOpen, setMaHelpOpen, maHelpDialogRef,
1819
effortCapHelpOpen, setEffortCapHelpOpen, effortCapHelpDialogRef,
1920
shadowCallHelpOpen, setShadowCallHelpOpen, shadowCallHelpDialogRef,
21+
shadowCall,
2022
} = d;
2123

2224
return (
@@ -199,7 +201,7 @@ export function DashboardDialogs(d: Dash) {
199201
<button type="button" className="btn btn-ghost btn-icon" onClick={() => setShadowCallHelpOpen(false)} aria-label={t("common.close")}><IconX /></button>
200202
</div>
201203
<div className="modal-desc leading-relaxed" style={{ whiteSpace: "pre-line" }}>
202-
{t("dash.shadowCallTooltip")}
204+
{t("dash.shadowCallTooltip", { models: shadowSourceModelLabel(shadowCall?.sourceModels) })}
203205
</div>
204206
<div className="modal-actions">
205207
<button type="button" className="btn btn-primary" onClick={() => setShadowCallHelpOpen(false)}>{t("common.ok")}</button>

0 commit comments

Comments
 (0)