Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ fall back to 350k.
`ANTHROPIC_SMALL_FAST_MODEL`. The effective Haiku is `tierModels.haiku ?? smallFastModel`, fed
to both Haiku variables.

When both `tierModels.haiku` and `smallFastModel` are absent, OpenCodex leaves both helper variables unset; Claude Code then chooses its native helper model (currently Sonnet), which may incur native-provider charges.

## Roster agents (injectAgents)

`ocx claude` (and the system-env daemon) syncs your featured subagent roster (Subagents tab,
Expand Down
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/ja/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ Claude ページで圧縮値を調整できます。**警告:** モデルの実
`ANTHROPIC_SMALL_FAST_MODEL` です。実際の Haiku 値は `tierModels.haiku ?? smallFastModel` で、
両 Haiku 変数に入ります。

`tierModels.haiku` と `smallFastModel` の両方がない場合、OpenCodex は 2 つのヘルパーモデル変数を未設定のままにします。その後 Claude Code がネイティブのヘルパーモデル(現在は Sonnet)を選択し、ネイティブプロバイダーで料金が発生する可能性があります。

## ロスターエージェント(injectAgents)

`ocx claude` とシステム環境デーモンは推奨サブエージェントロスター(Subagents タブ、最大 5 モデル)と
Expand Down
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/ko/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ Claude 페이지에서 압축 값을 조절할 수 있어요. **경고:** 모델
`ANTHROPIC_SMALL_FAST_MODEL`이에요. 실제 Haiku 값은 `tierModels.haiku ?? smallFastModel`이며,
두 Haiku 변수에 모두 들어가요.

`tierModels.haiku`와 `smallFastModel`이 모두 없으면 OpenCodex는 두 보조 모델 변수를 설정하지 않아요. 그러면 Claude Code가 네이티브 보조 모델(현재 Sonnet)을 선택하며, 네이티브 프로바이더 요금이 발생할 수 있어요.

## 로스터 에이전트(injectAgents)

`ocx claude`와 시스템 환경 데몬은 추천 서브에이전트 로스터(Subagents 탭, 최대 5개 모델)와
Expand Down
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/ru/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ shell-файлом: `ANTHROPIC_MODEL`, четыре `ANTHROPIC_DEFAULT_{OPUS,SON
устаревший `ANTHROPIC_SMALL_FAST_MODEL`. Эффективное значение Haiku — `tierModels.haiku ??
smallFastModel`; оно подставляется в обе переменные Haiku.

Если отсутствуют и `tierModels.haiku`, и `smallFastModel`, OpenCodex оставляет обе переменные вспомогательной модели незаданными. Затем Claude Code выбирает нативную вспомогательную модель (сейчас Sonnet), что может привести к расходам у нативного провайдера.

## Агенты из ростера (injectAgents)

`ocx claude` (и демон системного окружения) синхронизирует ваш ростер избранных подагентов
Expand Down
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/zh-cn/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ user-agent 会获得易读的 CLI 形式,其他客户端会获得 Desktop 哈
`ANTHROPIC_SMALL_FAST_MODEL`。有效 Haiku 值为 `tierModels.haiku ?? smallFastModel`,并会
提供给两个 Haiku 变量。

当 `tierModels.haiku` 和 `smallFastModel` 均未设置时,OpenCodex 会让两个辅助模型变量保持未设置;随后 Claude Code 会选择其原生辅助模型(目前为 Sonnet),并可能产生原生提供方费用。

## 名册代理(injectAgents)

`ocx claude`(以及系统环境守护进程)会把你的精选子代理名册(Subagents 标签页,最多 5 个模型)
Expand Down
10 changes: 10 additions & 0 deletions gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,13 @@ export const de = {
"models.noRoutedHint": "Melde dich zuerst bei einem Anbieter an oder füge einen hinzu.",
"models.emptyDiscovery": "Es wurden keine Modelle gefunden. Prüfe den Anbieter-Endpunkt oder füge ein statisches/eigenes Modell hinzu.",
"models.emptyDiscoveryDisabled": "Die Live-Modellerkennung ist aus und es sind keine statischen Modelle konfiguriert.",
"models.discoveryFailedBadge": "Erkennung fehlgeschlagen",
"models.discoveryFailedHttp": "Die Modellerkennung ist fehlgeschlagen (HTTP {status}).",
"models.discoveryFailedBlocked": "Die Modellerkennung wurde durch die Zielrichtlinie blockiert.",
"models.discoveryFailedInvalidResponse": "Die Modellerkennung lieferte eine ungültige Antwort.",
"models.discoveryFailedNetwork": "Die Modellerkennung ist an einem Netzwerkfehler gescheitert.",
"models.discoveryFailedProvider": "Der Anbieter meldete einen Fehler bei der Modellerkennung.",
"models.discoveryFailedGeneric": "Die Modellerkennung ist fehlgeschlagen.",
"models.openProviderSettings": "Anbietereinstellungen öffnen",
"models.loading": "Lädt…",
"models.search": "Modelle suchen…",
Expand Down Expand Up @@ -716,6 +723,9 @@ export const de = {
"claude.manualEnv": "Manuelle Einrichtung (erweitert)",
"claude.smallFastModel": "Hintergrund-Hilfsmodell",
"claude.smallFastModelHint": "Das Modell für Hintergrundarbeit wie Chat-Zusammenfassungen und Themenerkennung. Auch der haiku-Alias der Subagenten nutzt es. Leer = Claude-Standard (Haiku).",
"claude.smallFastModelAccurateHint": "Das Modell, das Claude Code für Hintergrundaufgaben wie Chat-Zusammenfassungen und Themenerkennung verwendet. Auch der haiku-Alias der Subagenten nutzt es.",
"claude.smallFastModelUnsetOption": "Claude Code wählen lassen (natives Modell)",
"claude.smallFastModelNativeWarning": "Wenn kein Modell gewählt ist, setzt OpenCodex keine Hilfsmodell-Overrides. Claude Code kann dann sein natives Sonnet-Modell verwenden, wodurch Kosten bei deinem nativen Anbieter entstehen können.",
"claude.slotUnset": "Claude-Standard verwenden",
"claude.modelMap": "Modell-Abfangen",
"claude.modelMapHint": "Fängt Anfragen für ein bestimmtes Modell ab und leitet sie an das gewählte Modell um. Standardmäßig leer — wirkt erst mit einer Regel.",
Expand Down
10 changes: 10 additions & 0 deletions gui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,13 @@ export const en = {
"models.noRoutedHint": "Log into a provider or add one first.",
"models.emptyDiscovery": "No models were discovered. Check the provider endpoint or add a static/custom model.",
"models.emptyDiscoveryDisabled": "Live model discovery is off and no static models are configured.",
"models.discoveryFailedBadge": "Discovery failed",
"models.discoveryFailedHttp": "Model discovery failed (HTTP {status}).",
"models.discoveryFailedBlocked": "Model discovery was blocked by the destination policy.",
"models.discoveryFailedInvalidResponse": "Model discovery returned an invalid response.",
"models.discoveryFailedNetwork": "Model discovery failed due to a network error.",
"models.discoveryFailedProvider": "The provider reported a model discovery error.",
"models.discoveryFailedGeneric": "Model discovery failed.",
"models.openProviderSettings": "Open provider settings",
"models.loading": "Loading…",
"models.search": "Search models…",
Expand Down Expand Up @@ -1023,6 +1030,9 @@ export const en = {
"claude.manualEnv": "Manual setup (advanced)",
"claude.smallFastModel": "Background helper model",
"claude.smallFastModelHint": "The model Claude Code uses for background work like chat summaries and topic detection. The haiku subagent alias uses it too. Empty = Claude default (Haiku).",
"claude.smallFastModelAccurateHint": "The model Claude Code uses for background work such as chat summaries and topic detection. The haiku subagent alias uses it too.",
"claude.smallFastModelUnsetOption": "Let Claude Code choose (native model)",
"claude.smallFastModelNativeWarning": "When unset, OpenCodex leaves the helper-model overrides unset. Claude Code may use its native Sonnet model, which may incur charges from your native provider.",
"claude.slotUnset": "Use Claude default",
"claude.modelMap": "Model interception",
"claude.modelMapHint": "Intercepts requests for a specific model and reroutes them to the one you pick. Empty by default — nothing happens until you add a rule.",
Expand Down
10 changes: 10 additions & 0 deletions gui/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,13 @@ export const ja: Record<TKey, string> = {
"models.noRoutedHint": "まずプロバイダーにログインするか追加してください。",
"models.emptyDiscovery": "モデルが見つかりませんでした。プロバイダーのエンドポイントを確認するか、静的/カスタムモデルを追加してください。",
"models.emptyDiscoveryDisabled": "ライブモデル検出がオフで、静的モデルも設定されていません。",
"models.discoveryFailedBadge": "検出に失敗",
"models.discoveryFailedHttp": "モデル検出に失敗しました(HTTP {status})。",
"models.discoveryFailedBlocked": "モデル検出は宛先ポリシーによりブロックされました。",
"models.discoveryFailedInvalidResponse": "モデル検出が無効な応答を返しました。",
"models.discoveryFailedNetwork": "ネットワークエラーによりモデル検出に失敗しました。",
"models.discoveryFailedProvider": "プロバイダーがモデル検出エラーを報告しました。",
"models.discoveryFailedGeneric": "モデル検出に失敗しました。",
"models.openProviderSettings": "プロバイダー設定を開く",
"models.loading": "読み込み中…",
"models.search": "モデルを検索…",
Expand Down Expand Up @@ -978,6 +985,9 @@ export const ja: Record<TKey, string> = {
"claude.manualEnv": "手動セットアップ(高度)",
"claude.smallFastModel": "バックグラウンドヘルパーモデル",
"claude.smallFastModelHint": "チャットの要約やトピック検出のようなバックグラウンド作業に Claude Code が使うモデルです。haiku サブエージェントエイリアスもこれを使います。空 = Claude デフォルト(Haiku)。",
"claude.smallFastModelAccurateHint": "チャットの要約やトピック検出など、Claude Code がバックグラウンド処理に使うモデルです。サブエージェントの haiku エイリアスもこのモデルを使います。",
"claude.smallFastModelUnsetOption": "Claude Code に選択させる(ネイティブモデル)",
"claude.smallFastModelNativeWarning": "未設定の場合、OpenCodex はヘルパーモデルの上書きを設定しません。Claude Code がネイティブの Sonnet モデルを使用し、ネイティブプロバイダーで料金が発生する可能性があります。",
"claude.slotUnset": "Claude デフォルトを使用",
"claude.modelMap": "モデルの傍受",
"claude.modelMapHint": "特定モデルへのリクエストを傍受し、選んだモデルに再ルーティングします。デフォルトは空 — ルールを追加するまで何も起きません。",
Expand Down
10 changes: 10 additions & 0 deletions gui/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,13 @@ export const ko: Record<TKey, string> = {
"models.noRoutedHint": "먼저 프로바이더에 로그인하거나 추가하세요.",
"models.emptyDiscovery": "발견된 모델이 없습니다. 프로바이더 엔드포인트를 확인하거나 정적/사용자 모델을 추가하세요.",
"models.emptyDiscoveryDisabled": "실시간 모델 검색이 꺼져 있고 정적 모델도 설정되지 않았습니다.",
"models.discoveryFailedBadge": "검색 실패",
"models.discoveryFailedHttp": "모델 검색에 실패했습니다(HTTP {status}).",
"models.discoveryFailedBlocked": "대상 정책 때문에 모델 검색이 차단되었습니다.",
"models.discoveryFailedInvalidResponse": "모델 검색이 잘못된 응답을 받았습니다.",
"models.discoveryFailedNetwork": "네트워크 오류로 모델 검색에 실패했습니다.",
"models.discoveryFailedProvider": "프로바이더가 모델 검색 오류를 보고했습니다.",
"models.discoveryFailedGeneric": "모델 검색에 실패했습니다.",
"models.openProviderSettings": "프로바이더 설정 열기",
"models.loading": "불러오는 중…",
"models.search": "모델 검색…",
Expand Down Expand Up @@ -738,6 +745,9 @@ export const ko: Record<TKey, string> = {
"claude.manualEnv": "직접 설정하기 (고급)",
"claude.smallFastModel": "백그라운드 보조 모델",
"claude.smallFastModelHint": "Claude Code가 대화 요약, 주제 감지 같은 배후 작업에 쓰는 모델입니다. 서브에이전트의 haiku 별칭도 이 모델을 씁니다. 비워두면 Claude 기본값(Haiku).",
"claude.smallFastModelAccurateHint": "Claude Code가 대화 요약, 주제 감지 같은 백그라운드 작업에 쓰는 모델입니다. 서브에이전트의 haiku 별칭도 이 모델을 사용합니다.",
"claude.smallFastModelUnsetOption": "Claude Code가 선택(네이티브 모델)",
"claude.smallFastModelNativeWarning": "비워 두면 OpenCodex가 보조 모델 환경 변수를 설정하지 않습니다. Claude Code가 네이티브 Sonnet 모델을 사용할 수 있으며, 네이티브 프로바이더 요금이 발생할 수 있습니다.",
Comment on lines +748 to +750

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Mistranslation: "환경 변수" (environment variable) isn't in the English source and misrepresents the mechanism.

Line 750: "claude.smallFastModelNativeWarning": "비워 두면 OpenCodex가 보조 모델 환경 변수를 설정하지 않습니다. ..." — this says OpenCodex "does not set the helper-model environment variable". The English source (en.ts line 1035) says only "When unset, OpenCodex leaves the helper-model overrides unset." — no mention of an environment variable. de.ts ("setzt OpenCodex keine Hilfsmodell-Overrides") and ja.ts ("ヘルパーモデルの上書きを設定しません") both correctly translate "overrides", not "environment variable". A Korean-reading user could conclude they need to set some env var manually to fix this, which isn't how the GUI setting works.

💬 Suggested fix
-  "claude.smallFastModelNativeWarning": "비워 두면 OpenCodex가 보조 모델 환경 변수를 설정하지 않습니다. Claude Code가 네이티브 Sonnet 모델을 사용할 수 있으며, 네이티브 프로바이더 요금이 발생할 수 있습니다.",
+  "claude.smallFastModelNativeWarning": "비워 두면 OpenCodex가 보조 모델 오버라이드를 설정하지 않습니다. Claude Code가 네이티브 Sonnet 모델을 사용할 수 있으며, 네이티브 프로바이더 요금이 발생할 수 있습니다.",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"claude.smallFastModelAccurateHint": "Claude Code가 대화 요약, 주제 감지 같은 백그라운드 작업에 쓰는 모델입니다. 서브에이전트의 haiku 별칭도 이 모델을 사용합니다.",
"claude.smallFastModelUnsetOption": "Claude Code가 선택(네이티브 모델)",
"claude.smallFastModelNativeWarning": "비워 두면 OpenCodex가 보조 모델 환경 변수를 설정하지 않습니다. Claude Code가 네이티브 Sonnet 모델을 사용할 수 있으며, 네이티브 프로바이더 요금이 발생할 수 있습니다.",
"claude.smallFastModelAccurateHint": "Claude Code가 대화 요약, 주제 감지 같은 백그라운드 작업에 쓰는 모델입니다. 서브에이전트의 haiku 별칭도 이 모델을 사용합니다.",
"claude.smallFastModelUnsetOption": "Claude Code가 선택(네이티브 모델)",
"claude.smallFastModelNativeWarning": "비워 두면 OpenCodex가 보조 모델 오버라이드를 설정하지 않습니다. Claude Code가 네이티브 Sonnet 모델을 사용할 수 있으며, 네이티브 프로바이더 요금이 발생할 수 있습니다.",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@gui/src/i18n/ko.ts` around lines 748 - 750, Update the Korean translation
value for claude.smallFastModelNativeWarning to translate “helper-model
overrides” directly, removing the reference to an environment variable while
preserving the warning about native Sonnet usage and provider charges.

"claude.slotUnset": "Claude 기본값 사용",
"claude.modelMap": "모델 가로채기",
"claude.modelMapHint": "Claude가 특정 모델을 요청하면 가로채서 지정한 모델로 보냅니다. 기본값은 비어 있어요 — 규칙을 추가할 때만 동작합니다.",
Expand Down
10 changes: 10 additions & 0 deletions gui/src/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,13 @@ export const ru: Record<TKey, string> = {
"models.noRoutedHint": "Сначала войдите в провайдера или добавьте нового.",
"models.emptyDiscovery": "Модели не обнаружены. Проверьте адрес провайдера или добавьте статическую/пользовательскую модель.",
"models.emptyDiscoveryDisabled": "Автообнаружение моделей выключено, статические модели не настроены.",
"models.discoveryFailedBadge": "Ошибка обнаружения",
"models.discoveryFailedHttp": "Не удалось обнаружить модели (HTTP {status}).",
"models.discoveryFailedBlocked": "Обнаружение моделей заблокировано политикой назначения.",
"models.discoveryFailedInvalidResponse": "Обнаружение моделей вернуло недопустимый ответ.",
"models.discoveryFailedNetwork": "Обнаружение моделей не удалось из-за сетевой ошибки.",
"models.discoveryFailedProvider": "Провайдер сообщил об ошибке обнаружения моделей.",
"models.discoveryFailedGeneric": "Не удалось обнаружить модели.",
"models.openProviderSettings": "Открыть настройки провайдера",
"models.loading": "Загрузка…",
"models.search": "Поиск моделей…",
Expand Down Expand Up @@ -1023,6 +1030,9 @@ export const ru: Record<TKey, string> = {
"claude.manualEnv": "Ручная настройка (для продвинутых)",
"claude.smallFastModel": "Фоновая вспомогательная модель",
"claude.smallFastModelHint": "Модель, которую Claude Code использует для фоновых задач вроде суммаризации чатов и определения тем. Её также использует алиас подагента haiku. Пусто = значение Claude по умолчанию (Haiku).",
"claude.smallFastModelAccurateHint": "Модель, которую Claude Code использует для фоновых задач, например суммаризации чатов и определения тем. Её также использует алиас подагента haiku.",
"claude.smallFastModelUnsetOption": "Разрешить Claude Code выбрать нативную модель",
"claude.smallFastModelNativeWarning": "Если модель не выбрана, OpenCodex не задаёт переопределения вспомогательной модели. Claude Code может использовать нативную модель Sonnet, что может привести к расходам у вашего нативного провайдера.",
"claude.slotUnset": "Модель Claude по умолчанию",
"claude.modelMap": "Перехват моделей",
"claude.modelMapHint": "Перехватывает запросы к определённой модели и перенаправляет их на выбранную вами. По умолчанию список пуст — пока вы не добавите правило, ничего не происходит.",
Expand Down
10 changes: 10 additions & 0 deletions gui/src/i18n/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,13 @@ export const zh: Record<TKey, string> = {
"models.noRoutedHint": "请先登录提供方或添加一个。",
"models.emptyDiscovery": "未发现任何模型。请检查提供方端点,或添加静态/自定义模型。",
"models.emptyDiscoveryDisabled": "实时模型发现已关闭,且尚未配置静态模型。",
"models.discoveryFailedBadge": "发现失败",
"models.discoveryFailedHttp": "模型发现失败(HTTP {status})。",
"models.discoveryFailedBlocked": "模型发现被目标策略阻止。",
"models.discoveryFailedInvalidResponse": "模型发现返回了无效响应。",
"models.discoveryFailedNetwork": "由于网络错误,模型发现失败。",
"models.discoveryFailedProvider": "提供方报告了模型发现错误。",
"models.discoveryFailedGeneric": "模型发现失败。",
"models.openProviderSettings": "打开提供方设置",
"models.loading": "加载中…",
"models.search": "搜索模型…",
Expand Down Expand Up @@ -738,6 +745,9 @@ export const zh: Record<TKey, string> = {
"claude.manualEnv": "手动配置(高级)",
"claude.smallFastModel": "后台辅助模型",
"claude.smallFastModelHint": "Claude Code 用于对话摘要、主题识别等后台工作的模型。子代理的 haiku 别名也使用它。留空 = Claude 默认(Haiku)。",
"claude.smallFastModelAccurateHint": "Claude Code 用于聊天摘要、主题识别等后台工作的模型。子代理的 haiku 别名也使用此模型。",
"claude.smallFastModelUnsetOption": "让 Claude Code 选择(原生模型)",
"claude.smallFastModelNativeWarning": "留空时,OpenCodex 不会设置辅助模型覆盖项。Claude Code 可能使用其原生 Sonnet 模型,并可能产生原生提供方费用。",
"claude.slotUnset": "使用 Claude 默认值",
"claude.modelMap": "模型拦截",
"claude.modelMapHint": "拦截对特定模型的请求并重定向到你指定的模型。默认为空——添加规则后才生效。",
Expand Down
12 changes: 12 additions & 0 deletions gui/src/models-groups.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
/** Pure grouping for the Models page, including configured providers with zero model rows. */
export type ProviderDiscoverySummary =
| { status: "ok" }
| { status: "failed"; reason: "http"; httpStatus: number }
| {
status: "failed";
reason: "blocked" | "invalid_response" | "network" | "provider";
httpStatus?: never;
};

export interface ConfiguredProviderSummary {
name: string;
authMode?: string;
disabled?: boolean;
liveModels?: boolean;
models?: string[];
discovery?: ProviderDiscoverySummary;
}

export interface ProviderModelGroup<Row> {
Expand All @@ -13,6 +23,7 @@ export interface ProviderModelGroup<Row> {
native: boolean;
liveModels: boolean;
configuredModels: string[];
discovery?: ProviderDiscoverySummary;
}

export function buildProviderModelGroups<Row extends { provider: string; native?: boolean }>(
Expand Down Expand Up @@ -45,6 +56,7 @@ export function buildProviderModelGroups<Row extends { provider: string; native?
native: providerRows.length > 0 && providerRows.every(row => row.native === true),
liveModels: configured?.liveModels !== false,
configuredModels: configured?.models ?? [],
discovery: configured?.discovery,
};
})
.sort((a, b) => {
Expand Down
Loading
Loading