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, Assistant,
FileTypes, FileTypes,
GenerateImageParams, GenerateImageParams,
GroqServiceTiers,
isGroqServiceTier,
isOpenAIServiceTier,
KnowledgeReference, KnowledgeReference,
MCPCallToolResponse, MCPCallToolResponse,
MCPTool, MCPTool,
MCPToolResponse, MCPToolResponse,
MemoryItem, MemoryItem,
Model, Model,
OpenAIServiceTier,
OpenAIServiceTiers, OpenAIServiceTiers,
Provider, Provider,
SystemProviderIds,
ToolCallResponse, ToolCallResponse,
WebSearchProviderResponse, WebSearchProviderResponse,
WebSearchResponse WebSearchResponse
@ -203,31 +206,31 @@ export abstract class BaseApiClient<
// NOTE: 这个也许可以迁移到OpenAIBaseClient // NOTE: 这个也许可以迁移到OpenAIBaseClient
protected getServiceTier(model: Model) { protected getServiceTier(model: Model) {
if ( const serviceTierSetting = this.provider.serviceTier
!isSupportServiceTierProviders(this.provider) ||
!isOpenAIModel(model) || if (!isSupportServiceTierProviders(this.provider) || !isOpenAIModel(model) || !serviceTierSetting) {
model.provider === 'github' ||
model.provider === 'copilot'
) {
return undefined return undefined
} }
let serviceTier: OpenAIServiceTier = OpenAIServiceTiers.AUTO // 处理不同供应商需要 fallback 到默认值的情况
const serviceTierSetting = this.provider.serviceTier if (this.provider.id === SystemProviderIds.groq) {
if (
if (serviceTierSetting === OpenAIServiceTiers.FLEX) { !isGroqServiceTier(serviceTierSetting) ||
if (isSupportFlexServiceTierModel(model)) { (serviceTierSetting === GroqServiceTiers.flex && !isSupportFlexServiceTierModel(model))
serviceTier = OpenAIServiceTiers.FLEX ) {
} else { return GroqServiceTiers.on_demand
serviceTier = OpenAIServiceTiers.AUTO
} }
} else if (serviceTierSetting) {
serviceTier = serviceTierSetting
} else { } else {
// undefined 时使用默认值 auto // 其他 OpenAI 供应商,假设他们的服务层级设置和 OpenAI 完全相同
if (
!isOpenAIServiceTier(serviceTierSetting) ||
(serviceTierSetting === OpenAIServiceTiers.flex && !isSupportFlexServiceTierModel(model))
) {
return OpenAIServiceTiers.auto
}
} }
return serviceTier return serviceTierSetting
} }
protected getTimeout(model: Model) { protected getTimeout(model: Model) {

View File

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

View File

@ -184,7 +184,7 @@ export type Provider = {
isNotSupportDeveloperRole?: boolean isNotSupportDeveloperRole?: boolean
/** 是否不支持 service_tier 参数. Only for OpenAI Models. */ /** 是否不支持 service_tier 参数. Only for OpenAI Models. */
isNotSupportServiceTier?: boolean isNotSupportServiceTier?: boolean
serviceTier?: OpenAIServiceTier serviceTier?: ServiceTier
isVertex?: boolean isVertex?: boolean
notes?: string notes?: string
@ -905,10 +905,10 @@ export interface StoreSyncAction {
export type OpenAISummaryText = 'auto' | 'concise' | 'detailed' | 'off' export type OpenAISummaryText = 'auto' | 'concise' | 'detailed' | 'off'
export const OpenAIServiceTiers = { export const OpenAIServiceTiers = {
AUTO: 'auto', auto: 'auto',
DEFAULT: 'default', default: 'default',
FLEX: 'flex', flex: 'flex',
PRIORITY: 'priority' priority: 'priority'
} as const } as const
export type OpenAIServiceTier = (typeof OpenAIServiceTiers)[keyof typeof OpenAIServiceTiers] 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) 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 = { export type S3Config = {
endpoint: string endpoint: string
region: string region: string