dafdba324a
Add a unified model_overrides config section that lets users manually declare context_window, max_output_tokens, capabilities, cost, and family for any provider+model — winning over models.dev, OpenRouter, and hardcoded defaults. Resolution order (first hit wins): 1. model_overrides.<provider>.<model_id> (per-provider+model) 2. model_overrides.<provider>._default (per-provider default) 3. model_overrides._default (global default) 4. Normal catalog resolution Key subtlety: an unknown model id (not in the catalog) derives base metadata from sensible defaults before patching, so overriding a model the catalog doesn't know yet is the supported self-unblock path. This is exactly the #84482 scenario (Upstage solar-pro4/syn-pro wrong context) and the #8731 scenario (custom/local models with manual capability declaration). Wired into: - get_model_capabilities() — patches capability fields; unknown models get safe defaults (tools on, vision/reasoning off) before patching - lookup_models_dev_context() — context_window override, checked before catalog lookup so it works even for providers not in PROVIDER_TO_MODELS_DEV - get_model_info() — merges override dict onto catalog entry (shallow merge); for unknown models, the override is the sole source of metadata - get_model_context_length() — step 0b in the resolution pipeline, before custom_providers (0c) and before any network probe Config example: model_overrides: upstage: solar-pro4: context_window: 524288 syn-pro: context_window: 65536 custom:my-local-vllm: my-llava-model: context_window: 8192 supports_vision: true supports_reasoning: false supports_tools: true _default: context_window: 128000 Fixes #8731 Fixes #84482 Refs #47247