* feat(models): live-first model fetching for all OpenAI-compat providers (#871) The WebUI model picker relied on hardcoded _PROVIDER_MODELS as primary source for providers like zai, minimax, mistralai, xai, openai-codex, deepseek, and gemini. These lists go stale — new models don't appear until someone manually updates the dict. Add an OpenAI-compat /v1/models fetch fallback in _handle_live_models() that fires when provider_model_ids() is unavailable or returns []. The resolution chain is now: 1. hermes_cli.provider_model_ids() (agent's live fetch) 2. Custom providers from config.yaml 3. Direct /v1/models fetch for known OpenAI-compat endpoints 4. Static _PROVIDER_MODELS as last-resort offline fallback Covers: zai, minimax, mistralai, xai, openai-codex, deepseek, gemini. Uses urllib (stdlib) — no new dependencies. Static lists remain as offline fallback so the UI always shows something. Closes #871 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(models): address review feedback on live fetch (#892) Five changes from nesquena-hermes review: 1. Move _OPENAI_COMPAT_ENDPOINTS to module level — avoid dict reconstruction per request 2. Document urllib blocking behavior — 8s timeout acceptable because server is threaded and frontend enriches in background 3. Add TODO comment for TTL-based caching follow-up 4. Remove openai-codex from endpoint map — same endpoint as base openai provider, already covered by provider_model_ids() 5. Restrict API key lookup to provider-scoped and model.api_key only — remove top-level api_key fallback to prevent cross-provider key leakage Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
126 KiB
126 KiB