fix(providers): let catalog-only no-auth providers sync their models - #14448
Merged
diegosouzapw merged 3 commits intoSep 24, 2026
Conversation
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.
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? |
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A no-auth provider whose registry entry exposes no remote models endpoint can never persist a single model, while
/modelskeeps answering200 OKwith 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.51this silently blocks 7 providers:devin-cli-agentic,duckduckgo-web,cloudflare-playground,veoaifree-web,auggie,zcode,codex-app-server.What
buildNoAuthModelsResponsenow marks the catalog-only response asintentional, 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 reportingsource: "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
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.npm run typecheck:coreclean.npm run build:releasecompletes.