构建治理约 12 分钟

EDPAgent 与 AgentRule

规则驱动的动态规划智能体:业务范围、规划步骤、执行上限、总结格式写进一份规则文件,由 Rail 在运行时强制执行。

依据 agent-solution 0.1.3 · main@bf702bc9(2026-11-03)核实

把规则从提示词里拿出来

很多智能体把"能做什么、不能做什么、最多试几次"全写在提示词里,然后祈祷模型遵守。EDPAgent(动态规划智能体参考实现)换了个做法:规则写在一份 AgentRule.md 里,分成两部分。

部分去向例子
YAML 头解析成配置对象,由 Rail 强制执行迭代上限、单工具调用上限、中断超时
Markdown 正文注入系统提示词,指导模型行为规划规约、超范围时怎么回应
源码AgentRule.mdagent-solution/common/agents/edp-agent-python/AgentRule.md@bf702bc9

能用代码强制的就不交给模型,交给模型的也写得明确、可检查。

六项规则

规则内容
1 业务范围允许做什么、超范围时的提示
2 规划步骤需求解析 → 目标拆解 → 方案生成 → 规则校验 → 结果输出
3 任务依赖结构化依赖声明(预留)
4、5 执行限制最大迭代次数、用户补充输入的最大尝试次数、中断超时、每种工具的调用上限
6 总结格式总结结构、最大长度、必填字段

另有一份话术配置(ScriptsConfig.md)。业务场景则放在 skills/scenarios/ 下的场景文件里,用环境变量切换当前场景——仓库自带的示例场景是理财业务,换成交期承诺只需要再写一份场景文件。

说明

场景文件的写法本站没有逐项核实,这里只说明规则文件与场景文件的分工。

Rail 把规则变成硬约束

limits 一节由两个 Rail 执行:

Rail时机做什么
IterationLimitRail每次工具调用后累加计数,达到 max_iterations 就请求强制结束
ExecutionLimitRail每次工具调用前按工具名计数,某个工具达到上限就请求强制结束
源码IterationLimitRailagent-solution/common/agents/edp-agent-python/rail/iteration_limit_rail.py:17@bf702bc9

两者都用 agent-core 的 request_force_finish,结束原因带类型(如 iteration_limit_exceeded),前端和日志能区分"正常完成"和"被上限截停"。

此外还有 AskUserRail 负责人机交互中断:ask_user 工具触发中断,状态存进 Redis,用户回复后续轮;支持终止关键词、超时和次数限制。

运行拓扑

EDPAgent 跑在 agent-runtime 的 A2A 服务里(上一个模块讲过),面向客户端;需要调用低代码平台的流程时,通过一个 A2A 适配服务转发。会话状态和断点存 Redis,模型走 OpenAI 兼容接口。

源码EDPAgent READMEagent-solution/common/agents/edp-agent-python/README.md@bf702bc9

小结

  • 规则文件分两半:配置由 Rail 强制执行,正文进提示词。
  • 迭代上限、单工具上限都在工具调用前后计数,超限强制结束并注明原因。
  • 业务范围、步骤、话术、场景拆成独立文件,换业务不改代码。

源码出处

链接指向固定提交,仓库后续更新不影响这里的行号。

过关测验

  1. 1. AgentRule.md 里的 limits.max_iterations 是靠什么生效的?

  2. 2. 用户的请求超出当前业务范围时,EDPAgent 要求模型怎么做?

通关条件

  • ○ 测验全部答对