AI DAILY / 2026-09-10
Agent2:面向编码与安全任务的自主智能体开源项目
aaravshah1311/Agent-2
全文中文翻译 · AI 生成,仅供学习交流
aaravshah1311/Agent-2
自主循环:理解(understand)→ 检视(inspect)→ 发现技能(discover skills)→ 规划(plan)→ 执行(execute)→ 观察(observe)→ 分析(analyze)→ 验证(verify)→ 重新规划(re-plan)。第四个 DAG 消费者(DAG,Directed Acyclic Graph,有向无环图)。入口只有两扇,且都是显式的。core/ultracode/Verification「完成」不等于验证。从持久化的账本里抽出五条裁决,因为 agent_tasks.status 是由被评判的对象自己写入的。core/verify.py技能.agent2/skills/ 下的指令文件,每次请求按五个层级选取。不是每个提示词都装入所有技能,且没有任何写入 API 能触达包内目录 core/skills/。
项目文档 / 初始化
遍历项目,读取自身注释里对项目的描述,再写入 .agent2/agent2.md,后续每条提示词都将其作为事实读回。
core/projectscan.py、core/projectdoc.py健康检查
一次聚合装配就能回答「它是否在工作」,由 /health 和 GET /api/health 读取。十四个章节,每节都由持有该事实的读取方投影而成。core/health.py指标
十三个信号,挂在已有的单写入者卡点处。其中三个是借来的,第二个漂移副本因此不会出现。core/metrics.py跨进程同步
notify() 在进程内同步发布;SyncPoller 把另一个进程改动过的内容重新发布出去。core/sync.py个人智能层
完全离线的预测、可选启用的语法、可选启用的提示词增强。无网络,不重训。core/pil/文件智能
通过一个路由器加一套插件,识别、转换并处理真实的文件格式。
fileintel/MCP
桥接 Burp Suite(:9876,SSE)与 OWASP ZAP(:8282,先探测 streamable HTTP 再回退 SSE)。两者默认都不自动连接。
integrations/个人智能层
共享同一份记忆和同一套被动学习引擎的三个模块,全程离线。
- 预测,trie/前缀(prefix)+ n-gram + 短语级幽灵文本(phrase ghost-text)。永不调用 LLM(Large Language Model,大语言模型)。
- 语法(默认关闭),确定性规则,遮蔽技术片段、纠错、再原样还原。
- 改进(默认关闭),只加入权重高于阈值的偏好。绝不凭空捏造需求。
学习是 SQLite 中的权重调整,而非模型训练。接受 +0.08,忽略 −0.03,接受后又删除 −0.20。两个代理循环都用原文学习,并送出处理后的副本;历史记录与展示界面保留原文。
POST /api/pil/wipe 是「忘了我」的入口。每个函数都吞掉异常,返回安全默认值。PIL 失败时降级为「什么也不做」。
🔐 安全姿态
Agent-2 为安全研究而生,这带来两重义务,工具必须真正能打,代理必须真正受限。两套相互独立的系统,由相互独立的角色维护。
谁能触达 Web 界面,server/auth.py。一个决策函数 decide(),以单个 before_request 钩子形式安装,因此任何接入该 API 的应用都自带守卫。模式来自 AGENT2_WEB_AUTH,可选 auto(loopback 受信,其他一律需令牌)、always off。Socket.IO 握手不经过 Flask 的 before_request,因此 sockets.on_connect 自行调用 socket_allowed()。run_raw_command 是 socket 事件,若只守卫 /api/*,所有读取接口会被锁死,而 shell 仍敞开着。Origin 检查对不安全方法先于身份检查执行,因为 loopback 信任无法分辨「自己的标签页」和「偶然打开的页面」。访问令牌仅驻内存;web_sessions 仅存储其 SHA-256 摘要,所以拷贝走的 agent2.db 一无可用。
一个身份能做什么,core/permissions.py。角色,owner(默认)、operator(可驱动代理,不得触碰凭据或 MCP 端点)、viewer(只读)。
AGENT2_WEB_ROLE 描述 Web 客户端;AGENT2_DENY_CAPS 从本进程(含 CLI)的能力中扣除。未知角色回退为 viewer,绝非 owner;未映射的变更类 API 路由回退为 destructive。两个回退方向都指向更严格的一端。
凭据如何存储,core/secrets.py。凭据以 a2s: 引用形式持久化,永远不存真值,且只占用恰好三列。后端按优先级,操作系统钥匙串(仅当一次探测往返真正成功时)、AES-256-GCM 或基于标准库的 BLAKE2b+HMAC 构造、明文(会对外通告)。
resolve() 对非引用原样放行,因此所有遗留行继续可用;seal() 读回自己刚写入的内容,而非让调用者持久化一个悬空引用。主密钥默认位于 ~/.agent2/secret.key,刻意放在 DB 目录之外。一把与 agent2.db 摆在一起的主密钥,会随每次数据库的拷贝一同泄露。诚实交代,本方案只防御「单独泄露数据库」这一情形,describe() 也在自身返回内容里如实说明。
掩码是常量。
••••••••,其长度并非由密钥派生。旧的 k[:6]…k[-4:] 写法会把一个十位 ZAP 密钥的大部分打印出来。
项目刻意不提供「跳过 TLS 验证」的开关。
在安全工具的控制通道上默默信任任何证书,正是本项目拒绝交付的那种无声降级。
安全测试
run_command 支持真实的工具链,包括 nmap、nikto、gobuster、ffuf、sqlmap、hydra、metasploit、searchsploit、theharvester、binwalk、strings、volatility。
当 Burp 已连接时,burp_* 工具可驱动代理历史、Repeater、Intruder、Scanner 与站点地图。
两条命令杀停上限默认均为关闭,只有「卡住报告」默认在 20 秒时启用。
一次安全扫描本应静默二十分钟;默认超时会把一次合法的 nmap -p- 全端口扫描中途杀掉,把一份被截断的结果丢给模型,而模型根本认不出它已经被截断了。
⚙️ 配置
所有状态都在 agent2.db 中,绝不在 .env 文件里。
config.DB 是该路径的唯一事实来源。环境变量只覆盖必须在数据库打开之前做出的决策;共 116 个,完整文档见「环境变量」一节。最常被设置的几个:
| 变量 | 默认值 | 作用 |
|---|---|---|
| AGENT2_DB | 项目根目录 | agent2.db 的存放位置(Docker 中为 /data) |
| AGENT2_LOG_DIR | <db dir>/logs | 所有日志所在的目录 |
| AGENT2_HOST / AGENT2_PORT | 0.0.0.0 / 首选端口 | 绑定地址 / 首选端口。服务器在端口被占时不会硬失败,请读取它实际回报的端口 |
| AGENT2_WEB_AUTH | auto | 可选 auto、always off。仅由环境变量控制,因为把 off 存入数据库等同于一次持续存在的静默降级 |
| AGENT2_WEB_TOKEN | per-process | 远程客户端的访问令牌。绝不落盘 |
| AGENT2_WEB_ROLE | owner | Web 客户端的能力,可选 owner、operator、viewer |
| AGENT2_DENY_CAPS | — | 从整个进程(含 CLI)扣除的能力 |
| AGENT2_CMD_TIMEOUT | (关闭) | 执行上限,单位秒。设计上默认关闭 |
| AGENT2_CMD_STUCK_SEC | 20 秒 | 经过该静默时长后上报命令(永不杀停) |
| AGENT2_MODEL_ROUTING | — | 可选 off、default_only、always。默认留空,以便存储的设置生效 |
| AGENT2_SECRET_KEY_FILE | ~/.agent2/secret.key | 主密钥位置,刻意放在 DB 目录之外 |
| BURP_MCP_URL / ZAP_MCP_URL | :9876 / :8282 | MCP 端点,作为兜底;存储的 mcp_config 行会优先 |图族有自己的上限,每一条都会主动上报、绝不静默:
| 变量 | 默认值 | 作用 |
|---|---|---|
| AGENT2_SKILLS_IN_PROMPT | — | .agent2/skills/ 的总开关,一个提示词最多可装入多少个技能。「并非每个提示词都装入每个技能」的衡量基准 |
| AGENT2_WORKFLOWS_MAX_NODES | — | 总开关,单个工作流可声明的节点数。直接拒绝,绝不截断。一张缺了最后一节点的图,其依赖关系将无法闭合 |
| AGENT2_DAG_MAX_WORKERS_MAX_RUNNING | — | 泵可使用的线程数(节点以内联方式一次跑一个)、同时在飞的节点数。两个数字,是因为 in-flight 由行派生而来,且会统计其他进程的领用 |