EDPAgent 与 AgentRule
规则驱动的动态规划智能体:业务范围、规划步骤、执行上限、总结格式写进一份规则文件,由 Rail 在运行时强制执行。
依据 agent-solution 0.1.3 · main@bf702bc9(2026-11-03)核实
把规则从提示词里拿出来
很多智能体把"能做什么、不能做什么、最多试几次"全写在提示词里,然后祈祷模型遵守。EDPAgent(动态规划智能体参考实现)换了个做法:规则写在一份 AgentRule.md 里,分成两部分。
| 部分 | 去向 | 例子 |
|---|---|---|
| YAML 头 | 解析成配置对象,由 Rail 强制执行 | 迭代上限、单工具调用上限、中断超时 |
| Markdown 正文 | 注入系统提示词,指导模型行为 | 规划规约、超范围时怎么回应 |
能用代码强制的就不交给模型,交给模型的也写得明确、可检查。
六项规则
| 规则 | 内容 |
|---|---|
| 1 业务范围 | 允许做什么、超范围时的提示 |
| 2 规划步骤 | 需求解析 → 目标拆解 → 方案生成 → 规则校验 → 结果输出 |
| 3 任务依赖 | 结构化依赖声明(预留) |
| 4、5 执行限制 | 最大迭代次数、用户补充输入的最大尝试次数、中断超时、每种工具的调用上限 |
| 6 总结格式 | 总结结构、最大长度、必填字段 |
另有一份话术配置(ScriptsConfig.md)。业务场景则放在 skills/scenarios/ 下的场景文件里,用环境变量切换当前场景——仓库自带的示例场景是理财业务,换成交期承诺只需要再写一份场景文件。
场景文件的写法本站没有逐项核实,这里只说明规则文件与场景文件的分工。
Rail 把规则变成硬约束
limits 一节由两个 Rail 执行:
| Rail | 时机 | 做什么 |
|---|---|---|
IterationLimitRail | 每次工具调用后 | 累加计数,达到 max_iterations 就请求强制结束 |
ExecutionLimitRail | 每次工具调用前 | 按工具名计数,某个工具达到上限就请求强制结束 |
两者都用 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 强制执行,正文进提示词。
- 迭代上限、单工具上限都在工具调用前后计数,超限强制结束并注明原因。
- 业务范围、步骤、话术、场景拆成独立文件,换业务不改代码。
源码出处
- agent-solution/common/agents/edp-agent-python/README.md能力一览与运行拓扑
- agent-solution/common/agents/edp-agent-python/AgentRule.md六项规则:YAML 头 + 提示词正文
- agent-solution/common/agents/edp-agent-python/agent_rule.py:271
def load_agent_rule解析规则文件 - agent-solution/common/agents/edp-agent-python/rail/iteration_limit_rail.py:17
class IterationLimitRail全局迭代上限 - agent-solution/common/agents/edp-agent-python/rail/execution_limit_rail.py:57
class ExecutionLimitRail单个工具的调用次数上限
链接指向固定提交,仓库后续更新不影响这里的行号。
过关测验
1. AgentRule.md 里的 limits.max_iterations 是靠什么生效的?
2. 用户的请求超出当前业务范围时,EDPAgent 要求模型怎么做?