分层化、模块化设计优先
系统把设备协议、能力暴露、Agent 决策、人机交互和跨层合同分开。每一层都能被替换、被测试、被复用: fake adapter 支撑确定性测试,real adapter 支撑真实米家,MCP 工具层屏蔽设备协议,Agent Runtime 不知道 MiHome 细节。
把 LLM Agent 接入真实米家设备,并用工程边界约束它的行动
这不是一个单纯的智能家居面板,而是一套 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,并生成 action result 与 action log。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 返回成功且刷新后的归一化状态匹配目标值。
开发基础设施
这一部分是项目的另一个重点:Homent 不只是在开发一个 Agent,还把“如何让 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 源头保持一致。文档自迭代
Homent 的自迭代不是把聊天记录长期保存,而是把已验证的事实放进稳定位置: 根文档保存系统事实,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 规则:闭环不仅停在本地通过,还要求可回滚、可同步到项目远端。Homent 的核心价值在于把 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 等验证脚本。