/** * 启发式规则 —— 根据模型 ID 的模式匹配推断能力参数。 * * 所有匹配不区分大小写。按优先级从高到低依次尝试。 * 未匹配到任何模式时返回保守默认值。 */ /** 启发式:模型是否支持推理 */ export function guessReasoning(modelId: string): boolean { const patterns = [/claude/i, /gpt-[45]/i, /o[1-9]/i, /gemini/i, /grok/i, /kimi/i]; return patterns.some((p) => p.test(modelId)); } /** * 中等多模态白名单:主流明确支持图像的系列默认 text+image。 * Grok 3/4 经 xAI 文档确认支持 image input; * grok-imagine-* 为图像生成 API,不在此列。 * 不含裸 gpt-4、o 系列、泛 Kimi 等。 */ export function guessInput(modelId: string): ('text' | 'image')[] { const id = modelId; // grok-imagine-* 是生成模型,排除 if (/grok-imagine/i.test(id)) { return ['text']; } const multimodal = /claude/i.test(id) || /gemini/i.test(id) || /vision/i.test(id) || /gpt-4o/i.test(id) || /gpt-4\.1/i.test(id) || /gpt-5/i.test(id) || /grok-[34]/i.test(id); return multimodal ? ['text', 'image'] : ['text']; } /** 启发式:模型上下文窗口大小(Token 数) */ export function guessContextWindow(modelId: string): number { if (/gemini/i.test(modelId)) return 1_000_000; if (/grok-4\.1-fast/i.test(modelId)) return 2_000_000; if (/grok-4\.3/i.test(modelId)) return 1_000_000; if (/grok-4\.5/i.test(modelId)) return 500_000; if (/grok/i.test(modelId)) return 1_000_000; if (/kimi/i.test(modelId)) return 128_000; if (/claude/i.test(modelId)) return 200_000; if (/o[1-9]/i.test(modelId)) return 200_000; if (/gpt-[45]/i.test(modelId)) return 200_000; return 128_000; } /** 启发式:模型最大输出 Token 数 */ export function guessMaxTokens(modelId: string): number { if (/o[1-9]/i.test(modelId)) return 32_768; if (/gpt-[45]/i.test(modelId)) return 16_384; if (/kimi/i.test(modelId)) return 16_384; if (/grok/i.test(modelId)) return 131_072; if (/claude/i.test(modelId)) return 8_192; if (/gemini/i.test(modelId)) return 8_192; return 4_096; }