godcall/INSTALL.md

289 lines
11 KiB
Markdown

# TencentDB Agent Memory — Installation Guide
← Back to [README.md](./README.md) · 简体中文: [INSTALL_CN.md](./INSTALL_CN.md)
This document covers three installation modes:
1. **Full three-in-one stack**: `memory-core` + `memory-hub` + `proxy` in one
shot (recommended — lets coding agents like Claude Code plug directly into
your team memory / knowledge / skill injection).
2. **Memory Hub only**: lightweight deploy when Memory Core is already running.
3. **Using Proxy with Claude Code**: point a coding agent at the proxy.
---
## Full three-in-one stack: Memory Core + Memory Hub + Proxy (recommended)
Boot `memory-core` + `memory-hub` + `proxy` in one command so coding agents can
consume team memory / knowledge / skills through the proxy:
```bash
# 1) Fetch the scripts
git clone https://github.com/TencentCloud/TencentDB-Agent-Memory.git
cd TencentDB-Agent-Memory/deploy/global-images
# 2) Prepare .env (fill in real LLM values)
cp .env.example .env
$EDITOR .env
# MEMORY_LLM_BASE_URL / MEMORY_LLM_API_KEY / MEMORY_LLM_MODEL ← used internally by memory + hub
# PROXY_UPSTREAM_URL / PROXY_UPSTREAM_API_KEY / PROXY_UPSTREAM_MODEL ← upstream the proxy forwards to
# 3) Dry-run validation (optional; also does a live LLM probe — use --skip-llm to skip)
./verify.sh
# 4) One-shot boot
./start-all.sh
```
When it finishes, the script automatically:
1. On the first boot, calls `init-admin` to create the admin user, generates a
random 32-char `user_key` and persists it to `./.admin-key` (reused across
restarts of the same volume).
2. Immediately runs `POST /v3/meta/auth/verify` to sanity-check the key. Once
verified, it prints a ready-to-run block like:
```bash
export ANTHROPIC_BASE_URL=http://127.0.0.1:8096/claude-code/default
export ANTHROPIC_AUTH_TOKEN='sk-mem-<random 32 chars>'
claude --model <whatever PROXY_UPSTREAM_MODEL is set to>
```
Default ports:
| Service | Port | Purpose |
|---|---|---|
| Memory Core | `8420` | memory read/write, auth, skill/RAG data plane |
| Panel UI | `8125` | team memory control panel |
| Knowledge | `8424` | wiki / code-graph service |
| Proxy | `8096` | LLM request proxy (Anthropic / OpenAI dual-protocol) |
---
## After deploy: making it useful
Starting the containers is just half the job. To make coding agents like
Claude Code actually consume team memory, you also need to (a) create the
org structure in the panel and (b) pick them from within a CC session.
### Step 1: Log into the panel
Open **<http://localhost:8125>** in your browser (Panel UI).
- The first visit asks for a `user_key` — use the admin one printed at the
end of `start-all.sh` (stored in `deploy/global-images/.admin-key`, a
`sk-mem-...` string)
- Once logged in you are `system_admin`. It can **create Teams and
sub-users**, but at this stage **cannot directly create other business
assets such as Agent / Wiki / Skill** (the business APIs enforce
`owner_user_id === caller`, and `system_admin` isn't yet in the
allow-list; this restriction will be lifted in a future release).
- **Correct pattern**: admin creates a `normal` user → copy that user's
`user_key` → log out → log back in as the new user → everything from
here on (Team / Agent / Task) is owned by the new user.
> In short: admin is the "ops account" for managing users; business users
> are the "app accounts" for managing assets. Even in a single-machine
> local playground, keep this split — don't use the admin key to drive CC.
Knowledge Service Swagger (optional, for API poking):
<http://localhost:8424/docs>
### Step 1.5: Admin creates a business user (required once)
Panel: top-left "Users" → "New" (or use the API directly):
```bash
ADMIN_KEY=$(cat ./.admin-key)
curl -sS -X POST http://localhost:8420/v3/meta/user/create \
-H "x-tdai-user-key: $ADMIN_KEY" \
-H "x-tdai-service-id: default" \
-H "Content-Type: application/json" \
-d '{"username":"you"}' | jq
```
The response body's `data.default_user_key` (`sk-mem-...`) is the login
key for the new user — **save it now**; the panel won't show the full
value again after creation.
Then log out of the panel and log back in with this new key — you're now
a `normal` user and can create Team / Agent / Task under your own name.
### Step 2: Create Team / Agent / Task in the panel
Every memory entry attaches to a `team / agent / task` triple:
1. **Team**: sidebar → "Team" → New
- A Team owns everything: memory, skill, knowledge
2. **Agent**: enter a Team → "Agent" → New
- Fill a clear `description` + `system prompt` (the agent's role)
- e.g. `bug-fix engineer`, `frontend reviewer`, `SQL tuner`
3. **Task** (optional): Team → "Task" → New
- A Task is the concrete piece of work: "fix login XSS", "ship v1.4"
- Memories link to Tasks; skipping Task still works but L2/L3 lose the
Task dimension
You'll want **at least 1 Team + 1 Agent** before you start; Task is optional.
### Step 3: Point Claude Code at the Proxy
Use the **business user's** `user_key` (not the admin key — admin can't
own assets yet, and proxy's sessionInit will show an empty picker):
```bash
export ANTHROPIC_BASE_URL=http://127.0.0.1:8096/claude-code/default
export ANTHROPIC_AUTH_TOKEN="<the sk-mem-... from Step 1.5>"
claude --model <whatever PROXY_UPSTREAM_MODEL is set to>
```
- `ANTHROPIC_BASE_URL` reroutes CC's API from anthropic.com to the local
proxy; the trailing `default` is the memory instance ID
(`x-tdai-service-id`) — always `default` in this local deploy
- `ANTHROPIC_AUTH_TOKEN` is the **business user's** `user_key` (the
`default_user_key` returned in Step 1.5); proxy uses it to look up
user_id via core, and only teams/agents/tasks owned by this user show
up in the next step's picker
- `--model` uses the upstream model name you configured in
`PROXY_UPSTREAM_MODEL` (proxy forwards to `PROXY_UPSTREAM_URL`)
### Step 4: First CC turn — pick Team → Agent → Task
**Every new CC session**, the proxy uses CC's native `AskUserQuestion`
tool to walk you through three consecutive picks:
```
┌─────────────────────────────────────────────────┐
│ 1. Please pick the Team for this session: │
│ ○ Team A │
│ ○ Team B │
│ │
│ 2. Please pick an Agent under Team A: │
│ ○ bug-fix engineer │
│ ○ frontend reviewer │
│ │
│ 3. Optionally pick a Task: │
│ ○ Fix login XSS │
│ ○ [Skip task binding] │
└─────────────────────────────────────────────────┘
```
**Answer each with CC's usual arrow-key + Enter**. Once done:
- Proxy binds this session to that team/agent/task
- **Every subsequent turn, proxy auto-injects that agent's L2/L3 memory,
skills, and knowledge into the system prompt**
- L0 (raw dialogue) is captured into memory-core's SQLite
- Background workers extract L1 (memory) → L2 (scene) → L3 (persona) as
thresholds are hit
Only a **new CC session** triggers the picker; subsequent turns inside the
same `claude` process reuse the binding.
### Step 5: Watch memory grow
After a chat, look in the panel:
- Left sidebar → **Memory** → Chat Memory: L0 dialogue sliced into scenes
- **Agent detail** page → Profile: L2 scenes + L3 persona accumulate
- **Skill** list: if the LLM decides "this is a reusable how-to", it gets
auto-extracted into a Skill
Memory-core `/health` also shows whether the pipeline is doing work:
```bash
curl -s http://localhost:8420/health | jq .services.pipelineWorker
```
Expect `tasksConsumed` / `tasksCompleted` to grow with dialogue.
### FAQ
**Q: CC session doesn't prompt me to pick anything?**
`PROXY_ENABLE_SESSION_INIT=1` isn't set. `start-all.sh` defaults to
`PROXY_FULL_STACK=1` which enables it; if you overrode `.env` or ran
`PROXY_FULL_STACK=0`, restart: `PROXY_FULL_STACK=1 ./start-proxy.sh`.
**Q: The picker is empty (or only shows entries owned by someone else)?**
You're likely driving CC with the admin key. Admin **cannot own business
assets** (current limitation), so its team list is empty. Fix: follow
Step 1.5 to create a business user, then use that user's
`default_user_key` as `ANTHROPIC_AUTH_TOKEN`. The business user must also
have created at least one Team/Agent in the panel.
**Q: Panel shows "Panel API 8125 not started"?**
`docker ps` and check `tdai-memory-hub` is healthy. If not, look at
`docker logs tdai-memory-hub` — most commonly a mis-set
`REMOTE_INSTANCE_URL` or `LLM_BASE_URL`.
**Q: L1/L2 never runs, `records/` stays empty?**
Default `promptMode=chat` extracts memory from ordinary conversation. If
you set `code` but the dialogue is small talk, the LLM decides there is
nothing worth persisting and returns 0. Switch back to `chat` or have a
**real work-style conversation** with the agent (edit files, run tests,
give conclusions).
**Q: How do I switch to another team/agent mid-work?**
Start a fresh `claude` session (new window / new session ID) — the picker
runs again.
---
## Memory Hub only
When Memory Core is already running on port `8420`, one command pulls the
Memory Hub image so you get the team memory panel:
```bash
docker pull docker.io/agentmemory/memory-hub:latest
```
Boot Panel + Knowledge Service:
```bash
docker run -d --name tdai-memory-hub \
--add-host=host.docker.internal:host-gateway \
-p 8125:8125 -p 8424:8424 \
-v tdai-panel-data:/data/knowledge \
-e REMOTE_INSTANCE_URL=http://host.docker.internal:8420 \
-e REMOTE_INSTANCE_KEY=local \
-e KNOWLEDGE_PUBLIC_BASE_URL=http://host.docker.internal:8424/v3 \
-e LLM_MODE=custom \
-e LLM_BASE_URL=<OPENAI_COMPATIBLE_BASE_URL> \
-e LLM_API_KEY=<YOUR_API_KEY> \
-e LLM_MODEL=<MODEL_ID> \
docker.io/agentmemory/memory-hub:latest
```
Open [http://localhost:8125](http://localhost:8125).
## Using Proxy with Claude Code
`start-all.sh` has already stored the admin user_key at
`deploy/global-images/.admin-key`. Point Claude Code straight at the proxy:
```bash
export ANTHROPIC_BASE_URL=http://127.0.0.1:8096/claude-code/default
export ANTHROPIC_AUTH_TOKEN="$(cat ./.admin-key)"
claude --model <whatever PROXY_UPSTREAM_MODEL is set to>
```
The proxy pipeline in order: `auth` (validates user_key) → `sessionInit`
(interactive team/agent/task picker) → `injection` (L2/L3 memory + skill +
knowledge blended into the system prompt) → forward to the upstream LLM.
Disable the full pipeline (passthrough only): `PROXY_FULL_STACK=0 ./start-proxy.sh`.
## Stop / cleanup
```bash
./stop-all.sh # stop containers, keep volumes & admin key
./stop-all.sh --purge # nuke volumes, admin key, and generated proxy config
```
## More
Additional installation modes (OpenClaw, Hermes, SDK, running from source,
K8s, platform notes) — see
[`deploy/global-images/README.md`](./deploy/global-images/README.md) and
[`MemoryCore/README.md`](./MemoryCore/README.md).