export type ImportedModelModality = 'text' | 'audio' | 'image' | 'pdf'; export type ImportedVisionTokenEstimator = 'qwen-32px-grid'; export interface ImportedModelProfile { modalities: { input: ImportedModelModality[]; output: ImportedModelModality[]; }; limit?: { context: number; output: number; }; visionTokenEstimator?: ImportedVisionTokenEstimator; } const VERIFIED_QWEN_PLUS_MODEL_IDS = new Set([ 'qwen3.6-plus', 'qwen3.6-plus-2026-04-02', 'qwen3.7-plus', 'qwen3.7-plus-2026-05-26', ]); const QWEN_VL_PATTERN = /^qwen(?:\d+(?:\.\d+)?)?-vl(?:[-\w.]+)?$/i; const QWEN_OMNI_PATTERN = /^qwen-omni(?:[-\w.]+)?$/i; function imageModalities(): ImportedModelProfile['modalities'] { return { input: ['text', 'image'], output: ['text'], }; } export function getImportedModelProfile(rawModelId: string): ImportedModelProfile | null { const modelId = rawModelId.trim(); if (VERIFIED_QWEN_PLUS_MODEL_IDS.has(modelId.toLowerCase())) { return { modalities: imageModalities(), limit: { context: 1_000_000, output: 65_536, }, visionTokenEstimator: 'qwen-32px-grid', }; } if (QWEN_VL_PATTERN.test(modelId) || QWEN_OMNI_PATTERN.test(modelId)) { return { modalities: imageModalities(), }; } return null; } export function estimateImportedModelVisionTokens( modelId: string, width: number, height: number, ): number | null { if (getImportedModelProfile(modelId)?.visionTokenEstimator !== 'qwen-32px-grid') return null; if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return null; return Math.ceil((width * height) / (32 * 32)) + 2; }