11 KiB
AgentKit 框架完善计划
问题框架
目标:完善 fischer-agentkit 框架本身,修复安全性问题、补全缺失功能、提升代码质量。
范围:仅修改 fischer-agentkit/ 目录下的代码。GEO 项目集成留在 GEO 开发会话中完成。
当前状态:
- Phase 1(U1-U8)全部实现完成,535 个单元测试通过
- 61 个文件变更未提交(在
feat/agentkit-v2-phase1分支) - 代码审查发现 19 个问题(4 P0 + 6 P1 + 9 P2/P3),已全部修复
- 1 个 TODO 待解决(pgvector 向量检索)
- README 已编写
需求追踪
来自代码审查和框架分析的问题清单:
| ID | 分类 | 描述 | 严重度 |
|---|---|---|---|
| R1 | 安全 | pgvector 向量检索未实现 | 高 |
| R2 | 安全 | custom_handler 缺少模块前缀白名单 | 高 |
| R3 | 安全 | Server 缺少 API 认证 | 高 |
| R4 | 安全 | CORS 配置不当(allow_origins=["*"] + allow_credentials=True) | 高 |
| R5 | 安全 | 缺少速率限制 | 高 |
| R6 | 安全 | Callback URL SSRF 风险 | 高 |
| R7 | 代码质量 | registry.py 死代码 | 中 |
| R8 | 代码质量 | pipeline_engine.py 死代码 | 中 |
| R9 | 代码质量 | reflector.py error_type 提取 bug | 低 |
| R10 | 功能 | get_task_status 返回 placeholder | 中 |
| R11 | 功能 | Quality Gate/Standardization 失败静默忽略 | 中 |
| R12 | 功能 | MCP Server 未使用官方 SDK | 中 |
| R13 | 依赖 | pyproject.toml 缺少 pgvector 依赖 | 中 |
| R14 | 依赖 | pyproject.toml 缺少 fastapi/uvicorn 依赖 | 低(Phase 1 已部分修复) |
| R15 | 测试 | 18 个模块测试覆盖不足 | 中 |
关键决策
KTD1:安全修复优先于功能补全
所有安全问题(R1-R6)必须在功能补全之前修复。框架的安全性是生产就绪的前提。
KTD2:API 认证采用 API Key 方案
不引入 JWT/OAuth 等复杂方案。Server 模式使用 API Key 认证即可满足需求。实现方式:
- 通过环境变量
AGENTKIT_API_KEY配置 - 请求头
X-API-Key验证 - 健康检查端点不需要认证
KTD3:速率限制采用固定窗口算法
不引入 Redis 滑动窗口等复杂方案。使用内存中的固定窗口计数器即可,后续可升级为 Redis 方案。
KTD4:Callback URL SSRF 防护采用白名单方案
只允许 http:// 和 https:// 协议,拒绝内网 IP(127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)。
KTD5:pgvector 向量检索在 Phase 2 实现
当前使用时间衰减排序作为降级方案是可接受的。pgvector 实现需要 PostgreSQL 扩展支持,作为独立单元实现。
KTD6:静默失败改为结构化日志记录
quality gate 和 output standardization 的失败不应静默忽略,应记录 warning 日志并在响应中附带质量状态信息。
实现单元
U1. 提交 Phase 1 代码并创建新分支
目标:将 Phase 1 的 61 个文件变更提交到 git,创建新的开发分支。
依赖:无
Files:
- 当前工作目录所有变更
Approach:
- 在
feat/agentkit-v2-phase1分支上提交所有变更 - 创建新分支
feat/agentkit-framework-hardening - 后续工作在新分支上进行
验证:git log -1 显示提交,git status 显示干净工作树
U2. 修复安全:custom_handler 模块前缀白名单
目标:为 ConfigDrivenAgent._import_handler() 添加模块前缀白名单,防止任意代码执行。
依赖:无
Files:
src/agentkit/core/config_driven.py
Approach:
- 在
ConfigDrivenAgent类中添加_ALLOWED_HANDLER_PREFIXES常量 - 在
_import_handler()方法开头添加白名单校验 - 白名单前缀:
"agentkit.","app.agent_framework."
Patterns to follow:参考 QualityGate._import_validator() 的白名单实现
Test scenarios:
- 白名单前缀的 handler 可以正常导入
- 非白名单前缀的 handler 抛出 ImportError
- 空路径、畸形路径的处理
验证:pytest tests/unit/test_config_driven.py -v 新增测试通过
U3. 修复安全:CORS 配置 + API Key 认证
目标:修复 CORS 配置不当问题,添加 API Key 认证中间件。
依赖:无
Files:
src/agentkit/server/app.pysrc/agentkit/server/middleware.py(新建)
Approach:
- 修复 CORS:移除
allow_credentials=True(与allow_origins=["*"]冲突) - 创建
APIKeyAuthMiddleware:- 从环境变量
AGENTKIT_API_KEY读取密钥 - 验证请求头
X-API-Key - 健康检查端点(
/api/v1/health)不需要认证
- 从环境变量
- 在
create_app()中注册中间件
Test scenarios:
- 无 API Key 的请求返回 401
- 正确 API Key 的请求通过
- 健康检查端点不需要 API Key
- CORS 预检请求正常响应
验证:pytest tests/unit/test_server_middleware.py -v 新增测试通过
U4. 修复安全:速率限制
目标:添加请求速率限制中间件,防止 LLM 成本耗尽。
依赖:U3(需要中间件基础设施)
Files:
src/agentkit/server/middleware.py(修改)
Approach:
- 创建
RateLimiter类:固定窗口计数器,基于 IP 或 API Key 限流 - 默认配置:每分钟 60 次请求(可配置)
- 在
create_app()中注册速率限制中间件 - 超过限制时返回 429 Too Many Requests
Test scenarios:
- 请求在限制内正常通过
- 超过限制返回 429
- 时间窗口过后计数器重置
- 不同 API Key 独立计数
验证:pytest tests/unit/test_rate_limiter.py -v 新增测试通过
U5. 修复安全:Callback URL SSRF 防护
目标:为 TaskDispatcher._trigger_callback() 添加 URL 验证。
依赖:无
Files:
src/agentkit/core/dispatcher.py
Approach:
- 创建
_validate_callback_url(url)函数 - 校验规则:
- 只允许
http://和https://协议 - 拒绝内网 IP:127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
- 拒绝 localhost/127.0.0.1
- 只允许
- 无效 URL 抛出
ValueError
Test scenarios:
- 合法公网 URL 通过验证
- 内网 IP 被拒绝
- localhost 被拒绝
- 非 http/https 协议被拒绝(ftp, file, etc.)
验证:pytest tests/unit/test_callback_url.py -v 新增测试通过
U6. 修复代码质量:清理死代码 + Bug
目标:清理发现的死代码和修复 reflector.py 的 error_type 提取 bug。
依赖:无
Files:
src/agentkit/core/registry.pysrc/agentkit/orchestrator/pipeline_engine.pysrc/agentkit/evolution/reflector.py
Approach:
registry.py:51:删除无用的stmt = type(db).execute.__self__.__class__行pipeline_engine.py:73-74:删除不可能的条件分支if sr.output_data and isinstance(sr, dict): passreflector.py:110:修复error_type提取逻辑,不再使用type(result.error_message).__name__(永远是 "str")
Test scenarios:
- 清理后原有测试全部通过
- reflector.py 修复后 error_type 能正确提取错误类型
验证:pytest tests/unit/ -v --ignore=tests/unit/test_working_memory.py --ignore=tests/unit/test_handoff.py 全部通过
U7. 修复功能:get_task_status 实现 + 静默失败日志化
目标:实现真正的任务状态查询,将静默失败改为结构化日志记录。
依赖:无
Files:
src/agentkit/server/routes/tasks.py
Approach:
get_task_status端点:添加简单的任务状态追踪(内存字典或 Redis)- Quality Gate 失败:记录 warning 日志,在响应中附带
quality_status: "skipped"字段 - Output Standardization 失败:记录 warning 日志,在响应中附带
standardization_status: "skipped"字段
Test scenarios:
- 提交任务后能查询到任务状态
- Quality Gate 失败时响应包含 quality_status 字段
- Standardization 失败时响应包含 standardization_status 字段
- 日志中包含失败原因
验证:pytest tests/unit/test_server_routes.py -v 更新后的测试通过
U8. 修复功能:pgvector 向量检索实现
目标:实现 EpisodicMemory 的 pgvector 语义搜索。
依赖:无(需要 PostgreSQL 实例运行)
Files:
src/agentkit/memory/episodic.pypyproject.toml
Approach:
- 添加
pgvector到pyproject.toml依赖 - 修改
EpisodicMemory.search()方法:- 如果有
_embedder且安装了 pgvector,使用embedding.cosine_distance(query_embedding)排序 - 否则回退到时间衰减排序
- 如果有
- 添加迁移或建表语句(如果需要 vector 类型列)
Test scenarios:
- 有 pgvector 时按余弦距离排序返回结果
- 无 pgvector 时回退到时间衰减排序
- 空查询返回空列表
验证:pytest tests/unit/test_episodic_memory.py -v 更新后的测试通过
U9. 修复依赖:完善 pyproject.toml
目标:确保所有运行时依赖正确声明。
依赖:U8(pgvector 依赖)
Files:
pyproject.toml
Approach:
- 添加
pgvector>=0.2到 dependencies(episodic memory 需要) - 确认
fastapi>=0.110,uvicorn>=0.27在 optional-dependencies.server 中(Phase 1 已添加) - 确认
mcp>=1.0与实际使用一致(如果使用官方 SDK)
验证:pip install -e ".[server]" 成功安装所有依赖
U10. 补充测试覆盖(可选)
目标:为测试覆盖不足的模块添加测试。
依赖:U1-U9 全部完成
Files:
tests/unit/test_registry.py(扩展现有)tests/unit/test_dispatcher.py(扩展现有)tests/unit/test_pipeline_engine.py(新建)tests/unit/test_handoff.py(扩展现有)tests/unit/test_mcp_*.py(扩展现有)
Approach:
- 每个模块添加 5-10 个核心测试用例
- 优先覆盖 happy path 和错误路径
- 集成测试需要真实 Redis/PostgreSQL 的可以标记为 skip
验证:总测试数达到 600+,覆盖率提升到 80%+
执行顺序
U1(提交代码) → U2(白名单) → U3(CORS + 认证) → U4(速率限制)
↓
U6(死代码清理) → U7(任务状态 + 日志) → U8(pgvector) → U9(依赖完善)
↓
U10(补充测试,可选)
并发性:
- U2, U6, U7 可以并行执行(无依赖)
- U3 和 U4 有依赖关系(U3 先于 U4)
- U5 独立,可与任何单元并行
- U8 和 U9 有依赖关系(U9 需要 U8 的 pgvector 信息)
风险与缓解
| 风险 | 影响 | 缓解 |
|---|---|---|
| pgvector 需要 PostgreSQL 扩展 | 测试环境可能没有 pgvector | 使用 skip 标记,提供降级方案 |
| API Key 认证破坏现有测试 | 测试需要传递 API Key | 测试环境设置环境变量 |
| 速率限制影响 E2E 测试 | 测试可能被限流 | 测试环境提高限制或使用 mock |
范围边界
本计划包含:
- AgentKit 框架本身的安全修复
- 代码质量清理
- 缺失功能补全
- 依赖完善
本计划不包含:
- GEO 项目的任何改动(留在 GEO 开发会话中完成)
- 新的 Agent 类型或 Skill 类型
- 前端 UI 开发
- 生产环境部署配置(K8s、监控等)