Skip to content

fix(coderd): send assigned chat model IDs verbatim - #28144

Merged
ibetitsmike merged 4 commits into
mainfrom
mike/codagt-832-verbatim-model-ids
Aug 13, 2026
Merged

fix(coderd): send assigned chat model IDs verbatim#28144
ibetitsmike merged 4 commits into
mainfrom
mike/codagt-832-verbatim-model-ids

Conversation

@ibetitsmike

@ibetitsmike ibetitsmike commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Fixes #27361 (CODAGT-832).

Problem

When an Agents model was configured under a non-gateway provider type (e.g. Anthropic or OpenAI) with a model ID whose first /- or :-segment matched a built-in provider name (anthropic, azure, bedrock, google, openai, openai-compat, openrouter, vercel), chatprovider.ResolveModelWithProviderHint parsed it as a canonical provider/model reference: the prefix was stripped and the request rerouted to the embedded provider type, overriding the provider the admin explicitly assigned. LLM gateways (e.g. LiteLLM) that namespace their catalogs as bedrock/... or anthropic/... behind an Anthropic- or OpenAI-type provider failed with an opaque upstream "Model not found", and escaping was impossible (bedrock/bedrock/... still rerouted).

Fix

A valid provider hint is now authoritative: ResolveModelWithProviderHint returns the assigned provider and the verbatim model ID whenever a hint is present. Canonical provider/model and provider:model parsing applies only to hint-less resolution paths. Every production call site derives the hint from the model config's explicitly assigned AI provider, so the assignment always wins.

The save-time guard rejecting slash-namespaced models on OpenRouter-like providers typed as openai (provider named openrouter or hosted at openrouter.ai) is kept: that combination remains a misconfiguration whose correct fix is the openrouter provider type, and rejecting it early beats a confusing upstream error. Its wording no longer claims prefix stripping happens.

Back-compat note

A pre-existing config that relied on stripping (e.g. model anthropic/claude-x assigned to an Anthropic-type provider pointing at the real Anthropic API) now sends the prefixed ID verbatim and will get a clear upstream model-not-found error; the admin fixes it by editing the model ID. Nothing in the product ever suggested the canonical form for assigned models.

Validation

  • Unit: TestResolveModelWithProviderHint updated (hints preserve bedrock/..., anthropic/..., provider:... verbatim; hint-less canonical parsing unchanged), red-green verified against the old ordering. Gateway and openai-type provider routing tests assert verbatim pass-through end to end.
  • Full ./coderd/x/chatd/... suites plus TestCreateChatModelConfig, TestUpdateChatModelConfig, and TestValidateChatModelConfigProviderModel pass.
  • Remote dogfood UAT on real models (PASS): an openai-type provider pointed at a Vercel AI Gateway mount returned a real completion for anthropic/claude-haiku-4.5, with trace logs confirming provider=openai model=anthropic/claude-haiku-4.5 (verbatim, not rerouted); gateway-type (openai-compat) routing with deepseek/deepseek-v4-pro-0813 and the model catalog/picker regressions pass.

Mux acted on Mike's behalf to create this PR.

Provider hints are now authoritative in model resolution, so no layer
strips vendor prefixes from slash-namespaced model IDs. The save-time
and request-time rejection of such models on OpenRouter-like openai-type
providers guarded against the old stripping behavior and would now block
working configurations.
@linear-code

linear-code Bot commented Aug 13, 2026

Copy link
Copy Markdown

CODAGT-832

@ibetitsmike

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Bravo.

Reviewed commit: d475056a36

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ibetitsmike
ibetitsmike marked this pull request as ready for review August 13, 2026 18:36
@ibetitsmike

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Bravo.

Reviewed commit: a1d636a1a2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ibetitsmike
ibetitsmike merged commit 93c6faf into main Aug 13, 2026
28 checks passed
@ibetitsmike
ibetitsmike deleted the mike/codagt-832-verbatim-model-ids branch August 13, 2026 19:31
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 13, 2026
@ibetitsmike ibetitsmike added backport backport/v2.36 Backport PR targeting release/2.36 labels Aug 13, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

backport/v2.36 Backport PR targeting release/2.36 backport

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Model IDs with reserved provider prefixes (e.g. bedrock/...) are silently reinterpreted as canonical refs on non-gateway provider types

2 participants