From 9492c84b54fc9863a9b8bdd0fc4e5d0800629833 Mon Sep 17 00:00:00 2001 From: icarus Date: Wed, 6 Aug 2025 16:25:07 +0800 Subject: [PATCH] =?UTF-8?q?refactor(types):=20=E5=B0=86=20isSystemProvider?= =?UTF-8?q?=20=E7=A7=BB=E5=8A=A8=E5=88=B0=20types=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=B9=B6=E9=87=8D=E6=9E=84=E7=B3=BB=E7=BB=9F=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E5=95=86=20ID=20=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 isSystemProvider 函数从 config/providers.ts 移动到 types/index.ts 以更好组织代码 重构系统提供商 ID 为 SystemProviderIds 常量对象并添加类型检查函数 更新所有引用 isSystemProvider 的导入路径 --- src/renderer/src/config/providers.ts | 12 +- src/renderer/src/hooks/useProvider.ts | 3 +- .../ProviderSettings/ApiOptionsSettings.tsx | 3 +- .../pages/settings/ProviderSettings/index.tsx | 4 +- src/renderer/src/store/migrate.ts | 14 +- src/renderer/src/types/index.ts | 124 ++++++++++-------- src/renderer/src/utils/match.ts | 5 +- src/renderer/src/utils/naming.ts | 5 +- 8 files changed, 91 insertions(+), 79 deletions(-) diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 536a7d5524..9acbcd2a42 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -52,8 +52,7 @@ import VoyageAIProviderLogo from '@renderer/assets/images/providers/voyageai.png import XirangProviderLogo from '@renderer/assets/images/providers/xirang.png' import ZeroOneProviderLogo from '@renderer/assets/images/providers/zero-one.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' -import { SYSTEM_PROVIDERS } from '@renderer/store/llm' -import { Provider, SystemProvider } from '@renderer/types' +import { Provider } from '@renderer/types' import { TOKENFLUX_HOST } from './constant' @@ -755,12 +754,3 @@ const SUPPORT_QWEN3_ENABLE_THINKING_PROVIDER = ['dashscope', 'modelscope'] export const isSupportQwen3EnableThinkingProvider = (provider: Provider) => { return SUPPORT_QWEN3_ENABLE_THINKING_PROVIDER.includes(provider.id) } - -/** - * 判断是否为系统内置的提供商。比直接使用`provider.isSystem`更好,因为该数据字段不会随着版本更新而变化。 - * @param provider - Provider对象,包含提供商的信息 - * @returns 是否为系统内置提供商 - */ -export const isSystemProvider = (provider: Provider): provider is SystemProvider => { - return SYSTEM_PROVIDERS.some((p) => p.id === provider.id) -} diff --git a/src/renderer/src/hooks/useProvider.ts b/src/renderer/src/hooks/useProvider.ts index e02bfa2dcf..81083ea984 100644 --- a/src/renderer/src/hooks/useProvider.ts +++ b/src/renderer/src/hooks/useProvider.ts @@ -1,5 +1,4 @@ import { createSelector } from '@reduxjs/toolkit' -import { isSystemProvider } from '@renderer/config/providers' import { useAppDispatch, useAppSelector } from '@renderer/store' import { addModel, @@ -10,7 +9,7 @@ import { updateProvider, updateProviders } from '@renderer/store/llm' -import { Assistant, Model, Provider } from '@renderer/types' +import { Assistant, isSystemProvider, Model, Provider } from '@renderer/types' import { useDefaultModel } from './useAssistant' diff --git a/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings.tsx index b9f7b23033..fa438bab24 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ApiOptionsSettings.tsx @@ -1,8 +1,7 @@ import InfoTooltip from '@renderer/components/InfoTooltip' import { HStack } from '@renderer/components/Layout' -import { isSystemProvider } from '@renderer/config/providers' import { useProvider } from '@renderer/hooks/useProvider' -import { Provider } from '@renderer/types' +import { isSystemProvider, Provider } from '@renderer/types' import { Collapse, Flex, Switch } from 'antd' import { startTransition, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/renderer/src/pages/settings/ProviderSettings/index.tsx b/src/renderer/src/pages/settings/ProviderSettings/index.tsx index 718b25191b..08fe14dd77 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/index.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/index.tsx @@ -1,11 +1,11 @@ import { loggerService } from '@logger' import { DraggableVirtualList } from '@renderer/components/DraggableList' import { DeleteIcon, EditIcon } from '@renderer/components/Icons' -import { getProviderLogo, isSystemProvider } from '@renderer/config/providers' +import { getProviderLogo } from '@renderer/config/providers' import { useAllProviders, useProviders } from '@renderer/hooks/useProvider' import { getProviderLabel } from '@renderer/i18n/label' import ImageStorage from '@renderer/services/ImageStorage' -import { Provider, ProviderType } from '@renderer/types' +import { isSystemProvider, Provider, ProviderType } from '@renderer/types' import { generateColorFromChar, getFancyProviderName, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 9189faa6b3..d918fc9da3 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -7,12 +7,20 @@ import { TRANSLATE_PROMPT } from '@renderer/config/prompts' import { isSupportArrayContentProvider, isSupportDeveloperRoleProvider, - isSupportStreamOptionsProvider, - isSystemProvider + isSupportStreamOptionsProvider } from '@renderer/config/providers' import db from '@renderer/databases' import i18n from '@renderer/i18n' -import { Assistant, LanguageCode, Model, Provider, WebSearchProvider } from '@renderer/types' +import { + Assistant, + isSystemProvider, + LanguageCode, + Model, + OpenAIServiceTiers, + Provider, + SystemProviderIds, + WebSearchProvider +} from '@renderer/types' import { getDefaultGroupName, getLeadingEmoji, runAsyncFunction, uuid } from '@renderer/utils' import { defaultByPassRules, UpgradeChannel } from '@shared/config/constant' import { isEmpty } from 'lodash' diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 960943f0fd..1376635508 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -192,65 +192,83 @@ export type Provider = { extra_headers?: Record } -export type SystemProviderId = - | 'silicon' - | 'aihubmix' - | 'ocoolai' - | 'deepseek' - | 'ppio' - | 'alayanew' - | 'qiniu' - | 'dmxapi' - | 'burncloud' - | 'tokenflux' - | '302ai' - | 'cephalon' - | 'lanyun' - | 'ph8' - | 'openrouter' - | 'ollama' - | 'new-api' - | 'lmstudio' - | 'anthropic' - | 'openai' - | 'azure-openai' - | 'gemini' - | 'vertexai' - | 'github' - | 'copilot' - | 'zhipu' - | 'yi' - | 'moonshot' - | 'baichuan' - | 'dashscope' - | 'stepfun' - | 'doubao' - | 'infini' - | 'minimax' - | 'groq' - | 'together' - | 'fireworks' - | 'nvidia' - | 'grok' - | 'hyperbolic' - | 'mistral' - | 'jina' - | 'perplexity' - | 'modelscope' - | 'xirang' - | 'hunyuan' - | 'tencent-cloud-ti' - | 'baidu-cloud' - | 'gpustack' - | 'voyageai' - | 'aws-bedrock' - | 'poe' +export const SystemProviderIds = { + silicon: 'silicon', + aihubmix: 'aihubmix', + ocoolai: 'ocoolai', + deepseek: 'deepseek', + ppio: 'ppio', + alayanew: 'alayanew', + qiniu: 'qiniu', + dmxapi: 'dmxapi', + burncloud: 'burncloud', + tokenflux: 'tokenflux', + '302ai': '302ai', + cephalon: 'cephalon', + lanyun: 'lanyun', + ph8: 'ph8', + openrouter: 'openrouter', + ollama: 'ollama', + 'new-api': 'new-api', + lmstudio: 'lmstudio', + anthropic: 'anthropic', + openai: 'openai', + 'azure-openai': 'azure-openai', + gemini: 'gemini', + vertexai: 'vertexai', + github: 'github', + copilot: 'copilot', + zhipu: 'zhipu', + yi: 'yi', + moonshot: 'moonshot', + baichuan: 'baichuan', + dashscope: 'dashscope', + stepfun: 'stepfun', + doubao: 'doubao', + infini: 'infini', + minimax: 'minimax', + groq: 'groq', + together: 'together', + fireworks: 'fireworks', + nvidia: 'nvidia', + grok: 'grok', + hyperbolic: 'hyperbolic', + mistral: 'mistral', + jina: 'jina', + perplexity: 'perplexity', + modelscope: 'modelscope', + xirang: 'xirang', + hunyuan: 'hunyuan', + 'tencent-cloud-ti': 'tencent-cloud-ti', + 'baidu-cloud': 'baidu-cloud', + gpustack: 'gpustack', + voyageai: 'voyageai', + 'aws-bedrock': 'aws-bedrock', + poe: 'poe' +} as const + +export type SystemProviderId = (typeof SystemProviderIds)[keyof typeof SystemProviderIds] + +const systemProviderIdValues = Object.values(SystemProviderIds) + +export const isSystemProviderId = (id: string): id is SystemProviderId => { + return systemProviderIdValues.some((sid) => sid === id) +} export type SystemProvider = Provider & { id: SystemProviderId isSystem: true } +/** + * 判断是否为系统内置的提供商。比直接使用`provider.isSystem`更好,因为该数据字段不会随着版本更新而变化。 + * @param provider - Provider对象,包含提供商的信息 + * @returns 是否为系统内置提供商 + */ +export const isSystemProvider = (provider: Provider): provider is SystemProvider => { + return isSystemProviderId(provider.id) && !!provider.isSystem +} + export type ProviderSupportedServiceTier = Provider & { isSupportServiceTier: true serviceTier: OpenAIServiceTier diff --git a/src/renderer/src/utils/match.ts b/src/renderer/src/utils/match.ts index 027d071679..28b12a9b5f 100644 --- a/src/renderer/src/utils/match.ts +++ b/src/renderer/src/utils/match.ts @@ -1,5 +1,5 @@ import { getProviderLabel } from '@renderer/i18n/label' -import { Model, Provider } from '@renderer/types' +import { isSystemProvider, Model, Provider } from '@renderer/types' /** * 判断一个字符串是否包含由另一个字符串表示的 keywords @@ -64,8 +64,7 @@ export function matchKeywordsInModel(keywords: string | string[], model: Model, * @returns 搜索字符串 */ function getProviderSearchString(provider: Provider) { - // FIXME: 无法在这里使用 isSystemProvider,但我不清楚为什么 - return provider.isSystem ? `${getProviderLabel(provider.id)} ${provider.id}` : provider.name + return isSystemProvider(provider) ? `${getProviderLabel(provider.id)} ${provider.id}` : provider.name } /** diff --git a/src/renderer/src/utils/naming.ts b/src/renderer/src/utils/naming.ts index 78beab6e99..f652f3c41a 100644 --- a/src/renderer/src/utils/naming.ts +++ b/src/renderer/src/utils/naming.ts @@ -1,5 +1,5 @@ import { getProviderLabel } from '@renderer/i18n/label' -import { Provider } from '@renderer/types' +import { isSystemProvider, Provider } from '@renderer/types' /** * 从模型 ID 中提取默认组名。 @@ -82,8 +82,7 @@ export const getLowerBaseModelName = (id: string, delimiter: string = '/'): stri * @returns 描述性的名字 */ export const getFancyProviderName = (provider: Provider) => { - // FIXME: 无法在这里使用 isSystemProvider,但我不清楚为什么 - return provider.isSystem ? getProviderLabel(provider.id) : provider.name + return isSystemProvider(provider) ? getProviderLabel(provider.id) : provider.name } /**