mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
Promote bare "ollama" from a custom-endpoint alias to a real provider and
build the desktop UX around it. A local server's connection kind is
reachability rather than a credential, so every credential-shaped gate
(provider registry, picker filters, settings surfaces) gets an explicit
path for it.
Backend:
- Provider overlay + registry entry (127.0.0.1:11434/v1 default, keyless
with a local-only placeholder, base-url normalization for /api and /v1
forms). Existing provider=custom configs are untouched.
- GET /api/local-servers/detect fingerprints well-known local ports plus a
local configured base_url; response shape leaves room for a future
installed/running/managed distinction.
- /api/ollama/* management endpoints: installed+running+recommended models,
registry pull as a poll-able background job streaming native NDJSON
progress, delete, and load (warm-up / keep_alive pinning). Pull and
delete bust the picker's model-id cache.
- Model picker payload: per-model capabilities widened to tools/vision/
context_length; local Ollama rows enriched from the server's native
/api/show (authoritative for on-disk tags, where models.dev is sparse),
backfilled off the request path by a background thread.
- The explicit-only picker filter keeps ollama rows: the row only exists
when the server answered a probe, which is as explicit as a pasted key.
- Reasoning safety: /api/show thinking capability gates all reasoning
fields (Ollama 400s reasoning_effort on non-thinking models), and
OpenAI-only effort levels map to the nearest accepted level
(xhigh->max, minimal->low).
- model.ollama_keep_alive config: sent per-request as extra_body.keep_alive.
- Latency discipline for a local server that may be down: a 300ms TCP
pre-check with a short negative cache guards every native-API read; the
status endpoint probes fresh so a just-started server is noticed
immediately; localhost is rewritten to 127.0.0.1 (Windows resolves
localhost to ::1 first and Ollama binds IPv4 loopback — each request
otherwise pays a ~2s failed IPv6 connect, including chat inference).
Desktop:
- Providers -> Accounts: a "Local servers" card mirroring the OAuth card
language ("Running · N models" / a start-the-server hint), expanding to
model management: installed models with size/quant/VRAM, delete, warm-up,
curated pull recommendations with a progress bar, free-form pull, and a
KV-cache advisory when a loaded model runs well under its trained window.
Polls while down so it flips to Running by itself.
- Model picker: "No tools" badge (explicit tools:false only — absence means
unknown) with demotion, plus context window / parameter size / quant per
row; refetches once after open so backfilled metadata appears in place.
- Onboarding: detected-server row with a model select, replacing blind
first-model assignment for detected servers.
- Composer status stack: "Loading <model> into memory" row during cold
starts, confirmed against /api/ps so ordinary slow generations stay quiet.
Chat inference stays on the OpenAI-compatible /v1 endpoint; the native
/api surface is used read-only for metadata plus explicit management
actions. Lifecycle management (starting or installing Ollama) is not
included.
|
||
|---|---|---|
| .. | ||
| browser | ||
| context_engine | ||
| cron_providers | ||
| dashboard_auth | ||
| disk-cleanup | ||
| google_meet | ||
| hermes-achievements | ||
| image_gen | ||
| kanban | ||
| memory | ||
| model-providers | ||
| observability | ||
| platforms | ||
| security-guidance | ||
| spotify | ||
| teams_pipeline | ||
| video_gen | ||
| web | ||
| __init__.py | ||
| plugin_utils.py | ||