关于 Audrey
Audrey 是面向 Codex 和 Claude Code 的本地持久化记忆引擎,可在会话开始和提交提示词时召回相关信息,并在工具执行前检查操作。适合希望代理记住项目经验并避免重复失败的开发者。
主要功能
- 01会话开始时注入记忆摘要
- 02提示词触发的相关记忆召回
- 03工具执行前的操作检查
- 04记录工具执行结果并关联
- 05记忆过期与矛盾标记
- 06本地 SQLite 存储
适用场景
- 01避免代理重复执行已失败的部署命令
- 02记录仓库约定,使新会话自动遵守
- 03检测已失效的脚本或路径引用
MCP 相关
该项目是 MCP 服务,README 未明确说明其 MCP 接口的具体工具内容。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
让你的编码 Agent 不再犯同样的错误,记忆总在它行动之前出现。
Audrey 为 Codex 和 Claude Code 提供一套本地、有据可依的记忆闭环: 记住重要的事、自动回忆、行动前先核查,并从后续结果中学习。
你的 Agent 应该记住工作本身,而不只是对话
你在周一修好了部署命令。到了周四,一个新会话又去尝试那个坏掉的版本。
你解释过这个仓库从不提交生成的文件。下一个 Agent 却热心地把它们提交了。
你发现了一条微妙的迁移规则,把它记在某个地方,却仍然得记得把它粘贴进每一次新对话。
这就是 Audrey 要弥补的缺口。
Audrey 就坐在 Agent 旁边,自动参与到工作中。会话开始时,它会带回一小份相关的记忆包。当你提交提示词时,它会回忆起项目事实、偏好、流程和近期风险。在带有副作用的工具运行之前,Audrey 会依据过往证据核查拟议的操作。之后,它会把结果关联回紧接其前的那次核查。
模型不必记住存在某个记忆工具。这正是关键所在。
认识 Audrey Autopilot
安装一次 Audrey,审阅一次 hooks,然后照常使用 Codex 或 Claude Code。
npm install -g audrey
audrey install --host auto
需要 Node.js 22.16+(22.x)或 24+。SQLite 已内置在 Node 中,因此全新安装和 npx 启动都无需批准依赖脚本即可运行。npm 11.17+ 可能会对依赖脚本发出警告,npm 12 可能会提示它阻止了这些脚本;Audrey 的 CPU 嵌入运行时并不需要这些脚本。
auto 会配置所有已安装且受支持的 CLI。你也可以明确指定一个:
audrey install --host codex
audrey install --host claude-code
安装后重启宿主。Codex 会让你通过 /hooks 信任一次非托管 hooks;Claude Code 也可能要求你批准项目或插件组件。经过这一步明确的安装与信任之后,Audrey 就是自动的——绝不会被偷偷安装。
随后 Autopilot 会闭合这个环路:
| 时机 | Audrey 做什么 |
|---|---|
| 会话开始 | 注入一份精简的、限定于该 Agent 的记忆简报 |
| 你发送提示词 | 回忆相关证据;诸如“remember that…”或“I prefer…”这类明确持久的表述可以成为记忆 |
| 提出 bash/edit/write | 核查确切的过往失败、受信规则、流程、矛盾之处以及记忆健康状况 |
| 工具执行完毕 | 将 tool_use_id 关联到 Guard 回执,并记录脱敏后的结果 |
| 上报工具失败 | 形成一条持久、经净化的失败记忆,供下次尝试使用 |
| 回合停止或上下文压缩 | 运行轻量、仅处理到期项的整合,不阻塞对话 |
每个 hook 事件都带有宿主声明的超时(PreToolUse Guard 核查为 30 秒);Audrey 会让自身内部的嵌入/LLM 超时比该截止时间提前几秒结束,以便干净退出,而不是在竞速中输给宿主的强制终止。默认情况下,基础设施故障采用失败即放行:如果 Audrey 自身出错或超时,工具调用会无防护地继续,而不是冻结会话。设置 AUDREY_HOOK_FAIL_CLOSED=1,可在 PreToolUse 核查以此方式失败时改为拒绝该操作;其他生命周期 hook(会话开始、提示词回忆、工具执行后记账)没有可回退的“拒绝”行为,无论此设置如何都始终降级为放行。
一个关于部署失败的小故事
第一次尝试失败了:
$ npm run deploy
Error: deployment target is missing
Audrey 会保留一份经过脱敏的追踪记录以及确切的行动指纹。如果另一个会话在问题修复之前提出相同的行动,Guard 会返回带有证据的拒绝。更改命令或修复目标后,Audrey 会让工作继续进行。一旦该确切行动成功,旧的失败就不再阻止它。
这比“向量搜索找到了一个模糊相似的错误”更有用。Audrey 在行动之前创建回执,在行动之后记录发生了什么,并保留两者之间的谱系。
无需 API 密钥或网络调用即可尝试完整循环:
audrey demo --scenario repeated-failure
查看并不等于执行
在部署失败与重试之间,Agent 会运行大量无法改变任何东西的命令:用 grep 查找错误、git status、对配置文件执行 cat、对结果并不存在的目录执行 ls。一个记忆系统若把其中每一条都当作风险,或者把 grep 没有找到任何内容记作“失败”,就会变成一个在你烤面包时乱响的烟雾报警器。人们不再理会它,于是当烤面包机真的着火那天,它便一文不值。
Audrey 像工程师那样解读命令。一条命令的每一部分都被明确认定为只读(grep、git log、npm view、docker ps、sed -n '1,40p' 及其同类,且没有命令替换,除重定向到 /dev/null 外没有其他重定向,没有 sudo 或 xargs,没有可能改变动词解析结果的环境变量赋值),那么它根本不会到达 Guard。它的退出码会被记录,但绝不会被计为一课。其余一切照旧受到保护,任何 Audrey 无法明确识别的内容都被视为执行。
$ grep -rn "prisma" src/ Guard: silent
$ git status --short Guard: silent
$ cat prisma/schema.prisma Guard: silent
$ npm run deploy
Audrey Guard: BLOCKED
- recent_failure (high): This exact Bash action failed before: Prisma client was not generated. Run npm run db:generate before deploy.
- must_follow (high): Before running npm run deploy, run npm run db:generate because Prisma client must be generated first.
这是 audrey demo --scenario repeated-failure 的输出,它在没有 API 密钥和网络的情况下运行整个序列。
当 Guard 确实发言时,它会指明自己依据的是哪条记忆,而被记住的失败会依据所运行的命令(npm run deploy 对应 npm run deploy)与所提出的命令进行匹配,而不是依据两个字符串在嵌入向量中看起来有多相似。
带有可执行选项或生命周期脚本的命令会受到保护,包括 git ls-remote --upload-pack=...、npm pack --dry-run 和 ss -K。分类器只是为普通检查命令提供的便利,并不是操作系统沙箱。仓库配置、shell 展开以及由读取器调用的程序都可能改变一条命令的行为。在需要强制执行时,请使用主机权限或沙箱。
Audrey 记住了什么
Audrey 把记忆视为远不止一堆文本块。
- 情节是发生过的事情:用户的决定、工具结果、项目事实、偏好。
- 语义记忆是由累积证据支持的原则。
- 程序性记忆是行动方式:如何重试、验证、避免或恢复。
- 矛盾保持可见,而不是被静默覆盖。
- 置信度会随来源质量、证据、时间、检索、干扰、上下文和反馈而变化。
- 低价值记忆会衰减;重复的证据可以巩固为更持久的知让。
每个上下文包都包含记忆 ID、置信度、可获取时的来源,以及纳入原因。不确定或有争议的记忆会被标注为此类。检索到的内容会被一条简单规则包裹:记忆是证据,不是权威;当前的系统和用户指令永远优先。
当记忆不再为真
记忆出错并不只是因为时间久远。一条写着“用 npm run deploy:prod 发布”的笔记可能时效性极佳、来源可靠,但在该脚本被删除的那一天就彻底错了。更糟的是,每次召回都会强化它,因为检索本身就被当作记忆有用的证据。一个语气笃定、论据充分却错误的指令,比完全没有记忆更有害。
所以 Audrey 会做检查。当一条记忆被写入时,它会记录其中可对照项目验证的断言——仓库相对路径和 package 脚本名称——并且只保留在当时确实能解析的那些。正是最后这一点让这个信号有了价值:一条从未解析成功的断言,只是对拼写错误的猜测;而一条曾经解析成功、如今不再成功的断言,则意味着世界已经从一条仍自称有效的记忆脚下移开了。
audrey ground
[audrey] Grounding memories against /home/you/project
[audrey] Checked 14: 12 still true, 2 broken, 0 repaired.
[audrey] 01K8ZQ... references a missing npm_script: deploy:prod
[audrey] 01K8ZR... references a missing path: scripts/release.mjs
损坏的记忆不会被删除。它们保留内容,明确说明自己仍然指向什么,并接受置信度惩罚,从而默认不再起主导作用,但仍可读、可修复。它们也不再具备进入数据包 must-follow 部分的资格——那个部分可以强制触发 Guard 拦截,而一条指名了已不存在文件的规则,是没人能遵守的规则。
修复是对称的。恢复文件或脚本,下一次检查就会清除标记。一个已经迁移的检出会报告为未知,而不是损坏,因为一条记忆不应因为描述了本机当前看不到的项目而被否定。
没有可检查断言的记忆会保持未标注。沉默并不等于健康证明,把它当作健康证明,就是同一个错误指向了相反的方向。
它能做的一切,以及你什么时候会真正用到它
其中大部分功能在安装 Autopilot 后就会自行运行。你不需要调用 recall,也不需要调用 Guard。这张表列出的,是你会有意主动使用的部分,同时也让那些自动运行的部分变得清晰可读,而不是像魔法一样。
| 功能 | 你何时需要它 | 它为什么有用 | 如何使用 |
|---|---|---|---|
| Autopilot | 安装一次后,始终开启 | 这就是核心所在。记忆会在 Agent 行动之前送达,而不是在你察觉出错之后才送达。 | audrey install --host auto,重启宿主,批准 hooks 一次 |
| Guard | 在任何可能产生副作用的编辑、写入或 shell 命令之前自动触发 | 会将确切的行动指纹与过往失败进行比对。不是“类似这样的东西曾经坏过”——而是这条确切的命令,至今仍然坏着。只读命令(grep、ls、git status)不受 Guard 保护,它们的非零退出也不会被记为失败。 | 在 PreToolUse 时运行。手动执行:audrey guard --tool Bash --strict |
| Grounding | 在删除或重命名某条记忆可能提到的内容之后 | 置信度告诉你一条记忆来源可靠。Grounding 告诉你它是否仍然为真。一条关于你已删除脚本的笔记,置信度很高,但内容是错的。 | audrey ground,或让维护清扫来执行 |
| 会话简报 | 会话开始时自动触发 | 小巧、范围明确的包,而不是每次都粘贴上下文。未变更的记忆每个会话只注入一次;内容或状态有变化的记忆会再次发送。 | SessionStart hook。用 audrey greeting 预览 |
| 显式捕获 | 当你说“记住……”或“我偏好……”时 | 有意留下的记忆比推断出来的更有价值,而这样表达就足够了。 | 直接输入即可。Autopilot 会识别这些句式 |
| 整合 | 空闲时自动触发;长时间休息前手动执行 | 重复的事件片段会归并为一条原则。否则存储里就是一堆近乎重复的内容,recall 会变得嘈杂。 | audrey dream |
| 矛盾 | 当两条记忆互相冲突时 | 任何一方都不会悄悄胜出。两者都会保持可见并带有标注,直到有东西解决它们。 | 在包中呈现;用 memory_resolve_truth 来裁定 |
| 衰减 | 自动触发 | 低价值的记忆会淡出。被强化的记忆会保留下来。与整合在同一次清扫中运行。 | 属于 audrey dream 的一部分 |
| 提升 | 当某个模式值得成为仓库规则时 | 把一个学到的习惯从记忆中移出,放进团队可以阅读和审查的文件里。 | 先执行 audrey promote --dry-run |
| 影响 | 当你想知道这一切是否在起作用时 | 显示哪些记忆被使用过,以及它们是否有帮助。回答“这东西是否值得保留”。 | audrey impact --window 30 |
| 快照 | 备份,或迁移到新机器时 | 完整存储保存在一个 JSON 文件中。导入时将其视为不受信任:导入过程中会进行脱敏并去除信任标记。 | AUDREY_ENABLE_ADMIN_TOOLS=1,然后 memory_export / memory_import |
| Doctor | 包不再送达时 | 两个真正的原因是 hook 入口点发生偏移,以及整合长期得不到执行。Doctor 会指出是哪一个。 | audrey doctor |
| Demo | 在信任这一切之前 | 无需 API key、无需网络即可运行整个循环。无需任何配置就能看到它工作。 | audrey demo --scenario repeated-failure |
| REST sidecar | 不是 Codex 或 Claude Code 的自定义 Agent | 相同的记忆运行时,相同的证据契约,通过 HTTP 提供。包含 Python 和 JS 客户端。 | 在设置了 AUDREY_API_KEY 的情况下运行 audrey serve |
Audrey 刻意不做的事
Audrey 默认不会把你的记忆上传到托管服务。它不会把每一句话都当作永久真理。它不会把任意工具输出中的指令提升为受信任的策略。它不会声称一个小型本地基准测试就证明了最先进的记忆质量。
原始提示词事件和工具正文默认不会保留。Audrey 存储哈希、有界摘要、指纹和脱敏元数据。显式的用户记忆语言会被有意持久化;工具失败记忆会先经过净化。除非设置 AUDREY_ENABLE_ADMIN_TOOLS=1,否则管理导出/导入/遗忘/提升相关接口处于禁用状态。
静态加密、绑定身份的租户授权、速率限制和合规保留目前仍是部署方的责任。它们不会被隐藏在“生产就绪”的徽章背后。
为什么团队可能真的需要这个
更少的重复错误
Guard 会在记忆可能改变行动的位置检查它,而不是在损害发生之后。精确的失败指纹避免了那种嘈杂的“一个 Bash 命令失败了,所以所有 Bash 命令都可疑”的行为。
跨 Agent 会话的连续性
Audrey 不绑定于某一个模型供应商。Codex 和 Claude Code 使用相同的记忆运行时和相同的证据契约。MCP、REST、JavaScript 和 Python 客户端也让核心能力可用于自定义 Agent。
人类可以检查的证据
允许、警告和阻止决策都带有回执和证据 ID。结果记录会连接回这些回执。团队不仅可以问“Agent 记住了什么?”,还可以问“哪条记忆改变了这次行动,那是否有用?”
本地控制
默认存储是 SQLite、FTS5 和 sqlite-vec。默认使用本地嵌入。云端嵌入或大模型提供商需要显式配置。
更安全的共享存储
按 Agent 作用域的召回会继续经过验证、矛盾检测、干扰、情感、失败查找、胶囊、问候、Guard 和 REST 请求路由。召回会为其返回结果更新检索簿记(语义记忆和程序记忆的使用次数与最后强化时间戳)。胶囊和 Guard 过滤可能会进一步收窄这些结果。显式验证反馈(memory_validate / /v1/validate)会单独根据记忆实际表现来调整显著性,而不仅仅是因为它被召回了。
向量候选会在最近邻排序之前按 Agent 分区,因此一个繁忙的 Agent 无法在有界搜索中把另一个挤出去。对于硬性租户边界,仍应为每个租户或安全域使用不同的 AUDREY_DATA_DIR。
在安装任何东西之前先看看
npm exec --yes --package=audrey -- audrey demo --scenario repeated-failure
该命令会从 npm 缓存运行,演练完整的由 SQLite 支持的 Guard 循环,并且不改变主机配置。
我们想把它带到哪里
目标是打造面向 Agent 的时间证据图:不可变观察、显式有效窗口、来源信任、演化中的声明、限定作用域的过程,以及基于结果校准的策略。真正站得住脚的部分不是存储更多文本。而是知道曾经相信什么、为什么相信、在什么上下文中相信、相信了多久,以及据此行动是否有帮助。
近期工作包括持久后台认知任务、绑定凭据的租户命名空间、记忆隔离与污染传播、公开长期评估、加密备份选项,以及一个持久本地守护进程,彻底消除每个 hook 的模型启动。
如果这正是你想构建的那种 Agent 基础设施,请开一个 issue,或者从演示开始。Audrey 采用 MIT 许可证,产品边界是有意可检查的。
技术参考
下面全部是机制。上面的简短版本才是产品。
环境要求与包
- Node.js 22.16+(22.x)或 24+;不再支持 Node 20 和 23
- npm 包:
audrey - Python 客户端:
audrey-memory - 默认存储:本地 SQLite + FTS5 +
sqlite-vec - 默认嵌入:本地 384 维模型
npm install audrey
pip install audrey-memory
Audrey 使用 node:sqlite;sqlite-vec 在平台包中提供其扩展。本地嵌入运行时也包含其 CPU 二进制文件,因此 npm install --ignore-scripts audrey 可以正常工作。请保持可选依赖项启用:它们包含 sqlite-vec 和 sharp 的平台文件。GPU 加速可能需要针对你的平台提供额外的 ONNX Runtime 库。某些受支持的 Node 版本会在启动时打印实验性 SQLite 警告;这不会妨碍运行。
对于 Autopilot,优先使用全局或其他稳定安装方式。Hook 和 MCP 配置会固定实际的 Node 可执行文件和 Audrey 入口点;临时性的 npx 缓存不是持久的生产运行时。
宿主配置
独立预览或应用生命周期 hook:
audrey hook-config claude-code
audrey hook-config claude-code --apply --scope local
audrey hook-config claude-code --apply --scope project
audrey hook-config claude-code --apply --scope user
audrey hook-config codex
audrey hook-config codex --apply --scope project
audrey hook-config codex --apply --scope user
Claude Code 作用域映射遵循宿主的术语:
local→.claude/settings.local.jsonproject→.claude/settings.jsonuser→~/.claude/settings.json
Codex 支持项目级 .codex/hooks.json 和用户级 ~/.codex/hooks.json;它没有本地 hook 作用域。Audrey 会保留无关的 hook,替换较旧的 Audrey 自有处理器,写入带时间戳的私有备份,并在重复安装时保持幂等。与项目相邻的备份名称匹配 *.audrey-*.bak;请保持该模式被忽略,因为宿主配置可能包含无关的凭据。
Audrey 遵循 CLAUDE_CONFIG_DIR 和 CODEX_HOME。生成的 hook 会固定安装时使用的稳定 Node 可执行文件、Audrey 入口点、数据目录、Agent 身份和非机密 provider 选择。使用本地嵌入时,Autopilot 安装会执行一次预热,以免第一个真实 hook 同时也是第一次模型加载;设置 AUDREY_DISABLE_WARMUP=1 可跳过预热。
生成 MCP 配置但不应用:
audrey mcp-config codex
audrey mcp-config generic
audrey mcp-config vscode
使用安装时相同的宿主和作用域移除 Audrey 自有的 MCP 注册和 hook:
audrey uninstall --host auto --scope user
audrey uninstall --host claude-code --scope local
audrey uninstall --host codex --scope project
添加 --dry-run 可在不更改任一宿主的情况下预览卸载。仅当你有意保留 Audrey hook 时,才添加 --mcp-only。
Autopilot 安全契约
共享的 hook 适配器会规范化当前 Codex 和 Claude Code 的 payload。
- 上下文注入受
AUDREY_CONTEXT_BUDGET_CHARS限制(默认为 4000;除非另有覆盖,Autopilot 使用更保守的 3200 字符数据包)。 - 提示词和工具检索查询在嵌入前会先被限制。大型编辑携带哈希和长度,而非文件正文;精确的 Guard 身份使用完整的脱敏摘要,而非截断的前缀。
- 生成的默认 hook 会守卫并观察
Bash、Edit、MultiEdit、Write、NotebookEdit、apply_patch,以及来自已连接 MCP 服务的每个mcp__*工具,但排除 Audrey 自身的内存工具,这样 Guard 永远不会守卫自己。 - 只有当 Bash 命令可能产生副作用时才会被守卫。如果一条命令的每一部分都被明确识别为只读(
grep、ls、sed -n、git status、npm ls及类似命令;没有命令替换,除了重定向到/dev/null外没有重定向,没有sudo、xargs或eval),则跳过预检,其非零退出码会被记录,但绝不会被视为需要避免的失败。分类器无法识别的任何内容都会被守卫。 - 记住的 Bash 失败会依据其所运行的动词(
npm run deploy、git push)与提议的命令进行匹配,而不是依据两条命令字符串的相似程度。 - 前/后关联使用
session_id + tool_use_id,因此并行的工具调用不会附加到错误的回执上。 - Claude 的
PostToolUseFailure以及显式暴露非零退出码的 Codex 响应会规范化到同一失败路径。当前的 Codex hook 可能省略 Bash 退出状态;Audrey 会将不透明的结果记录为unknown,而绝不会记录为捏造的成功。 - 发生内部错误时,每个 hook 都会记录到 stderr 并输出
{}(不表态,因此工具继续执行)。只有PreToolUse在AUDREY_HOOK_FAIL_CLOSED=1时会改变行为,改为输出拒绝决定;上下文注入和工具后 hook 没有拒绝路径,始终输出{}。 - Stop hook 始终输出有效 JSON,绝不继续或阻止已完成的回合。
Codex hook 拦截是一道护栏,而非完整的 shell 策略边界。当前宿主契约不会拦截每一条更丰富的 unified_exec 路径,并可能省略静默 Bash 失败的退出状态。参见 Codex hooks 文档。将 Guard 回执用作证据,并保持沙箱、审批、CI 和部署控制到位。
JavaScript API
import { Audrey, MemoryController } from 'audrey';
const memory = new Audrey({
dataDir: './audrey-data',
agent: 'payments-agent',
embedding: { provider: 'local', dimensions: 384 },
});
await memory.encode({
content: 'Stripe returns HTTP 429 above 100 requests per second.',
source: 'direct-observation',
tags: ['stripe', 'rate-limit'],
context: { service: 'billing' },
});
const capsule = await memory.capsule('increase Stripe throughput', {
scope: 'agent',
budgetChars: 3000,
});
const guard = new MemoryController(memory);
const before = await guard.beforeAction({
action: 'deploy the billing worker',
tool: 'Bash',
command: 'npm run deploy:billing',
cwd: process.cwd(),
});
console.log(before.decision, before.evidenceIds);
await memory.closeAsync();
REST sidecar
AUDREY_AGENT=payments-agent audrey serve
curl http://127.0.0.1:7437/health
核心路由:
| 需求 | 路由 |
|---|---|
| 编码一个 episode | POST /v1/encode |
| 召回记忆 | POST /v1/recall |
| 构建上下文数据包 | POST /v1/capsule |
| 在动作前检查 | POST /v1/preflight |
| 创建 Guard 回执 | POST /v1/guard/before |
| 关闭 Guard 回执 | POST /v1/guard/after |
| 整合与衰减 | POST /v1/dream |
| 健康与索引状态 | GET /v1/status |
| 将学到的过程提升为规则文件(管理员) | POST /v1/promote |
对任何非环回部署使用 AUDREY_API_KEY。X-Audrey-Agent 会在受信任部署内限定编码、召回、capsule、preflight、Guard、整合和问候语的作用域;它是一个路由头,而非认证边界。请在你的网关处绑定 Agent/租户身份,而不要信任任意的公共头。每条路由还接受 JSON 正文中的每次调用 agent 字段,作为无法为每个请求设置头的调用方(例如 Python 客户端)的回退方案;当两者同时存在时,头优先。
Python 客户端
from audrey_memory import Audrey
memory = Audrey(base_url="http://127.0.0.1:7437", agent="payments-agent")
memory_id = memory.encode(
"Stripe returns HTTP 429 above 100 requests per second.",
source="direct-observation",
)
results = memory.recall("Stripe rate limit", limit=5)
memory.close()
Python 包是 REST sidecar 的客户端;内存运行时仍保留在 Node 进程中。
记忆与检索流水线
episode
├─ transactional SQLite + vector + FTS write
├─ agent-scoped interference / resonance / validation
├─ reinforcement or contradiction evidence
├─ sleep-time consolidation into semantic or procedural memory
└─ grounding checks that stored claims still hold in the project
query
├─ bounded vector candidates
├─ FTS5 lexical candidates
├─ reciprocal-rank fusion and confidence scoring
├─ context / affect / recency / interference modifiers
└─ final-only retrieval bookkeeping
Agent 范围内的向量搜索在最近邻排序之前使用原生 sqlite-vec 分区键,而不是对全库候选进行后过滤。如果融合结果不足,Audrey 会执行一次有界的分区本地重试。语义检索和程序性检索的计数仅在最终结果被产出时更新;去重后、超出上限以及未被消费的流式候选不会获得权威性提升。
MCP 接口
Audrey 暴露 23 个 MCP 工具,以及状态、近期记忆和原则资源,还有简报/回忆/反思提示词。主要分组如下:
- 捕获:
memory_encode、memory_reflect、memory_observe_tool - 检索:
memory_recall、memory_capsule、memory_greeting - 操作安全:
memory_preflight、memory_guard_before、memory_guard_after、memory_reflexes - 生命周期:
memory_consolidate、memory_dream、memory_decay、memory_resolve_truth、memory_ground - 治理:
memory_validate、memory_promote、memory_forget、memory_export、memory_import、memory_status、memory_introspect
当生命周期钩子不可用时,该服务还会发送解释 Guard 回执循环的主机指令。
环境变量
| 变量 | 默认值 | 用途 |
|---|---|---|
AUDREY_MODEL_CACHE_DIR | $XDG_CACHE_HOME/audrey/models 或 ~/.cache/audrey/models | 用于本地模型文件的可写单用户缓存 |
AUDREY_SHARED_STORE | 0 | 设为 1 以对有意共享的存储保留运维人员管理的权限 |
AUDREY_DATA_DIR | ~/.audrey/data | SQLite 存储;每个租户/安全边界使用不同的目录 |
AUDREY_AGENT | 因主机而异 | 用于作用域操作的逻辑记忆所有者 |
AUDREY_EMBEDDING_PROVIDER | local | local、gemini、openai 或 mock |
AUDREY_LLM_PROVIDER | 未设置 | 用于反思/整合的 anthropic、openai 或 mock;未设置(或 auto)时仅使用本地启发式方法,绝不使用环境中的 ANTHROPIC_API_KEY/OPENAI_API_KEY |
AUDREY_LLM_MODEL | 提供方默认值 | 显式覆盖 LLM 模型 |
AUDREY_DEVICE | gpu | 本地嵌入设备;回退到 CPU |
AUDREY_CONTEXT_BUDGET_CHARS | 4000 | 默认胶囊的最大大小 |
AUDREY_AUTOPILOT_SCOPE | agent | 用于钩子的 agent 或显式的跨 Agent shared 召回 |
AUDREY_PACKET_FORMAT | compact | 注入数据包的样式:compact 行格式或 verbose key=value |
AUDREY_PACKET_DELTA | 1 | 每个会话对每个未更改的记忆版本仅注入一次;0 表示每次提示词都重新发送完整数据包 |
AUDREY_HOOK_FAIL_CLOSED | 0 | 当 Audrey 自身失败时拒绝受保护的操作 |
AUDREY_API_KEY | 未设置 | 用于 REST 访问的 Bearer 令牌 |
AUDREY_ALLOW_NO_AUTH | 0 | 设为 1 以允许未经身份验证的非回环 REST 访问 |
AUDREY_HOST | 127.0.0.1 | REST 绑定地址 |
AUDREY_PORT | 7437 | REST 端口 |
AUDREY_ENABLE_ADMIN_TOOLS | 0 | 启用导出、导入、遗忘和提升操作 |
AUDREY_ENABLE_SHARED_SCOPE | 0 | 允许显式的跨 Agent REST 召回;管理工具也会启用它 |
AUDREY_PROFILE | 0 | 包含阶段计时诊断信息 |
AUDREY_DISABLE_WARMUP | 0 | 禁用 MCP 嵌入预热 |
AUDREY_PRAGMA_DEFAULTS | 1 | 设为 0 以禁用 SQLite 性能调优 |
提供方密钥绝不会嵌入生成的钩子命令中。--include-secrets 仅适用于 MCP 注册;优先使用主机环境注入或密钥管理器。
新的本地存储会在支持 POSIX 模式的文件系统上使用私有目录和数据库权限。现有的数据库和 WAL 文件在打开时会受到限制。Windows 和挂载卷需要适当的操作系统 ACL。仅当你自行管理共享访问时,才设置 AUDREY_SHARED_STORE=1(SDK:sharedStore: true)。
本地模型在首次使用时会下载到单用户缓存中。在依赖离线钩子之前,请让首次运行完成。初始化失败可以在同一进程中重试。对于由 root 安装的系统包,请以桌面用户身份运行初始模型加载,以保持缓存可写。
快照格式 2 保留接地锚点、其最后已知状态以及整合撤销日志;较旧的快照仍可导入。工作树在召回时共享仓库标识,而接地检查则检查记录锚点的检出。回滚在撤销合并时会保留较早的知识。无法安全逆转的旧式合并(没有撤销日志)将被拒绝。
REST API 要求 JSON 请求体,并拒绝跨源浏览器请求。除非显式设置 AUDREY_ALLOW_NO_AUTH=1,否则未经身份验证的请求要求回环主机。对于网络部署,请配置 AUDREY_API_KEY。
生产检查清单
- 为每个租户或硬隔离域分配独立的
AUDREY_DATA_DIR。 - 显式固定 embedding 和 LLM 提供商。
- 在提供商、维度或版本迁移前备份存储。
- 将 REST sidecar 置于身份验证和速率限制之后;不要将 agent 选择标头暴露为身份标识。
- 除非跨 Agent 检索是有意为之且经您自己的身份层授权,否则保持 REST 共享范围禁用。
- 将凭据和受监管的原始内容排除在编码记忆之外。
- 在受监管使用前确定保留、删除、加密和审计策略。
- 监控
audrey status --json --fail-on-unhealthy。 - 将 hook 运行时保持在稳定的已安装路径上。
- 针对您的拓扑对并发写入者进行负载测试;SQLite WAL 不是分布式协调层。
本地 embedding 使用 Transformers.js 4.3+ 和 sharp 0.35.4+,解决了已发布依赖树中先前的 libvips/libheif 安全公告。托管 embedding 提供商改变了运行时执行,但不会移除已安装的软件包。针对您的安装运行 npm audit --omit=dev 以检查当前安全公告。
基准测试与证据
在本地运行发布门禁:
npm test
npm run bench:memory:check
npm run bench:guard:check
npm run bench:guard:publication:verify
npm run smoke:cli
npm run pack:check
GuardBench 目前包含十个本地、确定性的行动前场景,涵盖重复失败、过程、范围变更、恢复、脱敏、冲突指令和噪声存储。已检入的 v1 方法论使用模拟的 64 维 embedding 提供商,旨在捕获回归。本地完美通过并不代表真实提供商的延迟或生产误报率。
此检出中的最新本地结果:10/10 场景通过,100% 预防率,0% 误拦截率,0 原始机密泄露,0 已发布产物泄露,在模拟提供商方法论下 Guard 延迟 p50/p95 为 3.805ms / 13.445ms。
benchmarks/perf-snapshot.js 在可配置的语料库大小下测量编码和混合召回的 p50/p95/p99,并附带机器和提供商来源信息。在您计划运营的硬件和 embedding 提供商上运行它;托管提供商的延迟主要由其网络往返决定。
较长期的公开评估目标包括 LongMemEval、MemoryAgentBench 以及对抗性记忆投毒案例。相关的设计方向包括 Zep/Graphiti 中的双时态知识图谱、A-MEM 中的演化记忆组织,以及 Sleep-time Compute 中的睡眠时间 Agent 计算。
开发
git clone https://github.com/Evilander/Audrey.git
cd Audrey
npm ci
npm run build
npm run lint
npm run format:check
npm test
参见 CONTRIBUTING.md、SECURITY.md 和 docs/MEMORY_BENCHMARKING.md。
维护者发布门禁
这些命令被有意记录,因为论文和发布证据账本会针对公开源代码树验证它们:
npm run bench:guard:zep
npm run bench:guard:external:dry-run
npm run bench:guard:external:evidence
npm run bench:guard:external:evidence:strict
npm run paper:arxiv:compile
npm run paper:arxiv:compile:strict
npm run paper:launch-results
npm run paper:launch-results:strict
npm run release:cut:plan
npm run release:cut:apply
npm run release:readiness
npm run release:readiness:strict
npm run python:release:check
实时 Zep 运行需要 ZEP_API_KEY;ZEP_GUARDBENCH_INGEST_DELAY_MS 调整摄取稳定时间。外部干运行矩阵无需凭据即可证明适配器形态,而外部证据验证将待处理运行与已验证的实时证据区分开来。
发布打包执行绝对路径扫描,在社交文案中预留 X URL,并检查提交的 artifact-url 目标。发布就绪状态分别报告源代码控制状态、实时远程 HEAD 验证、npm 注册表/认证就绪状态和 PyPI 发布就绪状态。
MIT 许可。为那些应当在工作上变得更好而不失问责能力的 Agent 而构建。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。