{ "version": 1, "date": "2026-06-10", "description": "VibeIDE model behaviour quirks. Source of truth — see README.md section 'Model behaviour quirks'. PRs welcome. Schema: ./src/vs/workbench/contrib/vibeide/common/modelQuirks/modelQuirksTypes.ts.", "docs": "https://github.com/VibeBrains/VibeIDE#model-behaviour-quirks", "rules": [ { "match": "kimi-k2.6", "temperature": 1.0, "topP": 0.95, "mirrorReasoningContent": true, "note": "kimi-k2.x family — opencode upstream transform.ts:478-510" }, { "match": "kimi-k2.5", "temperature": 1.0, "topP": 0.95, "mirrorReasoningContent": true }, { "match": "kimi-k2-thinking", "temperature": 1.0, "topP": 0.95, "mirrorReasoningContent": true }, { "match": "kimi-k2", "temperature": 0.6, "note": "Legacy kimi-k2 (non-thinking, non-versioned) — opencode upstream uses T=0.6" }, { "match": "kimi", "temperature": 1.0, "topP": 0.95, "note": "Future kimi versions — defaults to 'new-style' preset" }, { "match": "minimax-m2.7", "temperature": 1.0, "topP": 0.95, "topK": 40, "forceEmptyReasoning": true, "mirrorReasoningContent": true }, { "match": "minimax-m2.5", "temperature": 1.0, "topP": 0.95, "topK": 40, "forceEmptyReasoning": true, "mirrorReasoningContent": true }, { "match": "minimax-m2", "temperature": 1.0, "topP": 0.95, "topK": 20, "forceEmptyReasoning": true, "mirrorReasoningContent": true, "note": "Base minimax-m2 — opencode upstream uses topK=20; m2.x variants prefer topK=40. Interleaved-reasoning family: needs empty-reasoning slot + mirrored reasoning_content roundtrip on every assistant turn, else openCode closes the stream with an empty body → 'Empty response (reason: unknown)' (model-stalls #001/#009)." }, { "match": "minimax", "temperature": 1.0, "topP": 0.95, "topK": 40, "forceEmptyReasoning": true, "mirrorReasoningContent": true, "forcedToolChoiceUnsupported": true, "note": "Future minimax versions — higher topK + reasoning-roundtrip (interleaved-reasoning family). forcedToolChoiceUnsupported: minimax OpenAI-compatible API ignores tool_choice:'required' (returns prose), so the agent loop skips the forced nudge and leans on the implicit-completion net. Covers all minimax-* via field-merge." }, { "match": "kimi", "provider": "openCode", "temperature": 1.0, "topP": 0.95, "forceToolCallFormat": "auto", "note": "kimi via openCode — native FC (auto = native-first + auto-downgrade safety net). XML fallback was forced because native FC was unreliable, but XML itself proved broken for openCode aggregator models (tags leak / model stalls / hallucinates, 0.13.17-19). arg-repair (0.13.18) + invalid-routing now handle native arg confusion; auto-downgrade reverts to XML only if native genuinely keeps failing. Revert to xml if native stalls." }, { "match": "deepseek", "provider": "openCode", "forceEmptyReasoning": true, "mirrorReasoningContent": true, "forceToolCallFormat": "auto", "note": "DeepSeek via openCode — native FC (auto = native-first + auto-downgrade). Was forced to XML (native confused tool names with cross-tool args), but XML proved worse: model emits attribute self-closing / paired-attr tags that leak into chat and never execute (0.13.17-19). arg-repair (0.13.18) + invalid-routing handle the arg confusion now. Revert to xml if native stalls." }, { "match": "minimax", "provider": "openCode", "temperature": 1.0, "topP": 0.95, "topK": 40, "forceToolCallFormat": "auto", "note": "minimax via openCode — native FC (auto = native-first + auto-downgrade). Was forced to XML over cross-tool arg confusion (read_file with {nl_input}), but on XML minimax just stalls without emitting a parseable call (0.13.17-19). arg-repair (0.13.18) + invalid-routing turn the arg confusion into a clean recoverable error instead of a 120s stall. Revert to xml if native stalls." }, { "match": "deepseek", "forceEmptyReasoning": true, "mirrorReasoningContent": true, "note": "DeepSeek family (all providers) — every assistant message must carry a reasoning slot (HTTP 400 otherwise); reasoning text must be mirrored on top-level message field. Native FC is left enabled here for direct API users; the openCode-scoped rule above forces XML for that aggregator." }, { "match": "qwen", "temperature": 0.55, "topP": 1.0, "forceToolCallFormat": "xml", "note": "Qwen-family (DIRECT API) — native FC unreliable (hallucinates param names like 'path_pattern' instead of 'pattern'). Forcing XML routes through extractXMLToolsWrapper which handles the naked-tag ... form. NOTE: openCode-scoped override below flips qwen-via-openCode to native (XML there proved to be silent hallucination — model claims no file access)." }, { "match": "qwen", "provider": "openCode", "temperature": 0.55, "topP": 1.0, "forceToolCallFormat": "auto", "note": "qwen via openCode — native FC (auto = native-first + auto-downgrade). On XML qwen did NOT execute tools — it hallucinated a plausible summary then admitted 'no file-system access' (observed 2026-05-26). Param-name hallucination (path_pattern→pattern) is now caught by arg-repair (0.13.18). Revert to xml if native stalls." }, { "match": "glm", "temperature": 1.0, "note": "GLM family (z.ai) — 4.6/4.7/5/5.1, single preset" }, { "match": "gemini", "temperature": 1.0, "topP": 0.95, "topK": 64, "note": "Gemini via aggregator (NOT native @ai-sdk/google path, which has its own settings)" } ] }