fix(docs): correct warm-toggle and Reconcile-without-Store claims

The failover chain editor leaves the warm toggle enabled on every row
(the model list has no backend field to gate on) and relies on the
server warning instead, so the docs describing it as disabled for
remote targets were wrong. Separately, syncstate's hydrate() returns
early with no Store or Loader, so a Reconcile tick is a no-op rather
than one that empties the map — correct that claim everywhere it was
repeated (contributor guide, distsync comment, design spec).

No behavior change.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
This commit is contained in:
Ettore Di Giacinto committed 2026-09-27 07:42:21 +00:00
1 parent 00d9d80897
commit 452a3a0cbe
4 files changed
+14 -13

No files matched your search

+3 -3
View File
@@ -44,9 +44,9 @@ Examples:
`failover.targets` and `failover.chains` are ephemeral live-health state
with no `Store`, republished by the leader every 10 s.
**Gotcha:** `Reconcile` with neither a `Store` nor a `Loader` re-hydrates the
map **empty** on a reconnect or a late join — there is nothing for it to pull
from. If your map has no durable backing, a leader (or another privileged
**Gotcha:** `Reconcile` with neither a `Store` nor a `Loader` does **nothing**
— there is nothing for it to pull from, so it cannot help a late joiner catch
up. If your map has no durable backing, a leader (or another privileged
writer) must republish its live state after a reconnect instead of relying on
`Reconcile` to recover it.
+3 -3
View File
@@ -25,9 +25,9 @@ var (
// PinStore is given) so a late joiner hydrates every pin from the DB on
// Start, not just from whatever peers happen to broadcast afterwards.
// - failover.targets and failover.chains are ephemeral live-health state,
// NATS-only with no Store and no Reconcile: there is nothing durable to
// hydrate from, and a Reconcile tick would re-hydrate them empty and wipe
// live state clean off a running frontend. A late joiner instead catches
// NATS-only with no Store and no Reconcile: with neither set, a Reconcile
// tick's hydrate is a no-op (nothing durable to pull from), so it could
// never help a late joiner catch up anyway. A late joiner instead catches
// up from the leader's periodic Republish (see failover.Manager.Republish).
type Sync struct {
pins *syncstate.SyncedMap[string, PinRecord]
+5 -5
View File
@@ -236,11 +236,11 @@ continue. On a single LocalAI instance, a restart removes the pin. In
- The model editor's template picker has a **Failover Chain** template that
starts a new model with two empty targets. Any model can also add a
`failover.targets` field directly: each row picks a target model and a
**warm** toggle, with move up/down and remove controls. The warm toggle is
disabled, with an explanation, for a target on a remote (`localai-proxy` or
`cloud-proxy`) backend, since `warm` has no effect there. The field flags
fewer than two targets, a duplicate target, and the chain naming itself as
one of its own targets.
**warm** toggle, with move up/down and remove controls. The toggle is
available on every row; `warm` has no effect on a remote (`localai-proxy` or
`cloud-proxy`) target, and LocalAI logs a warning when it loads a chain with
one set. The field flags fewer than two targets, a duplicate target, and the
chain naming itself as one of its own targets.
- Opening an existing chain in the model editor shows a health strip: the
chain's status pill, its active target and how long it has been active,
and a table of every target with its kind, warm flag, status, last probe
@@ -70,8 +70,9 @@ below applies when distributed mode is on.
maps. The manager does not import NATS or gorm directly.
- A peer delta is applied through `OnApply`, which changes local state
without publishing again (no echo loops).
- The NATS-only maps have no `Store`, so `Reconcile` would re-hydrate them
empty. Instead the leader republishes every target and chain snapshot every
- The NATS-only maps have no `Store`, so a `Reconcile` tick's hydrate would be
a no-op — nothing durable to pull from, so it could never help a late
joiner. Instead the leader republishes every target and chain snapshot every
10 s. A frontend that joins late converges within 10 s and uses its own
state until then.