# Honcho Memory Provider AI-native cross-session user modeling with dialectic Q&A, semantic search, peer cards, and persistent conclusions. > **Honcho docs:** ## Requirements - `pip install honcho-ai` - Honcho API key from [app.honcho.dev](https://app.honcho.dev), or a self-hosted instance ## Setup ```bash hermes honcho setup # full interactive wizard (cloud or local) hermes memory setup # generic picker, also works ``` Or manually: ```bash hermes config set memory.provider honcho echo "HONCHO_API_KEY=your-key" >> ~/.hermes/.env ``` ## Config Resolution Config is read from the first file that exists: | Priority | Path | Scope | |----------|------|-------| | 1 | `$HERMES_HOME/honcho.json` | Profile-local (isolated Hermes instances) | | 2 | `~/.hermes/honcho.json` | Default profile (shared host blocks) | | 3 | `~/.honcho/config.json` | Global (cross-app interop) | Host key is derived from the active Hermes profile: `hermes` (default) or `hermes.`. ## Tools | Tool | LLM call? | Description | |------|-----------|-------------| | `honcho_profile` | No | User's peer card -- key facts snapshot | | `honcho_search` | No | Semantic search over stored context (800 tok default, 2000 max) | | `honcho_context` | Yes | LLM-synthesized answer via dialectic reasoning | | `honcho_conclude` | No | Write a persistent fact about the user | Tool availability depends on `recallMode`: hidden in `context` mode, always present in `tools` and `hybrid`. ## Full Configuration Reference ### Identity & Connection | Key | Type | Default | Scope | Description | |-----|------|---------|-------|-------------| | `apiKey` | string | -- | root / host | API key. Falls back to `HONCHO_API_KEY` env var | | `baseUrl` | string | -- | root | Base URL for self-hosted Honcho. Local URLs (`localhost`, `127.0.0.1`, `::1`) auto-skip API key auth | | `environment` | string | `"production"` | root / host | SDK environment mapping | | `enabled` | bool | auto | root / host | Master toggle. Auto-enables when `apiKey` or `baseUrl` present | | `workspace` | string | host key | root / host | Honcho workspace ID | | `peerName` | string | -- | root / host | User peer identity | | `aiPeer` | string | host key | root / host | AI peer identity | ### Memory & Recall | Key | Type | Default | Scope | Description | |-----|------|---------|-------|-------------| | `recallMode` | string | `"hybrid"` | root / host | `"hybrid"` (auto-inject + tools), `"context"` (auto-inject only, tools hidden), `"tools"` (tools only, no injection). Legacy `"auto"` normalizes to `"hybrid"` | | `observationMode` | string | `"directional"` | root / host | Shorthand preset: `"directional"` (all on) or `"unified"` (shared pool). Use `observation` object for granular control | | `observation` | object | -- | root / host | Per-peer observation config (see below) | #### Observation (granular) Maps 1:1 to Honcho's per-peer `SessionPeerConfig`. Set at root or per host block -- each profile can have different observation settings. When present, overrides `observationMode` preset. ```json "observation": { "user": { "observeMe": true, "observeOthers": true }, "ai": { "observeMe": true, "observeOthers": true } } ``` | Field | Default | Description | |-------|---------|-------------| | `user.observeMe` | `true` | User peer self-observation (Honcho builds user representation) | | `user.observeOthers` | `true` | User peer observes AI messages | | `ai.observeMe` | `true` | AI peer self-observation (Honcho builds AI representation) | | `ai.observeOthers` | `true` | AI peer observes user messages (enables cross-peer dialectic) | Presets for `observationMode`: - `"directional"` (default): all four booleans `true` - `"unified"`: user `observeMe=true`, AI `observeOthers=true`, rest `false` Per-profile example -- coder profile observes the user but user doesn't observe coder: ```json "hosts": { "hermes.coder": { "observation": { "user": { "observeMe": true, "observeOthers": false }, "ai": { "observeMe": true, "observeOthers": true } } } } ``` Settings changed in the [Honcho dashboard](https://app.honcho.dev) are synced back on session init. ### Write Behavior | Key | Type | Default | Scope | Description | |-----|------|---------|-------|-------------| | `writeFrequency` | string or int | `"async"` | root / host | `"async"` (background thread), `"turn"` (sync per turn), `"session"` (batch on end), or integer N (every N turns) | | `saveMessages` | bool | `true` | root / host | Whether to persist messages to Honcho API | ### Session Resolution | Key | Type | Default | Scope | Description | |-----|------|---------|-------|-------------| | `sessionStrategy` | string | `"per-directory"` | root / host | `"per-directory"`, `"per-session"` (new each run), `"per-repo"` (git root name), `"global"` (single session) | | `sessionPeerPrefix` | bool | `false` | root / host | Prepend peer name to session keys | | `sessions` | object | `{}` | root | Manual directory-to-session-name mappings: `{"/path/to/project": "my-session"}` | ### Token Budgets & Dialectic | Key | Type | Default | Scope | Description | |-----|------|---------|-------|-------------| | `contextTokens` | int | SDK default | root / host | Token budget for `context()` API calls. Also gates prefetch truncation (tokens x 4 chars) | | `dialecticReasoningLevel` | string | `"low"` | root / host | Base reasoning level for `peer.chat()`: `"minimal"`, `"low"`, `"medium"`, `"high"`, `"max"` | | `dialecticDynamic` | bool | `true` | root / host | Auto-bump reasoning based on query length: `<120` chars = base level, `120-400` = +1, `>400` = +2 (capped at `"high"`). Set `false` to always use `dialecticReasoningLevel` as-is | | `dialecticMaxChars` | int | `600` | root / host | Max chars of dialectic result injected into system prompt | | `dialecticMaxInputChars` | int | `10000` | root / host | Max chars for dialectic query input to `peer.chat()`. Honcho cloud limit: 10k | | `messageMaxChars` | int | `25000` | root / host | Max chars per message sent via `add_messages()`. Messages exceeding this are chunked with `[continued]` markers. Honcho cloud limit: 25k | ### Cost Awareness (Advanced) These are read from the root config object, not the host block. Must be set manually in `honcho.json`. | Key | Type | Default | Description | |-----|------|---------|-------------| | `injectionFrequency` | string | `"every-turn"` | `"every-turn"` or `"first-turn"` (inject context only on turn 0) | | `contextCadence` | int | `1` | Minimum turns between `context()` API calls | | `dialecticCadence` | int | `1` | Minimum turns between `peer.chat()` API calls | | `reasoningLevelCap` | string | -- | Hard cap on auto-bumped reasoning: `"minimal"`, `"low"`, `"mid"`, `"high"` | ### Hardcoded Limits (Not Configurable) | Limit | Value | Location | |-------|-------|----------| | Search tool max tokens | 2000 (hard cap), 800 (default) | `__init__.py` handle_tool_call | | Peer card fetch tokens | 200 | `session.py` get_peer_card | ## Config Precedence For every key, resolution order is: **host block > root > env var > default**. Host key derivation: `HERMES_HONCHO_HOST` env > active profile (`hermes.`) > `"hermes"`. ## Environment Variables | Variable | Fallback for | |----------|-------------| | `HONCHO_API_KEY` | `apiKey` | | `HONCHO_BASE_URL` | `baseUrl` | | `HONCHO_ENVIRONMENT` | `environment` | | `HERMES_HONCHO_HOST` | Host key override | ## CLI Commands | Command | Description | |---------|-------------| | `hermes honcho setup` | Full interactive setup wizard | | `hermes honcho status` | Show resolved config for active profile | | `hermes honcho enable` / `disable` | Toggle Honcho for active profile | | `hermes honcho mode ` | Change recall or observation mode | | `hermes honcho peer --user ` | Update user peer name | | `hermes honcho peer --ai ` | Update AI peer name | | `hermes honcho tokens --context ` | Set context token budget | | `hermes honcho tokens --dialectic ` | Set dialectic max chars | | `hermes honcho map ` | Map current directory to a session name | | `hermes honcho sync` | Create host blocks for all Hermes profiles | ## Example Config ```json { "apiKey": "your-key", "workspace": "hermes", "peerName": "eri", "hosts": { "hermes": { "enabled": true, "aiPeer": "hermes", "workspace": "hermes", "peerName": "eri", "recallMode": "hybrid", "observation": { "user": { "observeMe": true, "observeOthers": true }, "ai": { "observeMe": true, "observeOthers": true } }, "writeFrequency": "async", "sessionStrategy": "per-directory", "dialecticReasoningLevel": "low", "dialecticMaxChars": 600, "saveMessages": true }, "hermes.coder": { "enabled": true, "aiPeer": "coder", "workspace": "hermes", "peerName": "eri", "observation": { "user": { "observeMe": true, "observeOthers": false }, "ai": { "observeMe": true, "observeOthers": true } } } }, "sessions": { "/home/user/myproject": "myproject-main" } } ```