Skip to content

fix(providers): let catalog-only no-auth providers sync their models - #14448

Merged
diegosouzapw merged 3 commits into
diegosouzapw:release/v3.8.51from
aldoeliacim:fix/noauth-catalog-model-sync-deadzone
Sep 24, 2026
Merged

diegosouzapw merged 3 commits into
diegosouzapw:release/v3.8.51from
aldoeliacim:fix/noauth-catalog-model-sync-deadzone

Conversation

@aldoeliacim

Copy link
Copy Markdown
Contributor

Why

A no-auth provider whose registry entry exposes no remote models endpoint can never persist a single model, while /models keeps answering 200 OK with the full catalog. The failure is invisible from the outside: the endpoint looks healthy, the provider simply stays empty forever.

For these providers the local catalog is not a fallback after a failed fetch — it is the intended and only discovery source. Model-sync's degraded-discovery guard cannot tell those two situations apart, because both arrive as source: "local_catalog". It assumes the pessimistic one, refuses to pin what it treats as a stale catalog, and returns 502 before the import stage.

On release/v3.8.51 this silently blocks 7 providers: devin-cli-agentic, duckduckgo-web, cloudflare-playground, veoaifree-web, auggie, zcode, codex-app-server.

What

buildNoAuthModelsResponse now marks the catalog-only response as intentional, which is the marker the guard already understands and which comparable providers already carry. Providers that do have a remote endpoint are untouched: they keep reporting source: "upstream", and a genuinely degraded discovery is still rejected exactly as before.

The discriminator is the absence of a models endpoint, not a hand-maintained provider list, so a newly added no-auth provider is covered automatically rather than silently joining the dead zone.

Verification

  • The regression test derives its provider list from the registry instead of hardcoding ids. Three providers present in v3.8.50 (chipotle, felo-web, theoldllm) were dropped in v3.8.51; a literal list would have rotted into a false failure while also failing to cover anything newly added.
  • Confirmed the test actually fails without the fix: reverting the one-line change turns it red and names all 7 affected providers.
  • Targeted suites (no-auth, discovery, degraded-catalog, sync-models, model-route, projection): 553 passing, 0 failing. npm run typecheck:core clean. npm run build:release completes.

A no-auth provider whose registry entry declares no `modelsUrl` has the
local catalog as its only possible discovery source. The no-auth response
path never marked that catalog as intentional, so model-sync's degraded
-discovery guard read a healthy response as a failed remote fetch and
returned 502 before importing anything.

The effect was a silent, permanent dead zone: those providers could never
persist a single model while `/models` kept answering 200 OK. Five live
connections were affected (chipotle, cloudflare-playground, duckduckgo-web,
felo-web, theoldllm), covering 58 models.

The catalog is now marked intentional exactly when no `modelsUrl` exists,
so the discriminator is the absence of a remote endpoint rather than a
hand-maintained provider list. Providers that declare a `modelsUrl` keep
reporting `upstream`, and a genuinely failed live fetch is still rejected
as degraded so a stale catalog is never pinned over a real outage.
Copilot AI lite review requested due to automatic review settings September 22, 2026 05:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@diegosouzapw

Copy link
Copy Markdown
Owner

Solid, well-scoped fix, and the deliberately-derived (not hardcoded) provider list in the test is a nice touch — it won't rot as providers get added/retired between releases. One small thing before merging: your changelog fragment references #14290 while the PR body cites #5460/#5465 — could you double check which issue number is the canonical one so the release notes point at the right place?

aldoeliacim and others added 2 commits September 24, 2026 04:38
…alog fix

Neither diegosouzapw#14290 (an unrelated merged PR) nor diegosouzapw#5460/diegosouzapw#5465 (unrelated closed
issues about Reka and t3.chat) documents this bug — no filed issue exists
for it. Drop the bogus links: rename the changelog fragment to the PR's
own number (14448, matching the repo's fragment-naming convention) and
drop the diegosouzapw#14290 link from its body, and remove the diegosouzapw#5460/diegosouzapw#5465 reference
from the code comment in modelRouteProjection.ts.

Also ran the two regression suites named in review
(tests/unit/noauth-catalog-only-providers.test.ts and
tests/unit/noauth-local-catalog-intentional.test.ts) in isolation to
confirm both pass; the earlier failure seen when run together was
SQLITE_BUSY DB contention from the shared devbox, not a real defect.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
The first commit only carried the file rename; this carries the actual
content change it described — drop the diegosouzapw#14290 link from the changelog
fragment body and the diegosouzapw#5460/diegosouzapw#5465 reference from the code comment.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
@diegosouzapw
diegosouzapw merged commit eb3a11a into diegosouzapw:release/v3.8.51 Sep 24, 2026
3 checks passed
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.

3 participants