EvoAgent 是一个面向 Pull Request 的自进化审查与安全修复平台。它把任务生命周期、预算、失败恢复和审计放在 Harness 中,把具体能力封装为可替换的 Skill。
当前支持:
- 审查统一 diff,输出结构化问题、修复建议和测试建议
- GitHub
pull_requestwebhook(opened、reopened、synchronize) - OpenAI 兼容模型;未配置模型时自动使用确定性的本地规则审查器
- SQLite 保存任务状态、执行轨迹和最终报告
- JSON API 与 Markdown 报告
- webhook HMAC-SHA256 签名校验,以及可选的 GitHub PR 评论回写
- Web 管理台、任务 Dashboard 与 Prometheus 指标
- 安全、可靠性、AI 和动态 Skill Agent 并行协作
- 独立分支上的保守型自动修复提交
- PostgreSQL、Redis 生产模式
- 失败案例回流、提示词评测、版本激活与回滚
- LangGraph 节点编排、持久化 checkpoint 与任务断点续跑
- Redis Streams ACK、Worker 租约、指数退避重试和死信队列
- Webhook delivery 幂等、重放时间窗与评论 upsert
- 用户登录、RBAC、租户/仓库隔离和不可变管理审计
- 动态 Skill manifest 校验、签名校验和隔离进程沙箱
- 自动修复后的编译/测试门禁、灰度发布与影子流量
- OpenTelemetry Trace、Prometheus 指标和持久化告警
项目使用 Python 3.11。先安装锁定范围内的运行依赖,并配置本地管理员:
python -m pip install -r requirements.txt
$env:EVOAGENT_AUTH_SECRET = '<至少 32 字节随机值>'
$env:EVOAGENT_BOOTSTRAP_ADMIN_USERNAME = 'admin'
$env:EVOAGENT_BOOTSTRAP_ADMIN_PASSWORD = '<至少 10 个字符的密码>'
python -m evoagent服务默认监听 127.0.0.1:8080。启动后打开 http://127.0.0.1:8080/ 登录管理台。API 先登录并携带 Bearer Token:
$session = Invoke-RestMethod -Method Post -Uri http://127.0.0.1:8080/v1/auth/login `
-ContentType 'application/json' `
-Body (@{username='admin'; password='<你的密码>'} | ConvertTo-Json)
$headers = @{Authorization="Bearer $($session.access_token)"}
Invoke-RestMethod -Method Post -Uri http://127.0.0.1:8080/v1/reviews `
-Headers $headers `
-ContentType 'application/json' `
-Body (@{
repository = 'demo/api'
pull_request = 12
diff = "diff --git a/app.py b/app.py`n--- a/app.py`n+++ b/app.py`n@@ -1 +1,2 @@`n+password = 'secret'`n+eval(user_input)"
} | ConvertTo-Json)查询任务:
Invoke-RestMethod -Headers $headers http://127.0.0.1:8080/v1/tasks/<task-id>
Invoke-WebRequest -Headers $headers http://127.0.0.1:8080/v1/tasks/<task-id>/report运行测试:
python -m unittest discover -s tests -v默认 EVOAGENT_LLM_PROVIDER=local,此时只运行确定性的本地规则 Agent,不会调用大模型。
DeepSeek 官方 API(按 Token 计费):
$env:EVOAGENT_LLM_PROVIDER = 'deepseek'
$env:EVOAGENT_DEEPSEEK_API_KEY = '<deepseek-api-key>'
python -m evoagent通过 OpenRouter 使用有速率限制、可用性可能变化的 DeepSeek 免费模型:
$env:EVOAGENT_LLM_PROVIDER = 'openrouter-deepseek-free'
$env:EVOAGENT_OPENROUTER_API_KEY = '<openrouter-api-key>'
python -m evoagent如果指定的免费 DeepSeek 版本下线,可将 EVOAGENT_LLM_MODEL 改为 OpenRouter 当前提供的其他 :free 模型,或把 Provider 改为 openrouter-free 让免费路由自动选择可用模型。
任意其他 OpenAI Chat Completions 兼容端点使用 custom:
$env:EVOAGENT_LLM_PROVIDER = 'custom'
$env:EVOAGENT_LLM_BASE_URL = 'https://example.com/v1'
$env:EVOAGENT_LLM_API_KEY = '<token>'
$env:EVOAGENT_LLM_MODEL = '<model-name>'密钥只通过环境变量读取,不要提交到仓库。
服务启动时会建立基础验证集和隐藏回归集。候选提示词不会接受调用方提供的“回归分数”作为上线依据,而是:
- 使用当前提示词和候选提示词分别回放同一批验证 Diff;
- 计算精确率、召回率、F1、严重级别正确率、高风险召回率、干净样本正确率和执行成功率;调用失败会按漏报或失败的干净样本计分;
- 候选必须在验证集达到最小提升,并通过隐藏集的分数、精确率、召回率和高风险召回率非退化门禁;
- 没有配置大模型,或验证集、隐藏集样本不足时只保存候选,状态为
deferred; - 评测记录包含提示词和数据集 SHA-256 指纹,隐藏集只持久化聚合指标,不暴露案例明细;
- 没有新增有效反馈信号时不会重复创建内容相同的候选版本;
- 所有评测运行、版本、指标和激活决定均持久化,可回滚。
可通过 POST /v1/evaluation/cases 增加版本化样本,split 支持 train、validation 和 holdout。样本名称和内容绑定且不可覆盖;修订样本必须使用新名称,重复提交相同内容则保持幂等。期望结果可选填 rule_id,用于避免“同一行但错误类别”的结果被算作命中。POST /v1/evolution/auto 会从未解决反馈生成候选并执行同样的真实回放门禁。
相关门禁可通过以下环境变量调整:
EVOAGENT_EVAL_MIN_CASES:验证集最少样本数;EVOAGENT_EVAL_MIN_HOLDOUT_CASES:隐藏集最少样本数;EVOAGENT_EVAL_MAX_CASES:每个数据分区单次最多回放样本数;EVOAGENT_EVAL_MIN_IMPROVEMENT:验证集最小分数提升;EVOAGENT_EVAL_MAX_METRIC_REGRESSION:受保护指标允许的最大退化,默认0。
Webhook 地址为 POST /webhooks/github,事件选择 Pull requests。建议配置:
$env:EVOAGENT_GITHUB_WEBHOOK_SECRET = '<webhook-secret>'
$env:EVOAGENT_GITHUB_TOKEN = '<fine-grained-token>'默认只返回审查结果,不向 GitHub 写入内容。要自动发布 PR 评论,需显式启用:
$env:EVOAGENT_AUTO_POST_REVIEW = 'true'Token 至少需要目标仓库 Pull requests 的读权限;启用评论回写时需要写权限。Webhook 下载 PR diff 时优先使用 payload 中的 diff_url。
在 GitHub Developer settings 创建 GitHub App:
- Setup URL:
<公网地址>/github/setup - Webhook URL:
<公网地址>/webhooks/github - Webhook event:Pull request
- Repository permissions:Contents
Read & write、Pull requestsRead & write、MetadataRead-only
下载 App 私钥后配置 EVOAGENT_GITHUB_APP_ID、EVOAGENT_GITHUB_APP_SLUG、EVOAGENT_GITHUB_PRIVATE_KEY_PATH 和 webhook secret。管理台的 GitHub App 页面会进入正式安装流程。
自动修复只覆盖可确定安全的规则,例如调试输出、shell=True 和硬编码 Python 凭据;结果始终提交到新的 evoagent/fix-pr-* 分支,不直接修改源分支。
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/health |
健康检查 |
POST |
/v1/auth/login |
登录并获取租户绑定的短期 Bearer Token |
POST |
/v1/reviews |
创建同步审查任务 |
POST |
/v1/reviews?async=true |
创建异步审查任务 |
GET |
/v1/tasks/{id} |
获取状态、轨迹和报告 |
GET |
/v1/tasks/{id}/report |
获取 Markdown 报告 |
POST |
/v1/tasks/{id}/fix |
创建自动修复分支和提交 |
POST |
/v1/tasks/{id}/feedback |
回流误报、漏报或坏修复 |
POST |
/v1/tasks/{id}/cancel |
请求取消任务 |
POST |
/v1/tasks/{id}/resume |
从最近 checkpoint 续跑任务 |
POST |
/webhooks/github |
接收 GitHub PR webhook |
POST |
/v1/skills/reload |
动态重新加载 Skill |
POST |
/v1/evolution/auto |
从失败案例生成并评测提示词版本 |
POST |
/v1/evolution/propose |
评测指定提示词候选版本 |
GET/POST |
/v1/evaluation/cases |
查询或增加版本化评测样本 |
GET |
/v1/evolution/status |
查询模型与评测门禁就绪状态 |
GET |
/v1/evolution/runs |
查询持久化的新旧版本评测记录 |
POST |
/v1/skills/{name}/versions/{version}/activate |
激活或回滚版本 |
GET |
/metrics |
Prometheus 文本指标 |
GET |
/api/alerts |
查询租户告警 |
GET |
/api/audit |
查询租户审计日志 |
GET |
/api/queue/dead-letters |
查询死信任务 |
POST |
/v1/queue/dead-letters/replay |
重放死信任务 |
GET/POST |
/api/deployments/llm-review、/v1/deployments/llm-review |
查询或配置灰度/影子发布 |
POST /v1/reviews 的 diff 最大默认 1 MiB;单任务默认最多 8 步、120 秒。可通过环境变量调整,详见 .env.example。