Implements the bugs_to_fix/capability-gate-followups.md plan (#1, #2, #3, #4, #5, #6). - #1: local vision fallback honors require_json_mode - an image + json_object request now falls through to the 422 naming the missing capability instead of returning prose that breaks the json contract - #2: the pinned-model capability check now honors cfg.routing.require_vision / require_json_mode, so a pin and routed traffic face the same gate - #3: drop 'image' modality from deepseek-v4-flash (supports_vision = 0) - #4: README hard-filter count Four -> Six - #5: extract routing.capability_gate_reason() shared by rejection_reason and the pinned check, so the flag rule cannot drift between the two - #6: single iter_image_url_values() generator replaces four image-part traversals; _run_local_vision computes count/bytes once Adds 9 tests (capability_gate_reason unit coverage, json-mode-gated local fallback, vision gate off for pins). Full suite: 416 passing.
107 lines
2.3 KiB
JSON
107 lines
2.3 KiB
JSON
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"model": "llm-router/auto",
|
|
"provider": {
|
|
"llm-router": {
|
|
"name": "Local LLM Router",
|
|
"npm": "@ai-sdk/openai-compatible",
|
|
"options": {
|
|
"baseURL": "http://127.0.0.1:8080/v1",
|
|
"apiKey": "unused"
|
|
},
|
|
"models": {
|
|
"auto": {
|
|
"name": "auto (router picks, interactive)",
|
|
"limit": {
|
|
"context": 782324,
|
|
"output": 16384
|
|
},
|
|
"modalities": {
|
|
"input": [
|
|
"text",
|
|
"image"
|
|
]
|
|
}
|
|
},
|
|
"auto:batch": {
|
|
"name": "auto (router picks, admits flex/async)",
|
|
"limit": {
|
|
"context": 782324,
|
|
"output": 16384
|
|
},
|
|
"modalities": {
|
|
"input": [
|
|
"text",
|
|
"image"
|
|
]
|
|
}
|
|
},
|
|
"deepseek-v4-flash": {
|
|
"name": "Deepseek V4 Flash (pin)",
|
|
"limit": {
|
|
"context": 1048560,
|
|
"output": 16384
|
|
},
|
|
"modalities": {
|
|
"input": [
|
|
"text"
|
|
]
|
|
}
|
|
},
|
|
"gemma-4-31b": {
|
|
"name": "Gemma 4 31B (pin)",
|
|
"limit": {
|
|
"context": 262128,
|
|
"output": 16384
|
|
},
|
|
"modalities": {
|
|
"input": [
|
|
"text",
|
|
"image"
|
|
]
|
|
}
|
|
},
|
|
"kimi-k2.7-code": {
|
|
"name": "Kimi K2.7 Code (pin)",
|
|
"limit": {
|
|
"context": 262128,
|
|
"output": 16384
|
|
},
|
|
"modalities": {
|
|
"input": [
|
|
"text",
|
|
"image"
|
|
]
|
|
}
|
|
},
|
|
"kimi-k3": {
|
|
"name": "Kimi K3 (pin)",
|
|
"limit": {
|
|
"context": 1048560,
|
|
"output": 16384
|
|
},
|
|
"modalities": {
|
|
"input": [
|
|
"text",
|
|
"image"
|
|
]
|
|
}
|
|
},
|
|
"qwen3.6-35b": {
|
|
"name": "Qwen 3.6 35B (pin)",
|
|
"limit": {
|
|
"context": 131056,
|
|
"output": 16384
|
|
},
|
|
"modalities": {
|
|
"input": [
|
|
"text",
|
|
"image"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|