添加 grok-4.1-mini、grok-4.1-thinking 及其 nsfw 变体到可用模型列表,并更新核心映射以支持这些新模型。 同时将项目版本号更新至 2.12.9。
223 lines
6.1 KiB
JavaScript
223 lines
6.1 KiB
JavaScript
import { convertData } from '../convert/convert.js';
|
|
import { MODEL_PROVIDER } from '../utils/common.js';
|
|
|
|
/**
|
|
* 各提供商支持的模型列表
|
|
* 用于前端UI选择不支持的模型
|
|
*/
|
|
export const PROVIDER_MODELS = {
|
|
'gemini-cli-oauth': [
|
|
'gemini-2.5-flash',
|
|
'gemini-2.5-flash-lite',
|
|
'gemini-2.5-pro',
|
|
'gemini-2.5-pro-preview-06-05',
|
|
'gemini-2.5-flash-preview-09-2025',
|
|
'gemini-3-pro-preview',
|
|
'gemini-3-flash-preview',
|
|
'gemini-3.1-pro-preview',
|
|
'gemini-3.1-flash-lite-preview',
|
|
],
|
|
'gemini-antigravity': [
|
|
'gemini-3-flash',
|
|
'gemini-3.1-pro-high',
|
|
'gemini-3.1-pro-low',
|
|
'gemini-3.1-flash-image',
|
|
'gemini-3-flash-agent',
|
|
'gemini-2.5-flash',
|
|
'gemini-2.5-flash-lite',
|
|
'gemini-2.5-flash-thinking',
|
|
'gemini-claude-sonnet-4-6',
|
|
'gemini-claude-opus-4-6-thinking',
|
|
],
|
|
'claude-custom': [],
|
|
'claude-kiro-oauth': [
|
|
'claude-haiku-4-5',
|
|
'claude-opus-4-6',
|
|
'claude-sonnet-4-6',
|
|
'claude-opus-4-5',
|
|
'claude-opus-4-5-20251101',
|
|
'claude-sonnet-4-5',
|
|
'claude-sonnet-4-5-20250929',
|
|
'claude-sonnet-4-20250514',
|
|
'claude-3-7-sonnet-20250219'
|
|
],
|
|
'openai-custom': [],
|
|
'openaiResponses-custom': [],
|
|
'openai-qwen-oauth': [
|
|
'qwen3-coder-plus',
|
|
'qwen3-coder-flash',
|
|
'coder-model',
|
|
'vision-model'
|
|
],
|
|
'openai-iflow': [
|
|
// iFlow 特有模型
|
|
'iflow-rome-30ba3b',
|
|
// Qwen 模型
|
|
'qwen3-coder-plus',
|
|
'qwen3-max',
|
|
'qwen3-vl-plus',
|
|
'qwen3-max-preview',
|
|
'qwen3-32b',
|
|
'qwen3-235b-a22b-thinking-2507',
|
|
'qwen3-235b-a22b-instruct',
|
|
'qwen3-235b',
|
|
// Kimi 模型
|
|
'kimi-k2-0905',
|
|
'kimi-k2',
|
|
// GLM 模型
|
|
'glm-4.6',
|
|
// DeepSeek 模型
|
|
'deepseek-v3.2',
|
|
'deepseek-r1',
|
|
'deepseek-v3',
|
|
// 手动定义
|
|
'glm-4.7',
|
|
'glm-5',
|
|
'kimi-k2.5',
|
|
'minimax-m2.1',
|
|
'minimax-m2.5',
|
|
],
|
|
'openai-codex-oauth': [
|
|
'gpt-5',
|
|
'gpt-5-codex',
|
|
'gpt-5-codex-mini',
|
|
'gpt-5.1',
|
|
'gpt-5.1-codex',
|
|
'gpt-5.1-codex-mini',
|
|
'gpt-5.1-codex-max',
|
|
'gpt-5.2',
|
|
'gpt-5.2-codex',
|
|
'gpt-5.3-codex',
|
|
'gpt-5.3-codex-spark',
|
|
'gpt-5.4',
|
|
'gpt-5.4-mini',
|
|
],
|
|
'forward-api': [],
|
|
'grok-custom': [
|
|
'grok-4.1-mini',
|
|
'grok-4.1-thinking',
|
|
'grok-4.20',
|
|
'grok-4.20-auto',
|
|
'grok-4.20-fast',
|
|
'grok-4.20-expert',
|
|
'grok-4.20-heavy',
|
|
'grok-imagine-1.0',
|
|
'grok-imagine-1.0-edit',
|
|
'grok-4.1-mini-nsfw',
|
|
'grok-4.1-thinking-nsfw',
|
|
'grok-4.20-nsfw',
|
|
'grok-4.20-auto-nsfw',
|
|
'grok-4.20-fast-nsfw',
|
|
'grok-4.20-expert-nsfw',
|
|
'grok-4.20-heavy-nsfw',
|
|
'grok-imagine-1.0-nsfw',
|
|
'grok-imagine-1.0-edit-nsfw'
|
|
]
|
|
};
|
|
|
|
export const MANAGED_MODEL_LIST_PROVIDERS = [
|
|
'openai-custom',
|
|
'openaiResponses-custom',
|
|
'claude-custom'
|
|
];
|
|
|
|
export function getManagedModelListProviderType(providerType) {
|
|
return MANAGED_MODEL_LIST_PROVIDERS.find(baseType =>
|
|
providerType === baseType || providerType.startsWith(baseType + '-')
|
|
) || null;
|
|
}
|
|
|
|
export function usesManagedModelList(providerType) {
|
|
return getManagedModelListProviderType(providerType) !== null;
|
|
}
|
|
|
|
export function normalizeModelIds(models = []) {
|
|
return [...new Set(
|
|
(Array.isArray(models) ? models : [])
|
|
.filter(model => typeof model === 'string')
|
|
.map(model => model.trim())
|
|
.filter(Boolean)
|
|
)].sort((a, b) => a.localeCompare(b));
|
|
}
|
|
|
|
function extractModelIdsFromListShape(modelList) {
|
|
if (!modelList) {
|
|
return [];
|
|
}
|
|
|
|
if (Array.isArray(modelList)) {
|
|
return modelList.map(item => {
|
|
if (typeof item === 'string') return item;
|
|
return item?.id || item?.name || item?.model || null;
|
|
}).filter(Boolean);
|
|
}
|
|
|
|
if (Array.isArray(modelList.data)) {
|
|
return modelList.data.map(item => item?.id || item?.name || item?.model || null).filter(Boolean);
|
|
}
|
|
|
|
if (Array.isArray(modelList.models)) {
|
|
return modelList.models.map(item => {
|
|
if (typeof item === 'string') return item;
|
|
return item?.id || item?.name || item?.model || null;
|
|
}).filter(Boolean);
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
export function extractModelIdsFromNativeList(modelList, providerType) {
|
|
let convertedModelList = modelList;
|
|
|
|
// 只有在提供商类型与目标类型协议不同时才尝试转换
|
|
if (providerType !== MODEL_PROVIDER.OPENAI_CUSTOM && !providerType.startsWith(MODEL_PROVIDER.OPENAI_CUSTOM + '-')) {
|
|
try {
|
|
convertedModelList = convertData(modelList, 'modelList', providerType, MODEL_PROVIDER.OPENAI_CUSTOM);
|
|
} catch {
|
|
convertedModelList = modelList;
|
|
}
|
|
}
|
|
|
|
const convertedIds = normalizeModelIds(extractModelIdsFromListShape(convertedModelList));
|
|
if (convertedIds.length > 0) {
|
|
return convertedIds;
|
|
}
|
|
|
|
return normalizeModelIds(extractModelIdsFromListShape(modelList));
|
|
}
|
|
|
|
export function getConfiguredSupportedModels(providerType, providerConfig = {}) {
|
|
if (!usesManagedModelList(providerType)) {
|
|
return [];
|
|
}
|
|
|
|
return normalizeModelIds(providerConfig?.supportedModels);
|
|
}
|
|
|
|
/**
|
|
* 获取指定提供商类型支持的模型列表
|
|
* @param {string} providerType - 提供商类型
|
|
* @returns {Array<string>} 模型列表
|
|
*/
|
|
export function getProviderModels(providerType) {
|
|
if (PROVIDER_MODELS[providerType]) {
|
|
return PROVIDER_MODELS[providerType];
|
|
}
|
|
|
|
// 尝试前缀匹配 (例如 openai-custom-1 -> openai-custom)
|
|
for (const key of Object.keys(PROVIDER_MODELS)) {
|
|
if (providerType.startsWith(key + '-')) {
|
|
return PROVIDER_MODELS[key];
|
|
}
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* 获取所有提供商的模型列表
|
|
* @returns {Object} 所有提供商的模型映射
|
|
*/
|
|
export function getAllProviderModels() {
|
|
return PROVIDER_MODELS;
|
|
}
|