refactor(service-tier): 统一服务层级命名并添加Groq支持

将OpenAIServiceTiers的常量值从大写改为小写以保持命名一致性
新增GroqServiceTiers及相关类型守卫
重构BaseApiClient中的服务层级处理逻辑以支持多供应商
This commit is contained in:
icarus 2025-08-06 18:40:11 +08:00
parent 1b231aed1e
commit b69a9ab03d
3 changed files with 52 additions and 25 deletions

View File

@ -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) {

View File

@ -258,7 +258,7 @@ export const SYSTEM_PROVIDERS_CONFIG: Record<SystemProviderId, SystemProvider> =
models: SYSTEM_MODELS.openai,
isSystem: true,
enabled: false,
serviceTier: OpenAIServiceTiers.AUTO
serviceTier: OpenAIServiceTiers.auto
},
'azure-openai': {
id: 'azure-openai',

View File

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