Agent 系列(20):Harness 实战——从单文件到生产级模块包

发布时间:2026/6/14 14:26:14

Agent 系列(20):Harness 实战——从单文件到生产级模块包 从演示代码到可复用包Article 19 用一个 900 行的harness_full_demo.py演示了 8 层防护。这个文件足够说明概念,但不适合复用:所有层耦合在一起,无法单独测试,无法被其他项目引用。生产级 Agent 项目需要的是一个可以import的包:harness/ ├── __init__.py 公共 API 导出 ├── registry.py Layer 2:ActionRegistry + PermissionLevel ├── budget.py Layer 3:PermissionBudget(含 refund()) ├── sandbox.py Layer 4:sanitise_input + sandboxed_eval ├── audit.py Layer 6:ImmutableAuditLog(哈希链) ├── rollback.py Layer 7:RollbackCoordinator └── harness.py 统一入口:AgentHarness本文从包设计开始,覆盖三个关键 API 决策,最后展示两种集成方式:纯 Python standalone 和 LangGraph 图嵌入。模块设计registry.py — Layer 2classPermissionLevel(Enum):READ=1WRITE=2ADMIN=3IRREVERSIBLE=4@dataclassclassRegisteredAction:name:strlevel:PermissionLevel budget_cost:intdescription:strhandler:Any# Callable 或 BaseToolclassActionRegistry:defregister(self,action:RegisteredAction)-None:...defget(self,name:str)-RegisteredAction:...# 不存在 → PermissionErrordefis_allowed(self,name:str)-bool:...defnames(self)-list[str]:...get()而非__getitem__:统一抛出PermissionError,不暴露 KeyError 内部细节。budget.py — Layer 3classPermissionBudget:defspend(self,action_name:str,cost:int)-None:ifself.remainingcost:raiseBudgetExhaustedError(...)self.remaining-=costdefrefund(self,action_name:str,cost:int)-None:self.remaining=min(self.total,self.remaining+cost)新增refund():Article 19 中预算在审批前扣除、被拒绝后不退还。生产包修正了这个设计——IRREVERSIBLE 操作被拦截时,harness.py主动调用refund(),保持预算精度。sandbox.py — Layer 4INJECTION_PATTERN=re.compile(r"(ignore.*(previous|above|prior)|forget.*instruction|"r"you are now|act as|jailbreak|bypass|"r"override.*system|system.*override|"# 两种词序都覆盖r"/s|\n\n###|###\s*system|\|im_start\||system prompt)",re.IGNORECASE,)注意两个细节:同时覆盖SYSTEM OVERRIDE(system 在前)和override.*system(override 在前)\n\n###匹配真实换行,不是字面量\\n\\n###这两个 bug 在 Article 21 的对抗测试中被发现并修复。audit.py — Layer 6clas

相关新闻