Skip to content

Agently Talk to Control

项目链接

定位

这是一个基于 Agently v4 的“自然语言 -> 控制动作”示例项目。它适合回答这类问题:

  • 用户的话能不能直接根据当前状态回答
  • 如果不能,是否需要拆成一组有顺序的控制动作
  • 如果也不能安全执行,应该如何拒绝并给出建议

和普通聊天 demo 不同,它把状态读取、动作规划、控制执行、拒绝分支、流式回显放进了同一个运行时。

1. 项目分层

如何理解这套结构

  • app.py 只负责 UI 与执行入口,不把控制逻辑塞进界面层。
  • workflows/talk_to_control.py 是 owner layer,负责真正的判断、编排与状态更新。
  • SETTINGS.yaml 同时描述模型配置、设备初始状态和控制器注册信息。
  • controllers/ 只承载具体动作,不负责路由与规划。

2. 运行态主链路

关键点

  • 第一步不是直接调控制器,而是先判断这条请求属于直接回答 / 执行动作 / 拒绝请求哪一路。
  • RunActionStage 会按资源冲突关系切分 stage;互不冲突的动作可在同一 stage 并行执行。
  • Finalize 统一负责整理 transcript、设备状态和已完成动作列表。

3. 它在 Agently-Skills 视角下用了什么

能力层对应 skill项目中的体现
顶层问题路由agently-playbook整个项目先判断“回答 / 执行 / 拒绝”哪条路径才是 owner path
结构化规划与动作参数生成agently-output-control规划请求和动作请求都通过结构化字段与 ensure_keys 保持接口稳定
单次响应的流式消费agently-model-response使用 get_response() + instant 流式把计划预览和拒绝理由提前推到 UI
显式控制流与阶段执行agently-triggerflowDirectReplyCannotDoRunActionStageFinalize 这些事件分支都由 TriggerFlow 驱动
模型与环境配置agently-model-setupAGENT_SETTINGS${ENV.xxx} 配置约定使模型接入和环境变量加载保持清晰边界

4. 为什么这个案例值得单独放进文档站

  • 它不是“模型返回一个 JSON 然后调用函数”这么简单,而是一个完整的控制型 workflow。
  • 它同时覆盖了结构化规划流式回显显式状态更新阶段级并行执行
  • 它证明了“自然语言控制”并不一定先从自定义 agent wrapper 开始,而可以沿着 Agently 的原生能力边界搭起来。

5. 扩展路径

如果你要把这个项目扩到更多设备或控制动作,最直接的路径是:

  1. SETTINGS.yaml 中补设备初始状态与控制器描述。
  2. controllers/ 中补控制函数。
  3. 如果开始出现审批、等待恢复、外部事件驱动或更复杂的阶段依赖,再继续往 TriggerFlow 章节深化。

对应阅读建议: