QwenAI / src /api /modelMapping.js
imseldrith's picture
Initial upload from Google Colab
9de864e verified
const CANONICAL_MODELS = Object.freeze([
"qwen3-max",
"qwen3-vl-plus",
"qwen3-coder-plus",
"qwen3-omni-flash",
"qwen-plus-2025-09-11",
"qwen3-235b-a22b",
"qwen3-30b-a3b",
"qwen3-coder-30b-a3b-instruct",
"qwen-max-latest",
"qwen-plus-2025-01-25",
"qwq-32b",
"qwen-turbo-2025-02-11",
"qwen2.5-omni-7b",
"qvq-72b-preview-0310",
"qwen2.5-vl-32b-instruct",
"qwen2.5-14b-instruct-1m",
"qwen2.5-coder-32b-instruct",
"qwen2.5-72b-instruct"
]);
const CANONICAL_MODEL_SET = new Set(CANONICAL_MODELS);
const ALIAS_GROUPS = Object.freeze({
"qwen3-max": [
"qwen-max",
"Qwen3-Max",
"Qwen3-Maximum",
"qwen3-max-preview",
"Qwen3-Max-Preview"
],
"qwen3-vl-plus": [
"qwen-vl",
"qwen-vl-plus",
"qwen-vl-plus-latest",
"qwen-vl-max",
"qwen-vl-max-latest",
"Qwen3-VL-235B-A22B",
"qwen3-vl-235b-a22b"
],
"qwen3-coder-plus": [
"qwen3-coder",
"qwen-coder-plus",
"qwen-coder-plus-latest",
"Qwen3-Coder-Plus",
"qwen2.5-coder-3b-instruct",
"qwen2.5-coder-1.5b-instruct",
"qwen2.5-coder-0.5b-instruct",
"Qwen3-Coder"
],
"qwen3-omni-flash": [
"qwen3-omni",
"qwen3-omni-latest",
"Qwen3-omni-flash",
"Qwen3-Omni-Flash",
"Qwen3-Omni"
],
"qwen-plus-2025-09-11": [
"qwen-plus",
"qwen-plus-latest",
"Qwen3-Next",
"Qwen3-Next-80B-A3B",
"Qwen3-Next-80B-A3Bб",
"qwen3-next",
"qwen3-next-80b-a3b"
],
"qwen3-235b-a22b": [
"qwen3",
"qwen-3",
"qwen3-235b",
"Qwen3-235B-A22B",
"Qwen3-235B-A22B-2507",
"qwen3-235b-a22b-2507"
],
"qwen3-30b-a3b": [
"qwen3-plus",
"qwen3-30b",
"Qwen3-30B-A3B",
"Qwen3-30B-A3B-2507",
"qwen3-30b-a3b-2507"
],
"qwen3-coder-30b-a3b-instruct": [
"qwen3-coder-flash",
"Qwen3-Coder-Flash",
"qwen3-coder-30b",
"Qwen3-Coder-30B-A3B-Instruct"
],
"qwen-max-latest": [
"Qwen2.5-Max",
"qwen2.5-max"
],
"qwen-plus-2025-01-25": [
"Qwen2.5-Plus",
"qwen2.5-plus"
],
"qwq-32b": [
"qwq",
"QwQ-32B",
"qwq-32b-preview"
],
"qwen-turbo-2025-02-11": [
"qwen-turbo",
"qwen-turbo-latest",
"Qwen2.5-Turbo"
],
"qwen2.5-omni-7b": [
"qwen2.5-omni",
"Qwen2.5-Omni-7B",
"qwen-omni-7b"
],
"qvq-72b-preview-0310": [
"qvq",
"QVQ-Max",
"qvq-72b"
],
"qwen2.5-vl-32b-instruct": [
"qwen2.5-vl",
"Qwen2.5-VL-32B-Instruct"
],
"qwen2.5-14b-instruct-1m": [
"qwen2.5-14b",
"qwen2.5-coder-14b-instruct",
"Qwen2.5-14B-Instruct-1M"
],
"qwen2.5-coder-32b-instruct": [
"qwen2.5-coder",
"qwen2.5-coder-plus",
"Qwen2.5-Coder-32B-Instruct"
],
"qwen2.5-72b-instruct": [
"qwen2.5-72b",
"Qwen2.5-72B-Instruct"
]
});
const buildModelMapping = () => {
const mapping = Object.create(null);
for (const model of CANONICAL_MODELS) {
mapping[model] = model;
}
for (const [target, aliases] of Object.entries(ALIAS_GROUPS)) {
if (!CANONICAL_MODEL_SET.has(target)) {
continue;
}
for (const alias of aliases) {
if (!alias) continue;
mapping[alias] = target;
}
}
return Object.freeze(mapping);
};
export const MODEL_MAPPING = buildModelMapping();
/**
* Получить соответствующую доступную модель
* @param {string} requestedModel - Запрошенная модель
* @param {string} defaultModel - Модель по умолчанию
* @returns {string} - Доступная модель
*/
export function getMappedModel(requestedModel, defaultModel = "qwen-max-latest") {
if (!requestedModel) return defaultModel;
// Проверяем точное соответствие в словаре
if (MODEL_MAPPING[requestedModel]) {
return MODEL_MAPPING[requestedModel];
}
// Проверяем, является ли запрошенная модель уже доступной
const availableModels = Object.values(MODEL_MAPPING);
if (availableModels.includes(requestedModel)) {
return requestedModel;
}
// Возвращаем модель по умолчанию, если соответствие не найдено
return defaultModel;
}