feat(settings): refactor agent auth modes and add model provider authentication

- Split env vars and config file persistence into separate save operations
- Add model_provider_id field to agent_setting for tracking selected provider
- Add "Model Provider" auth mode for Claude Code, Codex CLI, and Gemini CLI
- Add "Custom Endpoint" auth mode for Claude Code (previously only official subscription)
- Unify auth mode labels across all three agents (official subscription / custom endpoint / model provider)
- When model provider is selected, fill api_url and api_key into env and config automatically
- Resolve model provider credentials at ACP connect time as a backend fallback
- Clear provider deletion cascades to agent_setting.model_provider_id
- Claude Code writes API credentials to config.env (ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN)
- Codex: switching auth modes patches config.toml instead of clearing it
- Add i18n keys for new auth modes in all 10 supported languages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
xintaofei
2026-04-06 22:10:18 +08:00
parent d28c54a038
commit b64976e4d6
24 changed files with 1269 additions and 276 deletions

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "يُفضّل استخدام token-file بدل الرمز النصي متى أمكن؛ قم بالإعداد عبر openclaw CLI.",
"sessionKeyHint": "اختياري. حدّد مفتاح جلسة gateway؛ واتركه فارغًا للتعيين التلقائي لجلسة معزولة."
},
"authModeOfficialSubscription": "الاشتراك الرسمي",
"authModeCustomEndpoint": "نقطة نهاية مخصصة",
"authModeCustomEndpointHint": "تكوين عنوان API ومفتاح API يدوياً لنقطة نهاية مخصصة.",
"authModeModelProvider": "مزود النموذج",
"modelProvider": "مزود النموذج",
"modelProviderHint": "استخدم عنوان API ومفتاح API من مزود نموذج مُعدّ.",
"selectModelProvider": "اختر مزود النموذج",
"noModelProviderAvailable": "لا يوجد مزود نموذج مُعدّ لهذا الوكيل. انتقل إلى إعدادات مزود النموذج لإضافة واحد.",
"claude": {
"authMode": "وضع المصادقة",
"officialSubscription": "الاشتراك الرسمي",
"officialSubscriptionHint": "استخدم اشتراك Anthropic الرسمي، لا حاجة لمفتاح API.",
"mainModel": "النموذج الرئيسي",
"reasoningModel": "نموذج الاستدلال (thinking)",
"haikuDefaultModel": "نموذج Haiku الافتراضي",
@@ -624,7 +635,8 @@
"configSavedHint": "يجب إعادة فتح الجلسات الحالية لتطبيق التغييرات",
"saveConfigManagementFailed": "فشل حفظ إدارة الإعدادات",
"clineSaved": "تم حفظ تكوين Cline",
"saveClineFailed": "فشل في حفظ تكوين Cline"
"saveClineFailed": "فشل في حفظ تكوين Cline",
"modelProviderRequired": "يرجى اختيار مزود نموذج قبل الحفظ."
},
"version": {
"statusLabel": "حالة الإصدار",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "Wenn möglich token-file statt Klartext-Token verwenden; über openclaw CLI konfigurieren.",
"sessionKeyHint": "Optional. Gateway-Session-Key angeben; leer lassen für automatische Zuweisung einer isolierten Session."
},
"authModeOfficialSubscription": "Offizielles Abonnement",
"authModeCustomEndpoint": "Benutzerdefinierter Endpunkt",
"authModeCustomEndpointHint": "API-URL und API-Key manuell für einen benutzerdefinierten Endpunkt konfigurieren.",
"authModeModelProvider": "Modellanbieter",
"modelProvider": "Modellanbieter",
"modelProviderHint": "API-URL und API-Key eines konfigurierten Modellanbieters verwenden.",
"selectModelProvider": "Modellanbieter auswählen",
"noModelProviderAvailable": "Kein Modellanbieter für diesen Agent konfiguriert. Gehen Sie zu den Modellanbieter-Einstellungen, um einen hinzuzufügen.",
"claude": {
"authMode": "Authentifizierungsmodus",
"officialSubscription": "Offizielles Abonnement",
"officialSubscriptionHint": "Offizielles Anthropic-Abonnement verwenden, kein API-Key erforderlich.",
"mainModel": "Hauptmodell",
"reasoningModel": "Reasoning-Modell (thinking)",
"haikuDefaultModel": "Standard-Haiku-Modell",
@@ -624,7 +635,8 @@
"configSavedHint": "Bestehende Sitzungen müssen neu geöffnet werden, damit die Änderungen wirksam werden",
"saveConfigManagementFailed": "Speichern der Konfigurationsverwaltung fehlgeschlagen",
"clineSaved": "Cline-Konfiguration gespeichert",
"saveClineFailed": "Cline-Konfiguration konnte nicht gespeichert werden"
"saveClineFailed": "Cline-Konfiguration konnte nicht gespeichert werden",
"modelProviderRequired": "Bitte wählen Sie vor dem Speichern einen Modellanbieter aus."
},
"version": {
"statusLabel": "Versionsstatus",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "Use token-file instead of plain token when possible; configure via openclaw CLI.",
"sessionKeyHint": "Optional. Specify gateway session key; leave empty to auto-assign isolated session."
},
"authModeOfficialSubscription": "Official Subscription",
"authModeCustomEndpoint": "Custom Endpoint",
"authModeCustomEndpointHint": "Manually configure API URL and API Key for a custom endpoint.",
"authModeModelProvider": "Model Provider",
"modelProvider": "Model Provider",
"modelProviderHint": "Use API URL and API Key from a configured model provider.",
"selectModelProvider": "Select Model Provider",
"noModelProviderAvailable": "No model provider configured for this agent. Go to Model Provider Settings to add one.",
"claude": {
"authMode": "Auth Mode",
"officialSubscription": "Official Subscription",
"officialSubscriptionHint": "Use official Anthropic subscription, no API Key required.",
"mainModel": "Main Model",
"reasoningModel": "Reasoning Model (thinking)",
"haikuDefaultModel": "Default Haiku Model",
@@ -624,7 +635,8 @@
"configSavedHint": "Existing sessions need to be reopened to take effect",
"saveConfigManagementFailed": "Failed to save config management",
"clineSaved": "Cline config saved",
"saveClineFailed": "Failed to save Cline config"
"saveClineFailed": "Failed to save Cline config",
"modelProviderRequired": "Please select a model provider before saving."
},
"version": {
"statusLabel": "Version Status",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "Usa token-file en lugar de token en texto plano cuando sea posible; configúralo con el CLI de openclaw.",
"sessionKeyHint": "Opcional. Especifica la session key del gateway; si se deja vacío se asigna automáticamente una sesión aislada."
},
"authModeOfficialSubscription": "Suscripción oficial",
"authModeCustomEndpoint": "Endpoint personalizado",
"authModeCustomEndpointHint": "Configurar manualmente la URL de API y la clave API para un endpoint personalizado.",
"authModeModelProvider": "Proveedor de modelo",
"modelProvider": "Proveedor de modelo",
"modelProviderHint": "Usar la URL de API y la clave API de un proveedor de modelo configurado.",
"selectModelProvider": "Seleccionar proveedor de modelo",
"noModelProviderAvailable": "No hay proveedor de modelo configurado para este agente. Vaya a la configuración de proveedores de modelo para agregar uno.",
"claude": {
"authMode": "Modo de autenticación",
"officialSubscription": "Suscripción oficial",
"officialSubscriptionHint": "Usar la suscripción oficial de Anthropic, no se requiere API Key.",
"mainModel": "Modelo principal",
"reasoningModel": "Modelo de razonamiento (thinking)",
"haikuDefaultModel": "Modelo Haiku predeterminado",
@@ -624,7 +635,8 @@
"configSavedHint": "Las sesiones existentes deben reabrirse para que surta efecto",
"saveConfigManagementFailed": "No se pudo guardar la gestión de configuración",
"clineSaved": "Configuración de Cline guardada",
"saveClineFailed": "Error al guardar la configuración de Cline"
"saveClineFailed": "Error al guardar la configuración de Cline",
"modelProviderRequired": "Seleccione un proveedor de modelo antes de guardar."
},
"version": {
"statusLabel": "Estado de versión",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "Utilisez token-file plutôt quun token en clair si possible ; configurez-le via le CLI openclaw.",
"sessionKeyHint": "Optionnel. Spécifie la session key de la gateway ; laisser vide pour auto-attribuer une session isolée."
},
"authModeOfficialSubscription": "Abonnement officiel",
"authModeCustomEndpoint": "Endpoint personnalisé",
"authModeCustomEndpointHint": "Configurer manuellement l'URL API et la clé API pour un endpoint personnalisé.",
"authModeModelProvider": "Fournisseur de modèle",
"modelProvider": "Fournisseur de modèle",
"modelProviderHint": "Utiliser l'URL API et la clé API d'un fournisseur de modèle configuré.",
"selectModelProvider": "Sélectionner un fournisseur de modèle",
"noModelProviderAvailable": "Aucun fournisseur de modèle configuré pour cet agent. Allez dans les paramètres des fournisseurs de modèle pour en ajouter un.",
"claude": {
"authMode": "Mode d'authentification",
"officialSubscription": "Abonnement officiel",
"officialSubscriptionHint": "Utiliser l'abonnement officiel Anthropic, pas de clé API requise.",
"mainModel": "Modèle principal",
"reasoningModel": "Modèle de raisonnement (thinking)",
"haikuDefaultModel": "Modèle Haiku par défaut",
@@ -624,7 +635,8 @@
"configSavedHint": "Les sessions existantes doivent être rouvertes pour prendre effet",
"saveConfigManagementFailed": "Échec de lenregistrement de la gestion de configuration",
"clineSaved": "Configuration Cline enregistrée",
"saveClineFailed": "Échec de l'enregistrement de la configuration Cline"
"saveClineFailed": "Échec de l'enregistrement de la configuration Cline",
"modelProviderRequired": "Veuillez sélectionner un fournisseur de modèle avant d'enregistrer."
},
"version": {
"statusLabel": "Statut de version",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "可能な場合は平文トークンではなく token-file の使用を推奨します。openclaw CLI で設定してください。",
"sessionKeyHint": "任意。gateway の session key を指定します。空欄の場合は分離されたセッションが自動割り当てされます。"
},
"authModeOfficialSubscription": "公式サブスクリプション",
"authModeCustomEndpoint": "カスタムエンドポイント",
"authModeCustomEndpointHint": "API URL と API Key を手動で設定してカスタムエンドポイントに接続します。",
"authModeModelProvider": "モデルプロバイダー",
"modelProvider": "モデルプロバイダー",
"modelProviderHint": "設定済みモデルプロバイダーの API URL と API Key を使用します。",
"selectModelProvider": "モデルプロバイダーを選択",
"noModelProviderAvailable": "このエージェントにはモデルプロバイダーが設定されていません。モデルプロバイダー設定で追加してください。",
"claude": {
"authMode": "認証方式",
"officialSubscription": "公式サブスクリプション",
"officialSubscriptionHint": "Anthropic 公式サブスクリプションを使用、API Key 不要。",
"mainModel": "メインモデル",
"reasoningModel": "推論モデルthinking",
"haikuDefaultModel": "デフォルト Haiku モデル",
@@ -624,7 +635,8 @@
"configSavedHint": "既存のセッションは再度開く必要があります",
"saveConfigManagementFailed": "設定管理の保存に失敗しました",
"clineSaved": "Cline設定を保存しました",
"saveClineFailed": "Cline設定の保存に失敗しました"
"saveClineFailed": "Cline設定の保存に失敗しました",
"modelProviderRequired": "保存する前にモデルプロバイダーを選択してください。"
},
"version": {
"statusLabel": "バージョン状態",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "가능하면 평문 토큰 대신 token-file을 사용하세요. openclaw CLI로 설정하세요.",
"sessionKeyHint": "선택 사항입니다. gateway 세션 키를 지정합니다. 비워두면 격리된 세션이 자동 할당됩니다."
},
"authModeOfficialSubscription": "공식 구독",
"authModeCustomEndpoint": "사용자 정의 엔드포인트",
"authModeCustomEndpointHint": "API URL과 API Key를 수동으로 구성하여 사용자 정의 엔드포인트에 연결합니다.",
"authModeModelProvider": "모델 공급자",
"modelProvider": "모델 공급자",
"modelProviderHint": "구성된 모델 공급자의 API URL 및 API Key를 사용합니다.",
"selectModelProvider": "모델 공급자 선택",
"noModelProviderAvailable": "이 에이전트에 구성된 모델 공급자가 없습니다. 모델 공급자 설정에서 추가하세요.",
"claude": {
"authMode": "인증 방식",
"officialSubscription": "공식 구독",
"officialSubscriptionHint": "Anthropic 공식 구독 사용, API Key 불필요.",
"mainModel": "메인 모델",
"reasoningModel": "추론 모델 (thinking)",
"haikuDefaultModel": "기본 Haiku 모델",
@@ -624,7 +635,8 @@
"configSavedHint": "기존 세션은 다시 열어야 적용됩니다",
"saveConfigManagementFailed": "구성 관리 저장 실패",
"clineSaved": "Cline 설정 저장됨",
"saveClineFailed": "Cline 설정 저장 실패"
"saveClineFailed": "Cline 설정 저장 실패",
"modelProviderRequired": "저장하기 전에 모델 공급자를 선택하세요."
},
"version": {
"statusLabel": "버전 상태",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "Use token-file em vez de token em texto puro quando possível; configure via CLI do openclaw.",
"sessionKeyHint": "Opcional. Especifique a session key do gateway; deixe vazio para atribuição automática de sessão isolada."
},
"authModeOfficialSubscription": "Assinatura oficial",
"authModeCustomEndpoint": "Endpoint personalizado",
"authModeCustomEndpointHint": "Configurar manualmente a URL da API e a chave API para um endpoint personalizado.",
"authModeModelProvider": "Provedor de modelo",
"modelProvider": "Provedor de modelo",
"modelProviderHint": "Usar URL da API e chave API de um provedor de modelo configurado.",
"selectModelProvider": "Selecionar provedor de modelo",
"noModelProviderAvailable": "Nenhum provedor de modelo configurado para este agente. Vá para as configurações de provedores de modelo para adicionar um.",
"claude": {
"authMode": "Modo de autenticação",
"officialSubscription": "Assinatura oficial",
"officialSubscriptionHint": "Usar assinatura oficial da Anthropic, sem necessidade de API Key.",
"mainModel": "Modelo principal",
"reasoningModel": "Modelo de raciocínio (thinking)",
"haikuDefaultModel": "Modelo Haiku padrão",
@@ -624,7 +635,8 @@
"configSavedHint": "Sessões existentes precisam ser reabertas para que as alterações tenham efeito",
"saveConfigManagementFailed": "Falha ao salvar o gerenciamento de configuração",
"clineSaved": "Configuração do Cline salva",
"saveClineFailed": "Falha ao salvar a configuração do Cline"
"saveClineFailed": "Falha ao salvar a configuração do Cline",
"modelProviderRequired": "Selecione um provedor de modelo antes de salvar."
},
"version": {
"statusLabel": "Status da versão",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "建议使用 token-file 替代明文 Token可通过 openclaw 命令行配置。",
"sessionKeyHint": "可选。指定 Gateway Session Key留空则自动分配隔离会话。"
},
"authModeOfficialSubscription": "官网订阅",
"authModeCustomEndpoint": "自定义接口",
"authModeCustomEndpointHint": "手动配置 API URL 和 API Key 连接自定义接口。",
"authModeModelProvider": "模型供应商",
"modelProvider": "模型供应商",
"modelProviderHint": "使用已配置的模型供应商的 API URL 和 API Key。",
"selectModelProvider": "选择模型供应商",
"noModelProviderAvailable": "该代理未配置模型供应商。请前往模型供应商设置添加。",
"claude": {
"authMode": "认证方式",
"officialSubscription": "官方订阅",
"officialSubscriptionHint": "使用 Anthropic 官方订阅,无需 API Key。",
"mainModel": "主模型",
"reasoningModel": "推理模型thinking",
"haikuDefaultModel": "Haiku 默认模型",
@@ -624,7 +635,8 @@
"configSavedHint": "已有会话需要重新打开才能生效",
"saveConfigManagementFailed": "保存配置管理失败",
"clineSaved": "Cline 配置已保存",
"saveClineFailed": "保存 Cline 配置失败"
"saveClineFailed": "保存 Cline 配置失败",
"modelProviderRequired": "请先选择一个模型供应商再保存。"
},
"version": {
"statusLabel": "版本状态",

View File

@@ -565,7 +565,18 @@
"gatewayTokenHint": "建議使用 token-file 取代明文 Token可透過 openclaw 命令列配置。",
"sessionKeyHint": "可選。指定 Gateway Session Key留空則自動分配隔離會話。"
},
"authModeOfficialSubscription": "官網訂閱",
"authModeCustomEndpoint": "自定義介面",
"authModeCustomEndpointHint": "手動配置 API URL 和 API Key 連接自定義介面。",
"authModeModelProvider": "模型供應商",
"modelProvider": "模型供應商",
"modelProviderHint": "使用已配置的模型供應商的 API URL 和 API Key。",
"selectModelProvider": "選擇模型供應商",
"noModelProviderAvailable": "該代理未配置模型供應商。請前往模型供應商設定添加。",
"claude": {
"authMode": "認證方式",
"officialSubscription": "官方訂閱",
"officialSubscriptionHint": "使用 Anthropic 官方訂閱,無需 API Key。",
"mainModel": "主模型",
"reasoningModel": "推理模型thinking",
"haikuDefaultModel": "Haiku 預設模型",
@@ -624,7 +635,8 @@
"configSavedHint": "已有會話需要重新打開才能生效",
"saveConfigManagementFailed": "儲存配置管理失敗",
"clineSaved": "Cline 配置已儲存",
"saveClineFailed": "儲存 Cline 配置失敗"
"saveClineFailed": "儲存 Cline 配置失敗",
"modelProviderRequired": "請先選擇一個模型供應商再儲存。"
},
"version": {
"statusLabel": "版本狀態",