先划清层边界
设备协议、能力暴露、Agent 决策、人机交互和跨层合约分开处理。这样 fake adapter 可以跑确定性测试, real adapter 可以接真实米家,MCP 层屏蔽设备协议,Agent Runtime 不感知 MiHome 细节。
把 LLM Agent 接入真实米家设备,并用工程边界约束它的行动
Homent 是一个 local-first 的智能家居 Agent。它把模型接到真实米家设备前,先用 contracts、CoreAdapter、MCP Server、 Agent Runtime、Agent Server 和 Web UI 划清运行边界。模型可以理解和建议,实际写设备时仍要经过审批、审计和回归验证。
设备协议、能力暴露、Agent 决策、人机交互和跨层合约分开处理。这样 fake adapter 可以跑确定性测试, real adapter 可以接真实米家,MCP 层屏蔽设备协议,Agent Runtime 不感知 MiHome 细节。
固定自动化通常只有两种模式:用户发指令,或者条件触发动作。Homent 增加了一条 Agent 决策链路:系统读取家庭状态、近期事件和长期记忆, 再让 LLM 给出建议或主动 tick。策略层决定自动执行、要求审批,还是直接拒绝。
Agent Memory 记录偏好、长期指令、自动化规则和决策摘要。Proactive Tick 周期性读取 HomeContext、近期事件和记忆。 delayed one-shot、comfort preference、habit learning 和 memory maintenance 让这些记录进入后续决策,而不是只停留在存储层。
LLM 不直接写设备。Web UI 产生的是 UserIntent,Agent Runtime 生成受验证的 ActionProposal,
AutomationPolicy 决定自动执行、要求审批、拒绝或无动作,最终写入必须产生 ActionResult 与审计日志。
背景与目标
把 LLM 接入智能家居后,风险不再只是 UI 交互做得好不好。模型可能误解意图,生成设备不支持的动作,甚至把动作发到错误设备上。 Homent 的目标很明确:Agent 可以观察、记忆、规划和行动,但行动前必须穿过固定边界。
现在仓库已经跑通 fake 闭环、真实 MiHome adapter、MCP HTTP transport、默认 OpenAI-compatible LLM planner、长期记忆、 proactive tick、延迟一次性动作、多步骤动作计划、舒适偏好学习、习惯学习、记忆生命周期维护、Agent HTTP API、Web UI cockpit, 以及覆盖跨层链路的 E2E 测试。
架构介绍
这张图把当前模块放到同一张分层图里:左侧是贯穿全系统的合约轴,中间是运行时业务分层, 右侧是部署、测试和工具设施。它表达的是“职责在哪一层”,不是要求记住每一条 crate 依赖。
各模块展开
这里按“模块做什么、内部由什么组成、和谁协同”来讲。听众可以顺着一次请求或一次设备写入往下看, 也能看出这些层为什么要分开。
contracts/*.schema.json:定义 action、agent、agent interaction、memory、context、device、entity、event、MCP tools、proactive agent、service 等模型。crates/homent-contracts:Rust 侧共享类型,供 Core、MCP、Agent、E2E 使用。generated/ts/homent-contracts:前端 @homent/contracts 类型包,供 Web UI 使用。UserIntent 表达用户输入,避免 Web UI 直接构造设备写入。ActionProposal、ActionResult、ActionLogEntry 构成提案、执行和审计链路。ActionPlan 表达多步骤场景;ScheduledAction 表达延迟一次性动作。AgentInteractionResult、AgentMemoryRecord、ProactiveTickResult 支撑聊天、记忆生命周期和主动轮询。just contracts 与 just check-contracts 用来发现生成物漂移。homent-core-apiCoreAdapter trait、事件流类型和适配器错误,不包含米家协议。ActionRequest 并返回 ActionResult。refresh_entity_states 专门服务显式刷新和写入后的状态校验。homent-core-mihomeFakeMiHomeAdapter 是默认 deterministic 本地闭环,支撑测试和本地开发。RealMiHomeAdapter 封装 Xiaomi 账号、OAuth、MIoT Cloud、MIoT spec、Cloud MIPS、云端读写和事件观察。config、mapping、action、fake、mihome 等子模块组织。homent-mcp-serverhoment-core-api,不依赖 homent-core-mihome 的实现细节。list_entities、read_entity_state(s)、write_entity_action、get_home_context、recent events 和 health。write_entity_action 是设备写入边界,会产生审计记录;但提案创建和审批策略不在这一层。homent-mcp-hostHOMENT_ADAPTER=fake|real 选择 Fake 或 Real adapter。McpClient 抽象访问 MCP,而不是链接设备或协议 crate。UserIntent,再由 Runtime 通过 MCP 写入。OpenAiCompatibleLlmPlanner 是正常启动时的默认决策核心,输出 reply、memory operations、单动作 proposal 或多步骤 action plan。ActionPlan;两者不能同时出现。JsonFileMemoryStore 保存偏好、长期指令、自动化规则和紧凑决策摘要,并维护 status、confidence、expires_at、supersedes。AutomationPolicy 决定 auto execute、require approval、reject 或 no-op。McpClient,并生成 ActionResult 与 ActionLogEntry。DeterministicPlanner 仍用于 focused tests 和显式开发 fallback,不是正常默认决策核心。/api/world/devices、单设备状态、recent events。HttpMcpClient 实现 Runtime 的 McpClient trait,只通过 MCP HTTP 访问设备能力。runtime_factory 正常启动时构造 LLM planner;缺少 LLM API key 时启动失败,避免静默降级。HOMENT_WEB_UI_ORIGINS 控制 trusted browser origin,低风险 Web UI 写入才允许自动执行。DeviceOverview,渲染实体、状态值和可写能力。UserIntent,先做本地投影并标记 Syncing,再等待 Agent API 返回执行结果或 pending proposal。PUT /api/agent/proactive-config 调整后台轮询。just dev-agent、just dev-mcp-host 等提示,但不执行本地命令。crates/homent-e2efake_mihome_event_loop 验证 fake 观察、写入和事件闭环。four_layer_agent_interaction_flow 验证 Web intent 到 Runtime、MCP、Core 的四层链路。llm_agent_decision_flow 与 natural_memory_proactive_agent_flow 覆盖 LLM 决策、记忆和 proactive tick。justfilefmt、lint、test、typecheck 覆盖基础质量门禁。check-all 串起 Rust、contracts、boundaries、doc-context、前端 lint/test/build。dev-mcp-host、dev-agent、dev-web、dev-real 组织本地运行栈。scripts/generate-contracts.sh 与 check-contracts-clean.sh 保护 contract-first 流程。check-boundaries.sh 防止 Agent/Web UI 绕过 MCP/Core 边界。check-doc-context.sh 保证文档路由、skills 和上下文保留流程没有断链。米家接入与可扩展性
RealMiHomeAdapter 负责真实 Xiaomi 账号绑定、凭据加载、运行态凭据刷新、云端 inventory、MIoT spec、REST 写入和云端事件观察。
这些细节都留在 homent-core-mihome 内部。上层只看到 Entity、EntityState、EntityCapability、HomeContext 和 ActionResult。
如果以后接入新的设备来源,只需要实现 CoreAdapter,不必重写 Agent、MCP 或 Web UI。FakeMiHomeAdapter 和 RealMiHomeAdapter 共用同一个 trait, 所以 fake E2E 和真实验收走的是同一条产品路径。
新增 MiHome 控制能力也沿着这条路径扩展:先定义明确 ActionType,再由 CoreAdapter 映射到可写 MIoT property,
Runtime 负责风险与审批,Web UI 只在 capability 存在时显示控件。
意图-行动安全体系
这里不把“理解用户说什么”和“真的去写设备”放在一起。用户表达、模型规划、系统提案、策略裁决、设备写入和审计记录分成几步。 LLM 可以处理自然语言,但拿不到直接写设备的权限。
Agent Server 正常启动时使用 OpenAiCompatibleLlmPlanner。Planner 将 HomeContext 脱敏成 prompt-scoped aliases,
同时注入相关记忆、近期事件和 proactive 输入,要求模型输出结构化 JSON,并在 Runtime 内把别名映射回真实实体。
系统验证 entity alias、ActionType、参数类型、风险级别和目标设备可写能力。无效模型输出不会成为 pending action,更不会写设备。
当前仅允许低风险 light/switch power 与 light brightness 在策略通过时自动执行。温度、模式、色温、湿度、风速、窗帘位置和多步骤计划保持审批。
RealMiHomeAdapter 只有在 MIoT set 返回成功、刷新后的归一化状态也匹配目标值时,才把写入判为成功。
开发基础设施
这个项目还有一层工作:让 LLM Agent 能长期改这个仓库,而且每次都能找对边界、跑对检查、留下可追溯的上下文。
homent-doc-context 是所有非平凡工作的入口,约束先读路由文档和相关上下文;
homent-feature 管跨层需求,要求计划、评审、TDD、check-all 和验收;
homent-review 负责计划评审与提交前审查;
homent-debug 在 check-all、E2E 或集成失败时接管定位;
contracts、core、mcp、agent-runtime、web-ui 各有 owning skill,限制修改只能落在本层职责内。
SYSTEM.md 定系统目标,ARCHITECTURE.md 定依赖方向和边界,
CONTRACTS.md 定跨层模型语义,PLANS.md 定里程碑;
docs/README.md 是文档路由表;
plans/ 保存实施范围和状态;
docs/decisions/ 保存 ADR;
docs/agent/context-retention.md 规定上下文保留与交接。
普通需求要求从 main 开独立分支,先写顶层计划并通过 homent-review Plan Review Mode,再获得明确批准;
实现阶段按受影响层 TDD,结束跑 just check-all;
提交前做 Superpowers review 与 Homent pre-submit review;
UI 相关做 Browser/Chrome 验证,设备相关做可逆真实设备验收,最终合并回 main 后再次全量验证。
just 汇聚 fmt、lint、test、typecheck、contracts、check-contracts、check-boundaries、check-doc-context、check-remote、e2e、check-all 和 push-all;
scripts 保护 contracts clean 和 layer boundaries;
fake adapter、fake LLM endpoint 和 E2E 支撑不依赖真实云端的回归;
Browser/Chrome 用于真实 UI;
dev-real 串起 real MCP host、Agent Server 和 Web UI。
开发体系清单
这些文件和命令服务同一个目的:让 LLM 在复杂仓库里工作时,不丢边界、不忘事实,也不跳过验证。
homent-doc-context:选择本次任务需要读取的文档,决定经验应该沉淀到 plan、ADR、handoff 还是 skill。homent-feature:跨 contracts、Core、MCP、Agent、Web UI 的需求交付流程,约束计划、评审、TDD 与验收。homent-review:计划评审和提交前审查,重点检查层边界、合约漂移、设备写入安全和测试证据。homent-debug:接管 just check-all、E2E、集成失败和真实验收失败,要求先复现再修复。homent-contracts:维护 schema、Rust crate、TS package 与跨层语义一致性。homent-core-adapter、homent-mcp-server、homent-agent-runtime、homent-web-ui:分别约束设备协议、工具边界、Agent 决策和 UI 交互的 owning scope。writing-plans:把需求拆成可审查、可执行、可验证的实施计划。test-driven-development:先建立失败测试或缺口证据,再做最小实现。systematic-debugging:问题修复时先保留症状、复现、定位根因,避免猜修。receiving-code-review 与 requesting-code-review:把评审变成技术事实校验,不做表面同意。verification-before-completion:在声称完成前必须有命令、浏览器或真实设备验收输出。AGENTS.md:顶层架构、层边界、测试命令、交付规则和完成标准。docs/README.md:文档路由表,避免每次任务全量读取文档树。SYSTEM.md、ARCHITECTURE.md、CONTRACTS.md、PLANS.md:稳定系统事实。plans/0001-0017:feature plan、实施状态、验收证据和未完成上下文。docs/decisions/*:长期 ADR;docs/agent/context-retention.md 与 handovers 负责 Agent 续接。contracts/*.schema.json 是跨层协议源头;Rust 和 TypeScript 类型都从这里收敛。UserIntent 把用户表达结构化,避免 UI 直接构造设备写入。ActionProposal、ActionResult、ActionLogEntry 定义提案、执行结果和审计链路。AgentMemoryRecord 与 ProactiveTickResult 支撑长期记忆、主动轮询、习惯学习和可解释主动行为。ActionPlan 与 ScheduledAction 分别支撑多步骤动作编排和延迟一次性动作。AutomationPolicy 把自动执行、审批、拒绝、无动作写成显式策略,模型不能自由发挥。just fmt/lint/test/typecheck 覆盖基础格式、Rust lint/test 和前端类型检查。just contracts、check-contracts、check-boundaries 防止生成物漂移和层依赖越界。just check-doc-context 检查文档上下文链路,避免流程说明和执行入口脱节。just check-remote 与 just push-all 固化 GitHub remote 和分支备份要求,避免本地闭环无法交付。just e2e、just check-all 提供跨层回归闭环。dev-mcp-host、dev-agent、dev-web、dev-real 支撑 fake 到 real 的分级验收。check-all。homent-debug。关键文件解读
这几份文件处理的是 LLM 开发里最容易乱的事:下一次会话从哪里开始,哪些事实可信,经验放到哪里,哪些内容不能写进长期文档。 它们会参与 Agent 执行流程,不只是面向读者的说明文档。
.agents/skills/homent-doc-context/SKILL.mdAGENTS.md、docs/README.md,再按任务类型选择对应 owning skill 和相关设计文档。plans/,长期架构决定进入 docs/decisions/,未完成上下文进入 handover,可复用操作规程进入 skill。docs/README.mdSYSTEM.md,架构和层边界读 ARCHITECTURE.md,跨层模型语义读 CONTRACTS.md。docs/agent/context-retention.mdAGENTS.md:把四层架构、层边界、测试命令、交付流程和完成标准放在仓库入口,约束所有 Agent 工作。.agents/skills/homent-review/SKILL.md:定义 Plan Review 与提交前审查,重点看边界、合约、设备写入安全、测试证据和文档沉淀。justfile:把分散命令收敛成 fmt、lint、test、typecheck、contracts、e2e 和 check-all。scripts/check-doc-context.sh:验证文档路由、上下文保留规范和本地 skills 的引用没有断链。scripts/check-boundaries.sh 与 scripts/check-contracts-clean.sh:分别检查层依赖是否越界、合约生成物是否和 schema 源头保持一致。文档自迭代
这里不长期保存聊天记录。能留下来的只有验证过的工程事实: 根文档放系统事实,plans 放执行状态,ADR 放长期决策,skills 放可复用操作规程。
LLM 自闭环开发流程
这里说的“人在环外”只针对开发执行。人不逐步指挥每个实现动作,主要审查计划、边界和验收证据。 设备安全层面仍然保留人工审批和审计。
迭代进程、现状与未来
时间轴按当前 git 历史和 plans/0001-0017 整理。能看出系统如何从初始化、fake 闭环、真实米家、四层架构,
LLM 决策核心、记忆/主动 Agent,一路迭代到 delayed one-shot、动作计划、舒适偏好、习惯学习、记忆维护和 MiHome 动作扩展。
main 已包含 plans/0011-0017 的第一版能力:记忆进入 LLM planning、延迟一次性动作、多步骤动作计划、舒适偏好、习惯学习、记忆生命周期维护和扩展 MiHome actions。米家智能显示器挂灯1S 验证 set_power false -> true -> false 并恢复初始状态。set_color_temperature 做过真实路径验收:云端 set 返回成功但刷新状态未变化,CoreAdapter 正确判定失败,说明成功条件仍以观测状态为准。push-all。通过本地检查还不够,分支也要能同步到项目远端。这套设计的重点很直接:把 LLM 的不确定性放进确定的工程边界里。模型负责理解和建议,合约负责语义,Runtime 负责策略, MCP 负责写入边界,CoreAdapter 负责真实设备协议,测试和审计负责证明系统按设计运行。
这份分享可以收束到两件事:一条是 Agent 控制真实家居的运行链路,另一条是用 LLM Agent 开发复杂系统的工程方法。
本文基于当前仓库事实整理:SYSTEM.md、ARCHITECTURE.md、CONTRACTS.md、
README.md、docs/README.md、docs/agent/context-retention.md、
plans/0004-four-layer-runtime-flow.md、plans/0006-llm-agent-decision-core.md、
plans/0007-natural-memory-proactive-agent.md、plans/0008-webui-agent-optimization.md、
plans/0010-webui-ai-native-redesign.md、plans/0011-agent-memory-proactive-llm.md、
plans/0012-agent-multi-action-orchestration.md、plans/0013-expanded-mihome-actions.md、
plans/0014-delayed-one-shot-actions.md、plans/0015-contextual-comfort-preferences.md、
plans/0016-habit-learning.md、plans/0017-memory-lifecycle-maintenance.md、
docs/agent/intelligence-status.md、docs/decisions/*、各 crate/App README、E2E 测试与 justfile。
开发流程部分还参考了 .agents/skills/*、Superpowers 流程技能、AGENTS.md 中的交付规范,
以及 scripts/check-doc-context.sh、scripts/check-boundaries.sh、scripts/check-contracts-clean.sh 等验证脚本。