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 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)
}

View File

@ -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'

View File

@ -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'

View File

@ -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,

View File

@ -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'

View File

@ -192,65 +192,83 @@ export type Provider = {
extra_headers?: Record<string, string>
}
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

View File

@ -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
}
/**

View File

@ -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
}
/**