Files
wehub-resource-sync 6c9c7fe7f3
CI / integration tests (3.13) (push) Failing after 1s
Commit lint / pull request title (push) Has been skipped
Docs / links (push) Failing after 1s
CI / unit tests (3.13) (push) Failing after 1s
CI / lint (push) Failing after 1s
CI / integration tests (push) Failing after 1s
CI / package build (push) Failing after 1s
Commit lint / commit messages (push) Failing after 1s
CI / unit tests (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:24:24 +08:00

293 lines
9.3 KiB
Markdown

# Quickstart
> Five minutes from zero to "I added a conversation, queried it back, and
> can read it as plain Markdown."
EverOS runs as a **service** — start the server, then call the HTTP API.
There is no in-process library mode; an `everos` server is always in
front of your agent.
## Prerequisites
- **Python 3.12+**
- **API keys** for three capabilities: a chat LLM (memory extraction),
an embedding model (vector retrieval), and a reranker. Any
OpenAI-compatible endpoint works.
## 1. Install
**From PyPI** (users):
```bash
pip install everos
# or: uv pip install everos
```
**From source** (contributors / developers):
```bash
git clone https://github.com/EverMind-AI/EverOS.git
cd EverOS
uv sync # install all deps into .venv
```
> **Note:** source install creates a `.venv` virtualenv. Subsequent
> `everos` commands need either `uv run everos ...` or activate the venv
> first (`source .venv/bin/activate`).
## 2. Configure
```bash
everos init # default root: ~/.everos
everos init --root /data/everos # or specify a custom root
```
> **Root directory** — defaults to `~/.everos`. Use `--root <path>` to
> relocate; all subsequent commands (`server start`, `cascade status`,
> etc.) must use the matching `--root`. Any setting in `everos.toml` can
> also be overridden via `EVEROS_*` environment variables for containers
> and CI.
This creates `everos.toml` and `ome.toml` under the root directory.
Open `everos.toml` and fill in three sections — here's the minimum
viable config:
```toml
[llm]
model = "gpt-4.1-mini" # or your preferred model
base_url = "https://openrouter.ai/api/v1" # any OpenAI-compatible endpoint
api_key = "sk-..." # your API key
[embedding]
model = "Qwen/Qwen3-Embedding-4B"
base_url = "https://api.deepinfra.com/v1/openai"
api_key = "..."
[rerank]
provider = "deepinfra"
model = "Qwen/Qwen3-Reranker-4B"
base_url = "https://api.deepinfra.com/v1/inference"
api_key = "..."
```
The generated file pre-fills recommended `model` and `base_url`
defaults — just drop in your API keys. Any OpenAI-compatible endpoint
works.
> **Multimodal** (`[multimodal]`) is optional — only needed when
> ingesting image / pdf / audio content items. See
> [docs/multimodal.md](docs/multimodal.md) for setup.
## 3. Start the server
Check your file descriptor limit — EverOS opens many LanceDB segment
files under concurrent search + indexing. Platform defaults:
**macOS 256** · **Linux 1024** · **Windows 8192**. If yours is below
4096, raise it before starting:
Run these in the **same terminal** where you will start the server —
`ulimit` is per-shell-session, not global:
```bash
ulimit -n # check current limit
ulimit -n 4096 # raise if needed
everos server start [--root <path>] # must be in the same session
```
> **No side effects** — `ulimit -n` only raises the per-process ceiling.
> It does not pre-allocate memory or file handles, and has zero
> performance cost. For Linux production, set `LimitNOFILE=65536` in
> your systemd unit file.
You should see:
```
starting everos on 127.0.0.1:8000
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
The server runs in the foreground. **Open a second terminal** for the
steps below.
Verify it's up:
```bash
curl http://127.0.0.1:8000/health
# {"status":"ok"}
```
## 4. Add a conversation
Send messages to the server — one at a time or in batches. Each batch
belongs to a `session_id`, which represents one conversation thread.
Timestamps are Unix epoch in **milliseconds** (UTC).
First, a chat about climbing:
```bash
TS=$(($(date +%s)*1000))
curl -X POST http://127.0.0.1:8000/api/v1/memory/add \
-H 'Content-Type: application/json' \
-d "{
\"session_id\": \"demo-001\",
\"messages\": [
{\"sender_id\": \"alice\", \"role\": \"user\", \"timestamp\": $TS, \"content\": \"I just got back from a week in Yosemite. The climbing was incredible.\"},
{\"sender_id\": \"agent1\", \"role\": \"assistant\", \"timestamp\": $((TS+10000)), \"content\": \"That sounds amazing! Which routes did you do?\"},
{\"sender_id\": \"alice\", \"role\": \"user\", \"timestamp\": $((TS+20000)), \"content\": \"Mostly cracks on El Cap. I go every spring — it's my favorite season there.\"}
]
}"
# → status: "accumulated"
```
Now the topic shifts to work:
```bash
curl -X POST http://127.0.0.1:8000/api/v1/memory/add \
-H 'Content-Type: application/json' \
-d "{
\"session_id\": \"demo-001\",
\"messages\": [
{\"sender_id\": \"alice\", \"role\": \"user\", \"timestamp\": $((TS+60000)), \"content\": \"By the way, I switched to biking to work last month. Loving it so far.\"},
{\"sender_id\": \"agent1\", \"role\": \"assistant\", \"timestamp\": $((TS+70000)), \"content\": \"How long is your commute?\"},
{\"sender_id\": \"alice\", \"role\": \"user\", \"timestamp\": $((TS+80000)), \"content\": \"About 25 minutes. I stop at Blue Bottle in SOMA for coffee most mornings.\"}
]
}"
```
Response:
```json
{
"data": {
"message_count": 3,
"status": "extracted"
}
}
```
EverOS detected a topic shift (climbing → commute) and automatically
extracted the earlier conversation into memory.
The `status` field tells you what happened:
| Status | Meaning |
|---|---|
| `accumulated` | Messages buffered, still part of the same topic. |
| `extracted` | Topic shift detected — memory extracted from the buffer. |
> For the full API contract, see [docs/openapi.json](docs/openapi.json).
## 5. Flush (manual extraction)
If you want to extract memory without waiting for a topic shift — for
example at the end of a session — call `/flush`:
```bash
curl -X POST http://127.0.0.1:8000/api/v1/memory/flush \
-H 'Content-Type: application/json' \
-d '{"session_id":"demo-001"}'
```
```json
{
"data": {
"status": "extracted"
}
}
```
This forces extraction of whatever is still in the buffer.
## 6. Search
```bash
curl -X POST http://127.0.0.1:8000/api/v1/memory/search \
-H 'Content-Type: application/json' \
-d '{
"user_id": "alice",
"query": "Where do I like to climb?",
"top_k": 5
}'
```
Response (trimmed):
```json
{
"data": {
"episodes": [
{
"id": "alice_ep_20260528_00000002",
"summary": "... Alice shared that she loves climbing in Yosemite every spring ...",
"score": 0.628,
"atomic_facts": [
{
"content": "Alice said she loves climbing in Yosemite every spring.",
"score": 0.628
}
]
}
]
}
}
```
Hybrid retrieval (BM25 + vector + scalar) returns the matching episode
with its atomic facts nested under it.
## 7. Your memory is just Markdown
This is what makes EverOS different — memory persists as plain Markdown:
```
<root>/ ← ~/.everos or your --root path
├── default_app/ ← app_id ("default" → "default_app")
│ └── default_project/ ← project_id ("default" → "default_project")
│ ├── users/<user_id>/
│ │ ├── user.md ← profile
│ │ ├── episodes/ ← daily-log episodes
│ │ ├── .atomic_facts/ ← nested facts (dot-hidden)
│ │ └── .foresights/ ← predictive memory (dot-hidden)
│ ├── agents/<agent_id>/
│ │ ├── agent.md
│ │ ├── .cases/ ← task cases
│ │ └── skills/ ← procedural memories
│ └── knowledge/ ← shared knowledge base
├── everos.toml ← provider config
├── ome.toml ← strategy config (hot-reloaded)
├── .index/ ← derived indexes (rebuildable from md)
│ ├── sqlite/system.db
│ └── lancedb/
└── .tmp/
```
Every memory entry is a plain Markdown file you can directly read and
edit — no database driver needed.
## Stopping the server
`Ctrl+C` in the server terminal.
## Next steps
- **Integrate into your agent** — wrap `/add`, `/flush`, `/search` in a
thin HTTP client and call them from your agent loop.
- **App + project scope** — pass `app_id` / `project_id` in your API
requests to partition memory spaces inside one server (defaults to
`"default"` when omitted).
- **Knowledge base** — upload documents via
`/api/v1/knowledge/documents` and search with hybrid retrieval. See
[docs/knowledge.md](docs/knowledge.md).
- **Reflection** — offline memory consolidation; enable in `ome.toml`.
See [docs/reflection.md](docs/reflection.md).
- **Multimodal** — ingest image / pdf / audio / office documents. See
[docs/multimodal.md](docs/multimodal.md).
- **Search modes** — four methods (`HYBRID` / `KEYWORD` / `VECTOR` /
`AGENTIC`) with a filter DSL. See [docs/openapi.json](docs/openapi.json)
for the full API schema.
- **Architecture** — [docs/architecture.md](docs/architecture.md) for
DDD layering; [docs/storage_layout.md](docs/storage_layout.md) for
on-disk layout.
- **Found a bug?** — [open an issue](CONTRIBUTING.md).