refactor(types): 将 isSystemProvider 移动到 types 模块并重构系统提供商 ID 定义

将 isSystemProvider 函数从 config/providers.ts 移动到 types/index.ts 以更好组织代码
重构系统提供商 ID 为 SystemProviderIds 常量对象并添加类型检查函数
更新所有引用 isSystemProvider 的导入路径
This commit is contained in:
icarus 2025-08-06 16:25:07 +08:00
parent 9b28ad7191
commit 9492c84b54
8 changed files with 91 additions and 79 deletions

View File

@ -52,8 +52,7 @@ import VoyageAIProviderLogo from '@renderer/assets/images/providers/voyageai.png
import XirangProviderLogo from '@renderer/assets/images/providers/xirang.png' import XirangProviderLogo from '@renderer/assets/images/providers/xirang.png'
import ZeroOneProviderLogo from '@renderer/assets/images/providers/zero-one.png' import ZeroOneProviderLogo from '@renderer/assets/images/providers/zero-one.png'
import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png'
import { SYSTEM_PROVIDERS } from '@renderer/store/llm' import { Provider } from '@renderer/types'
import { Provider, SystemProvider } from '@renderer/types'
import { TOKENFLUX_HOST } from './constant' import { TOKENFLUX_HOST } from './constant'
@ -755,12 +754,3 @@ const SUPPORT_QWEN3_ENABLE_THINKING_PROVIDER = ['dashscope', 'modelscope']
export const isSupportQwen3EnableThinkingProvider = (provider: Provider) => { export const isSupportQwen3EnableThinkingProvider = (provider: Provider) => {
return SUPPORT_QWEN3_ENABLE_THINKING_PROVIDER.includes(provider.id) 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)
}

View File

@ -1,5 +1,4 @@
import { createSelector } from '@reduxjs/toolkit' import { createSelector } from '@reduxjs/toolkit'
import { isSystemProvider } from '@renderer/config/providers'
import { useAppDispatch, useAppSelector } from '@renderer/store' import { useAppDispatch, useAppSelector } from '@renderer/store'
import { import {
addModel, addModel,
@ -10,7 +9,7 @@ import {
updateProvider, updateProvider,
updateProviders updateProviders
} from '@renderer/store/llm' } from '@renderer/store/llm'
import { Assistant, Model, Provider } from '@renderer/types' import { Assistant, isSystemProvider, Model, Provider } from '@renderer/types'
import { useDefaultModel } from './useAssistant' import { useDefaultModel } from './useAssistant'

View File

@ -1,8 +1,7 @@
import InfoTooltip from '@renderer/components/InfoTooltip' import InfoTooltip from '@renderer/components/InfoTooltip'
import { HStack } from '@renderer/components/Layout' import { HStack } from '@renderer/components/Layout'
import { isSystemProvider } from '@renderer/config/providers'
import { useProvider } from '@renderer/hooks/useProvider' import { useProvider } from '@renderer/hooks/useProvider'
import { Provider } from '@renderer/types' import { isSystemProvider, Provider } from '@renderer/types'
import { Collapse, Flex, Switch } from 'antd' import { Collapse, Flex, Switch } from 'antd'
import { startTransition, useCallback, useMemo } from 'react' import { startTransition, useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'

View File

@ -1,11 +1,11 @@
import { loggerService } from '@logger' import { loggerService } from '@logger'
import { DraggableVirtualList } from '@renderer/components/DraggableList' import { DraggableVirtualList } from '@renderer/components/DraggableList'
import { DeleteIcon, EditIcon } from '@renderer/components/Icons' 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 { useAllProviders, useProviders } from '@renderer/hooks/useProvider'
import { getProviderLabel } from '@renderer/i18n/label' import { getProviderLabel } from '@renderer/i18n/label'
import ImageStorage from '@renderer/services/ImageStorage' import ImageStorage from '@renderer/services/ImageStorage'
import { Provider, ProviderType } from '@renderer/types' import { isSystemProvider, Provider, ProviderType } from '@renderer/types'
import { import {
generateColorFromChar, generateColorFromChar,
getFancyProviderName, getFancyProviderName,

View File

@ -7,12 +7,20 @@ import { TRANSLATE_PROMPT } from '@renderer/config/prompts'
import { import {
isSupportArrayContentProvider, isSupportArrayContentProvider,
isSupportDeveloperRoleProvider, isSupportDeveloperRoleProvider,
isSupportStreamOptionsProvider, isSupportStreamOptionsProvider
isSystemProvider
} from '@renderer/config/providers' } from '@renderer/config/providers'
import db from '@renderer/databases' import db from '@renderer/databases'
import i18n from '@renderer/i18n' 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 { getDefaultGroupName, getLeadingEmoji, runAsyncFunction, uuid } from '@renderer/utils'
import { defaultByPassRules, UpgradeChannel } from '@shared/config/constant' import { defaultByPassRules, UpgradeChannel } from '@shared/config/constant'
import { isEmpty } from 'lodash' import { isEmpty } from 'lodash'

View File

@ -192,65 +192,83 @@ export type Provider = {
extra_headers?: Record<string, string> extra_headers?: Record<string, string>
} }
export type SystemProviderId = export const SystemProviderIds = {
| 'silicon' silicon: 'silicon',
| 'aihubmix' aihubmix: 'aihubmix',
| 'ocoolai' ocoolai: 'ocoolai',
| 'deepseek' deepseek: 'deepseek',
| 'ppio' ppio: 'ppio',
| 'alayanew' alayanew: 'alayanew',
| 'qiniu' qiniu: 'qiniu',
| 'dmxapi' dmxapi: 'dmxapi',
| 'burncloud' burncloud: 'burncloud',
| 'tokenflux' tokenflux: 'tokenflux',
| '302ai' '302ai': '302ai',
| 'cephalon' cephalon: 'cephalon',
| 'lanyun' lanyun: 'lanyun',
| 'ph8' ph8: 'ph8',
| 'openrouter' openrouter: 'openrouter',
| 'ollama' ollama: 'ollama',
| 'new-api' 'new-api': 'new-api',
| 'lmstudio' lmstudio: 'lmstudio',
| 'anthropic' anthropic: 'anthropic',
| 'openai' openai: 'openai',
| 'azure-openai' 'azure-openai': 'azure-openai',
| 'gemini' gemini: 'gemini',
| 'vertexai' vertexai: 'vertexai',
| 'github' github: 'github',
| 'copilot' copilot: 'copilot',
| 'zhipu' zhipu: 'zhipu',
| 'yi' yi: 'yi',
| 'moonshot' moonshot: 'moonshot',
| 'baichuan' baichuan: 'baichuan',
| 'dashscope' dashscope: 'dashscope',
| 'stepfun' stepfun: 'stepfun',
| 'doubao' doubao: 'doubao',
| 'infini' infini: 'infini',
| 'minimax' minimax: 'minimax',
| 'groq' groq: 'groq',
| 'together' together: 'together',
| 'fireworks' fireworks: 'fireworks',
| 'nvidia' nvidia: 'nvidia',
| 'grok' grok: 'grok',
| 'hyperbolic' hyperbolic: 'hyperbolic',
| 'mistral' mistral: 'mistral',
| 'jina' jina: 'jina',
| 'perplexity' perplexity: 'perplexity',
| 'modelscope' modelscope: 'modelscope',
| 'xirang' xirang: 'xirang',
| 'hunyuan' hunyuan: 'hunyuan',
| 'tencent-cloud-ti' 'tencent-cloud-ti': 'tencent-cloud-ti',
| 'baidu-cloud' 'baidu-cloud': 'baidu-cloud',
| 'gpustack' gpustack: 'gpustack',
| 'voyageai' voyageai: 'voyageai',
| 'aws-bedrock' 'aws-bedrock': 'aws-bedrock',
| 'poe' 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 & { export type SystemProvider = Provider & {
id: SystemProviderId id: SystemProviderId
isSystem: true 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 & { export type ProviderSupportedServiceTier = Provider & {
isSupportServiceTier: true isSupportServiceTier: true
serviceTier: OpenAIServiceTier serviceTier: OpenAIServiceTier

View File

@ -1,5 +1,5 @@
import { getProviderLabel } from '@renderer/i18n/label' import { getProviderLabel } from '@renderer/i18n/label'
import { Model, Provider } from '@renderer/types' import { isSystemProvider, Model, Provider } from '@renderer/types'
/** /**
* keywords * keywords
@ -64,8 +64,7 @@ export function matchKeywordsInModel(keywords: string | string[], model: Model,
* @returns * @returns
*/ */
function getProviderSearchString(provider: Provider) { function getProviderSearchString(provider: Provider) {
// FIXME: 无法在这里使用 isSystemProvider但我不清楚为什么 return isSystemProvider(provider) ? `${getProviderLabel(provider.id)} ${provider.id}` : provider.name
return provider.isSystem ? `${getProviderLabel(provider.id)} ${provider.id}` : provider.name
} }
/** /**

View File

@ -1,5 +1,5 @@
import { getProviderLabel } from '@renderer/i18n/label' import { getProviderLabel } from '@renderer/i18n/label'
import { Provider } from '@renderer/types' import { isSystemProvider, Provider } from '@renderer/types'
/** /**
* ID * ID
@ -82,8 +82,7 @@ export const getLowerBaseModelName = (id: string, delimiter: string = '/'): stri
* @returns * @returns
*/ */
export const getFancyProviderName = (provider: Provider) => { export const getFancyProviderName = (provider: Provider) => {
// FIXME: 无法在这里使用 isSystemProvider但我不清楚为什么 return isSystemProvider(provider) ? getProviderLabel(provider.id) : provider.name
return provider.isSystem ? getProviderLabel(provider.id) : provider.name
} }
/** /**