diff --git a/ROADMAP.md b/ROADMAP.md index d0fd11b..0eec812 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -442,3 +442,20 @@ to: 3. Call `WorkerResolveTrust` tool to unblock, or `WorkerRestart` to reset. **HTTP endpoint tracking:** Not scheduled. If a concrete use case emerges that file polling cannot serve (e.g. remote workers over a network boundary), open a new issue to upstream a `/worker/state` route to sst/opencode at that time. Until then: file/CLI is canonical. + +## Provider Routing: Model-Name Prefix Must Win Over Env-Var Presence (fixed 2026-04-08, `0530c50`) + +### `openai/gpt-4.1-mini` was silently misrouted to Anthropic when ANTHROPIC_API_KEY was set + +**Root cause:** `metadata_for_model` returned `None` for any model not matching `claude` or `grok` prefix. +`detect_provider_kind` then fell through to auth-sniffer order: first `has_auth_from_env_or_saved()` (Anthropic), then `OPENAI_API_KEY`, then `XAI_API_KEY`. + +If `ANTHROPIC_API_KEY` was present in the environment (e.g. user has both Anthropic and OpenRouter configured), any unknown model — including explicitly namespaced ones like `openai/gpt-4.1-mini` — was silently routed to the Anthropic client, which then failed with `missing Anthropic credentials` or a confusing 402/auth error rather than routing to OpenAI-compatible. + +**Fix:** Added explicit prefix checks in `metadata_for_model`: +- `openai/` prefix → `ProviderKind::OpenAi` +- `gpt-` prefix → `ProviderKind::OpenAi` + +Model name prefix now wins unconditionally over env-var presence. Regression test locked in: `providers::tests::openai_namespaced_model_routes_to_openai_not_anthropic`. + +**Lesson:** Auth-sniffer fallback order is fragile. Any new provider added in the future should be registered in `metadata_for_model` via a model-name prefix, not left to env-var order. This is the canonical extension point.