diff --git a/src/renderer/src/aiCore/clients/BaseApiClient.ts b/src/renderer/src/aiCore/clients/BaseApiClient.ts index e7dea5c46a..2d643783c2 100644 --- a/src/renderer/src/aiCore/clients/BaseApiClient.ts +++ b/src/renderer/src/aiCore/clients/BaseApiClient.ts @@ -13,15 +13,18 @@ import { Assistant, FileTypes, GenerateImageParams, + GroqServiceTiers, + isGroqServiceTier, + isOpenAIServiceTier, KnowledgeReference, MCPCallToolResponse, MCPTool, MCPToolResponse, MemoryItem, Model, - OpenAIServiceTier, OpenAIServiceTiers, Provider, + SystemProviderIds, ToolCallResponse, WebSearchProviderResponse, WebSearchResponse @@ -203,31 +206,31 @@ export abstract class BaseApiClient< // NOTE: 这个也许可以迁移到OpenAIBaseClient protected getServiceTier(model: Model) { - if ( - !isSupportServiceTierProviders(this.provider) || - !isOpenAIModel(model) || - model.provider === 'github' || - model.provider === 'copilot' - ) { + const serviceTierSetting = this.provider.serviceTier + + if (!isSupportServiceTierProviders(this.provider) || !isOpenAIModel(model) || !serviceTierSetting) { return undefined } - let serviceTier: OpenAIServiceTier = OpenAIServiceTiers.AUTO - const serviceTierSetting = this.provider.serviceTier - - if (serviceTierSetting === OpenAIServiceTiers.FLEX) { - if (isSupportFlexServiceTierModel(model)) { - serviceTier = OpenAIServiceTiers.FLEX - } else { - serviceTier = OpenAIServiceTiers.AUTO + // 处理不同供应商需要 fallback 到默认值的情况 + if (this.provider.id === SystemProviderIds.groq) { + if ( + !isGroqServiceTier(serviceTierSetting) || + (serviceTierSetting === GroqServiceTiers.flex && !isSupportFlexServiceTierModel(model)) + ) { + return GroqServiceTiers.on_demand } - } else if (serviceTierSetting) { - serviceTier = serviceTierSetting } else { - // undefined 时使用默认值 auto + // 其他 OpenAI 供应商,假设他们的服务层级设置和 OpenAI 完全相同 + if ( + !isOpenAIServiceTier(serviceTierSetting) || + (serviceTierSetting === OpenAIServiceTiers.flex && !isSupportFlexServiceTierModel(model)) + ) { + return OpenAIServiceTiers.auto + } } - return serviceTier + return serviceTierSetting } protected getTimeout(model: Model) { diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 522141aad2..82c2bf3c89 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -258,7 +258,7 @@ export const SYSTEM_PROVIDERS_CONFIG: Record = models: SYSTEM_MODELS.openai, isSystem: true, enabled: false, - serviceTier: OpenAIServiceTiers.AUTO + serviceTier: OpenAIServiceTiers.auto }, 'azure-openai': { id: 'azure-openai', diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index cc766437e7..37b6540f3f 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -184,7 +184,7 @@ export type Provider = { isNotSupportDeveloperRole?: boolean /** 是否不支持 service_tier 参数. Only for OpenAI Models. */ isNotSupportServiceTier?: boolean - serviceTier?: OpenAIServiceTier + serviceTier?: ServiceTier isVertex?: boolean notes?: string @@ -905,10 +905,10 @@ export interface StoreSyncAction { export type OpenAISummaryText = 'auto' | 'concise' | 'detailed' | 'off' export const OpenAIServiceTiers = { - AUTO: 'auto', - DEFAULT: 'default', - FLEX: 'flex', - PRIORITY: 'priority' + auto: 'auto', + default: 'default', + flex: 'flex', + priority: 'priority' } as const export type OpenAIServiceTier = (typeof OpenAIServiceTiers)[keyof typeof OpenAIServiceTiers] @@ -919,6 +919,30 @@ export function isOpenAIServiceTier(tier: string): tier is OpenAIServiceTier { return openAIServiceTiersValues.some((value) => value === tier) } +export const GroqServiceTiers = { + auto: 'auto', + on_demand: 'on_demand', + flex: 'flex', + performance: 'performance' +} as const + +// 从 GroqServiceTiers 对象中提取类型 +export type GroqServiceTier = (typeof GroqServiceTiers)[keyof typeof GroqServiceTiers] + +// 缓存 Groq 服务等级值数组以提升类型守卫性能 +const groqServiceTiersValues = Object.values(GroqServiceTiers) + +// Groq 服务等级类型守卫 +export function isGroqServiceTier(tier: string): tier is GroqServiceTier { + return groqServiceTiersValues.some((value) => value === tier) +} + +export type ServiceTier = OpenAIServiceTier | GroqServiceTier + +export function isServiceTier(tier: string): tier is ServiceTier { + return isGroqServiceTier(tier) || isOpenAIServiceTier(tier) +} + export type S3Config = { endpoint: string region: string