/**
* 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 =
(provider: P) => {
return {
...provider,
extra_headers: {
...provider.extra_headers,
'APP-Code': 'MLTG2087'
}
}
}
function isOpenAILLMModel(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 = (model: MinimalModel, provider: P): P =>
provider2Provider(AIHUBMIX_RULES, model, provider)