Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions docs/getting-started/baremetal-ubuntu.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,13 @@ targets a 128 GB box and leaves only ~4 GB for the host — scale it down to
reserve more host RAM. After rebooting, confirm with `cat /proc/cmdline`.

<Aside type="caution">
The old `amdgpu.gttsize` parameter is **deprecated** — it is ignored on
Linux 6.10+ (the GTT window is now driven entirely by `ttm.pages_limit`).
Set only `ttm.pages_limit`; drop `amdgpu.gttsize` from any older guide.
The old `amdgpu.gttsize` parameter is **deprecated** and may emit kernel
warnings on current amdgpu/TTM kernels — the GTT window is now driven
solely by `ttm.pages_limit`. Some newer kernels expose the same knob as
`amdttm.pages_limit` (the out-of-tree AMD TTM module) instead — check
which one your kernel ships with `modinfo ttm` / `modinfo amdttm` and set
whichever applies. Set only that knob; drop `amdgpu.gttsize` from any
older guide.
</Aside>

## 3. Install hal0
Expand Down
21 changes: 19 additions & 2 deletions docs/getting-started/first-model.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,14 @@ shows up in a few places:
- The **Models** view has an empty registry (the Inference tab reads "the
catalog is empty"), and the Downloads panel prompts you to add a model
from the catalog or via **Add by HF coords**.
- The **Slots** view shows a **no slots configured** hint if no capability
slots exist yet.
- **OpenWebUI** (`:3001`) is reachable, but its model selector is empty — it
reads the same empty `/v1/models` list below.
- The **Slots** view, `hal0 status`, and `hal0 slot list` show the
capability slots the installer scaffolded (structure only — device,
profile, port) with no model assigned, rather than an empty list: the
installer creates slot *shape*, never model picks. The one case where
these are truly empty is an install that skipped slot scaffolding
entirely with `hal0 setup --no-slots`.
- `GET /v1/models` returns an empty list, and a chat request against an
unconfigured slot has nothing to dispatch to.

Expand All @@ -51,6 +57,17 @@ hal0 model run qwen3-4b # assign to a slot, load, wait until serving
polls until the server answers, and prints a copy-paste `curl` smoke test
against the slot port. That's a working chat endpoint.

<Aside type="tip" title="Where the pull lands">
Downloads write to `[models].store` in `hal0.toml` — the single directory
the pull engine writes to and slot containers bind-mount. It's empty by
default and falls back to the legacy `pull_root` (`/var/lib/hal0/models`)
until you set it explicitly with `hal0 setup --storage-dir <path>`
(first-run setup) or `hal0 model store <path>` (any time — see
[Already have the files on disk?](#already-have-the-files-on-disk) below).
See [Paths and files](/docs/reference/paths-and-files/) for the full
resolution order.
</Aside>

## Already have the files on disk?

Many installs start from a disk full of GGUFs, not a download. Point hal0
Expand Down
10 changes: 7 additions & 3 deletions docs/getting-started/proxmox-lxc.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,13 @@ other tenants. Scale it down to reserve more host RAM. After rebooting,
</Aside>

<Aside type="caution">
The old `amdgpu.gttsize` parameter is **deprecated** — it is ignored on
Linux 6.10+ (the GTT window is now driven entirely by `ttm.pages_limit`).
Set only `ttm.pages_limit`; drop `amdgpu.gttsize` from any older guide.
The old `amdgpu.gttsize` parameter is **deprecated** and may emit kernel
warnings on current amdgpu/TTM kernels — the GTT window is now driven
solely by `ttm.pages_limit`. Some newer kernels expose the same knob as
`amdttm.pages_limit` (the out-of-tree AMD TTM module) instead — check
which one your kernel ships with `modinfo ttm` / `modinfo amdttm` and set
whichever applies. Set only that knob; drop `amdgpu.gttsize` from any
older guide.
</Aside>

## 2. Create the container
Expand Down
4 changes: 2 additions & 2 deletions docs/guides/configure.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,8 @@ Advanced, About.
`[memory]`, and `[activity]` key that previously required `hal0 config
edit` (including `slots.evict_pressure_mb`, the pressure-eviction floor;
the `memory.engine` picker only offers `hindsight`/`pgvector` even though
the schema also accepts `cognee`/`mem0`, since those two are silently
remapped to hindsight), plus a dedicated **memory graph** panel for
the schema also accepts `mem0`, since it's silently remapped to
hindsight), plus a dedicated **memory graph** panel for
`[memory.graph]` (`extraction_slot`, `llm_timeout_s`) and a **Restart
hal0-api** button — a one-click restart-and-health-poll for
`hal0-api.service`, handy after any change flagged "restart required".
Expand Down
22 changes: 4 additions & 18 deletions docs/guides/enable-memory.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Enable memory
description: hal0's memory subsystem is gated by [memory].enabled in hal0.toml (on by default). Toggle it with hal0 memory enable/disable, control graph extraction with hal0 memory graph --slot, and migrate any legacy store.
description: hal0's memory subsystem is gated by [memory].enabled in hal0.toml (on by default). Toggle it with hal0 memory enable/disable and control graph extraction with hal0 memory graph --slot.
sidebar:
order: 50
---
Expand Down Expand Up @@ -132,23 +132,6 @@ unaffected either way — this gate only controls the graph layer.
</TabItem>
</Tabs>

## Migrate a legacy store

If you previously ran the Cognee-backed memory store, preview a migration
into Hindsight banks:

```sh
hal0 memory migrate --dry-run
hal0 memory migrate --dry-run --cognee-dir /var/lib/hal0/memory/cognee
```

The report shows rows total / mapped / unmapped and whether it's a no-op.

<Aside type="caution">
Migration is **dry-run only** today — it reports the plan without writing.
Passing `--no-dry-run` exits with a "not yet implemented" error.
</Aside>

## Destructive ops are audited

Every destructive call under `/api/memory/*` — bank delete, and the
Expand All @@ -167,3 +150,6 @@ confirmation is rejected with `memory.confirm_required`.
the memory store.
- [MCP tools](/docs/reference/mcp-tools) — the `memory_*` tool tiers and
the `/mcp/memory` server this guide's flag gates.
- [Honcho memory](/docs/guides/honcho-memory) — `hal0 memory migrate --from
<engine> --to <engine>` moves an agent's memories between Hindsight and
Honcho.
14 changes: 8 additions & 6 deletions docs/reference/config-schema.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -116,14 +116,16 @@ NPU weights off the root filesystem too.

| Key | Type | Default | Notes |
|---|---|---|---|
| `engine` | str | `"hindsight"` | Active memory engine: `hindsight` (default) \| `mem0` \| `pgvector`. `cognee` is **deprecated** — accepted for back-compat but resolves to `hindsight`. |
| `engine` | str | `"hindsight"` | Active memory engine: `hindsight` (default) \| `mem0` \| `pgvector`. `cognee` was **retired in v1.0.0** — the schema now rejects it (the Cognee store has been dark since v0.4). |

<Aside type="note">
The validator also accepts `cognee`/`mem0`, but the Advanced Settings dropdown
only offers `hindsight`/`pgvector` — the factory silently remaps `cognee`/`mem0`
selections to `hindsight`, so the dashboard doesn't offer a choice that would
lie about what actually runs. Hand-editing `hal0.toml` to `cognee`/`mem0` is
still accepted at the schema level, but resolves to `hindsight` in practice.
The validator accepts `mem0`, but the Advanced Settings dropdown only offers
`hindsight`/`pgvector` — the factory silently remaps `mem0` selections to
`hindsight`, so the dashboard doesn't offer a choice that would lie about
what actually runs. Hand-editing `hal0.toml` to `mem0` is still accepted at
the schema level, but resolves to `hindsight` in practice. `cognee` is no
longer a valid value at all — a `hal0.toml` still carrying it fails config
validation and must be updated to `hindsight`.
</Aside>

### `[memory.embedding]` — reranker knobs (Hindsight era)
Expand Down
5 changes: 3 additions & 2 deletions installer/agents/hermes/plugins/hal0-provider/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
purely *declarative*: it advertises the endpoint, capabilities, and a live
model inventory; it does not itself stream tokens.
* ``base_url = "http://127.0.0.1:8080/v1"`` — loopback hal0-api (never a slot
port). No Bearer on the hal0 LAN (post-ADR-0012 identity model); identity is
carried by ``X-hal0-Agent`` when we make our own discovery call.
port). No Bearer on the hal0 LAN — hal0 ships with no built-in auth on the
trusted local network; identity is carried by ``X-hal0-Agent`` when we make
our own discovery call.
* ``default_aux_model = "hal0/agent"`` — pins compression / vision /
summarization / web_extract aux calls at the local agent slot. ``hal0/agent``
is a *virtual* name hal0 resolves per-request via its LiveSlotResolver, so
Expand Down
5 changes: 3 additions & 2 deletions src/hal0/agents/hermes/plugins/provider_hal0/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
purely *declarative*: it advertises the endpoint, capabilities, and a live
model inventory; it does not itself stream tokens.
* ``base_url = "http://127.0.0.1:8080/v1"`` — loopback hal0-api (never a slot
port). No Bearer on the hal0 LAN (post-ADR-0012 identity model); identity is
carried by ``X-hal0-Agent`` when we make our own discovery call.
port). No Bearer on the hal0 LAN — hal0 ships with no built-in auth on the
trusted local network; identity is carried by ``X-hal0-Agent`` when we make
our own discovery call.
* ``default_aux_model = "hal0/agent"`` — pins compression / vision /
summarization / web_extract aux calls at the local agent slot. ``hal0/agent``
is a *virtual* name hal0 resolves per-request via its LiveSlotResolver, so
Expand Down
6 changes: 3 additions & 3 deletions src/hal0/agents/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,9 +315,9 @@ def install(
# Already installed — return the existing record. Idempotent.
return self._read_record(name)

# Single-pick (ADR-0004 §2): only one bundled agent may be installed
# at a time. ``blocking`` == ``current`` — anything already
# installed conflicts with a fresh install.
# Single-pick: only one bundled agent may be installed at a time.
# ``blocking`` == ``current`` — anything already installed conflicts
# with a fresh install.
blocking = current

if not blocking:
Expand Down
22 changes: 14 additions & 8 deletions src/hal0/config/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -2446,16 +2446,22 @@ class MemoryConfig(BaseModel):
"(private:<agent> / project:<id> banks + fan-out recall)."
),
)
# HAL0-SUNSET: v1.0.0 — 'cognee' engine value resolves to hindsight at runtime; drop the alias.
# HAL0-SUNSET: v1.0.0 — 'cognee' engine literal retired here. It is no
# longer an accepted config value (was previously a back-compat alias
# that resolved to hindsight at runtime). provider_from_config's runtime
# resolution still treats any *unrecognized* engine as Hindsight as a
# defense-in-depth fallback for callers that bypass this validator
# (e.g. duck-typed namespaces), but a hal0.toml with engine = "cognee"
# now fails config validation outright — the Cognee store has been dark
# since v0.4.
engine: str = Field(
default="hindsight",
description=(
"Active memory engine. 'hindsight' (default) is the platform "
"engine; 'mem0' and 'pgvector' are alternates. 'cognee' is "
"DEPRECATED — the legacy Cognee store has been dark since v0.4 and "
"its wrapper was removed; the value is still accepted for "
"back-compat but resolves to 'hindsight' at runtime. Use "
"'hindsight'."
"engine; 'mem0' and 'pgvector' are alternates. The legacy "
"'cognee' value was retired in v1.0.0 (the Cognee store has been "
"dark since v0.4 and its wrapper was removed) — a hal0.toml "
"still carrying it must be updated to 'hindsight'."
),
)
agent_providers: dict[str, str] = Field(
Expand All @@ -2482,8 +2488,8 @@ class MemoryConfig(BaseModel):
@field_validator("engine")
@classmethod
def _engine_is_known(cls, v: str) -> str:
known = {"cognee", "hindsight", "mem0", "pgvector"}
s = str(v or "cognee").strip().lower()
known = {"hindsight", "mem0", "pgvector"}
s = str(v or "hindsight").strip().lower()
if s not in known:
raise ValueError(f"memory.engine {v!r} must be one of {sorted(known)}")
return s
Expand Down
10 changes: 9 additions & 1 deletion tests/config/test_memory_engine_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,18 @@ def test_engine_defaults_to_hindsight():


def test_engine_accepts_known_engines():
for e in ("cognee", "hindsight", "mem0", "pgvector"):
for e in ("hindsight", "mem0", "pgvector"):
assert MemoryConfig(engine=e).engine == e


def test_engine_rejects_unknown():
with pytest.raises(ValidationError):
MemoryConfig(engine="weaviate")


def test_engine_rejects_retired_cognee_literal():
# HAL0-SUNSET: v1.0.0 — 'cognee' was a back-compat alias that resolved to
# hindsight at runtime; it is now retired and fails validation like any
# other unknown engine. The Cognee store has been dark since v0.4.
with pytest.raises(ValidationError):
MemoryConfig(engine="cognee")
2 changes: 1 addition & 1 deletion ui/src/dash/memory-map.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export function useMemoryMapModel() {
const slots = slotsQ.data || []

// Pool total = the real ceiling for GPU model loads. On UMA (Strix Halo)
// that is the GTT cap (amdgpu.gttsize, ~80 GiB — live as
// that is the GTT cap (ttm.pages_limit, ~80 GiB — live as
// stats.gpu_vram_total_mb), NOT the full unified RAM (128 GiB): models can't
// actually allocate past the GTT window, so headroom must be measured
// against it. Prefer the live GTT cap; fall back to the static unified/ram
Expand Down
Loading