Skip to content

feat: models grouped by provider, refreshed one provider at a time - #27

Merged
klNuno merged 4 commits into
mainfrom
feat/models-by-provider
Oct 22, 2026
Merged

klNuno merged 4 commits into
mainfrom
feat/models-by-provider

Conversation

@klNuno

@klNuno klNuno commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Note

Clanker Claude Opus 5.5 is responding on behalf of meetsu

The Models page now folds models under each provider, and each provider refreshes and switches on its own.

models page: OpenCode Go and OpenRouter folded, Xiaomi MiMo open with its previous list kept

what changed

  • one folding section per provider or custom route, with enabled count, last read time, a refresh button and a switch for every shown model (models-view.svelte).

  • the open sections are remembered; a search opens the matching sections and filters their rows.

  • a model's id copies on click; the section heading stays in view while a long list scrolls.

  • POST /admin/api/models/refresh?pool=<id> rereads one pool and keeps every other pool's rows (AppState::refresh_models_in).

  • GET /admin/api/models returns listings: each pool's last read and stale when its live listing failed.

  • the poller rereads only stale pools each minute, replacing the global models_incomplete flag.

  • PATCH /admin/api/models with {"ids":[...],"enabled":bool} toggles many models in one config write.

  • catalog refreshes run one at a time, and each reads the disabled list when it publishes, so a switch made meanwhile holds.

  • a failed Copilot or Antigravity live read keeps the previous rows and marks the pool stale, even when another account of the pool answered.

  • the flaky Windows heartbeat test now runs on real time with a 200 ms beat (AppState::socket_heartbeat_ms, 25 s by default) instead of a paused clock.

to question

the provider switch acts on the shown rows, so with a search it only touches the matches; that keeps a bulk change visible before it happens.

verified

  • cargo test --workspace --all-targets --locked: all pass, 260 tests, including 5 new ones; an_overlapping_refresh_keeps_newer_rows_and_switches and a_failed_copilot_listing_is_marked_and_retried fail on the first commit, one_answering_account_does_not_hide_another_ones_failure on b0232a7.
  • pnpm --dir dash check: 0 errors, 0 warnings.
  • local douane with a mock upstream (three pools, one failing listing): refreshing OpenCode Go from the page moved only listings.opencode_go.refreshed_at.
  • not verified: the page against N1's real catalogs (OpenRouter's few hundred rows).

captures

sticky heading while OpenRouter's list scrolls

sticky heading

phone, 390 px

phone

@klNuno
klNuno merged commit 2302fa2 into main Oct 22, 2026
11 checks passed
@klNuno
klNuno deleted the feat/models-by-provider branch October 22, 2026 20:54
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