mateclaw/mateclaw-ui/src/views
matevip c0c642380a feat(llm): provider liveness model + honor requireApiKey on chat path
Phase 1 of the model-module refactor: combine pool / cooldown / probe-
completion signals into a single Liveness state surfaced through the
provider DTO, so the dropdown stops listing providers that are provably
unreachable. Zero schema change; one PR backend + frontend.

Backend
- Liveness enum with five mutually-exclusive states: LIVE, COOLDOWN,
  REMOVED, UNPROBED, UNCONFIGURED. Computed in ModelProviderService
  from AvailableProviderPool / ProviderHealthTracker / ProviderInitProbe
  snapshots batched once per listProviders() call.
- ProviderInitProbe.hasBeenProbed exposes a monotonic Set so the UI
  can distinguish 'still booting' from 'probed and removed' — without
  it the startup window flashes false REMOVED states.
- ProviderInfoDTO gains liveness + unavailableReason +
  cooldownRemainingMs + lastProbedAtMs. The legacy 'available' boolean
  stays but is now derived from liveness == LIVE so the chat fallback
  walker and the dropdown agree about what's usable.
- ProviderInitProbe injected into ModelProviderService via
  ObjectProvider to break the startup cycle (probe already depends on
  the service).

Frontend
- ProviderInfo type extended with liveness + the three detail fields.
- ModelSelector filters UNCONFIGURED + REMOVED out of the dropdown,
  shows COOLDOWN / UNPROBED with a status dot and dimmed rows that the
  user can still click to override.
- ProviderCard renders a five-state badge driven by liveness instead
  of the old configured + pool-entry combo. Reprobe button now keys
  off liveness in {REMOVED, COOLDOWN}.
- useProviders drops loadProviderPool / providerPool — pool data ships
  inline on each ProviderInfo, saves a round trip per page load and
  keeps a single source of truth.
- i18n: 8 new keys across zh-CN and en-US for liveness labels and the
  cooldown countdown tooltips.

Bonus fix (discovered during verification): AgentGraphBuilder.buildOpenAiApi
hard-required a usable API key on every OpenAI-compat provider, ignoring
the per-provider requireApiKey flag. That bug stranded keyless local
runtimes (LM Studio / MLX / llama.cpp) the moment a user actually
launched them; Ollama only worked by accident because its seed row
carries a placeholder string in api_key. keyRequired now honors
requireApiKey, and Spring AI's NoopApiKey is used when no key is needed
so the Authorization header is omitted entirely.

Test
- ModelProviderServiceLivenessTest covers all five Liveness states +
  the probe-bean-absent fallback branch.
- vip.mate.llm.** suite (118 tests) green; vue-tsc clean.
- End-to-end browser sanity: 27 raw providers reduce to 6 LIVE groups
  in the chat dropdown; LM Studio / MLX / llama.cpp render REMOVED red
  badges with reprobe buttons; cloud providers without keys show
  UNCONFIGURED.
2026-04-28 14:59:11 +08:00
..
Doctor fix(ui): prevent modals from closing on backdrop click 2026-04-11 18:06:48 +08:00
layout perf(channels): split Channels.vue, lazy-load modal, async locales, keep-alive route 2026-04-28 11:08:36 +08:00
Memory feat(memory): enable Memory Browser tab + audit fixes 2026-04-21 15:28:31 +08:00
Onboarding feat(ux): Phase 1 — onboarding, doctor, templates, navigation convergence 2026-04-09 00:32:35 +08:00
Security feat(auth): password change dialog + workspace member provisioning improvements 2026-04-17 00:11:10 +08:00
Settings feat(llm): provider liveness model + honor requireApiKey on chat path 2026-04-28 14:59:11 +08:00
Wiki feat(wiki): download original raw material file 2026-04-26 20:46:52 +08:00
AgentContext.vue fix(wiki): smaller batch-create + resume button for partial generation 2026-04-26 18:42:27 +08:00
Agents.vue feat(skill-market): paginated skill list with search and frosted-glass UI 2026-04-24 06:55:19 +08:00
Channels.vue perf(channels): split Channels.vue, lazy-load modal, async locales, keep-alive route 2026-04-28 11:08:36 +08:00
ChatConsole.vue fix(chat): surface SSE error in retry card and stop poll from wiping local-only failed turn 2026-04-28 00:16:14 +08:00
CronJobs.vue fix(ui): prevent modals from closing on backdrop click 2026-04-11 18:06:48 +08:00
Dashboard.vue refactor(ux): simplify interactions and humanize UI with Jobs-inspired review 2026-04-09 20:56:50 +08:00
Datasources.vue refactor(ui): minimalist login redesign, MCP fixes, Flyway upgrade compatibility 2026-04-11 23:01:08 +08:00
Login.vue feat(auth): password change dialog + workspace member provisioning improvements 2026-04-17 00:11:10 +08:00
McpServers.vue refactor(ui): minimalist login redesign, MCP fixes, Flyway upgrade compatibility 2026-04-11 23:01:08 +08:00
Plugins.vue feat(plugin): Plugin SDK + UI layout improvements 2026-04-13 18:38:03 +08:00
Sessions.vue feat(ui): add mobile responsive layout and fix hardcoded i18n strings 2026-04-05 18:56:41 +08:00
SkillMarket.vue feat(skill-market): bilingual skill display names (nameZh / nameEn) 2026-04-24 06:55:20 +08:00
TokenUsage.vue feat(ui): unify workspace and platform console surfaces 2026-04-09 19:48:17 +08:00
Tools.vue fix(ui): prevent modals from closing on backdrop click 2026-04-11 18:06:48 +08:00