feat(desktop): provider/model manager - #74297
Open
wildminder wants to merge 1 commit into
Open
Conversation
wildminder
force-pushed
the
feat/provider-model-manager
branch
from
July 29, 2026 21:09
09abf0c to
0c101e1
Compare
teknium1
reviewed
Jul 30, 2026
teknium1
left a comment
Contributor
There was a problem hiding this comment.
Thanks for the substantial Desktop UI and test work. Current main has moved custom-endpoint management onto a keyed providers: schema, so this needs a focused rework before it can safely land.
Problems
apps/desktop/src/lib/custom-provider-config.ts:204writes a custom provider API key into the config record. Current main deliberately keeps these keys in.envand storeskey_envinstead (hermes_cli/web_server.py:7189-7210).apps/desktop/src/lib/custom-provider-config.ts:164-214only manages legacycustom_providers, while current v12 custom endpoints useproviders:(hermes_cli/config.py:1508-1571;hermes_cli/web_server.py:7133-7223). This can omit current entries or create duplicate representations.apps/desktop/src/app/settings/use-provider-catalog.ts:26uses REST catalog data, but the PR addsenabledannotation only in the TUI JSON-RPC path. The proposedmodel.disabled_providersstate atcustom-provider-config.ts:252-268also differs from main's runtime-supportedproviders.<name>.enabledconfiguration (hermes_cli/config.py:2850-2872).
Suggested changes
- Rebuild persistence and enablement on the current
providers:/key_envlifecycle, and expose one authoritative enablement state through the REST catalog. - Add end-to-end coverage for v12 provider edit, credential storage, disable, and re-enable.
Automated hermes-sweeper review.
wildminder
force-pushed
the
feat/provider-model-manager
branch
from
July 30, 2026 22:22
0c101e1 to
281fbe2
Compare
…very, activation toggle, i18n, backend inventory - Provider Manager settings view with two-pane layout (provider list + model list) - Custom provider CRUD via REST endpoints (canonical providers:/key_env lifecycle) - Model discovery (auto-probe /v1/models) + manual add-model dialog - Per-model visibility toggles with $visibleModels store - Provider grouping (Local / Configured / Unconfigured), active-on-top, letter grouping - Capability filters (vision / multimodal / reasoning / fast) - Connection test for custom providers - i18n support (en, ja, zh, zh-hant) - Backend: inventory enabled-flag attach, custom-endpoint lifecycle, legacy compat - vitest.setup.ts localStorage polyfill for Node 26 compatibility
wildminder
force-pushed
the
feat/provider-model-manager
branch
from
July 31, 2026 20:46
281fbe2 to
31abbe1
Compare
This was referenced Aug 5, 2026
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 does this PR do?
Adds a Provider / Model Manager settings view to the desktop app. Users can browse all configured providers (built-in + custom), toggle per-model visibility, add/edit/delete custom OpenAI-compatible providers, activate/deactivate providers, and discover or refresh model catalogs - all from a two-pane Settings UI. The backend gains model-discovery and provider-filtering endpoints to support it.
Related Issue
N/A (new feature)
Type of Change
Changes Made
Desktop — new Settings view (
apps/desktop/src/app/settings/)provider-model-manager.tsx— two-pane container (provider nav + model list), search, deep-link via?pmprovider=<slug>provider-manager-nav.tsx— left pane: ARIA listbox, arrow-key nav, per-provider active-model count pill, enable/disable switchprovider-model-list.tsx— right pane: per-modelSwitchtoggles, capability badges, letter grouping (opt-in), sort A–Z/Z–A, active-model bold emphasisprovider-form-dialog.tsx— add/edit custom provider modal (name, base_url, api_key, api_mode, models); auto-generates provider ID from nameprovider-configure-panel.tsx— edit-credentials dialog for built-in providersmodel-add-dialog.tsx— manual model addition for custom providersprovider-grouping.ts,model-list-utils.ts— pure helpers (letter grouping, capability color meta, discover-button label)use-provider-catalog.ts,use-provider-config.ts,use-provider-visibility.ts— TanStack Query + nanostore hooksDesktop — lib / store / types / i18n
lib/custom-provider-config.ts— pure-TS config helpers (upsert/remove/enable, name normalization, models list↔dict)store/model-visibility.ts— extended with provider-scoped helperstypes/hermes.ts—enabled?onModelOptionProvideri18n/{en,ja,zh,zh-hant,types}.ts—providerManagernamespace (~30 keys × 4 locales)hermes.ts—getGlobalModelOptions({ includePricing, includeUnconfigured, explicitOnly, refresh }),discoverProviderModels()Backend
hermes_cli/inventory.py—build_model_options_payload(include_pricing=…), providerenabledflag, model display names,discover_provider_models()hermes_cli/web_server.py—GET /api/model/options(include_pricing param),POST /api/model/discovertui_gateway/server.py—model.optionsrespectsmodel.disabled_providers+ customenabled: falseTests
test_inventory_discover.py,test_inventory_model_display_names.py,test_inventory_options_flags.py,test_inventory_provider_enabled.py,test_web_server_model_discover.py)Toolchain
apps/desktop/package.json— vitest pinned to^3.2.7(4.1.x crashes on Node 26)apps/desktop/vitest.setup.ts— localStorage polyfill for jsdomHow to Test
_run_desktop.batorhermes dashboard), open Settings → Provider Manager.http://localhost:11434/v1), save — confirm it appears in the nav with all models disabled by default.cd apps/desktop && npx tsc -p . --noEmit && npx tsc -p tsconfig.electron.json --noEmit— both exit 0.scripts/run_tests.sh tests/hermes_cli/test_inventory_discover.py tests/hermes_cli/test_inventory_options_flags.py tests/hermes_cli/test_inventory_provider_enabled.py tests/hermes_cli/test_inventory_model_display_names.py tests/hermes_cli/test_web_server_model_discover.py -q— all pass.Checklist
Code
feat(desktop): …)pytest tests/ -qand all tests passDocumentation & Housekeeping
config.yamlkeys (uses existingcustom_providers/model.disabled_providers)AGENTS.mdScreenshots / Logs