mcpField
H
haki

haki

远程服务
gethaki.space记忆与知识27 周前更新

关于 haki

Haki 是面向 AI Agent 的持久记忆层,可将交互整理为带日期和来源的事实。它追踪已被取代的信息,并说明哪些记忆进入上下文包。

主要功能

  1. 01持久化事实台账
  2. 02有效日期与取代状态
  3. 03矛盾检测
  4. 04带来源的上下文追踪
  5. 05Python 和 TypeScript SDK
  6. 06CLI 与 Cursor MCP 工具

适用场景

  1. 01跨 Agent 会话保留偏好
  2. 02避免使用过时事实
  3. 03追踪上下文的选取原因

MCP 相关

Haki 提供 Cursor MCP 服务,包含检索、记录、检查和遗忘项目记忆的工具。Cursor Agent 决定调用时才会使用这些工具;服务不会拦截所有对话。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://api.gethaki.space/mcp/
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

Haki

为 AI Agent 提供可靠记忆

有凭有据的上下文:每条事实都附有日期、来源和状态。

Tests Python PostgreSQL p95 context License

Haki 让任何 AI Agent 都能拥有持久数月的记忆—— 能分辨当前信息与过时信息,并能为每条回忆提供依据。

快速开始 · 编码 Agent · Cursor · n8n · 网关 · API · gethaki.space


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:记录一条偏好,在同一对话中更改它,然后在新对话中检索当前值,并将旧值标记为 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
  1. “Add Haki to Cursor” 深度链接会安装 MCP 服务;
  2. 项目规则(.cursor/rules/haki.mdc)会告诉 Agent 何时记住、何时回忆;
  3. 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]
  1. 捕获 — 应用发送一个事件(一条消息、一个操作、一项 工具结果)。Haki 会将其记录为不可变证据,并在几毫秒内回复。网络重试 不会产生重复项(幂等性)。
  2. 整合 — Haki 在后台读取事件,并判断哪些内容应成为持久事实。它会去重、检测变化(旧 事实会变为已取代)以及矛盾(状态为冲突,在解决前暂不提供)。事实由 **(主体、谓词、限定条件)**标识:“工作日的起床时间”和“周末 的起床时间”是两个不同且共存的事实,并不矛盾—— 无论措辞多么接近,不同的限定条件都不会被混为一谈。
  3. 上下文 — Agent 在每次回复前都会请求相关记忆。 Haki 只返回有效、当前有效且在范围内的事实,按相关性排序, 并严格控制 Token 预算——在 10,000 条事实上的测量结果为 p95 249 毫秒 (参见 scripts/benchmark_context.py)。
  4. 检查 — 随时都可以通过追踪记录了解某条信息为何被保留、排除或拦截。
  5. 遗忘 — 更正或擦除操作会传播到所有由其衍生的内容,并附带带时间戳的回执。

概念

概念定义
主体(subject)被记忆的人或实体。必须具有稳定身份——没有身份就没有记忆。
事件原始证据:“这条消息在这一天被交换。”不可变。
事实在某个时间点被视为真实的信息。带日期、版本和来源。
取代一个事实替代另一个事实。旧事实仍保留在历史记录中,但不再作为当前事实提供。
冲突两个事实相互矛盾,且无法自动裁定:两者都会被暂时搁置并标记。
ContextPacket在回复前注入的记忆包:相关事实及其来源,且不超出预算。
追踪记录解释每项记忆决策的日志:保留、排除、拦截及其原因。
范围记忆的封闭边界(组织 → 项目 → 主体)。任何内容都不会越界。

定位

常见方案Haki
改变主意新旧事实共存,造成矛盾旧事实被取代;只提供当前事实
矛盾随机提供给模型暂不提供并标记,可显式解决
可解释性黑盒每项事实都有追踪记录和来源
遗忘删除一行记录级联传播,并附带回执
检索延迟每次请求都进行一次网络嵌入调用本地嵌入:关键路径中没有网络调用
语言覆盖范围通常只针对英语优化原生支持多语言(约 50 种语言)
部署需要组装多项服务(向量存储、队列等)只需一条 docker compose up 命令

实测性能

可复现的基准测试:uv run python scripts/benchmark_context.py(每种规模 100 次请求,本地嵌入,Windows 开发机器)。

记忆中的事实数p50p95PRD 目标
10060.5 毫秒80.6 毫秒< 250 毫秒
1,00063.7 毫秒68.0 毫秒< 250 毫秒
10,00027.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 /healthAPI 健康状态
/mcpMCP 服务(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 记住重要信息,并能证明这一点。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。