四个不那么常见的设计决定
先定边界与调度,再加能力。
内核零 IO
内核不碰任何外部世界。消息、文件、网络、硬件全部由插件经 PluginSDK 实现。于是「内核是否可信」与「某个插件是否安全」 可以分开评估。
插件是独立进程
插件是普通 Go 二进制,由内核 spawn 为子进程,经 stdio JSON-RPC (控制)、共享内存段(数据)、事件环(通知)通信。插件崩溃不牵连内核, 换掉 plugin.bin 即热重载。
输入是有级别的
输入分「排队」与「中断」两类,中断再按紧迫度分 L1–L4。 高级可抢占并保存现场,同级不抢占。L4 归内核独占 —— 所以「停止」真的能立刻停下。
忙时有人顶班
主 agent 忙长任务时,积压交给临时分诊助手: 能办的直接办,需要主 agent 的立刻回「忙碌中,请稍候」。 不必干等十几分钟。
三层记忆:从「刚才说了什么」到「三年前说过什么」
不是一个大向量库包打天下,而是三层各司其职、逐层下沉。 蓝 / 青 / 金三色对应的就是这三层。
① Context工作窗口
内存中的事件窗口。按与当前输入的相关性排序(预训练词向量 → 余弦相似度, TF-IDF 回退),最近若干条受保护。低分事件自动下沉。
② Document文件记忆
JSON + TF-IDF 索引的中间层。支持显式提交与隐式归档, 冷数据下沉后蒸馏成三元组进入图谱。
③ Graph图数据库
SQLite 持久化实体与关系,BFS 遍历召回。三元组从对话中蒸馏而来, 越用越准 —— 「几个月前的事还记得」靠的就是这层。
媒体也是一等节点
图片、音频不是附件,而是三层里的一类节点:内容寻址(相同字节只存一份)、 引用计数 GC(有引用绝不删)。
描述才是持久语义
视觉模型生成的描述以 [mime digest] 描述 写入纯文本记忆并参与检索, blob 只是可淘汰的缓存。所以几个月后「那张三色图」仍搜得到。
统一多模态空间
文本与图像落在同一向量空间(默认 Chinese-CLIP): 可以用一句话搜图,也可以用图找记忆。
一条消息进来之后
输入先过调度器,再进处理管道。管道有 7 个阶段钩子,插件可改写或短路。
外部输入(QQ / WebUI / CLI / 邮件 / 设备 …) │ ▼ 输入调度器 两类别 · 四级中断 L1–L4 │ ├─ 同级不抢占 → 入队列 │ ├─ 更高级 → 抢占(现场压入中断栈,稍后恢复) │ └─ 忙太久 → 转投 临时分诊助手 ▼ 处理管道 on_input → pre_action → post_action → before/after_toolcall → before/after_output │ 记忆召回 + 人格注入 + LLM 调用 + 工具循环 ▼ 三层记忆 Context → Document → Graph │ ▼ 输出通道 可寻址到具体 agent(父 ↔ 驻留子)
核心组件
homed常驻内核进程:LLM 编排、记忆管理、输入调度、插件生命周期PluginSDK四通道:注册工具 / 挂阶段钩子 / 订阅事件 / 声明输出通道inputch最基本的输入路由单位,可划给某个 agent(含驻留子)Stage7 个处理阶段钩子,插件可改写或短路消息流resident驻留子 agent:独立调度器 + temp 图记忆,父可查看/收发/压缩/回收hmapdev插件工具链:生成工程、构建 .hmap、安装16 内置 + 20 外部
实测注册数
不含第三方
另有 1 个网关脚本
跑起来
依赖 Go 1.25+ 与 CGo(sqlite3)。内核需 Linux;Windows 上 homed 跑在 WSL2 里,仅需构建 waiter.exe。
WebUI 与 API 密钥在 http://localhost:8080 配置,持久化到 SQLite。
开箱可用的插件
外部插件经 hmapdev 构建为独立二进制,可单独装卸、热重载。点任意插件看它能做什么。
点上方任一插件查看用途
a2av1.3.1Agent-to-Agent 协议通信插件,支持双向 A2A 通信:可查询其他 Agent 并回复其请求。提供 HTTP 服务端暴露本 Agent 能力。
acpv1.2.1Agent Client Protocol 通信插件:充当 ACP 服务端接受其他 Agent 的任务请求,同时提供客户端工具向远程 ACP Agent(如 opencode)发起会话并读取回复
biliv1.2.0B站视频下载工具,基于 yt-dlp 引擎。支持查看视频清晰度列表、指定格式下载、可配置下载目录。
browserv2.4.1统一浏览器插件:搜索、HTTP抓取(quick)、无头渲染(normal)、交互式浏览器(interactive/CDP)
calendarv1.1.0日历事件管理,支持提醒和重复事件
deepsearchv1.1.2为 agent 提供真正的联网信息检索:本地 SearXNG 聚合多引擎(返回标题/URL/摘要/时间),支持新闻、时间范围、指定引擎;并提供网页正文抽取与「搜索+读前K篇」的深检索
editdocv2.0.0全能办公插件:新建/读取/编辑/转换 docx·xlsx·pptx·md·csv·txt(基于 python-docx / openpyxl / python-pptx / soffice / pandoc)
homeagent-mail-bridgev0.2.2HomeAgent 接入 AgentMail:邮件驱动的多智能体协作
mcv0.1.8把 mineflayer 虚拟 MC 客户端封装为 HomeAgent 的 chan:mc IO 通道(两阶段激活 + 动作工具)
memov1.1.0待办与备忘录插件。待办(todo_add/todo_complete/todo_list)会主动提醒;备忘录(memo_create/memo_list/memo_delete)纯记事不提醒。
musicv0.1.0音乐搜索插件,支持搜索歌曲和查看歌词(基于网易云音乐)
ocrv1.0.0图片文字识别工具,基于 Tesseract OCR 引擎。支持从 URL 或 base64 图片中提取文字内容。
plugindevv1.0.0把 hmapdev 工具链封装成 Agent 可调用的工具:脚手架生成插件工程、构建打包 .hmap、管理 SDK 版本。配合 plugin_install 即可让 Agent 自己做完「新建插件 → 构建 → 安装」全流程。
qqv1.4.1QQ 消息收发插件,通过 NapCat 协议桥接
recoverydiagv0.2.0快速检查/崩溃取证工具集:diag_triage(退出码/信号/存活粗分)、diag_db(config.db 完整性 + LLM 源解析校验)、diag_log_scan(日志签名命中)、diag_delta(last-good 快照 vs 现状 diff)、diag_loc(正交综合定位)。全部返回结论而非原文,确定性、不消耗 LLM token,供 guard / failback 恢复决策使用。
rssv1.1.0RSS/Atom 订阅监控插件,自动检测更新并推送通知
sanitizerv0.1.0清洗 LLM 输出中的工具调用残留(思维泄漏)
vanblogv1.0.0管理 VanBlog 开源博客系统:文章的增删改查、分类标签管理、草稿发布、备份导出等
vikunjav1.0.1Vikunja 待办/任务管理:任务增删改查、项目与看板桶、标签、指派、评论、关联、附件、保存筛选器、团队与分享、通知、订阅、Webhook、时间跟踪、数据导入、实例管理;并附通用 API 直通工具兜底
weatherv1.0.0天气查询插件(基于 wttr.in),支持实时天气和未来预报
常见问题
最容易引起误解的六个地方。
「内核零 IO」是不是意味着内核很简单?
恰恰相反。零 IO 是为了让内核专注做难的部分:输入调度(四级中断、抢占与 现场保存)、上下文预算、三层记忆的蒸馏与召回。IO 挪出去之后,这些才有 清晰的所有权。
插件崩了会不会把 Agent 带崩?
不会。外部插件是独立子进程,与内核只通过 stdio JSON-RPC、共享内存段、 事件环通信。插件崩溃后,内核摘除它注册的工具、阶段与通道,按退避重启, 其余部分不受影响。
为什么消息会「排队」而不是立即处理?
因为同一时刻只应有一个任务在改上下文。同级抢占会让两边都做一半。 需要立刻插队时用更高级别的中断(如 L4:内核与内核级插件), 而不是让所有消息都变成抢占者。
长任务会不会让用户等很久?
这正是「分诊助手」的用途。主 agent 忙超阈值且积压够多时,内核拉起临时 驻留子接手:能办的直接办,需要主 agent 的立刻回「忙碌中,请稍候」。
记忆会不会无限膨胀?
不会。三层是迁移而非复制:上下文事件裁剪后归档成文档,文档冷掉后蒸馏成 图谱三元组。图谱有去重与 UNIQUE 约束,媒体靠引用计数 GC 回收无主内容。
能换 LLM 吗?
可以。内核不绑定厂商:每个 LLM 源对应一个 Lua 脚本负责请求与响应转换。 内置 9 个适配器(OpenAI、Anthropic、Gemini、DeepSeek、Groq、Mistral、 Ollama、GitHub、KimiCode),也可自己写一个接任意兼容 API。