AIClient-2-API/src/providers/provider-models.js
hex2077 c5cb63a239 feat(grok): 新增并更新图片生成模型配置
新增 grok-imagine-1.0-fast 和 grok-imagine-1.0-fast-edit 模型及其 NSFW 变体到支持列表。
更新模型映射,将原有 imagine 模型的 modeId 从 'fast' 改为 'expert',并为新增的 fast 模型配置正确的映射。
简化图片生成启用逻辑,现在仅基于模型名称(包含 'imagine' 或 'edit' 但不包含 'video')进行判断,以提高准确性和可维护性。
更新版本号至 2.13.0。
2026-04-07 14:39:53 +08:00

227 lines
6.3 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-imagine-1.0-fast',
'grok-imagine-1.0-fast-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',
'grok-imagine-1.0-fast-nsfw',
'grok-imagine-1.0-fast-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;
}