mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-19 22:52:08 +08:00
- Added provider API host formatting utilities to handle differences between Cherry Studio and AI SDK. - Introduced functions for formatting provider API hosts, including support for Azure OpenAI and Vertex AI. - Created a simple API key rotator for managing API key rotation. - Developed shared provider initialization and mapping utilities for resolving provider IDs. - Implemented AI SDK configuration utilities for converting Cherry Studio providers to AI SDK configurations. - Added support for various providers including OpenRouter, Google Vertex AI, and Amazon Bedrock. - Enhanced error handling and logging in the unified messages service for better debugging. - Introduced functions for streaming and generating unified messages using AI SDK.
72 lines
1.8 KiB
TypeScript
72 lines
1.8 KiB
TypeScript
/**
|
|
* AiHubMix规则集
|
|
*/
|
|
import { getLowerBaseModelName } from '@shared/utils/naming'
|
|
|
|
import type { MinimalModel, MinimalProvider } from '../types'
|
|
import { provider2Provider, startsWith } from './helper'
|
|
import type { RuleSet } from './types'
|
|
|
|
const extraProviderConfig = <P extends MinimalProvider>(provider: P) => {
|
|
return {
|
|
...provider,
|
|
extra_headers: {
|
|
...provider.extra_headers,
|
|
'APP-Code': 'MLTG2087'
|
|
}
|
|
}
|
|
}
|
|
|
|
function isOpenAILLMModel<M extends MinimalModel>(model: M): boolean {
|
|
const modelId = getLowerBaseModelName(model.id)
|
|
const reasonings = ['o1', 'o3', 'o4', 'gpt-oss']
|
|
if (reasonings.some((r) => modelId.includes(r))) {
|
|
return true
|
|
}
|
|
if (modelId.includes('gpt')) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
const AIHUBMIX_RULES: RuleSet = {
|
|
rules: [
|
|
{
|
|
match: startsWith('claude'),
|
|
provider: (provider) => {
|
|
return extraProviderConfig({
|
|
...provider,
|
|
type: 'anthropic'
|
|
})
|
|
}
|
|
},
|
|
{
|
|
match: (model) =>
|
|
(startsWith('gemini')(model) || startsWith('imagen')(model)) &&
|
|
!model.id.endsWith('-nothink') &&
|
|
!model.id.endsWith('-search') &&
|
|
!model.id.includes('embedding'),
|
|
provider: (provider) => {
|
|
return extraProviderConfig({
|
|
...provider,
|
|
type: 'gemini',
|
|
apiHost: 'https://aihubmix.com/gemini'
|
|
})
|
|
}
|
|
},
|
|
{
|
|
match: isOpenAILLMModel,
|
|
provider: (provider) => {
|
|
return extraProviderConfig({
|
|
...provider,
|
|
type: 'openai-response'
|
|
})
|
|
}
|
|
}
|
|
],
|
|
fallbackRule: (provider) => extraProviderConfig(provider)
|
|
}
|
|
|
|
export const aihubmixProviderCreator = <P extends MinimalProvider>(model: MinimalModel, provider: P): P =>
|
|
provider2Provider<MinimalModel, MinimalProvider, P>(AIHUBMIX_RULES, model, provider)
|