mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-24 23:02:30 +00:00
139 lines
4.3 KiB
JavaScript
139 lines
4.3 KiB
JavaScript
const DEFAULT_ANTIGRAVITY_MODEL = 'gemini-2.5-flash'
|
||
|
||
const UPSTREAM_TO_ALIAS = {
|
||
'rev19-uic3-1p': 'gemini-2.5-computer-use-preview-10-2025',
|
||
'gemini-3-pro-image': 'gemini-3-pro-image-preview',
|
||
'gemini-3-pro-high': 'gemini-3-pro-preview',
|
||
'gemini-3-flash': 'gemini-3-flash-preview',
|
||
'claude-sonnet-4-5': 'gemini-claude-sonnet-4-5',
|
||
'claude-sonnet-4-5-thinking': 'gemini-claude-sonnet-4-5-thinking',
|
||
'claude-opus-4-5-thinking': 'gemini-claude-opus-4-5-thinking',
|
||
chat_20706: '',
|
||
chat_23310: '',
|
||
'gemini-2.5-flash-thinking': '',
|
||
'gemini-3-pro-low': '',
|
||
'gemini-2.5-pro': ''
|
||
}
|
||
|
||
const ALIAS_TO_UPSTREAM = {
|
||
'gemini-2.5-computer-use-preview-10-2025': 'rev19-uic3-1p',
|
||
'gemini-3-pro-image-preview': 'gemini-3-pro-image',
|
||
'gemini-3-pro-preview': 'gemini-3-pro-high',
|
||
'gemini-3-flash-preview': 'gemini-3-flash',
|
||
'gemini-claude-sonnet-4-5': 'claude-sonnet-4-5',
|
||
'gemini-claude-sonnet-4-5-thinking': 'claude-sonnet-4-5-thinking',
|
||
'gemini-claude-opus-4-5-thinking': 'claude-opus-4-5-thinking'
|
||
}
|
||
|
||
const ANTIGRAVITY_MODEL_METADATA = {
|
||
'gemini-2.5-flash': {
|
||
thinking: { min: 0, max: 24576, zeroAllowed: true, dynamicAllowed: true },
|
||
name: 'models/gemini-2.5-flash'
|
||
},
|
||
'gemini-2.5-flash-lite': {
|
||
thinking: { min: 0, max: 24576, zeroAllowed: true, dynamicAllowed: true },
|
||
name: 'models/gemini-2.5-flash-lite'
|
||
},
|
||
'gemini-2.5-computer-use-preview-10-2025': {
|
||
name: 'models/gemini-2.5-computer-use-preview-10-2025'
|
||
},
|
||
'gemini-3-pro-preview': {
|
||
thinking: {
|
||
min: 128,
|
||
max: 32768,
|
||
zeroAllowed: false,
|
||
dynamicAllowed: true,
|
||
levels: ['low', 'high']
|
||
},
|
||
name: 'models/gemini-3-pro-preview'
|
||
},
|
||
'gemini-3-pro-image-preview': {
|
||
thinking: {
|
||
min: 128,
|
||
max: 32768,
|
||
zeroAllowed: false,
|
||
dynamicAllowed: true,
|
||
levels: ['low', 'high']
|
||
},
|
||
name: 'models/gemini-3-pro-image-preview'
|
||
},
|
||
'gemini-3-flash-preview': {
|
||
thinking: {
|
||
min: 128,
|
||
max: 32768,
|
||
zeroAllowed: false,
|
||
dynamicAllowed: true,
|
||
levels: ['minimal', 'low', 'medium', 'high']
|
||
},
|
||
name: 'models/gemini-3-flash-preview'
|
||
},
|
||
'gemini-claude-sonnet-4-5-thinking': {
|
||
thinking: { min: 1024, max: 200000, zeroAllowed: false, dynamicAllowed: true },
|
||
maxCompletionTokens: 64000
|
||
},
|
||
'gemini-claude-opus-4-5-thinking': {
|
||
thinking: { min: 1024, max: 200000, zeroAllowed: false, dynamicAllowed: true },
|
||
maxCompletionTokens: 64000
|
||
}
|
||
}
|
||
|
||
function normalizeAntigravityModelInput(model, defaultModel = DEFAULT_ANTIGRAVITY_MODEL) {
|
||
if (!model) {
|
||
return defaultModel
|
||
}
|
||
return model.startsWith('models/') ? model.slice('models/'.length) : model
|
||
}
|
||
|
||
function getAntigravityModelAlias(modelName) {
|
||
const normalized = normalizeAntigravityModelInput(modelName)
|
||
if (Object.prototype.hasOwnProperty.call(UPSTREAM_TO_ALIAS, normalized)) {
|
||
return UPSTREAM_TO_ALIAS[normalized]
|
||
}
|
||
return normalized
|
||
}
|
||
|
||
function getAntigravityModelMetadata(modelName) {
|
||
const normalized = normalizeAntigravityModelInput(modelName)
|
||
if (Object.prototype.hasOwnProperty.call(ANTIGRAVITY_MODEL_METADATA, normalized)) {
|
||
return ANTIGRAVITY_MODEL_METADATA[normalized]
|
||
}
|
||
if (normalized.startsWith('claude-')) {
|
||
const prefixed = `gemini-${normalized}`
|
||
if (Object.prototype.hasOwnProperty.call(ANTIGRAVITY_MODEL_METADATA, prefixed)) {
|
||
return ANTIGRAVITY_MODEL_METADATA[prefixed]
|
||
}
|
||
const thinkingAlias = `${prefixed}-thinking`
|
||
if (Object.prototype.hasOwnProperty.call(ANTIGRAVITY_MODEL_METADATA, thinkingAlias)) {
|
||
return ANTIGRAVITY_MODEL_METADATA[thinkingAlias]
|
||
}
|
||
}
|
||
return null
|
||
}
|
||
|
||
function mapAntigravityUpstreamModel(model) {
|
||
const normalized = normalizeAntigravityModelInput(model)
|
||
let upstream = Object.prototype.hasOwnProperty.call(ALIAS_TO_UPSTREAM, normalized)
|
||
? ALIAS_TO_UPSTREAM[normalized]
|
||
: normalized
|
||
|
||
if (upstream.startsWith('gemini-claude-')) {
|
||
upstream = upstream.replace(/^gemini-/, '')
|
||
}
|
||
|
||
const mapping = {
|
||
// Opus:上游更常见的是 thinking 变体(CLIProxyAPI 也按此处理)
|
||
'claude-opus-4-5': 'claude-opus-4-5-thinking',
|
||
// Gemini thinking 变体回退
|
||
'gemini-2.5-flash-thinking': 'gemini-2.5-flash'
|
||
}
|
||
|
||
return mapping[upstream] || upstream
|
||
}
|
||
|
||
module.exports = {
|
||
normalizeAntigravityModelInput,
|
||
getAntigravityModelAlias,
|
||
getAntigravityModelMetadata,
|
||
mapAntigravityUpstreamModel
|
||
}
|