diff --git a/docs-site/src/content/docs/guides/claude-code.md b/docs-site/src/content/docs/guides/claude-code.md index 541dfc8e663..f6a457ebcec 100644 --- a/docs-site/src/content/docs/guides/claude-code.md +++ b/docs-site/src/content/docs/guides/claude-code.md @@ -26,6 +26,42 @@ research-preview access. See [Anthropic Fast configuration](/reference/configuration/providers/#anthropic-fast-anthropic-speed) for the exact model and recovery scope. +## Tier defaults for CLI and external launchers + +In the Claude Code tab, select an Opus, Sonnet, Haiku or Fable default and **Save**. +These `claudeCode.tierModels` defaults are passed to new `ocx claude` launches. They do not +change the currently selected main model, reasoning effort or Desktop family assignments. + +Applications that launch `claude` directly do not receive the `ocx` launcher's environment. +After saving, choose **Preview Claude settings**, review the `ANTHROPIC_DEFAULT_*_MODEL` +changes, then **Apply to Claude settings**. This changes the OpenCodex host's Claude user +settings, not a remote browser's computer. Start a new Claude process to use the new values; +the operation does not stop or restart existing sessions. It does not configure routing or +authentication, so the direct caller must already be connected to OpenCodex. + +Selected routing aliases are paired with `ANTHROPIC_DEFAULT_*_MODEL_NAME` labels, using the +same readable names as the model picker. Preview includes both IDs and label changes; the +alias remains the submitted model ID. An existing label is managed only if it exactly matches +the generated name for its current alias. Other labels, including empty values, are preserved. +A manually entered label identical to that generated name is indistinguishable from a managed label. + +Only explicitly selected tier IDs are applied. An unset tier leaves its existing model ID +and its display label untouched. Replacing an alias with a first-party +ID or another non-alias also removes its matching generated label. Preview shows label removal +as an empty replacement; custom labels and unrelated settings remain intact. +Missing files are supported, but existing empty or corrupt files are +refused. Changes since preview require a new preview. Apply briefly moves the current +document into a private `model-default-backups/apply-*/settings.json` directory under the +Claude config directory, validates the captured document, then publishes exclusively. +It never replaces a concurrent writer's new file, including during rollback. Avoid editing +or launching Claude while applying: another reader can see the brief missing-file interval. +The filesystem must support same-volume moves and hard links; unsupported operations fail +without an overwrite fallback. After an interrupted apply or a failed automatic restore, +inspect this backup location and reconcile newer edits before restoring. Windows/Linux +filesystem behavior must be verified separately; a local test is not cross-platform proof. +Verify the resolved provider/model in request logs: selecting a tier is not proof of the +actual model served. This is especially useful for external classifiers requesting Sonnet. + ## Claude OAuth account pool (experimental) Native Anthropic subscription passthrough retains the upstream `anthropic-ratelimit-*` diff --git a/docs-site/src/content/docs/ja/guides/claude-code.md b/docs-site/src/content/docs/ja/guides/claude-code.md index 2e5f4ed87b3..4d1cd5938b4 100644 --- a/docs-site/src/content/docs/ja/guides/claude-code.md +++ b/docs-site/src/content/docs/ja/guides/claude-code.md @@ -14,6 +14,26 @@ Messages API 経由の Devin ルート(SWE-2 を含む)では、テキスト この出力順序の修正は、生成された一部のシステムテキストを Cognition が拒否する別の問題を解決するものではありません。 システム指示と安全上の制約は保持されます。 +## CLIと外部ランチャーのティア既定値 + +Claude CodeタブでOpus、Sonnet、Haiku、Fableの既定モデルを選択し、**保存**してください。 +`claudeCode.tierModels`は新しい`ocx claude`起動に渡されます。現在の主モデル、推論強度、 +Desktopのモデル系列割り当ては変更しません。 + +`claude`を直接起動するアプリには`ocx`の環境変数が渡されません。保存後、**Claude設定をプレビュー**で +`ANTHROPIC_DEFAULT_*_MODEL`の変更を確認し、**Claude設定に適用**を選びます。対象はブラウザーのPCではなく +OpenCodexホストのClaudeユーザー設定です。反映には新しいClaudeプロセスが必要です。既存セッションは再起動せず、 +ルーティングや認証も設定しないため、直接起動するアプリのOpenCodex接続は事前に設定してください。 + +明示的に選んだティアのみ適用します。**未指定**は既存のClaude設定を維持し、ネイティブモデルには戻しません。 +ファイルがない場合は作成できますが、既存の空ファイルや壊れたJSONは拒否します。プレビュー後の変更には再プレビューが必要です。 + +適用は実際のファイルをClaude設定ディレクトリ内の非公開`model-default-backups/apply-*/settings.json`へ一時移動し、 +内容を検証してから、対象が空いている場合のみ新設定を公開します。競合や復元時も他の書き込みを上書きしません。 +ファイルが一時的に存在しないため、適用中は設定の編集やClaude起動を避けてください。同一ボリュームの移動と +ハードリンクが必要で、失敗時に上書きへ切り替えません。中断や自動復元失敗後はバックアップと新しい編集を照合してください。 +WindowsとLinuxは別々に検証が必要です。実際の提供モデルはリクエストログで確認します。Sonnetを使う外部分類器にも有用です。 + ## クイックスタート ```bash diff --git a/docs-site/src/content/docs/ko/guides/claude-code.md b/docs-site/src/content/docs/ko/guides/claude-code.md index 3a8a8919ede..f4a6f3354ec 100644 --- a/docs-site/src/content/docs/ko/guides/claude-code.md +++ b/docs-site/src/content/docs/ko/guides/claude-code.md @@ -14,6 +14,29 @@ Messages API를 통해 사용하는 Devin 경로(SWE-2 포함)에서는 늦게 이 출력 순서 수정으로 Cognition이 생성된 일부 시스템 텍스트를 거부하는 별개의 문제가 해결되지는 않아요. 시스템 지시와 안전 제약은 그대로 유지해요. +## CLI와 외부 실행 앱의 티어 기본값 + +Claude Code 탭에서 Opus, Sonnet, Haiku, Fable 기본 모델을 선택한 뒤 **저장**하세요. +`claudeCode.tierModels` 값은 새 `ocx claude` 실행에 전달되며, 현재 주 모델이나 추론 강도, +Desktop의 모델 계열 할당은 바꾸지 않아요. + +`claude`를 직접 실행하는 앱에는 `ocx`의 환경 변수가 전달되지 않아요. 저장 후 +**Claude 설정 미리보기**에서 `ANTHROPIC_DEFAULT_*_MODEL` 변경을 확인하고 **Claude 설정에 적용**을 +누르세요. 변경 대상은 브라우저가 있는 PC가 아니라 OpenCodex 호스트의 Claude 사용자 설정이에요. +새 값을 사용하려면 새 Claude 프로세스를 실행해야 해요. 기존 세션을 강제 재시작하지 않으며, +라우팅이나 인증 연결도 설정하지 않으므로 직접 실행하는 앱의 OpenCodex 연결은 이미 준비되어 있어야 해요. + +명시적으로 선택한 티어만 적용해요. **미지정**은 기존 Claude 설정을 유지하며 네이티브 모델로 +초기화하지 않아요. 파일이 없으면 생성할 수 있지만, 기존의 빈 파일이나 손상된 JSON은 거부해요. +미리보기 이후 설정이 바뀌면 다시 미리보기가 필요해요. + +적용 시 실제 파일을 Claude 설정 디렉터리의 비공개 `model-default-backups/apply-*/settings.json`으로 +잠시 이동해 내용을 확인하고, 대상에 다른 파일이 없을 때만 새 설정을 게시해요. 충돌이나 복원 중에도 +다른 프로그램이 만든 파일을 덮어쓰지 않아요. 잠깐 파일이 없는 구간이 있으므로 적용 중에는 설정 편집이나 +Claude 실행을 피하세요. 같은 볼륨의 이동과 하드 링크를 지원해야 하며, 실패 시 덮어쓰기 방식으로 우회하지 않아요. +중단이나 자동 복원 실패 후에는 이 백업과 최신 변경을 대조해서 복원하세요. Windows와 Linux 동작은 +별도로 검증해야 해요. 실제 제공된 모델은 요청 로그로 확인하세요. Sonnet을 요청하는 외부 분류기에도 유용해요. + ## 빠른 시작 ```bash diff --git a/docs-site/src/content/docs/ru/guides/claude-code.md b/docs-site/src/content/docs/ru/guides/claude-code.md index ac2b97fd4be..13c5632fb0f 100644 --- a/docs-site/src/content/docs/ru/guides/claude-code.md +++ b/docs-site/src/content/docs/ru/guides/claude-code.md @@ -16,6 +16,32 @@ Claude Code может использовать все маршрутизиру Это исправление порядка вывода не решает отдельную проблему отказа Cognition принимать некоторые сгенерированные системные тексты. Системные инструкции и ограничения безопасности сохраняются. +## Модели по уровням для CLI и внешних приложений + +На странице Claude Code выберите модели Opus, Sonnet, Haiku или Fable и нажмите **Сохранить**. +Значения `claudeCode.tierModels` передаются новым запускам `ocx claude`, не изменяя текущую основную +модель, уровень рассуждения или назначения семейств Desktop. + +Приложения, запускающие `claude` напрямую, не получают окружение `ocx`. После сохранения выберите +**Предпросмотр настроек Claude**, проверьте изменения `ANTHROPIC_DEFAULT_*_MODEL`, затем +**Применить к настройкам Claude**. Изменяется конфигурация пользователя Claude на хосте OpenCodex, +а не на компьютере браузера. Для новых значений нужен новый процесс Claude; существующие сеансы +не перезапускаются. Маршрутизация и аутентификация не настраиваются: прямое приложение должно быть +уже подключено к OpenCodex. + +Применяются только явно выбранные уровни. **Не задано** сохраняет существующую настройку Claude, +а не возвращает нативную модель. Отсутствующий файл поддерживается, существующий пустой или +повреждённый файл отклоняется. Изменение после предпросмотра требует нового предпросмотра. + +При применении фактический файл временно перемещается в приватный каталог +`model-default-backups/apply-*/settings.json` внутри каталога Claude, проверяется и заменяется +публикацией только в свободный путь. Чужой новый файл не перезаписывается даже при откате. +На короткое время файл отсутствует: не редактируйте настройки и не запускайте Claude в этот момент. +Нужны перемещение в пределах одного тома и жёсткие ссылки; небезопасной перезаписью ошибки не обходятся. +После прерывания или ошибки восстановления сопоставьте резервную копию с новыми правками. +Windows и Linux требуют отдельных проверок. Реальную модель проверяйте по журналам запросов; +функция полезна и для внешних классификаторов, запрашивающих Sonnet. + ## Быстрый старт ```bash diff --git a/docs-site/src/content/docs/zh-cn/guides/claude-code.md b/docs-site/src/content/docs/zh-cn/guides/claude-code.md index 9aabbc7bb8f..5a28a1ac65b 100644 --- a/docs-site/src/content/docs/zh-cn/guides/claude-code.md +++ b/docs-site/src/content/docs/zh-cn/guides/claude-code.md @@ -14,6 +14,25 @@ Code 可以使用每一个已路由的提供商——包括 OAuth 登录、账 这项输出顺序修复不会解决 Cognition 拒绝部分生成的系统文本这一独立问题。 系统指令和安全约束会保持不变。 +## CLI 与外部启动器的层级默认模型 + +在 Claude Code 页面选择 Opus、Sonnet、Haiku 或 Fable 默认模型并**保存**。 +`claudeCode.tierModels` 会传给新的 `ocx claude` 进程,不会修改当前主模型、推理强度或 Desktop 系列分配。 + +直接启动 `claude` 的应用不会继承 `ocx` 的环境。保存后,选择**预览 Claude 设置**,核对 +`ANTHROPIC_DEFAULT_*_MODEL` 更改,再选择**应用到 Claude 设置**。修改的是 OpenCodex 主机上的 +Claude 用户设置,而非浏览器所在电脑。要使用新值,需要启动新的 Claude 进程;现有会话不会重启。 +该操作不配置路由或认证,因此直接调用的应用必须已连接 OpenCodex。 + +仅应用明确选择的层级。**未设置**会保留现有 Claude 设置,不会恢复原生模型。文件不存在时可以创建, +但现有空文件或损坏的 JSON 会被拒绝。预览后发生更改时必须重新预览。 + +应用时先将实际文件暂时移动到 Claude 配置目录下的私有 `model-default-backups/apply-*/settings.json`, +核对内容,再仅在目标路径空闲时发布新设置。冲突和回滚都不会覆盖其他写入者创建的新文件。 +此过程有短暂的文件缺失窗口,应用期间请勿编辑设置或启动 Claude。文件系统须支持同卷移动和硬链接; +失败时不会退回不安全的覆盖方式。中断或自动恢复失败后,请将备份与较新的修改核对后恢复。 +Windows 和 Linux 必须分别验证。请在请求日志中核对实际模型;请求 Sonnet 的外部分类器也能使用此功能。 + ## 快速开始 ```bash diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index a26c1cb78b6..b1baf027a32 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -7,6 +7,13 @@ import type { TKey } from "./en"; */ export const de: Record = { ...desktopCompatibilityCopy("de"), + "claude.tierDefaults.unset": "Nicht festgelegt (Claude-Einstellung beibehalten)", + "claude.tierDefaults.recovery": "Anwendung gestoppt; automatische Wiederherstellung fehlgeschlagen. Prüfen Sie vor einem erneuten Versuch die Sicherung unten.", + "claude.tierDefaults.title": "CLI-Standardmodelle", + "claude.tierDefaults.preview": "Claude-Einstellungen ansehen", + "claude.tierDefaults.apply": "Auf Claude-Einstellungen anwenden", + "claude.tierDefaults.applied": "Claude-Einstellungen entsprechen den gespeicherten Standardwerten.", + "claude.tierDefaults.failed": "Standardwerte konnten nicht angewendet werden. Erneut Vorschau anzeigen und Claude-Einstellungen prüfen.", "sidecar.pool": "Kontopool", "sidecar.poolCurrent": "Pool der aktuellen Anfrage", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index db03fdeacc3..c13ed81ae9e 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -8,6 +8,13 @@ import { desktopCompatibilityCopy } from "./desktop-compatibility-copy"; */ export const en = { ...desktopCompatibilityCopy("en"), + "claude.tierDefaults.unset": "Unset (keep existing Claude setting)", + "claude.tierDefaults.recovery": "Apply stopped and automatic restore failed. Check the backup below before retrying.", + "claude.tierDefaults.title": "CLI tier defaults", + "claude.tierDefaults.preview": "Preview Claude settings", + "claude.tierDefaults.apply": "Apply to Claude settings", + "claude.tierDefaults.applied": "Claude settings match the saved defaults.", + "claude.tierDefaults.failed": "Could not apply defaults. Preview again and check Claude settings.", "sidecar.pool": "Pool", "sidecar.poolCurrent": "Current request's pool", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index 1b2766afa3a..3283bd6a766 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -6,6 +6,13 @@ import type { TKey } from "./en"; */ export const fr: Record = { ...desktopCompatibilityCopy("fr"), + "claude.tierDefaults.unset": "Non défini (conserver le réglage Claude)", + "claude.tierDefaults.recovery": "Application arrêtée et restauration automatique échouée. Vérifiez la sauvegarde ci-dessous avant de réessayer.", + "claude.tierDefaults.title": "Modèles par défaut du CLI", + "claude.tierDefaults.preview": "Aperçu des paramètres Claude", + "claude.tierDefaults.apply": "Appliquer aux paramètres Claude", + "claude.tierDefaults.applied": "Les paramètres Claude correspondent aux valeurs enregistrées.", + "claude.tierDefaults.failed": "Impossible d'appliquer les valeurs. Relancez l'aperçu et vérifiez les paramètres Claude.", "sidecar.pool": "Pool de comptes", "sidecar.poolCurrent": "Pool de la requête actuelle", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 8a12b7927d5..020e9be2c54 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -6,6 +6,13 @@ import type { TKey } from "./en"; */ export const ja: Record = { ...desktopCompatibilityCopy("ja"), + "claude.tierDefaults.unset": "未指定(既存のClaude設定を維持)", + "claude.tierDefaults.recovery": "適用が停止し、自動復元に失敗しました。再試行する前に以下のバックアップを確認してください。", + "claude.tierDefaults.title": "CLIのティア既定モデル", + "claude.tierDefaults.preview": "Claude設定をプレビュー", + "claude.tierDefaults.apply": "Claude設定に適用", + "claude.tierDefaults.applied": "Claude設定は保存済みの既定値と一致しています。", + "claude.tierDefaults.failed": "既定値を適用できませんでした。再度プレビューしてClaude設定を確認してください。", "sidecar.pool": "アカウントプール", "sidecar.poolCurrent": "現在のリクエストのプール", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index 5ce9204378f..10e79645bea 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -6,6 +6,13 @@ import type { TKey } from "./en"; */ export const ko: Record = { ...desktopCompatibilityCopy("ko"), + "claude.tierDefaults.unset": "미지정 (기존 Claude 설정 유지)", + "claude.tierDefaults.recovery": "적용이 중단되었고 자동 복원에 실패했어요. 다시 시도하기 전에 아래 백업을 확인하세요.", + "claude.tierDefaults.title": "CLI 티어 기본 모델", + "claude.tierDefaults.preview": "Claude 설정 미리보기", + "claude.tierDefaults.apply": "Claude 설정에 적용", + "claude.tierDefaults.applied": "Claude 설정이 저장된 기본값과 일치합니다.", + "claude.tierDefaults.failed": "기본값을 적용하지 못했습니다. 다시 미리 보고 Claude 설정을 확인하세요.", "sidecar.pool": "계정 풀", "sidecar.poolCurrent": "현재 요청의 풀 사용", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/pt.ts b/gui/src/i18n/pt.ts index 4f24d953adb..0aa5fe5463f 100644 --- a/gui/src/i18n/pt.ts +++ b/gui/src/i18n/pt.ts @@ -8,6 +8,13 @@ import type { TKey } from "./en"; */ export const pt: Record = { ...desktopCompatibilityCopy("pt"), + "claude.tierDefaults.unset": "Não definido (manter configuração Claude)", + "claude.tierDefaults.recovery": "Aplicação interrompida; restauração automática falhou. Verifique o backup abaixo antes de tentar novamente.", + "claude.tierDefaults.title": "Modelos padrão da CLI", + "claude.tierDefaults.preview": "Prévia das configurações Claude", + "claude.tierDefaults.apply": "Aplicar às configurações Claude", + "claude.tierDefaults.applied": "As configurações Claude correspondem aos padrões salvos.", + "claude.tierDefaults.failed": "Não foi possível aplicar os padrões. Veja a prévia novamente e confira as configurações Claude.", "sidecar.pool": "Pool de contas", "sidecar.poolCurrent": "Pool da solicitação atual", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index 4d9304a0387..20796d6213d 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -6,6 +6,13 @@ import type { TKey } from "./en"; */ export const ru: Record = { ...desktopCompatibilityCopy("ru"), + "claude.tierDefaults.unset": "Не задано (сохранить настройку Claude)", + "claude.tierDefaults.recovery": "Применение остановлено, автоматическое восстановление не удалось. Проверьте резервную копию ниже перед повтором.", + "claude.tierDefaults.title": "Модели CLI по умолчанию", + "claude.tierDefaults.preview": "Предпросмотр настроек Claude", + "claude.tierDefaults.apply": "Применить к настройкам Claude", + "claude.tierDefaults.applied": "Настройки Claude соответствуют сохранённым значениям.", + "claude.tierDefaults.failed": "Не удалось применить значения. Повторите предпросмотр и проверьте настройки Claude.", "sidecar.pool": "Пул аккаунтов", "sidecar.poolCurrent": "Пул текущего запроса", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index 5f29b5bb3b5..50ecb6ef480 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -7,6 +7,13 @@ import type { TKey } from "./en"; */ export const tr: Record = { ...desktopCompatibilityCopy("tr"), + "claude.tierDefaults.unset": "Belirtilmedi (mevcut Claude ayarını koru)", + "claude.tierDefaults.recovery": "Uygulama durdu ve otomatik geri yükleme başarısız oldu. Yeniden denemeden önce aşağıdaki yedeği kontrol edin.", + "claude.tierDefaults.title": "CLI varsayılan modelleri", + "claude.tierDefaults.preview": "Claude ayarlarını önizle", + "claude.tierDefaults.apply": "Claude ayarlarına uygula", + "claude.tierDefaults.applied": "Claude ayarları kaydedilen varsayılanlarla eşleşiyor.", + "claude.tierDefaults.failed": "Varsayılanlar uygulanamadı. Yeniden önizleyin ve Claude ayarlarını kontrol edin.", "sidecar.pool": "Hesap havuzu", "sidecar.poolCurrent": "Geçerli isteğin havuzu", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/vi.ts b/gui/src/i18n/vi.ts index 02c7c912d25..206f6292a7a 100644 --- a/gui/src/i18n/vi.ts +++ b/gui/src/i18n/vi.ts @@ -8,6 +8,13 @@ import type { TKey } from "./en"; */ export const vi: Record = { ...desktopCompatibilityCopy("vi"), + "claude.tierDefaults.unset": "Chưa đặt (giữ cài đặt Claude hiện có)", + "claude.tierDefaults.recovery": "Đã dừng áp dụng và khôi phục tự động thất bại. Kiểm tra bản sao lưu bên dưới trước khi thử lại.", + "claude.tierDefaults.title": "Mô hình mặc định CLI", + "claude.tierDefaults.preview": "Xem trước cài đặt Claude", + "claude.tierDefaults.apply": "Áp dụng vào cài đặt Claude", + "claude.tierDefaults.applied": "Cài đặt Claude khớp với mặc định đã lưu.", + "claude.tierDefaults.failed": "Không thể áp dụng mặc định. Xem trước lại và kiểm tra cài đặt Claude.", "sidecar.pool": "Nhóm tài khoản", "sidecar.poolCurrent": "Nhóm của yêu cầu hiện tại", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index 090d3378cc2..01cdc1b5e37 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -4,6 +4,13 @@ import type { TKey } from "./en"; /** Traditional Chinese (Taiwan) UI strings — keys must match `en.ts` 1:1. */ export const zhTW: Record = { ...desktopCompatibilityCopy("zh-TW"), + "claude.tierDefaults.unset": "未設定(保留現有 Claude 設定)", + "claude.tierDefaults.recovery": "套用已停止,自動還原失敗。重試前請檢查下方備份。", + "claude.tierDefaults.title": "CLI 層級預設模型", + "claude.tierDefaults.preview": "預覽 Claude 設定", + "claude.tierDefaults.apply": "套用至 Claude 設定", + "claude.tierDefaults.applied": "Claude 設定與儲存的預設值一致。", + "claude.tierDefaults.failed": "無法套用預設值。請重新預覽並檢查 Claude 設定。", "sidecar.pool": "帳戶池", "sidecar.poolCurrent": "使用目前請求的帳戶池", "sidecar.poolA": "Anthropic", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 31357b60791..6e12ed34d93 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -6,6 +6,13 @@ import type { TKey } from "./en"; */ export const zh: Record = { ...desktopCompatibilityCopy("zh"), + "claude.tierDefaults.unset": "未设置(保留现有 Claude 设置)", + "claude.tierDefaults.recovery": "应用已停止,自动恢复失败。重试前请检查下方备份。", + "claude.tierDefaults.title": "CLI 层级默认模型", + "claude.tierDefaults.preview": "预览 Claude 设置", + "claude.tierDefaults.apply": "应用到 Claude 设置", + "claude.tierDefaults.applied": "Claude 设置与保存的默认值一致。", + "claude.tierDefaults.failed": "无法应用默认值。请重新预览并检查 Claude 设置。", "sidecar.pool": "账户池", "sidecar.poolCurrent": "使用当前请求的账户池", "sidecar.poolA": "Anthropic", diff --git a/gui/src/pages/ClaudeCode.tsx b/gui/src/pages/ClaudeCode.tsx index 1d6c9b15e36..505d7fa61ee 100644 --- a/gui/src/pages/ClaudeCode.tsx +++ b/gui/src/pages/ClaudeCode.tsx @@ -18,6 +18,7 @@ import { } from "./claude-code-sections"; import { AUTO_COMPACT_WINDOW_DEFAULT, formatCompactWindow, newClientId, normalizeContextAccounting, type ClaudeCodeState, type MapRow } from "./claude-code-types"; import { SmallFastModelSetting } from "./claude-code-settings"; +import { ClaudeCodeTierDefaults } from "./claude-code-tier-defaults"; import { interceptReasonKey, normalizeSharedProxy, selectFirstPartyNotice, type FirstPartyNotice } from "./claude-code-first-party"; import { acknowledgeSave, @@ -464,6 +465,11 @@ export default function ClaudeCode({ apiBase, active = true }: { apiBase: string /> + + + + void; + apiBase: string; + dirty: boolean; +}) { + const t = useT(); + const [preview, setPreview] = useState(null); + const [busy, setBusy] = useState(false); + const [message, setMessage] = useState(""); + const [failed, setFailed] = useState(false); + const [recoveryPath, setRecoveryPath] = useState(""); + const tierOptions = options.map(option => option.value === "" ? { ...option, label: t("claude.tierDefaults.unset") } : option); + async function request(apply: boolean) { + setBusy(true); + setMessage(""); + setFailed(false); + setRecoveryPath(""); + try { + const response = await fetch(`${apiBase}/api/claude-code/model-defaults`, apply ? { + method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ fingerprint: preview?.fingerprint }), + } : undefined); + if (!response.ok) { + const error = await response.json(); + if (error.code === "settings_recovery_required") { + setPreview(null); + setFailed(true); + setMessage(t("claude.tierDefaults.recovery")); + if (typeof error.backupPath === "string") setRecoveryPath(error.backupPath); + return; + } + throw new Error("apply_refused"); + } + const result = await readJsonOrThrow(response); + if (apply) { setPreview(null); setMessage(t("claude.tierDefaults.applied")); } + else setPreview(result as Preview); + } catch { + setPreview(null); + setFailed(true); + setMessage(t("claude.tierDefaults.failed")); + } finally { setBusy(false); } + } + return <> + {tiers.map(tier => { + const value = state.tierModels?.[tier] ?? ""; + const choices = value && !tierOptions.some(option => option.value === value) ? [...tierOptions, { value, label: value }] : tierOptions; + return
+ {t(`claudeDesktop.family.${tier}`)} +