RTerm v3.3.0
Model Failover is now actually configurable
v3.2.18 shipped the failover engine with 77 passing tests — but a wiring check revealed nothing could ever populate the chain. The profile field, the binding construction, and the UI didn't exist, so the feature was dormant. v3.3.0 completes the write→read path end to end.
What's new
fallbackModels on every model profile — an ordered list of model ids, persisted via settings:set like any other profile field.
Settings UI — a "Fallback Models (failover chain)" editor per profile:
- numbered rows with a model picker (primary excluded)
- the resolved model id shown beside each entry
- remove (×) and reorder (↑/↓) controls
- "+ Add fallback model"
- tooltip explaining the eligibility rules
Robust chain resolution — the primary's own id, duplicates, unknown ids, ids without an API key, and non-string/blank entries are all skipped with a warning. One bad entry can't break the chain. User order is preserved.
Two bugs found and fixed
-
Fallback models had no tools bound. The v3.2.18 fallback path rebuilt the chat model but never called
.bindTools(...)— a failover response would have had no tools available. Fallbacks now re-bind the same built-in + MCP tool set with the correct temperature for the pass type. -
Empty chain returned silent success.
withModelFailover([])returned a "success" with no value; it now returns an explicit error. Found by the new edge-case tests.
How to use
Settings → Models → (profile) → Fallback Models: add 2–3 models in priority order. When the primary's provider fails with an eligible error (429, 5xx, network, auth, model-unavailable), the same request retries down the chain transparently. Context-length, 400, and abort errors never fail over.
Verification
- New
v330FailoverWiring.extreme.spec.ts: 22/22 — resolution edge cases, JSON round-trips, engine edge cases, and two full write→read simulations - All prior suites green: v3218Comprehensive 77/77, layout-ui 8/8, automation passing
- typecheck:all clean (backend + web + electron)
npm
neuralos@3.3.0 · rterm-backend@3.3.0 · rterm-cli@3.3.0