OpenCortex 是面向 AI Agent 的记忆存储与召回运行时。它把 memory、 resource、session 写入分层文件树和 Qdrant 向量索引,再通过 HTTP API、 Streamable HTTP MCP 和 Web 控制台提供访问。
当前仓库只保留新的 opencortex 运行时。旧记忆链路不再是活跃代码;insights、
autophagy、skill engine、自我升级等能力目前以详细设计文档形式放在
docs/design/。
OpenCortex 当前提供:
- 用户事实、偏好、事件、工作流等 durable memory 写入。
- 文档和共享知识材料的 resource 写入。
- 对话 turn 和 session/end 的 session 写入。
- L0/L1/L2 三层存储:
L0:紧凑 abstractL1:overviewL2:完整 content
- 面向召回的旁路索引:
- primary object record
- anchor index
- fact index
- entity index
- reason-tree index
- 为 cone expansion 准备的关系信号
- probe、planner、executor、ranker、reason-tree selection 和 cone expansion 组成的召回链路。
- 按语义 query 或 URI 删除记忆。
- JWT 保护的 API、admin token 管理和 MCP 访问。
- React Web 控制台,用于 token 管理和记忆查看。
Client / Agent / MCP client
-> Bearer JWT middleware
-> FastAPI routes
-> Store flows
-> PrimaryRecordWriter
-> CFS-backed CortexStorage
-> QdrantVectorStore
-> SQLite-backed persistent event queue
-> semantic layer 和旁路索引后台 writer
-> Retrieval flow
-> probe
-> planner
-> executor
-> ranker
-> CFS hydration
-> React console
核心边界:
storage/:CFS、URI-tree 文件操作、CortexStorage、持久队列。vector/:Qdrant payload、向量存储、召回链路。store/:写入流程、session 流程、事件和 writer。console/:Web 控制台管理 API,不侵入 MCP 或公开 memory API。mcp/:通过 Streamable HTTP MCP 暴露同一套 memory 能力。
src/opencortex/
app.py FastAPI app factory 和运行时装配
settings.py OPENCORTEX_APP_* 配置
auth/ JWT 生成、验证、admin token API
console/ Web 控制台专用管理 API
core/ 请求身份上下文和 middleware
llm/ OpenAI-compatible LLM client
mcp/ Streamable HTTP MCP transport 和 tools
parse/ 文档 parser adapter
prompts/ 写入和召回 prompt
storage/ CFS、CortexStorage、持久队列、URI namespace
store/ 写入、session、event flow 和 writer
vector/ Qdrant store、payload schema、retrieval pipeline
web/ React/Vite 控制台
tests/opencortex/ 当前新运行时测试
docs/design/ 详细功能设计和后续排期
- Python
>=3.10 uv- Node.js
>=18,用于 Web 控制台 - Qdrant 可用 embedded local 模式;生产级或大数据量建议使用独立 Qdrant
Server,并通过
OPENCORTEX_APP_QDRANT_URL接入。
uv sync如需文档解析依赖:
uv sync --extra parsersWeb 控制台依赖:
cd web
npm install配置使用 OPENCORTEX_APP_ 环境变量前缀,也可以放入 .env。
常用配置:
export OPENCORTEX_APP_DATA_ROOT=./data
export OPENCORTEX_APP_VECTOR_DIMENSION=1024
# 留空则使用 embedded local Qdrant。
export OPENCORTEX_APP_QDRANT_URL=
export OPENCORTEX_APP_QDRANT_API_KEY=
export OPENCORTEX_APP_EMBEDDING_API_BASE=https://api.openai.com/v1
export OPENCORTEX_APP_EMBEDDING_API_KEY=<embedding-key>
export OPENCORTEX_APP_EMBEDDING_MODEL=text-embedding-3-small
export OPENCORTEX_APP_LLM_API_BASE=https://api.openai.com/v1
export OPENCORTEX_APP_LLM_API_KEY=<llm-key>
export OPENCORTEX_APP_LLM_MODEL=gpt-4o-mini
export OPENCORTEX_APP_LLM_API_STYLE=openai
export OPENCORTEX_APP_STORE_EVENT_WORKER_CONCURRENCY=4运行时会创建:
data/auth_secret.key:JWT 签名密钥data/tokens.json:已签发 token 记录data/qdrant/:embedded Qdrant 数据- CFS 内容树
- 持久事件队列
不要提交 data*/、日志、token 或本地密钥。
uv run opencortex-server --host 127.0.0.1 --port 8921等价入口:
uv run opencortex --host 127.0.0.1 --port 8921开发 reload:
uv run opencortex-server --host 127.0.0.1 --port 8921 --reload所有 /api/*、/admin/*、/console/* 和 /mcp 都需要:
Authorization: Bearer <jwt>Token 表示租户和用户身份。project 是业务属性,不属于 API key 创建参数。
生成用户 token:
uv run opencortex-token generate查看 token:
uv run opencortex-token list按 prefix 撤销:
uv run opencortex-token revoke <token-prefix>Admin token 管理走 /admin/v1/tokens。正常部署可以不设置
OPENCORTEX_APP_ADMIN_API_TOKEN;如果当前没有任何 admin 记录,OpenCortex 会在
启动时自动创建一个一次性的 _system/_admin token,并打印到 server logs。也可以
通过配置注入预生成的 admin token:
export OPENCORTEX_APP_ADMIN_API_TOKEN=<signed-admin-jwt>该 token 必须由当前 data/auth_secret.key 签名。
POST /api/v1/memory/store
Memory 示例:
curl -sS http://127.0.0.1:8921/api/v1/memory/store \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "memory",
"content": "Alice prefers concise technical summaries.",
"category": "semantic",
"metadata": {"entities": ["Alice"]},
"source": {"kind": "manual"}
}'Resource 示例:
curl -sS http://127.0.0.1:8921/api/v1/memory/store \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "resource",
"content": "# Qdrant Notes\n\nUse server Qdrant for production-like runs.",
"category": "semantic",
"metadata": {"title": "Qdrant Notes", "source_path": "/docs/qdrant.md"},
"source": {"kind": "document", "path": "/docs/qdrant.md", "title": "Qdrant Notes"}
}'同步请求只写 primary record。LLM 语义派生、L0/L1/L2 CFS 写入和旁路索引由后台 worker 处理。
POST /api/v1/memory/search
curl -sS http://127.0.0.1:8921/api/v1/memory/search \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "What does Alice prefer?", "limit": 5}'公开召回请求只接受:
querylimit
筛选和管理行为属于 console API,不放进公开 memory recall contract。
POST /api/v1/memory/forget
语义删除:
curl -sS http://127.0.0.1:8921/api/v1/memory/forget \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "Alice concise summaries"}'按 URI 删除:
curl -sS http://127.0.0.1:8921/api/v1/memory/forget \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uri": "opencortex://tenant/user/memories/public/semantic/example"}'POST /api/v1/session/message
curl -sS http://127.0.0.1:8921/api/v1/session/message \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"session_id": "session-001",
"turn_id": "turn-001",
"messages": [
{"role": "user", "content": "Remember that Alice prefers concise summaries."}
],
"tool_calls": [],
"cited_uris": []
}'Session message 会写 immediate record,并在满足条件时触发 merge。merge 完成后会清理 旧 immediate records。
POST /api/v1/session/end
curl -sS http://127.0.0.1:8921/api/v1/session/end \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"session_id": "session-001"}'Session end 会写 final session memory;如果内容是结构化的,还会生成 final tree 和 reason-tree side index。
GET /api/v1/auth/me
curl -sS http://127.0.0.1:8921/api/v1/auth/me \
-H "Authorization: Bearer $OPENCORTEX_TOKEN"Admin API 与 user memory API、MCP 分离。
GET /admin/v1/tokens
列表只返回公开字段,不返回完整 token。
POST /admin/v1/tokens
curl -sS http://127.0.0.1:8921/admin/v1/tokens \
-H "Authorization: Bearer $OPENCORTEX_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tenant_id": "tenant-a", "user_id": "alice"}'完整 token 只在创建时返回一次。
DELETE /admin/v1/tokens
curl -sS -X DELETE http://127.0.0.1:8921/admin/v1/tokens \
-H "Authorization: Bearer $OPENCORTEX_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"token_prefix": "abcd1234"}'Web 控制台使用 /console/v1/*。这些是管理面 API,不改变公开 memory API 或 MCP
contract。
当前 console routes:
GET /console/v1/statsGET /console/v1/memoriesPOST /console/v1/memories/searchGET /console/v1/memories/content?uri=...DELETE /console/v1/memories
Admin 可传 tenant/user 筛选;普通用户只能看到自身身份范围。
先启动后端,再启动前端:
cd web
npm install
npm run dev打开:
http://127.0.0.1:5173
Vite dev server 会代理:
/api/admin/console
当前控制台包含:
- token 校验登录
- dashboard stats
- memory search/list/detail/delete
- admin token management
OpenCortex 通过 Streamable HTTP 暴露远程 MCP server。MCP client 配置示例:
{
"mcpServers": {
"opencortex": {
"type": "http",
"url": "http://<host>:8921/mcp",
"headers": {
"Authorization": "Bearer <jwt>"
}
}
}
}认证使用和 HTTP API / Web console 相同的 Bearer token。不要把 OpenCortex
配置成 SSE server。很多 MCP client 在配置中把 Streamable HTTP 写作
type: "http";OpenCortex endpoint 实现的是 2025-06-18 Streamable HTTP
transport。
当前 MCP tools:
opencortex.searchopencortex.store_memoryopencortex.store_resourceopencortex.forgetopencortex.session_messageopencortex.session_end
不用 MCP client 时,可以用下面的命令快速验证 transport:
curl -sS http://127.0.0.1:8921/mcp \
-H "Authorization: Bearer $OPENCORTEX_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'GET /mcp 和 DELETE /mcp 当前返回 405。当前实现是无状态 Streamable HTTP
JSON-RPC,不是旧 HTTP+SSE transport。
OpenCortex 写入两个持久面:
CFS 保存 URI tree 和文件层:
opencortex://<tenant>/<user>/<bucket>/<project>/<category>/<node>/
content.md
.abstract.md
.overview.md
.abstract.json
CortexStorage 是 CFS 之上的 URI storage facade。
Qdrant 保存可向量检索的 payload。主要 retrieval surfaces:
l0_object:primary memory/resource/session objectdirectory:payload-only URI ancestor recordanchor_index:定位相关记忆的 anchor handlefact_index:从内容提取的 fact pointentity_index:entity projectionreason_tree_index:reason-tree node 和 summary
vector/ 拥有 payload schema 和召回逻辑。storage/ 不直接拥有 Qdrant 写入。
RetrievalRequest
-> Probe
-> Planner
-> Executor
-> Ranker
-> Reason-tree selection
-> Cone expansion
-> CFS hydration
-> RetrievalResponse
公开 API 保持输入简单,只接受 query 和 limit。内部 plan 决定 surface、budget、
weight、depth、是否使用 reason tree,以及是否做 cone expansion。
Primary write 会把事件写入持久队列。Worker action 负责:
- LLM semantic derivation
- CFS layer 写入
- search index 写入
- entity index 写入
- reason-tree build 和 index 写入
- session merge 和 cleanup
- 为后续 mutation 预留的 check-update event
队列持久化在 data root 下,中断后可恢复。
Python:
uv run --group dev ruff format --check src/opencortex tests/opencortex
uv run --group dev ruff check src/opencortex tests/opencortex
uv run --group dev pytest tests/opencortex -qWeb:
cd web
npm run build详细设计和后续排期:
docs/design/opencortex-functional-parity.mddocs/design/opencortex-recall-design.mddocs/design/insights-functional-detail.mddocs/design/autophagy-functional-detail.mddocs/design/skill-engine-functional-detail.mddocs/design/self-upgrade-functional-detail.md
Apache-2.0