一、为什么要做“治理优先”的编码Agent?
当下不少代码Agent实现,把重心放在提升模型生成效果上:Prompt调优、复杂多轮对话、更多工具调用。但工程落地时会遇到一堆现实痛点:
- AI随意修改项目内无关文件,改动范围不可控;
- 模型调用失败降级后静默假成功,用户以为任务完成实际什么都没产出;
- 生成语法错误的坏代码直接写入工程,引发连锁故障;
- 任务卡死、状态错乱,异常直接抛出500,没有审计与排查线索;
- Token、运行时长无管控,长任务成本不可控。
AICodeX 的核心立场:没有护栏的能力,不接入主流程。
它不是简单包装大模型API,而是一套完整工程系统,强制闭环:规划→执行→校验→修复重试,同时叠加权限、熔断、沙箱、审计全套治理能力。整套设计遵循四条核心原则:
- 治理优先于能力:能生成代码,不等于可以随便生成代码;
- 模型驱动 + 规则兜底:模型正常走模型;密钥缺失、调用失败自动切规则降级,并且降级行为对用户显式可见,绝不静默假成功;
- 白盒可观测:全部关键动作经由事件总线广播,前端实时展示,审计日志落库;
- 最小权限:文件写入受锁定清单、路径沙箱双重约束,越权直接拒绝。
二、五层分层架构:所有任务统一走Supervisor入口
系统自上而下分为五层,依赖单向向下,所有任务必须经过监督调度层supervisor单例,从流程层面锁死执行顺序,避免多任务互相串扰。
┌─────────────────────────────────────────────────────────────┐
│ 接入层 REST接口 / WebSocket长连接 │
├─────────────────────────────────────────────────────────────┤
│ 监督调度层 Supervisor(六态状态机、编排、护栏、变更暂存) │
├─────────────────────────────────────────────────────────────┤
│ 智能体层 Planner / Designer / Deployer / Executor / Verifier │
├─────────────────────────────────────────────────────────────┤
│ 工具与中间件 工具注册中心、原子写入、路径沙箱、语法校验等 │
├─────────────────────────────────────────────────────────────┤
│ 基础设施层 模型路由、上下文管理、知识图谱、事件总线 │
└─────────────────────────────────────────────────────────────┘
几个关键设计细节:
1. 大量核心组件(调度器、各个智能体、模型路由、工具注册中心、事件总线等)采用模块级单例,避免跨任务调用串扰,熔断器、审计逻辑只需要一次绑定;
2. 事件总线是整个系统可观测的基石,进程内发布订阅,全链路关键事件向外广播,供给审计日志、监控指标、前端实时面板、WebSocket推送;
3. 接入层同时支持REST同步调用与WebSocket流式推送,两套入口最终复用同一套调度逻辑,保证行为一致性。
三、六态状态机:把编码任务变成可控的状态流转
AICodeX用一套六态有限状态机定义任务完整生命周期,定义文件:app/core/orchestration/state_machine.py。
| 状态 | 含义 |
|---|---|
| IDLE | 任务空闲 |
| PLAN | 规划中 |
| EXEC | 代码执行落盘 |
| VERIFY | 后置校验 |
| DONE | 正常完成(终态) |
| CANCELLED | 取消/熔断终止(终态) |
合法状态转移规则:
IDLE → {PLAN, CANCELLED}
PLAN → {EXEC, PLAN, CANCELLED} # PLAN→PLAN支持重新规划
EXEC → {VERIFY, CANCELLED}
VERIFY → {DONE, EXEC, CANCELLED} # 校验失败自动回退EXEC修复重试
DONE → {}
CANCELLED → {}
非法状态转移会直接抛出IllegalTransitionError,杜绝流程错乱。
执行闭环逻辑:规划完成直接进入执行,没有人工审核计划的中间状态。执行完成自动进入校验;校验不通过,会自动回到执行阶段做修复,最多重试
governance.verify_retry_max次(默认2次),重试耗尽直接置为CANCELLED,防止死循环。
核心循环伪代码:
while True:
supervisor.execute() # Executor执行落盘
if state in (CANCELLED, DONE):
return 终止报告
report = supervisor.verify() # Verifier后置校验
if report.passed or not verification_retryable:
return report
# 校验失败,回到EXEC自动修复
REST和WebSocket两套入口,都会跑这套闭环,保证行为统一。
四、多智能体分工:不同任务,走不同智能体链路
系统内置5个智能体,各司其职,不会让同一个Agent既做架构设计、又写代码、又做校验。任务类型TaskType决定智能体执行路径:
| 任务类型 | 触发场景 | 智能体链路 |
|---|---|---|
| SIMPLE_QA | 普通问答 | 直接模型回答,不走代码生成闭环 |
| CODING | 编码修改、新增代码 | Planner → Executor → Verifier |
| ARCHITECTURE | 架构设计需求 | Designer → Planner → Executor → Verifier |
| DEPLOYMENT | 部署配置任务 | Deployer → Planner → Executor → Verifier |
4.1 四层意图判定链
不再使用简单关键词分类,采用L0~L3四层判定链:
- L0极速通道(规则):寒暄、确认类指令直接识别为普通问答,省去模型调用;
- L1模型主判:模型输出意图、关键词、符号、文件路径;
- L2规则降级:模型不可用的时候,规则打分兜底,保证无密钥环境也可以跑;
- L3澄清:信息不足,向前端推送澄清卡片,而不是粗暴归为普通问答。
识别出来的文件路径、符号直接喂给代码知识图谱做召回,帮助Agent理解现有代码库。
4.2 各个智能体核心职责
Planner(规划智能体)
只输出结构化计划,不调用任何工具执行代码;低温度保证输出确定性。强制每个会产出文件的步骤必须写明目标文件,缺失会重试+正则补全。同时结合知识图谱召回现有代码,让AI知道应该改哪些文件。模型故障时回退规则模板,并且显式标记降级。
Designer / Deployer(专家智能体)
在Planner之前运行,输出架构/部署文档落盘到工作区docs目录;系统强制保证设计产出必须有对应的落盘步骤,避免“只输出思考,不产出文件”。
Executor(执行智能体)
只能修改计划阶段锁定清单内的文件,越权直接拒绝。生成代码后先做语法预检,预检失败直接放弃落盘,返回错误,不让语法错误的坏文件污染工程。单步执行失败不会杀死整个任务,标记失败继续跑后续步骤。
Verifier(校验智能体)
对所有变更文件做校验:检查文件是否生成、Python/JS语法是否合法;校验结果驱动自动修复重试,达到重试上限终止任务。
五、整套护栏体系:治理能力是怎么落地的
这是AICodeX区别普通Agent最核心的部分,多层防护同时生效。
1. 任务文件锁定 LockedFileSet
规划阶段输出本次任务允许修改的文件清单,Executor只能修改清单内文件,禁止触碰项目其他文件;任务结束自动清空锁定集合。执行过程新增文件可以动态加入锁定集合。
2. 超控熔断 BudgetGuard
双重阈值保护任务成本:
- 时长阈值:单任务最长执行时间,默认600秒超时;
- Token阈值:软阈值触发警告;硬阈值触发暂停。
软提醒机制:触发熔断不会直接杀掉任务,而是暂停,向前端推送BUDGET_EXCEEDED事件,等待用户确认继续还是终止;用户无应答兜底终止,兼顾安全和灵活性。
3. 路径沙箱 PathSandbox
全部文件操作统一经过沙箱校验,限制在工作区根目录以内,拦截../路径穿越攻击;服务端/fs/*文件接口复用同一套沙箱逻辑,不会出现接口和Agent两套校验逻辑不一致。
4. 原子写入 AtomicWriter
写入流程:生成临时文件 → fsync刷盘 → os.replace原子替换。防止进程崩溃造成文件半写损坏;区分文件和目录,特殊文件名白名单放行。
5. Schema参数校验
基于Pydantic v2强校验所有工具入参,拦截危险路径;全部工具调用返回标准化ToolResult,统一错误码,前端可以友好展示错误信息。
6. 故障韧性设计
- 链路异常不返回500,返回结构化错误,同时复位状态机,避免任务卡死;
- 降级模式下的产物会被校验器识别,不会判定为任务成功,避免假性成功;
- 编码任务没有产出任何文件,直接报错提示,防止静默失败;
- 重试次数硬上限,避免校验修复进入无限死循环。
六、模型路由与知识图谱
模型路由 model_router
不同任务类型默认绑定不同优先级模型,同时支持自定义模型端点。候选模型按顺序自动降级,单模型连续失败达到阈值会临时熔断,全部熔断后重置放行主模型。每次模型调用统计Token,对接预算熔断器。
配置
config.yaml的model.base_url即可开启自定义端点模式,所有任务统一走自定义LLM服务。
代码知识图谱kg工具集
把代码索引封装成标准工具,Agent通过工具注册表调用语义检索、符号查询、调用关系分析;图谱不可用时自动降级,不会阻断主流程;同时限制扫描文件数量、上下文长度,防止上下文爆炸。
七、可观测性:事件总线、审计与监控
系统一共定义22种事件,覆盖任务全生命周期:任务启停、状态变更、意图识别、规划结果、工具调用、模型调用、校验结果、预算超限、异常报错等。
事件发布前自动做敏感信息脱敏,防止API密钥、密码泄露。事件订阅方包括:
1. 审计模块:事件落库,支持事后回溯审计;
2. Metrics指标:对外暴露Prometheus监控;
3. WebSocket网关:向前端实时推送,实现过程可视化;
4. 本地Dashboard快照接口。
配套接口:健康检查、指标接口、任务状态查询、变更暂存管理、会话管理、任务取消接口、文件操作接口等,同时支持REST和WebSocket两套交互方式。
八、记忆、配置与测试保障
- 用户记忆偏好:系统会提取用户长期编码偏好(例如习惯Python、需要详细注释),生成阶段注入模型System Prompt,问答链路、Agent编码链路分别处理。
- 核心配置:全部集中在
config.yaml,工作区根目录、超时时间、Token阈值、重试次数、沙箱白名单等均可调整;密钥建议通过环境变量注入,配置文件加入gitignore,避免密钥泄露。 - 测试保障:内置完整测试套件,包含端到端冒烟测试、故障韧性测试,全量316个用例全部通过,覆盖降级、语法错误、异常复位、规划强制带目标文件等边界场景。
项目也明确说明已经裁撤的模块:原Web应用生成器、进程级执行沙箱,属于零调用死代码,直接移除,减少维护负担。
九、简单看一遍REST模式完整时序
用户输入需求,到系统输出结果的完整流程:
1. 用户提交需求,前端发起POST /messages;
2. 服务端交给Supervisor启动任务,进入PLAN状态;
3. 若为架构/部署任务,先运行Designer/Deployer专家智能体;再运行Planner输出结构化规划,锁定本次修改文件;
4. 调度器驱动Executor执行,原子写入变更文件;
5. Verifier执行校验,语法、文件存在性检查;
6. 校验失败自动回到EXEC阶段修复,达到重试上限终止;校验通过置DONE;
7. 将报告返回前端,同时全流程事件被审计落库。
十、总结思考:Agent编码工程化的启示
AICodeX这套系统给我们一个启示:AI编码Agent的工程落地,难点不完全在于大模型本身,更多在于外围治理体系。
当我们只把Agent理解成“调用大模型+调用工具”,很容易忽略状态管控、权限隔离、异常兜底、可观测审计这些工程要素,上线之后就会遇到乱改文件、静默失败、任务失控等线上问题。
AICodeX的设计选择:
1. 用状态机把任务流程锁死,禁止非法流转;
2. 文件锁定+沙箱+原子写入,多层防护代码库安全;
3. 校验+自动修复闭环,同时设置重试上限,兼顾自动化与防死循环;
4. 模型降级必须显式,拒绝静默假成功;
5. 事件总线做全链路白盒可观测,所有行为可审计可排查。
当然这套方案也有取舍:增加治理层带来一定的系统复杂度;没有保留进程内Shell执行沙箱,放弃命令执行能力,换来了更高安全性。
如果你在做AI编码Agent相关开发,这套白皮书和源码可以作为一份不错的工程参考基线。