feat(i18n): add "supported_providers" key to multiple locale files and enhance CodeToolsPage with provider information

- Added the "supported_providers" translation key to English, Japanese, Russian, Simplified Chinese, and Traditional Chinese locale files.
- Updated CodeToolsPage to display a popover with supported providers when the Claude Code model is selected, improving user experience and accessibility of provider information.
- Introduced a new styled component for provider logos to enhance visual representation.
This commit is contained in:
kangfenmao 2025-09-01 22:20:40 +08:00
parent df7fd26907
commit 5ab98c9d05
7 changed files with 57 additions and 6 deletions

View File

@ -677,6 +677,7 @@
"model_placeholder": "Select the model to use",
"model_required": "Please select a model",
"select_folder": "Select Folder",
"supported_providers": "Supported Providers",
"title": "Code Tools",
"update_options": "Update Options",
"working_directory": "Working Directory"

View File

@ -677,6 +677,7 @@
"model_placeholder": "使用するモデルを選択してください",
"model_required": "モデルを選択してください",
"select_folder": "フォルダを選択",
"supported_providers": "サポートされているプロバイダー",
"title": "コードツール",
"update_options": "更新オプション",
"working_directory": "作業ディレクトリ"

View File

@ -677,6 +677,7 @@
"model_placeholder": "Выберите модель для использования",
"model_required": "Пожалуйста, выберите модель",
"select_folder": "Выберите папку",
"supported_providers": "Поддерживаемые поставщики",
"title": "Инструменты кода",
"update_options": "Параметры обновления",
"working_directory": "Рабочая директория"

View File

@ -677,6 +677,7 @@
"model_placeholder": "选择要使用的模型",
"model_required": "请选择模型",
"select_folder": "选择文件夹",
"supported_providers": "支持的服务商",
"title": "代码工具",
"update_options": "更新选项",
"working_directory": "工作目录"

View File

@ -677,6 +677,7 @@
"model_placeholder": "選擇要使用的模型",
"model_required": "請選擇模型",
"select_folder": "選擇資料夾",
"supported_providers": "支援的供應商",
"title": "程式碼工具",
"update_options": "更新選項",
"working_directory": "工作目錄"

View File

@ -2,19 +2,22 @@ import AiProvider from '@renderer/aiCore'
import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar'
import ModelSelector from '@renderer/components/ModelSelector'
import { isEmbeddingModel, isRerankModel, isTextToImageModel } from '@renderer/config/models'
import { getProviderLogo } from '@renderer/config/providers'
import { useCodeTools } from '@renderer/hooks/useCodeTools'
import { useProviders } from '@renderer/hooks/useProvider'
import { useAllProviders, useProviders } from '@renderer/hooks/useProvider'
import { useTimer } from '@renderer/hooks/useTimer'
import { getProviderLabel } from '@renderer/i18n/label'
import { getProviderByModel } from '@renderer/services/AssistantService'
import { loggerService } from '@renderer/services/LoggerService'
import { getModelUniqId } from '@renderer/services/ModelService'
import { useAppDispatch, useAppSelector } from '@renderer/store'
import { setIsBunInstalled } from '@renderer/store/mcp'
import { Model } from '@renderer/types'
import { Alert, Button, Checkbox, Input, Select, Space } from 'antd'
import { Download, Terminal, X } from 'lucide-react'
import { Alert, Avatar, Button, Checkbox, Input, Popover, Select, Space } from 'antd'
import { ArrowUpRight, Download, HelpCircle, Terminal, X } from 'lucide-react'
import { FC, useCallback, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import styled from 'styled-components'
import {
@ -22,6 +25,7 @@ import {
CLI_TOOL_PROVIDER_MAP,
CLI_TOOLS,
generateToolEnvironment,
getClaudeSupportedProviders,
parseEnvironmentVariables
} from '.'
@ -30,6 +34,7 @@ const logger = loggerService.withContext('CodeToolsPage')
const CodeToolsPage: FC = () => {
const { t } = useTranslation()
const { providers } = useProviders()
const allProviders = useAllProviders()
const dispatch = useAppDispatch()
const isBunInstalled = useAppSelector((state) => state.mcp.isBunInstalled)
const {
@ -258,7 +263,35 @@ const CodeToolsPage: FC = () => {
</SettingsItem>
<SettingsItem>
<div className="settings-label">{t('code.model')}</div>
<div className="settings-label">
{t('code.model')}
{selectedCliTool === 'claude-code' && (
<Popover
content={
<div style={{ width: 200 }}>
<div style={{ marginBottom: 8, fontWeight: 500 }}>{t('code.supported_providers')}</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
{getClaudeSupportedProviders(allProviders).map((provider) => {
return (
<Link
key={provider.id}
style={{ color: 'var(--color-text)', display: 'flex', alignItems: 'center', gap: 4 }}
to={`/settings/provider?id=${provider.id}`}>
<ProviderLogo shape="square" src={getProviderLogo(provider.id)} size={20} />
{getProviderLabel(provider.id)}
<ArrowUpRight size={14} />
</Link>
)
})}
</div>
</div>
}
trigger="hover"
placement="right">
<HelpCircle size={14} style={{ color: 'var(--color-text-3)', cursor: 'pointer' }} />
</Popover>
)}
</div>
<ModelSelector
providers={availableProviders}
predicate={modelPredicate}
@ -395,4 +428,8 @@ const BunInstallAlert = styled.div`
margin-bottom: 24px;
`
const ProviderLogo = styled(Avatar)`
border-radius: 4px;
`
export default CodeToolsPage

View File

@ -16,14 +16,14 @@ export interface ToolEnvironmentConfig {
// CLI 工具选项
export const CLI_TOOLS = [
{ value: codeTools.qwenCode, label: 'Qwen Code' },
{ value: codeTools.claudeCode, label: 'Claude Code' },
{ value: codeTools.qwenCode, label: 'Qwen Code' },
{ value: codeTools.geminiCli, label: 'Gemini CLI' },
{ value: codeTools.openaiCodex, label: 'OpenAI Codex' }
]
export const GEMINI_SUPPORTED_PROVIDERS = ['aihubmix', 'dmxapi', 'new-api']
export const CLAUDE_OFFICIAL_SUPPORTED_PROVIDERS = ['deepseek', 'moonshot', 'zhipu']
export const CLAUDE_OFFICIAL_SUPPORTED_PROVIDERS = ['deepseek', 'moonshot', 'zhipu', 'dashscope']
export const CLAUDE_SUPPORTED_PROVIDERS = ['aihubmix', 'dmxapi', 'new-api', ...CLAUDE_OFFICIAL_SUPPORTED_PROVIDERS]
// Provider 过滤映射
@ -57,6 +57,11 @@ export const getCodeToolsApiBaseUrl = (model: Model, type: EndpointType) => {
anthropic: {
api_base_url: 'https://open.bigmodel.cn/api/anthropic'
}
},
dashscope: {
anthropic: {
api_base_url: 'https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy'
}
}
}
@ -132,4 +137,8 @@ export const generateToolEnvironment = ({
return env
}
export const getClaudeSupportedProviders = (providers: Provider[]) => {
return providers.filter((p) => p.type === 'anthropic' || CLAUDE_SUPPORTED_PROVIDERS.includes(p.id))
}
export { default } from './CodeToolsPage'