关于 haki
Haki 是面向 AI Agent 的持久记忆层,可将交互整理为带日期和来源的事实。它追踪已被取代的信息,并说明哪些记忆进入上下文包。
主要功能
- 01持久化事实台账
- 02有效日期与取代状态
- 03矛盾检测
- 04带来源的上下文追踪
- 05Python 和 TypeScript SDK
- 06CLI 与 Cursor MCP 工具
适用场景
- 01跨 Agent 会话保留偏好
- 02避免使用过时事实
- 03追踪上下文的选取原因
MCP 相关
Haki 提供 Cursor MCP 服务,包含检索、记录、检查和遗忘项目记忆的工具。Cursor Agent 决定调用时才会使用这些工具;服务不会拦截所有对话。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://api.gethaki.space/mcp/claude mcp add --transport http gethaki-haki https://api.gethaki.space/mcp/{"mcpServers":{"gethaki-haki":{"type":"http","url":"https://api.gethaki.space/mcp/"}}}在 Cursor 中打开{"servers":{"gethaki-haki":{"type":"http","url":"https://api.gethaki.space/mcp/"}}}在 VS Code 中打开{"mcpServers":{"gethaki-haki":{"type":"http","url":"https://api.gethaki.space/mcp/"}}}{"mcpServers":{"gethaki-haki":{"serverUrl":"https://api.gethaki.space/mcp/"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
Haki
为 AI Agent 提供可靠记忆
有凭有据的上下文:每条事实都附有日期、来源和状态。
Haki 让任何 AI Agent 都能拥有持久数月的记忆—— 能分辨当前信息与过时信息,并能为每条回忆提供依据。
Haki 的作用
如今,AI Agent 除了单次对话之外什么都记不住:每次新会话都会从头开始,重新解释上下文,还可能套用数月前就已过时的偏好,却无从察觉。
Haki 是一个开源(Apache-2.0)的持久记忆层,不依赖你使用的模型或框架:它会从 Agent 的交流中提取结构化事实,随着时间推移保持信息更新,并为每个新请求提供相关、注明日期和来源的上下文包。它完全由你掌控——只需运行一次 docker compose up 即可安装,且不会更改你现有的 Agent、模型和基础设施。
问题
在生产环境中构建 AI Agent 的团队总会遇到相同的局限:
| 现象 | 后果 |
|---|---|
| 用户必须重复提供过的信息 | 体验变差,用户流失 |
| Agent 套用早已被覆盖的偏好 | 答案错误,信任受损 |
| 每次调用都将完整历史重新传入提示词 | 成本和延迟高,有用的上下文被稀释 |
| 无法解释为何使用某条信息 | 无法追溯,难以调试 |
| 一位客户的数据可能泄漏到另一位客户的上下文中 | 安全事件 |
现有方案(通用向量存储、对话摘要)在演示中表现良好,但在数周的真实使用后就会退化:将过时信息当作当前信息提供、矛盾未被发现、完全无法解释。
方案
事实台账,而非对话历史。 Haki 不会归档原始消息以供日后重放,而是从中提取结构化事实——偏好、约束、决策——并将每条事实关联回支撑它的来源事件。
双时态与替代关系。 每条事实都带有明确的有效日期和状态。信息发生变化时,旧事实会被标记为已替代——绝不会悄然删除,也绝不会再作为当前信息提供。出现尚未解决的矛盾时,两个版本都会被暂缓提供并标记出来,而不是随机提供其一。
系统化追溯。 每个注入的上下文包都附带其来源、有效日期和追踪记录,说明保留、排除或阻止了哪些记忆,以及原因。“Agent 为什么使用这条信息?”——不到一分钟就能给出可验证的答案。
快速入门
前置条件:Docker 和 uv。
.env.example中的默认值足以开始使用——无需密钥。如需自定义配置(真实的大模型密钥等),请将该文件复制为.env。
# Infrastructure (PostgreSQL 16 + pgvector, Redis 7)
docker compose up -d
# Dependencies (uv installs Python 3.12 if needed)
uv sync
# Database
uv run alembic upgrade head
# API
uv run uvicorn app.main:app --port 8100
如果遇到问题,运行
bash scripts/doctor.sh,即可通过一条命令诊断 Docker、容器、Postgres、.env、迁移和 API——只读、无副作用,可按需反复运行。
在另一个终端中,验证一切是否正常:
uv run haki connect --api-url http://localhost:8100
uv run haki verify
haki verify 会在几秒钟内运行一个完整场景:记录一条偏好,然后在同一段对话中更改想法,接着在新一段对话中查询记忆。它必须返回当前值,将旧值保留并标记为 superseded,而不是将其删除,并将整个过程关联到一条追踪记录。

haki verify — subject usr_verify_91d952a5e06f
✔ capture "Je préfère recevoir mes factures en français." thr_35bb7ecf
✔ consolidate 1 fact(s) extracted 0.2s
✔ capture "En fait, envoie-les moi en anglais plutôt, pa..." thr_35bb7ecf (same thread)
✔ consolidate 1 supersession 0.1s
✔ context NEW thread thr_3a21ef34 0.0s
recalled invoice_language = {"language": "en"} valid since 2026-08-11
hidden invoice_language = {"language": "fr"} superseded
trace 7c99a8de-4905-43b4-94df-21fb66492b3b
OK — your agent remembered across conversations, and it can prove it. 0.5s
如果仍然返回过时的值,或者找不到标记为 superseded 的旧值,该命令就会以状态码 1 退出:如果两条事实之间没有关联,仅仅碰巧返回了正确的值,就不算真正更新了记忆。
默认支持多语言:本地嵌入模型支持多种语言(法语、英语、西班牙语及另外约 50 种语言)——上方的演示场景特意用法语记录,即使使用不同语言查询,也仍然可以找到这条记忆。已通过端到端验证(
scripts/check_multilingual.py)。
使用 Haki 的四种方式
1. 编码 Agent——SDK 和 CLI
面向 Python 或 TypeScript 开发者。在现有的大模型调用外添加几行代码即可。
from haki import HakiClient
from haki.runtime import build_prompt_context, capture_turn
client = HakiClient("http://localhost:8100")
# Before the LLM call: memory becomes an instruction block
packet = client.context(subject_id="usr_42", query=user_msg, project_id="prj")
prompt = build_prompt_context(packet) + "\n" + system_prompt
answer = my_llm(prompt, user_msg) # your LLM and app code don't change
# After the LLM call: the conversation turn goes back into memory
capture_turn(client, "usr_42", "prj", user_msg, answer)
SDK 详情(方法、异步、错误)
capture(events, idempotency_key)— 幂等写入:网络重试不会造成重复;context(subject_id, query, project_id, budget_tokens=2000)— 返回带有trace_id的 ContextPacket;inspect(trace_id)— 查看这些记忆被选中的原因;timeline(subject_id, project_id)、consolidate_subject(...)、facts(...)、consolidate()、forget(...)、health();- 异步版本:
AsyncHakiClient; - 类型化错误:
HakiApiError(error_type、field、status_code)、HakiConnectionError。
CLI:haki login(设备码登录,见下文)、haki connect(配置并使用现有密钥进行测试)、haki verify(计时记忆测试)、haki status(API 健康状态)、haki mcp(Cursor 打包)。
haki login — 对于 Cloud 账户,hk_ 密钥只会在配置时显示一次:终端无法再次获取它。设备码流程(RFC 8628)无需新增密钥即可解决这一问题。CLI 会显示一个 XXXX-XXXX 验证码,并打开已填入该验证码的 <HAKI_CONSOLE_BASE_URL>/cli-auth(verification_uri_complete);验证码也会保留在屏幕上,因此可以用手机手动输入。你在已登录的控制台中批准后,终端就会收到一个新生成的专用密钥,而不是控制台自己的密钥——在 Keys 中撤销该终端的密钥不会断开其他连接。密钥只会在领取该密钥的轮询请求中发送一次。
在服务端,必须配置 HAKI_CONSOLE_SERVICE_KEY(它用于验证控制台对 /v1/cli/device/approve 的请求)。错误验证码会按用户限流,而不是按 IP 限流:所有批准请求都来自同一个地址(控制台自己的后端),因此按 IP 计数会导致所有人共用同一个限流计数,任何一个用户都可能耗尽其他所有人的额度。
TypeScript SDK(与 Python SDK 功能一致)
相同的方法、相同的类型化错误、相同的 <haki_memory> 块——无运行时依赖(使用原生 fetch,Node 18+)。
cd sdk/typescript && npm install && npm run build && npm test
import { HakiClient, buildPromptContext, captureTurn } from "gethaki";
const client = new HakiClient({ baseUrl: "http://localhost:8100", apiKey: "hk_..." });
const { packet } = await client.context({ subjectId: "usr_42", query: userMsg, projectId: "prj" });
const prompt = buildPromptContext(packet) + "\n" + systemPrompt;
const answer = await myLlm(prompt, userMsg);
await captureTurn(client, { subjectId: "usr_42", projectId: "prj", userMsg, assistantMsg: answer });
CLI haki-ts(node dist/cli.js …):connect、verify、status——与 Python CLI 使用同一个 ~/.haki/config.json 文件,两者可以互换使用。可运行示例:sdk/typescript/examples/basic-agent.mjs。
2. Cursor — MCP 服务
面向 Cursor 用户。一键安装,无需手动复制密钥。
uv run haki mcp # prints the deeplink, the mcp.json, and the Project Rule
- “Add Haki to Cursor” 深度链接会安装 MCP 服务;
- 项目规则(
.cursor/rules/haki.mdc)会告诉 Agent 何时记住、何时回忆; - Cursor 随后会在不同会话间保留决策、约定和已解决的 Bug。
Cursor 中会显示四个工具:
| 工具 | 作用 |
|---|---|
haki_context | 编码前回忆项目的相关上下文 |
haki_capture | 保存决策、约定或已解决的 Bug |
haki_inspect | 查看使用某条记忆的原因 |
haki_forget | 忘记一条信息 |
已知且有文档记录的限制:MCP 无法拦截 Cursor 中的每次对话—— 服务只能看到 Cursor 决定触发的工具调用。项目规则会告诉 Agent 何时 调用这些工具;实际覆盖率会进行衡量,绝不会宣称达到 100%。
3. n8n — 模板和节点
面向无代码构建者。导入一个模板,配置三项内容即可。
链路:Webhook → Haki Context → AI Agent → Haki Capture → Respond
integrations/n8n/ 中有两个选项:
- 原生模板
haki-persistent-support-agent.json— 可导入任何 n8n 实例,无需额外安装(使用标准 HTTP 节点); - 节点包
n8n-nodes-haki— 提供可视化的Haki Context和Haki Capture节点,并内置验证功能。
只需设置三项:Haki 凭据、LLM 凭据,以及对方的身份标识(subject)。没有身份标识的调用会被拒绝——没有稳定身份标识的记忆不可靠。
已在真实的 n8n 实例(Docker)中验证:第一条消息中提到的偏好会在第二条消息中被回忆,并附有来源信息。
4. 兼容 OpenAI 的网关
面向已使用 OpenAI API 的应用。只需更改 base_url,记忆便会自动生效。
import openai
client = openai.OpenAI(
base_url="http://localhost:8100/gateway/v1",
api_key="hk_...", # Haki key
default_headers={"X-Haki-Subject-Id": "usr_42"}, # who to remember
)
client.chat.completions.create(model="...", messages=[...])
每次调用 POST /gateway/v1/chat/completions 时:会将主体的记忆注入系统消息顶部(以 <haki_memory>…</haki_memory> 块的形式),再将调用转发给已配置的提供方(HAKI_LLM_*——Haki 密钥本身绝不会发送到上游),随后记录这次交互(conversation.turn,具备幂等性),并在后台继续进行整合。返回的响应与提供方原始响应完全相同,另外附带三个标头:X-Haki-Memory、X-Haki-Trace-Id、X-Haki-Context-Ms。
- 身份信息通过标头传递,绝不放在请求正文中(模型绝不会决定要记住什么):
X-Haki-Subject-Id(记忆所必需)、X-Haki-Thread-Id、X-Haki-Run-Id、X-Haki-Purpose、X-Haki-Idempotency-Key(默认值为正文的哈希值——重试不会产生重复内容)。 - 可控降级:没有身份标识时,请求会原样通过(
X-Haki-Memory: disabled);如果无法构建上下文,请求仍会发出,并标记为degraded。Haki 绝不会阻止 Agent。 - 流式响应:
stream: true会直接透传(X-Haki-Memory: disabled,不注入,也不捕获)——这是经过考虑的选择:无法捕获最终响应时进行注入会破坏记忆循环,而缓冲整个流则会违背使用流式响应的初衷。 - 有文档记录的限制(见私有仓库中的
research/Haki_Memory_Runtime.md):网关会观察对模型的调用,但看不到 Agent 在两次调用之间于本地运行的工具——这些调用通过 SDK 或直接调用 API 捕获。
SDK 中也有 httpx 变体:haki.gateway.gateway_client(base_url, api_key, subject_id, ...)(以及 async_gateway_client)。记忆带来的开销主要来自 build_context(本地约 15 ms,/v1/context 的 p95 低于 250 ms)——可复现的基准测试:
uv run python scripts/benchmark_gateway.py --api-key hk_...
托管云
不想运行自己的基础设施? gethaki.space 提供相同的 API,此外还有一个 Web 控制台,可用于浏览记忆、检查 追踪记录并手动解决冲突。完全支持免费自托管——本仓库中的 API 与 Cloud 运行的 API 相同。
工作原理
flowchart LR
A[Incoming message] --> B[CAPTURE<br/>raw evidence,<br/>append-only]
B --> C[CONSOLIDATION<br/>extraction, dedup,<br/>supersession, conflicts]
C --> D[(MEMORY<br/>active facts,<br/>dated, sourced)]
D --> E[CONTEXT<br/>relevant packet,<br/>under budget,<br/>249ms p95]
E --> F[Agent and LLM]
F --> B
E -.-> G[INSPECT<br/>decision trace]
D -.-> H[FORGET<br/>propagated erasure,<br/>with a receipt]
- 捕获 — 应用发送一个事件(一条消息、一个操作、一项 工具结果)。Haki 会将其记录为不可变证据,并在几毫秒内回复。网络重试 不会产生重复项(幂等性)。
- 整合 — Haki 在后台读取事件,并判断哪些内容应成为持久事实。它会去重、检测变化(旧 事实会变为已取代)以及矛盾(状态为冲突,在解决前暂不提供)。事实由 **(主体、谓词、限定条件)**标识:“工作日的起床时间”和“周末 的起床时间”是两个不同且共存的事实,并不矛盾—— 无论措辞多么接近,不同的限定条件都不会被混为一谈。
- 上下文 — Agent 在每次回复前都会请求相关记忆。
Haki 只返回有效、当前有效且在范围内的事实,按相关性排序,
并严格控制 Token 预算——在 10,000 条事实上的测量结果为 p95 249 毫秒
(参见
scripts/benchmark_context.py)。 - 检查 — 随时都可以通过追踪记录了解某条信息为何被保留、排除或拦截。
- 遗忘 — 更正或擦除操作会传播到所有由其衍生的内容,并附带带时间戳的回执。
概念
| 概念 | 定义 |
|---|---|
主体(subject) | 被记忆的人或实体。必须具有稳定身份——没有身份就没有记忆。 |
| 事件 | 原始证据:“这条消息在这一天被交换。”不可变。 |
| 事实 | 在某个时间点被视为真实的信息。带日期、版本和来源。 |
| 取代 | 一个事实替代另一个事实。旧事实仍保留在历史记录中,但不再作为当前事实提供。 |
| 冲突 | 两个事实相互矛盾,且无法自动裁定:两者都会被暂时搁置并标记。 |
| ContextPacket | 在回复前注入的记忆包:相关事实及其来源,且不超出预算。 |
| 追踪记录 | 解释每项记忆决策的日志:保留、排除、拦截及其原因。 |
| 范围 | 记忆的封闭边界(组织 → 项目 → 主体)。任何内容都不会越界。 |
定位
| 常见方案 | Haki | |
|---|---|---|
| 改变主意 | 新旧事实共存,造成矛盾 | 旧事实被取代;只提供当前事实 |
| 矛盾 | 随机提供给模型 | 暂不提供并标记,可显式解决 |
| 可解释性 | 黑盒 | 每项事实都有追踪记录和来源 |
| 遗忘 | 删除一行记录 | 级联传播,并附带回执 |
| 检索延迟 | 每次请求都进行一次网络嵌入调用 | 本地嵌入:关键路径中没有网络调用 |
| 语言覆盖范围 | 通常只针对英语优化 | 原生支持多语言(约 50 种语言) |
| 部署 | 需要组装多项服务(向量存储、队列等) | 只需一条 docker compose up 命令 |
实测性能
可复现的基准测试:uv run python scripts/benchmark_context.py(每种规模
100 次请求,本地嵌入,Windows 开发机器)。
| 记忆中的事实数 | p50 | p95 | PRD 目标 |
|---|---|---|---|
| 100 | 60.5 毫秒 | 80.6 毫秒 | < 250 毫秒 |
| 1,000 | 63.7 毫秒 | 68.0 毫秒 | < 250 毫秒 |
| 10,000 | 27.8 毫秒 | 42.5 毫秒 | < 250 毫秒 |
嵌入在本地计算(CPU 上运行 ONNX,使用多语言 384 维模型)——关键路径中没有网络调用。检索结合向量 索引(hnsw)和全文索引(GIN),然后只对最佳候选项进行评分。大模型成本(信息提取)完全异步,不会拖慢 回复。
公开基准测试
Haki 发布的是可复现的基准测试工具,而不是经过筛选的数据:包含冻结且带版本号的配置(数据集和校验和、模型、提示词、预算、价格)、严格遵循相同协议重新运行的完整上下文基线(相同模型、相同提示词、相同评审器),以及这个领域鲜少公布的指标——矛盾泄漏率、弃答率、每个数据包的令牌数、延迟和成本。
- 工具:
eval/(LoCoMo 和 LongMemEval_S 加载器、流水线、评审器、报告)。 - 我们有意不将结果提交到此代码库——请自行使用指定的数据集和冻结的配置运行工具;生成的数值(写入
eval/results/,已加入 gitignore)由你自行判断是否可信或提出质疑,而不是我们挑选给你看的数字。 - 复现:具体命令见
eval/README.md。
API 一览
| 端点 | 作用 |
|---|---|
POST /v1/capture | 发送事件(幂等,立即确认) |
POST /v1/context | 获取 ContextPacket(事实、警告、trace_id) |
GET /v1/inspect/{trace_id} | 内存决策的完整追踪记录 |
GET /v1/timeline | 某个主题的事件(原始证据) |
GET /v1/facts | 某个主题的事实及所有状态(来源、日期、版本) |
GET /v1/traces | 某个项目的近期追踪记录(最近 50 条) |
GET /v1/conflicts | 等待解决的矛盾 |
POST /v1/conflicts/{id}/resolve | 解决矛盾 |
POST /v1/feedback | 为记忆评分(useful/irrelevant/incorrect) |
POST /v1/keys · GET · DELETE | 管理 API 密钥 |
POST /v1/consolidate | 触发整合(开发/运维) |
POST /v1/forget | 遗忘某条事实或某个主题,并提供回执 |
POST /gateway/v1/chat/completions | 兼容 OpenAI 的代理:自动注入记忆并捕获信息 |
GET /v1/stats/health | 内存健康指标(新鲜度、未解决的矛盾、覆盖率) |
GET /health | API 健康状态 |
/mcp | MCP 服务(Cursor 和其他 MCP 客户端) |
以下 curl 示例假设已有密钥:使用
curl -X POST http://localhost:8100/v1/keys -d '{"org_id":"org_acme","project_id":"prj_support","label":"dev"}'创建密钥(第一个密钥免费,此后每个密钥管理自己的项目),然后在每次调用中添加-H "Authorization: Bearer hk_..."。
错误类型明确且可采取行动:
{"error": {"type": "missing_scope", "message": "...", "field": "..."}}
——不会返回笼统的错误消息。
完整示例:先捕获,再获取上下文
# Capture a preference
curl -X POST http://localhost:8100/v1/capture \
-H "Content-Type: application/json" \
-d '{
"idempotency_key": "demo-1",
"events": [{
"org_id": "org_acme", "project_id": "prj_support",
"subject_type": "user", "subject_id": "usr_42",
"kind": "conversation.message",
"occurred_at": "2026-07-15T10:00:00Z",
"payload": {"role": "user", "content": "I prefer my invoices in French."},
"classification": ["customer-data"]
}]
}'
# Consolidate (extracts the durable fact)
curl -X POST http://localhost:8100/v1/consolidate
# Ask for memory before a response
curl -X POST http://localhost:8100/v1/context \
-H "Content-Type: application/json" \
-d '{
"project_id": "prj_support", "subject_id": "usr_42",
"query": "what language should the invoice be in?",
"budget_tokens": 2000
}'
响应:事实 invoice_language: {"language": "fr"}、其有效日期、来源事件 ID,以及一个 trace_id。
安全性、作用域与遗忘
- 按项目划分的 API 密钥:默认情况下,每次
/v1/*调用都需要Authorization: Bearer hk_...。密钥仅绑定到单个项目:请求其他项目会返回403 forbidden_scope,且绝不会泄露其他项目的存在。通过POST/GET/DELETE /v1/keys管理(详情见docs/SECURITY.md)。 - PostgreSQL 行级安全:隔离由数据库本身保障(对 events、facts、traces、conflicts 启用 RLS)——即使应用层过滤被遗漏,查询也无法跨越项目边界(已通过非披露测试验证)。
- 确定性策略引擎:每次读取和写入都会经过明确的规则检查(作用域存在、密钥与项目匹配、审计)——绝不交由大模型处理。
- 模型绝不选择作用域:
project_id和subject_id来自调用方后端或其配置,绝不来自 LLM。 - 反馈与纠正:
POST /v1/feedback(useful/irrelevant/incorrect——被标记为不正确的事实会变为disputed,且不再提供);POST /v1/conflicts/{id}/resolve用于解决矛盾,并保留完整历史记录。 - 密钥:LLM 密钥存放在
.env中(已被 git 忽略,并提供模板,见.env.example),绝不放在代码、终端或前端中。 - 真正的遗忘:
POST /v1/forget会将擦除操作传递至 facts、 embeddings、events 和 traces,并在forget_receipts中生成带时间戳的回执。 - 提供开放的开发模式(
HAKI_AUTH_REQUIRED=false),仅供本地使用,启动时会显示明确警告。
架构
技术栈和模块(供技术爱好者参考)
技术栈:FastAPI · SQLAlchemy 2.0 async · PostgreSQL 16 + pgvector(hnsw)· Alembic · Redis 7 · fastembed(ONNX CPU)· 官方 MCP SDK。
模块:
- Memory Ledger(
app/ledger/)——双时态、仅追加的事件 (occurred_at= 业务时间,recorded_at= 系统时间)、版本化事实,以及明确的状态转换:candidate → active → superseded/disputed/disabled → deleted(终态)。 - Memory Consolidator(
app/consolidator/)——经 Pydantic 验证的 LLM 提取 (批次绝不会导致崩溃)、基于内容的去重 (幂等重放)、替代处理和冲突集。提供商故障会将任务标记为failed,而不会触及事件;事件仍可重放。 - Context Assembler(
app/context/)——先进行严格过滤(active、作用域、 有效性),再采用混合评分:0.6 × 余弦相似度 + 0.25 × 全文 + 0.15 × 近期性,并结合交叉编码器重排序、多跳实体扩展和时间锚定处理(有关这些机制如何协同工作,请参阅私有仓库中的research/Haki_Livre_Construction_2026-08-15.md)。采用两阶段检索(索引选择,然后评分),使成本不受记忆规模影响,保持稳定。 - 可互换的提供商(
app/providers/)——分别配置提取器 (HAKI_LLM_PROVIDER=fake|openai)和嵌入器 (HAKI_EMBED_PROVIDER=local|fake,默认使用 local)。不硬编码任何厂商的 SDK。 - MCP 服务(
app/mcp_server/)——挂载在 API 内部,使用 Streamable HTTP 传输。 - Gateway(
app/gateway/)——兼容 OpenAI 的代理:注入<haki_memory>区块(由 SDK 的build_prompt_context渲染,使用唯一共享实现),通过HAKI_LLM_*转发至上游(绝不传递 Haki 密钥本身),在响应后以幂等方式捕获内容,并提供有文档说明的流式透传支持。
数据库(Alembic 迁移):events、facts(vector(384)
嵌入,search_vector tsvector + GIN)、jobs、conflict_sets、
context_traces、forget_receipts、organizations、subject_aliases、
predicate_aliases。
质量与测试
针对真实 PostgreSQL 数据库运行了 376 项 Python 测试和 14 项 Node 测试(不使用数据库模拟):uv run pytest 和 cd sdk/typescript && npm test。
测试验证行为保证,而非实现细节:
- 被取代的事实绝不会作为有效事实返回;
- 一个主体绝不会看到另一个主体的记忆;
- 网络重试绝不会创建重复项;
- 存在未解决的冲突时,相关的两条事实都会被暂缓;
- 忘记之后,任何内容都不会再次被提供;
- 非法状态转换会被拒绝;
- 网关会注入记忆、在不阻塞的前提下降级、转发上游错误,并确保每个幂等键只捕获一次。
已在真实环境中运行端到端检查:LLM 提取(OpenRouter)、MCP 服务(官方客户端)、n8n 工作流(Docker)、延迟基准测试。
当前各项保证及其对应的实现机制和验证测试,均记录在
docs-site/en/production-guarantees.mdx 中。
路线图
| 里程碑 | 状态 |
|---|---|
| 记忆账本与幂等捕获 | 已完成 |
| 整合器(取代、冲突)与 ContextPacket | 已完成 |
| 本地嵌入与低于 250 ms 的 p95 基准测试 | 已完成 |
Python SDK 和 haki CLI | 已完成 |
| MCP 服务和 Cursor 集成 | 已完成 |
| n8n 集成(模板和节点) | 已完成 |
| 安全性:API 密钥、RLS、策略引擎、反馈 | 已完成 |
兼容 OpenAI 的网关(通过 base_url 自动注入记忆) | 已完成 |
| TypeScript SDK | 已完成 |
| 公开的 LoCoMo 和 LongMemEval 基准测试工具(可复现,可自行运行) | 已完成 |
| Haki 在该测试工具上的准确率数据(经校准且可复现) | 已完成 |
| 公开的可靠性报告页面(发展轨迹、方法论、尚未解决的问题) | 计划中 |
CLI 设备码身份验证(haki login) | 已完成 |
多渠道身份解析(/v1/subjects/resolve、/merge) | 已完成 |
| 跨编码器重排、时间锚定、实体/PRF 扩展 | 已完成 |
记忆健康指标(/v1/stats/health) | 已完成 |
| 可自托管的记忆健康仪表板(独立于 Cloud 控制台) | 计划中 |
仓库结构
haki/
├── app/ # FastAPI API (ledger, consolidator, context, gateway, MCP)
├── sdk/python/ # SDK + haki CLI
├── sdk/typescript/ # TypeScript SDK + haki-ts CLI (Python parity)
├── integrations/n8n/ # Native template + e2e workflow (node package: github.com/GetHaki/n8n-nodes-haki)
├── alembic/ # PostgreSQL migrations
├── tests/ # Behavioral tests (incl. eval harness tests)
├── eval/ # Public benchmark harness (LoCoMo + LongMemEval)
├── scripts/ # Benchmarks and diagnostics
├── docs-site/ # Product documentation (Mintlify)
└── docker-compose.yml # Postgres + pgvector + Redis
这是可自托管的 OSS 核心:API、两个 SDK、MCP 服务、n8n 集成和公开评测工具。托管版 Web 控制台(浏览记忆、点击解决冲突、计费)属于 Cloud 服务,存放在单独的私有仓库中——自托管 Haki 绝不需要它。
文档
产品文档(指南、完整 API 参考、生产保证契约)位于 docs-site/en/——这是一个 Mintlify 站点,可在该目录中运行 mint dev 在本地启动(需要 Node 18/20/22 LTS)。法语译文在 docs-site/fr/ 中同步维护。
Haki — 让你的 Agent 记住重要信息,并能证明这一点。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。