Repository navigation
feat(dashboard): models and combos catalog with filters and health tests - #14887
Merged
diegosouzapw merged 18 commits intoOct 8, 2026
Merged
diegosouzapw merged 18 commits into
diegosouzapw merged 18 commits into
Conversation
Test runner (useCatalogTestRunner): - Abort the active bulk run and any per-row tests on unmount; no further scheduling, state updates or localStorage writes afterwards. - Load stored results in a mount effect instead of a useState initializer. - Bulk combo tests use the run's AbortSignal, so Cancel also aborts tests in flight. Only the run that still owns the runner may advance progress or reset running state, so a cancelled run's late completions cannot end or hijack the next run. - Honour stoppedEarly from /api/models/test-all: models the server never tested stay untested instead of being stored as errors. - Response mapping moved to catalogTestResponses.ts; no English fallback text is stored, the badge renders translated messages instead. Page and components: - URL filters and the active tab are applied after mount (SSR-safe); deep links and Back/Forward keep working. - Tabs extracted to CatalogTabs with Arrow/Home/End keys, roving tabindex and focus following selection. - Confirm dialog before bulk runs of more than 50 models or 20 combos; exact duplicate targets are dropped before counting and batching. - New "min max output" filter bound to the existing minOutput param. - Numeric URL params and inputs accept whole numbers >= 0 only. - Per-row Test buttons are disabled while a bulk run is active; the progress bar has an accessible name and value text; error details are available to screen readers; test time is shown as a relative age. - combo-ref steps count as combo members. Tests: fake timers and deferred promises instead of real waits; new unit suites for bulk utils, URL state and response mapping; UI coverage for unmount abort, cancel/restart, stoppedEarly, >100-model batching with at most 2 calls in flight, confirm dialog, keyboard tabs, filter URL sync, single combo test and unsafe numeric params.
…cales Adds the 16 new modelCatalog keys (min max output filter, bulk progress and cancel status, bulk confirm dialog, error detail and HTTP fallback text, additional capabilities label, nested combo member label) to every locale with real translations; no __MISSING__ markers remain.
fouadSalkini
added a commit
to fouadSalkini/OmniRoute
that referenced
this pull request
Sep 26, 2026
…loads - Write the URL from one effect only, skip the write when pathname and search are unchanged, and ignore a refused history.replaceState call (browsers rate-limit it), so a throttled update never takes the page down. - Check free-form URL filters against loaded options only while options exist (models/combos loaded), so a Refresh no longer flashes an empty table and a failed load no longer drops valid filters from the URL. - Match the capability URL param case-insensitively, like the filter. - Drop the redundant lg/xl grid-cols-3 classes on the model filter grid.
… secrets gate gitleaks' generic-api-key rule matched `CATALOG_TEST_RESULTS_KEY = "..."` as a credential. Rename the identifier to CATALOG_TEST_RESULTS_STORAGE_NAME and keep the localStorage entry name "omniroute.catalogTestResults.v1" unchanged, so results users already stored keep loading. The two tests that import the constant only follow the rename.
… complexity gate Behaviour-preserving split of the new catalog helpers so each function stays under the cyclomatic and cognitive limits: - catalogTestStorage: classifyError reads named rate-limit, quota and timeout checks; loadCatalogTestResults delegates the stored-entry validation. - comboCatalogUtils: flattenCombos builds each row and member step through small parsers; the combo filter uses named member-bound and test-result predicates. - modelCatalogUtils: capability collection and each optional model filter are named predicates. flattenCatalog is unchanged from the base branch.
…maller helpers for the complexity gate Behaviour-preserving split with the same props, DOM, classes and i18n keys: - CatalogFilterFields: shared search row, select, number input and option lists that the model and combo filter panels used to repeat inline. - ModelCatalogFilters groups its grid into catalog-option selects and fixed-choice / numeric filters; ComboCatalogFilters uses the shared fields. - CatalogTestBadge renders its testing, untested and result states through three small components. - CatalogBulkActionBar moves the progress bar and cancelled notice into CatalogBulkProgress; the action buttons stay where they were.
…e complexity gate Behaviour-preserving split with the same props, DOM, classes and i18n keys: - CatalogTableParts: plain and actions headings, selection checkbox cells and the paging footer that both tables rendered inline. - ModelCatalogTable renders its header and rows through ModelCatalogTableHead and ModelCatalogTableRow, with the provider, type, capabilities and flags cells as small components. Its props block keeps its place; only the labels shape gets a name. - ComboCatalogTable does the same with ComboCatalogTableHead, ComboCatalogTableRow and ComboMembersCell; its props move to the ComboCatalogTableProps interface with the same members.
diegosouzapw
changed the base branch from
release/v3.8.51
to
release/v3.8.52
September 29, 2026 11:18
Owner
|
Re-homed to |
…ical zh provider term The catalog page re-added sidebar.modelCatalog and sidebar.modelCatalogSubtitle while the base already had them later in the same object, so JSON.parse kept the base copy and the new 'Models & Combos' label never showed. Each locale now has one copy carrying the new label. zh-CN catalog strings use the glossary's canonical 提供者 instead of the retired 提供商.
diegosouzapw
merged commit Oct 8, 2026
814ca10
into
diegosouzapw:release/v3.8.52
31 of 42 checks passed
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.
What
Turns
/dashboard/modelsinto a Models & Combos catalog with filters and health tests. The page gets twotabs: the model catalog and a new combos catalog. UI only: no API route, DB or schema changes.
Why
Admins have no single place to browse every model and combo, narrow them down by capability or health, and check
which ones actually answer. Today that means opening provider pages one at a time or testing from the combo editor.
How
GET /api/models/catalog) and Combos (GET /api/combos), deep-linkable with?tab=,keyboard accessible (Arrow/Home/End, roving tabindex, labelled tab panels).
context length, min max-output tokens, free/paid, provider health (
GET /api/providers/health-matrix), lasttest result (untested/ok/slow/error).
POST /api/models/test, combos usePOST /api/combos/test.POST /api/models/test-all(at most 100 ids per call, at most 2 calls in flight). Combos run at most 2 at atime. Runs above 50 models or 20 combos ask for confirmation, and exact duplicates are removed first.
take over a newer run. Leaving the page aborts the run. Models the server skipped (
stoppedEarly) stayuntested.
time. The sanitized API error text is available on hover and to screen readers.
localStorage, versioned key, newest 2,000 entries), with a"Clear results" action.
locales.
Tests
Vitest (10 files, 111 tests): filter/sort utils for models and combos, URL state parsing (invalid numbers
ignored), bulk batching (>100 ids split, at most 2 concurrent requests), result storage (cap, versioning, corrupt
JSON), response classification including
stoppedEarly, tab switching and deep link, filter → URL + rows, singlemodel and combo test flows, cancel then restart, abort on unmount, and results restored from storage.
Commands run locally: eslint (with suppressions) and prettier on changed files,
npm run check:file-size, thevitest files above, and the i18n checks.
check-key-completenessfails the same way on the base:featureFlagProxyPoolSharedEgressOrderDescription(added in #14657) is missing from 65 locales. This PR does nottouch it.