diff --git a/src/hooks/useProviderActions.ts b/src/hooks/useProviderActions.ts index 4f925d40..d70ce8c5 100644 --- a/src/hooks/useProviderActions.ts +++ b/src/hooks/useProviderActions.ts @@ -139,21 +139,41 @@ export function useProviderActions(activeApp: AppId, isProxyRunning?: boolean) { // 切换供应商 const switchProvider = useCallback( async (provider: Provider) => { - const requiresProxyForSwitch = - !isProxyRunning && - provider.category !== "official" && - ((activeApp === "claude" && - (provider.meta?.isFullUrl || - provider.meta?.apiFormat === "openai_chat" || - provider.meta?.apiFormat === "openai_responses")) || - (activeApp === "codex" && provider.meta?.isFullUrl)); - + // Determine why this provider requires the proxy + let proxyRequiredReason: string | null = null; if ( - requiresProxyForSwitch + !isProxyRunning && + provider.category !== "official" ) { + if ( + provider.meta?.apiFormat === "openai_chat" && + (activeApp === "claude") + ) { + proxyRequiredReason = t("notifications.proxyReasonOpenAIChat", { + defaultValue: "使用 OpenAI Chat 接口格式", + }); + } else if ( + provider.meta?.apiFormat === "openai_responses" && + (activeApp === "claude") + ) { + proxyRequiredReason = t("notifications.proxyReasonOpenAIResponses", { + defaultValue: "使用 OpenAI Responses 接口格式", + }); + } else if ( + provider.meta?.isFullUrl && + (activeApp === "claude" || activeApp === "codex") + ) { + proxyRequiredReason = t("notifications.proxyReasonFullUrl", { + defaultValue: "开启了完整 URL 连接模式", + }); + } + } + + if (proxyRequiredReason) { toast.warning( t("notifications.proxyRequiredForSwitch", { - defaultValue: "此供应商需要代理服务,请先启动代理", + reason: proxyRequiredReason, + defaultValue: "此供应商{{reason}},需要代理服务才能正常使用,请先启动代理", }), ); return; @@ -174,27 +194,8 @@ export function useProviderActions(activeApp: AppId, isProxyRunning?: boolean) { ); } - // 根据供应商类型显示不同的成功提示 - if ( - activeApp === "claude" && - provider.category !== "official" && - (provider.meta?.apiFormat === "openai_chat" || - provider.meta?.apiFormat === "openai_responses") - ) { - // OpenAI format provider: show proxy hint - toast.info( - t("notifications.openAIFormatHint", { - defaultValue: - "此供应商使用 OpenAI 兼容格式,需要开启代理服务才能正常使用", - }), - { - duration: 5000, - closeButton: true, - }, - ); - } else { - // 普通供应商:显示切换成功 - // OpenCode/OpenClaw: show "added to config" message instead of "switched" + // OpenCode/OpenClaw: show "added to config" message instead of "switched" + { const isMultiProviderApp = activeApp === "opencode" || activeApp === "openclaw"; const messageKey = isMultiProviderApp diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 0a526bcf..2f5ca304 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -174,9 +174,10 @@ "deleteFailed": "Failed to delete provider: {{error}}", "settingsSaved": "Settings saved", "settingsSaveFailed": "Failed to save settings: {{error}}", - "openAIChatFormatHint": "This provider uses OpenAI Chat format and requires the proxy service to be enabled", - "openAIFormatHint": "This provider uses OpenAI-compatible format and requires the proxy service to be enabled", - "proxyRequiredForSwitch": "This provider requires the proxy service. Start the proxy first.", + "proxyRequiredForSwitch": "This provider {{reason}}, requires the proxy service to work properly. Start the proxy first.", + "proxyReasonOpenAIChat": "uses OpenAI Chat API format", + "proxyReasonOpenAIResponses": "uses OpenAI Responses API format", + "proxyReasonFullUrl": "has full URL connection mode enabled", "openLinkFailed": "Failed to open link", "openclawModelsRegistered": "Models have been registered to /model list", "openclawDefaultModelSet": "Set as default model", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index cd980419..654f0219 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -174,9 +174,10 @@ "deleteFailed": "プロバイダーの削除に失敗しました: {{error}}", "settingsSaved": "設定を保存しました", "settingsSaveFailed": "設定の保存に失敗しました: {{error}}", - "openAIChatFormatHint": "このプロバイダーは OpenAI Chat フォーマットを使用しており、プロキシサービスの有効化が必要です", - "openAIFormatHint": "このプロバイダーは OpenAI 互換フォーマットを使用しており、プロキシサービスの有効化が必要です", - "proxyRequiredForSwitch": "このプロバイダーにはプロキシサービスが必要です。先にプロキシを起動してください", + "proxyRequiredForSwitch": "このプロバイダーは{{reason}}、プロキシサービスが必要です。先にプロキシを起動してください", + "proxyReasonOpenAIChat": "OpenAI Chat API フォーマットを使用しており", + "proxyReasonOpenAIResponses": "OpenAI Responses API フォーマットを使用しており", + "proxyReasonFullUrl": "完全 URL 接続モードが有効になっており", "openLinkFailed": "リンクを開けませんでした", "openclawModelsRegistered": "モデルが /model リストに登録されました", "openclawDefaultModelSet": "デフォルトモデルに設定しました", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index a1f06326..1eece758 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -174,9 +174,10 @@ "deleteFailed": "删除供应商失败:{{error}}", "settingsSaved": "设置已保存", "settingsSaveFailed": "保存设置失败:{{error}}", - "openAIChatFormatHint": "此供应商使用 OpenAI Chat 格式,需要开启代理服务才能正常使用", - "openAIFormatHint": "此供应商使用 OpenAI 兼容格式,需要开启代理服务才能正常使用", - "proxyRequiredForSwitch": "此供应商需要代理服务,请先启动代理", + "proxyRequiredForSwitch": "此供应商{{reason}},需要代理服务才能正常使用,请先启动代理", + "proxyReasonOpenAIChat": "使用 OpenAI Chat 接口格式", + "proxyReasonOpenAIResponses": "使用 OpenAI Responses 接口格式", + "proxyReasonFullUrl": "开启了完整 URL 连接模式", "openLinkFailed": "链接打开失败", "openclawModelsRegistered": "模型已注册到 /model 列表", "openclawDefaultModelSet": "已设为默认模型",