Skip to content

feat(frontdoor): route provider-qualified model names on every session - #514

Merged
Mearman merged 1 commit into
mainfrom
feat/unconditional-qualified-routing
Oct 18, 2026
Merged

Mearman merged 1 commit into
mainfrom
feat/unconditional-qualified-routing

Conversation

@Mearman

@Mearman Mearman commented Oct 18, 2026

Copy link
Copy Markdown
Member

feat(frontdoor): route provider-qualified model names on every session

A qualified model name was only resolved on a session that asked to
route by name, so exposing another provider's models meant a launch flag
or a router provider. The rule is now the naming scheme itself: a model
name whose first slash-separated segment names a defined provider routes
there on every session, with the request rewritten under the target's own
model name, and a slash naming no provider (an aggregator's vendor/model)
stays the session's own provider's business. A name for the provider the
session is already on is served in place under its bare model name.

Bare names keep their opt-in: only a session that routes by name (a
router's included) resolves a virtual model's or a family's name, so
nothing a session types bare is ever hijacked, and --route-by-name
now means exactly that.

/model follows: every session lists every provider's models qualified
(its own provider's catalogue included), a provider session's rows
replacing the built-in lineup and a provider-less session's following it;
the virtual and family rows stay on the sessions that can serve them. The
provider list the rows are built from is read through the launch's own
filesystem port, so an invalid provider file lists no rows rather than
failing the launch.

One scan now runs for every routed request, so the name resolution's
replay is carried into the routes matching that follows it; reading the
original body twice left two consumers on one stream and hung the
request.

A qualified model name was only resolved on a session that asked to
route by name, so exposing another provider's models meant a launch flag
or a router provider. The rule is now the naming scheme itself: a model
name whose first slash-separated segment names a defined provider routes
there on every session, with the request rewritten under the target's own
model name, and a slash naming no provider (an aggregator's `vendor/model`)
stays the session's own provider's business. A name for the provider the
session is already on is served in place under its bare model name.

Bare names keep their opt-in: only a session that routes by name (a
router's included) resolves a virtual model's or a family's name, so
nothing a session types bare is ever hijacked, and `--route-by-name`
now means exactly that.

`/model` follows: every session lists every provider's models qualified
(its own provider's catalogue included), a provider session's rows
replacing the built-in lineup and a provider-less session's following it;
the virtual and family rows stay on the sessions that can serve them. The
provider list the rows are built from is read through the launch's own
filesystem port, so an invalid provider file lists no rows rather than
failing the launch.

One scan now runs for every routed request, so the name resolution's
replay is carried into the `routes` matching that follows it; reading the
original body twice left two consumers on one stream and hung the
request.
@Mearman
Mearman merged commit f70ba38 into main Oct 18, 2026
32 checks passed
@Mearman
Mearman deleted the feat/unconditional-qualified-routing branch October 18, 2026 20:52
@ExaDev ExaDev deleted a comment from chatgpt-codex-connector Bot Oct 19, 2026
@ExaDev ExaDev deleted a comment from chatgpt-codex-connector Bot Oct 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant