
人工智能AI AgentAgent 记忆RAG后端MCP 服务【免费下载链接】honchoMemory library for building stateful agents项目地址https://gitcode.com/gh_mirrors/hon/honcho点击查看免费下载Honcho Sandbox 是 Honcho 仓库内置的一套「可随时推倒重来」的本地测试栈启动即完成数据预置已知的工作区、peers、会话、消息以及 Deriver 实际产出的结论并支持在 1 秒内恢复到完全一致的基准状态让 harness 集成测试彻底摆脱「取决于你笔记本当前状态」的随机性。读完本文你将掌握sandbox.sh的全部命令与参数、mock/real 两种模型 Provider 模式的选型与代价、Postgres 模板快照的加速原理与防过期机制以及如何用fixture.json以三个推理层级预置带推理链的结论数据。一分钟上手四个命令Sandbox 的一切操作都通过sandbox/sandbox.sh这一个入口完成它内部接管 Docker Compose 与 Postgres 的全部细节sandbox/sandbox.sh up # 启动 预置首次运行还会构建或拉取镜像 sandbox/sandbox.sh reset # 回到预置状态1 秒以内 sandbox/sandbox.sh status # 查看当前运行内容与已存在的模板 sandbox/sandbox.sh down # 停止并删除卷up是唯一需要等待较久的命令它负责拉起整套栈并完成首次 seed。reset是日常最常用的命令因为它的设计目标就是「不重跑 Deriver、不调用 LLM、不做迁移」实测 mock 模式下仅需0.86sreal 模式下也只需1.29s。API 固定落在http://127.0.0.1:18000Postgres 在宿主机的15432端口Redis 在16379端口。三个端口全部刻意避开了默认值因此沙箱可以和你本机已有的普通开发栈共存而不是与它争夺端口和卷命名卷统一带honcho-sandbox_前缀同样不会碰撞见 compose.yml。Provider 模式mock 与 realDeriver 需要调用模型 Provider而「调用真实模型」正是沙箱既不免费也不确定性的根源。仓库为此提供了两种解决方式mock 为默认mock默认real确定性每次运行产出相同结论非确定性成本零成本、无网络出口真实花费Seed 耗时~15s~6 minReset 耗时0.86s1.29s向量召回不可测试见下文可测试Derived 结论4 条全部explicit合成文本22 条 —— 16explicit、4deductive、2inductiveSeeded 结论7 条 —— 4explicit、2deductive、1inductive提交的文本同样 7 条字节级一致适用场景CI、harness 冒烟测试、任何需要可重复答案的场景召回质量、用真实模型输出做校验上面的 derived 数量来自提交的 fixture在两条路径上分别实测。这是两种模式差异最尖锐的例证mock 给你 4 条[mock] mock dummy placeholder …式副本而 real 模式会从「我的猫 Marzipan 是以桥塔的颜色命名的」一路推理出演绎结论alices cat is named after a feature of alices pedestrian bridge project.。任何断言模型自身推理结果的测试都必须用 real 模式。会浪费你一整天的两个坑Mock embedding 不带任何语义相似性。它的向量由内容哈希推导而来实现见 src/mock_provider/embeddings.py因此两段互为改写的文本与两段毫不相干的文本在向量空间中距离完全一样。任何建立在 mock 模式上的召回断言都必须使用词法/全文搜索向量排序类断言在 mock 模式下失败原因与你在测的代码毫无关系——这正是 real 模式存在的意义。Mock 模式「派生」出的结论是合成的。文本来自请求本身而非消息的含义层级永远是explicitDreamer 的 specialists 是通过工具调用写结论的而 mock 故意从不发出工具调用。测试应断言「存在派生结论」但不要断言它们的内容或层级分布否则测试会在一种模式下通过、在另一种模式下失败。要断言内容请对着 seeded 结论断言——那正是它们存在的目的。Real 模式cp sandbox/real.env.example sandbox/real.env # 然后填入一个 key sandbox/sandbox.sh up --provider real凭据只来自这一个被 gitignore 的文件绝不来自宿主的 shell 环境变量因此 real 模式每次运行只有一个可审计的输入沙箱也仍然不继承机器状态。sandbox.sh在启动前会执行三项前置检查见 preflight文件缺失直接拒绝启动文件里没有任何LLM_*_API_KEY也拒绝仍带着real.env.example的占位 keysk-replace-me同样拒绝。原因很实际一个没有 key 的 real 模式栈能正常启动然后什么都派生不出来——这与「Deriver 什么都没找到」完全无法区分。real 模式从 reset 设计中意外获得一个好处派生又慢又花钱而快照机制意味着你每个 seed 只付一次费之后 reset 全部免费。实测seed 耗时 361sreset 回到完全相同的状态仅 1.29s、全程零 Provider 调用。reset 为什么这么快Postgres 模板快照seed 会运行 Deriver而朴素的 reset 意味着把 Deriver 再跑一遍。仓库的解法是seed把完成状态的数据库快照成一个 Postgres 模板CREATE DATABASE honcho_sandbox_seeded_mock TEMPLATE honcho_sandboxreset则直接 DROP 掉活动数据库、再从模板重建随后 FLUSH Redis。没有迁移、没有重新派生、没有 LLM 调用——实测0.86s且每次字节级一致。关键细节在于整个过程不停止、不重启任何容器DROP DATABASE ... WITH (FORCE)会逐出 api 与 deriver 的连接池两者随后自行重连——api 在下一个请求时deriver 在下一次轮询时间隔 0.25 秒。每个组件会在飞行连接断开时各记录一条OperationalError日志这是预期行为也是不为每次 reset 支付约 9 秒容器重启的代价cmd_reset 中有完整注释。快照会过期三道守卫快照的代价是它可能变旧。仓库用三道守卫防止「静默地恢复到错误状态」按模式命名模板honcho_sandbox_seeded_mock与honcho_sandbox_seeded_real各自独立mock 模式产出的模板永远不会被恢复进 real 模式的运行里。模板内记录指纹指纹包含 seed 时的 Alembic revision、fixture.jsonseed.pyinject_conclusions.py的 SHA-256 前 16 位哈希、以及 Provider 模式。reset会对比指纹不一致就拒绝并提示 reseed而不是静默恢复一个早于某次迁移的状态实现见 fingerprint / check_fingerprint。对运行中栈做 Provider 校验seed和reset都不会重建容器因此两者带上的--provider并不能改变栈真正对话的对象只会改变被记录下来的值。up会把创建栈时使用的 Provider 写入sandbox/.state.envseed/reset一旦发现不匹配就拒绝并要求先执行up --provider ...。如果没有这层保护对运行中的 real 栈执行seed --provider mock会花钱产出非确定性的结论、却把它们标记为mock之后每次 reset 都会把这些结果当作「确定性基准」恢复出来require_running_provider 解释了这条伤害最大的路径。如果遇到过期拒绝sandbox/sandbox.sh seed。Seeded conclusions用 fixture 预置完整推理树fixture.json可以为每个 peer 预置成品结论覆盖三个推理层级中的任意一个。三个 key 都可选一个都不写时沙箱行为与没有该特性时完全一致{ id: alice, observe_me: true, observe_others: false, explicit: [ alice is a structural engineer based in Rotterdam, alice has a cat called Marzipan, named after the colour of the bridges pylon ], deductive: [ { content: alice named her cat after a feature of the bridge she is designing, premises: [0, 1] } ], inductive: [alice optimises for low lifetime maintenance cost] }携带这些 key 的 peer 就是「被观察者」。结论按(observer, observed)二元组键控observer 由推断得出每个设置了observe_others的 fixture peer排除被观察者自身。对标准 harness 形态来说这恰好就是assistant - alice——与 dream 使用的、harness 读取的是同一个二元组。一个没有任何其他 peer 观察的 peer 是错误而非静默无操作可以给该 peer 显式加一个observer来覆盖推断这也是抵达自表示alice - alice的方法。条目可以是裸字符串也可以是{content, premises}。每个 premise 是同一 peerexplicit列表的下标。premises 可选但「没有前提的派生结论」不是 Dreamer 会写出来的东西因此提交的 fixture 总是提供它们。内容必须唯一。Honcho 会对内容与已存储条目匹配大小写与空白不敏感的结论做合并且此行为无法关闭。seeder 会断言精确数量因此近似重复会导致 seed 失败而不是悄悄消失——assert_clean会把 create_documents 返回的各类去重计数批内精确重复、已存储精确重复、语义拒绝、语义替换逐项核对有任何非零即抛错inject_conclusions.py。premises 能买到什么买不到什么premise 下标会变成真实的Document.source_ids指向explicit阶段写入的真实行因此推理树两个方向都能真实遍历。但有两点局限premise 文本会渲染进 representation。peer.representation(target…)会把每条 premise 缩进打印在它的结论之下这是实际的收益点也是seed.py verify断言的内容渲染规则见 src/utils/representation.py 中关于DocumentMetadata.premises/.sources的分层级读取逻辑。premise 链接不在 API 上。结论响应携带level但不携带source_ids而get_reasoning_chain是 Dialectic 工具而非路由。因此测试只能通过 Dialectic 或 SQL 触达链接。正因为如此一棵断掉的推理树从外部看是无形的——所以 seeder 在快照之前自己检查链接解析每一条 premise id确认每条都能从其子节点可达。悬空或错位的 premise 会让 seed 失败verify_links 双向校验的实现。为什么这件事不走公开 API公开的 create-conclusions 端点永远写levelexplicit且不带 premisesschema 与各 SDK 都没有这两个字段。列是存在的但只有进程内调用者能设置它们。因此sandbox.sh把inject_conclusions.py放进 api 容器内部运行——该容器本身已经是 Honcho 的 venv自带 api 的 settings 和可用的 embedding client。脚本通过 stdin 进入、fixture 通过环境变量传入所以无需挂载任何东西容器里也不会留下任何痕迹inject_conclusions。代价是注入器调用的是 Honcho 的内部 API它们没有稳定性契约而且取自image.env钉死的镜像而非工作树。注入器在写入前会检查它依赖的每个函数签名与 schema 字段check_signatures发现不匹配就报「bumpimage.env并同步更新此脚本」并中止而不是半途 seed 一个数据库。把公开 API 拓宽到接受 level 是曾考虑过的替代方案但被刻意否决那会让任何客户端都能带着自己发明的 premises 断言一条deductive结论。fixture 里到底有什么fixture.json 包含两个 peer观察拓扑显式写明alice被观察且不观察别人assistant观察别人且不被观察、一个会话、六条携带可辨别的、可用词法检索到的事实消息以及一个被调度好的跨 peer dream。拓扑之所以写下来而不是用默认值是因为它是「会静默坏掉」的那个东西而seed.py会从服务端重新读回拓扑来确认它确实生效verify 阶段 逐 peer 对比get_peer_configuration的结果。编辑fixture.json之后用sandbox/sandbox.sh seed重建模板。seed总是从一个空的、刚迁移完的数据库开始所以无论你从什么状态运行它它都意味着同一件事——跑两次的结果与跑一次完全相同cmd_seed 会先 DROP 再 CREATE 数据库、FLUSH Redis、再通过 api 入口的 scripts/provision_db.py 应用迁移。Dream 在这里永远不会自行触发——文档阈值是 50、dream 最小间隔是 8 小时——所以 seed 直接调度一次。文件布局文件用途sandbox.sh入口。掌管 Docker 与 Postgres。compose.ymlProvider 无关的基座。单独不是可运行栈。compose.mock.ymlmock overlay新增 mock-provider 服务与接线。compose.real.ymlreal overlay读取real.env无 mock 服务。image.env钉死的镜像 digest。一行刻意手动 bump。init.sql创建honcho_sandbox数据库并启用 vector 扩展。fixture.json预置的对话内容。seed.py填充与校验。只与 API 对话。inject_conclusions.py写入 seeded 结论。在 api 容器内运行。real.env.examplereal 模式凭据的模板。基座上永远恰好叠一个 Provider overlay因此选择在-f列表里一目了然而不是埋没在某个默认值里。这也是compose.yml单独跑不起来的原因指向mock-provider的depends_on边在 mock overlay 里——Compose 对depends_on是加性合并的override 文件无法移除一条已有的依赖。配置只信 Compose 注入的沙箱只由 Compose 注入的内容配置。PYTHON_DOTENV_DISABLED和HONCHO_CONFIG_TOML_DISABLED都被置位因为 src/config.py 在 import 时调用load_dotenv(overrideTrue)而 Dockerfile 的COPY config.toml* /app/会把本地config.toml烘进任何本地构建的镜像。没有这两个 flag你机器上的残留配置就会悄悄获胜compose.yml 的注释说明了这一层。compose.yml还钉死了 Deriver 的调度参数让派生立即发生。在默认设置下只 seed 了少量消息的沙箱会产出零条结论并静默失败工作单元要等到批处理达到 512 token 或 30 分钟过去才被认领而启动抖动会把首次轮询推迟最多 30 秒。compose 中DeriverSettings 相关环境变量块逐一关掉了这些闸门DERIVER_FLUSH_ENABLED: true DERIVER_REPRESENTATION_BATCH_WORK_UNIT_TARGET_TOKENS: 0 DERIVER_REPRESENTATION_BATCH_MAX_AGE_SECONDS: 1 DERIVER_POLLING_STARTUP_JITTER_SECONDS: 0 DERIVER_POLLING_JITTER_RATIO: 0 DERIVER_POLLING_BACKOFF_ENABLED: false DERIVER_POLLING_SLEEP_INTERVAL_SECONDS: 0.25 DERIVER_STALE_WORK_UNIT_CLEANUP_INTERVAL_SECONDS: 5此外DREAM_ENABLED: true确保 dream 子系统在线尽管 seed 是通过 seed.py 的schedule_dream调用 直接调度、绕过了阈值与间隔限制。api 与 deriver 的restart: no策略也值得注意——栈的「生命周期」完全由sandbox.sh管理而不是靠 Docker 自愈掩盖问题。seed 的排空等待由 drain 函数 实现它轮询honcho.queue_status()直到 pending 与 in-progress 归零且 completed 大于 0超时则报出最后一次观察到的状态默认 300 秒可用SANDBOX_DRAIN_TIMEOUT覆盖——因为「队列从未排空」和「队列从未有过东西」从外部看一模一样沉默才是这里最危险的结果。从工作树构建sandbox/sandbox.sh up --build从仓库构建镜像而不是拉取钉死的 digest并让所有服务指向构建产物以保持同步。在你测试 Honcho 本身的改动时使用它。它用可复现性换来了时效性——你运行的是你的树而非钉死的字节这在迭代时是对的在复现他人结果时是错的。mock 模式还会预先检查镜像里是否包含src/mock_provider模块check_mock_provider_present因为一个早于该模块的 digest 能正常拉取随后让某个服务因缺模块而崩溃循环。如果up --build之后紧接着执行一次普通reset镜像会被.state.env中记录的值维持住不会偷偷翻回钉死的 digest——这正是 write_state 机制 存在的原因。实战建议小结CI 与 harness 冒烟测试一律用默认的 mock 模式对 seeded 结论断言内容与层级对 derived 结论只断言存在性召回断言用全文/词法检索。召回质量与推理验证切换到 real 模式接受非确定性与花费并在第一次 seed 之后尽情使用免费的秒级 reset。改 fixture 后sandbox.sh seed重建模板任何「模板过期」或「Provider 不匹配」的报错都按提示操作即可它们都是防静默错误的主动保护。赞分享人工智能AI AgentAgent 记忆RAG后端MCP 服务【免费下载链接】honchoMemory library for building stateful agents项目地址https://gitcode.com/gh_mirrors/hon/honcho点击查看免费下载相关推荐nbviewer核心功能详解支持GitHub、Gist等6大数据源nbviewer核心功能详解支持GitHub、Gist等6大数据源 nbviewer是一款强大的Jupyter Notebook在线渲染工具它能将Jupyt后端Apache APISIX 基准测试Benchmark全指南测试环境、性能结果与本地复现方法Apache APISIX 基准测试Benchmark全指南测试环境、性能结果与本地复现方法 本指南以 Apache APISIX 官方基准测试文档为主体API网关后端云原生微服务揭秘WechatEnhancement自动登录机制告别重复验证的终极方案揭秘WechatEnhancement自动登录机制告别重复验证的终极方案 WechatEnhancement是一款专为微信用户设计的增强工具其核心功能之一就上一篇鸣潮自动化助手5分钟快速上手让你轻松解放双手的游戏利器下一篇x64dbg 桥接内存分配函数 BridgeAlloc 详解从源码剖析分配机制、零初始化语义与配对释放契约创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考