wq / src /models.js
pigracing's picture
Upload 12 files
60a8358 verified
Raw History Blame Contribute Delete
2.03 kB
import { requestHeaders } from './headers.js';
const BASE_URL = 'https://chat.qwen.ai';
let cachedModels = null;
let cacheTime = 0;
const CACHE_TTL = 30 * 60 * 1000; // 30 min
async function fetchModels(token) {
const res = await fetch(`${BASE_URL}/api/models`, {
headers: {
'authorization': `Bearer ${token}`,
...requestHeaders(),
},
});
const json = await res.json();
return json.data || [];
}
export async function getModels(token) {
if (cachedModels && Date.now() - cacheTime < CACHE_TTL) return cachedModels;
cachedModels = await fetchModels(token);
cacheTime = Date.now();
return cachedModels;
}
export function clearModelCache() {
cachedModels = null;
cacheTime = 0;
}
export function handleOpenAIModels(modelList) {
const variants = [];
for (const m of modelList) {
const meta = m.info?.meta || {};
const caps = meta.capabilities || {};
const chatTypes = meta.chat_type || [];
const has = {
vision: !!caps.vision,
thinking: !!caps.thinking,
search: !!caps.search,
deep_research: chatTypes.includes('deep_research'),
image_gen: chatTypes.includes('t2i'),
video_gen: chatTypes.includes('t2v'),
web_dev: chatTypes.includes('web_dev'),
slides: chatTypes.includes('slides'),
};
const base = { object: 'model', created: 1700000000, owned_by: 'qwen', capabilities: has };
// Base model
variants.push({ id: m.id, ...base });
// Suffixed variants based on capabilities
if (has.thinking) variants.push({ id: m.id + '-thinking', ...base });
if (has.deep_research) variants.push({ id: m.id + '-deep-research', ...base });
if (has.image_gen) variants.push({ id: m.id + '-image', ...base });
if (has.video_gen) variants.push({ id: m.id + '-video', ...base });
if (has.web_dev) variants.push({ id: m.id + '-webdev', ...base });
if (has.slides) variants.push({ id: m.id + '-slides', ...base });
}
return { object: 'list', data: variants };
}