fischer-agentkit/docs/plans/2026-06-05-005-refactor-age...

11 KiB
Raw Blame History

AgentKit 框架完善计划

问题框架

目标:完善 fischer-agentkit 框架本身,修复安全性问题、补全缺失功能、提升代码质量。

范围:仅修改 fischer-agentkit/ 目录下的代码。GEO 项目集成留在 GEO 开发会话中完成。

当前状态

  • Phase 1U1-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必须在功能补全之前修复。框架的安全性是生产就绪的前提。

KTD2API 认证采用 API Key 方案

不引入 JWT/OAuth 等复杂方案。Server 模式使用 API Key 认证即可满足需求。实现方式:

  • 通过环境变量 AGENTKIT_API_KEY 配置
  • 请求头 X-API-Key 验证
  • 健康检查端点不需要认证

KTD3速率限制采用固定窗口算法

不引入 Redis 滑动窗口等复杂方案。使用内存中的固定窗口计数器即可,后续可升级为 Redis 方案。

KTD4Callback URL SSRF 防护采用白名单方案

只允许 http://https:// 协议,拒绝内网 IP127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16

KTD5pgvector 向量检索在 Phase 2 实现

当前使用时间衰减排序作为降级方案是可接受的。pgvector 实现需要 PostgreSQL 扩展支持,作为独立单元实现。

KTD6静默失败改为结构化日志记录

quality gate 和 output standardization 的失败不应静默忽略,应记录 warning 日志并在响应中附带质量状态信息。


实现单元

U1. 提交 Phase 1 代码并创建新分支

目标:将 Phase 1 的 61 个文件变更提交到 git创建新的开发分支。

依赖:无

Files

  • 当前工作目录所有变更

Approach

  1. feat/agentkit-v2-phase1 分支上提交所有变更
  2. 创建新分支 feat/agentkit-framework-hardening
  3. 后续工作在新分支上进行

验证git log -1 显示提交,git status 显示干净工作树


U2. 修复安全custom_handler 模块前缀白名单

目标:为 ConfigDrivenAgent._import_handler() 添加模块前缀白名单,防止任意代码执行。

依赖:无

Files

  • src/agentkit/core/config_driven.py

Approach

  1. ConfigDrivenAgent 类中添加 _ALLOWED_HANDLER_PREFIXES 常量
  2. _import_handler() 方法开头添加白名单校验
  3. 白名单前缀:"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.py
  • src/agentkit/server/middleware.py(新建)

Approach

  1. 修复 CORS移除 allow_credentials=True(与 allow_origins=["*"] 冲突)
  2. 创建 APIKeyAuthMiddleware
    • 从环境变量 AGENTKIT_API_KEY 读取密钥
    • 验证请求头 X-API-Key
    • 健康检查端点(/api/v1/health)不需要认证
  3. 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

  1. 创建 RateLimiter 类:固定窗口计数器,基于 IP 或 API Key 限流
  2. 默认配置:每分钟 60 次请求(可配置)
  3. create_app() 中注册速率限制中间件
  4. 超过限制时返回 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

  1. 创建 _validate_callback_url(url) 函数
  2. 校验规则:
    • 只允许 http://https:// 协议
    • 拒绝内网 IP127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
    • 拒绝 localhost/127.0.0.1
  3. 无效 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.py
  • src/agentkit/orchestrator/pipeline_engine.py
  • src/agentkit/evolution/reflector.py

Approach

  1. registry.py:51:删除无用的 stmt = type(db).execute.__self__.__class__
  2. pipeline_engine.py:73-74:删除不可能的条件分支 if sr.output_data and isinstance(sr, dict): pass
  3. reflector.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

  1. get_task_status 端点:添加简单的任务状态追踪(内存字典或 Redis
  2. Quality Gate 失败:记录 warning 日志,在响应中附带 quality_status: "skipped" 字段
  3. 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.py
  • pyproject.toml

Approach

  1. 添加 pgvectorpyproject.toml 依赖
  2. 修改 EpisodicMemory.search() 方法:
    • 如果有 _embedder 且安装了 pgvector使用 embedding.cosine_distance(query_embedding) 排序
    • 否则回退到时间衰减排序
  3. 添加迁移或建表语句(如果需要 vector 类型列)

Test scenarios

  • 有 pgvector 时按余弦距离排序返回结果
  • 无 pgvector 时回退到时间衰减排序
  • 空查询返回空列表

验证pytest tests/unit/test_episodic_memory.py -v 更新后的测试通过


U9. 修复依赖:完善 pyproject.toml

目标:确保所有运行时依赖正确声明。

依赖U8pgvector 依赖)

Files

  • pyproject.toml

Approach

  1. 添加 pgvector>=0.2 到 dependenciesepisodic memory 需要)
  2. 确认 fastapi>=0.110, uvicorn>=0.27 在 optional-dependencies.server 中Phase 1 已添加)
  3. 确认 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白名单 → U3CORS + 认证) → U4速率限制
                                                    ↓
U6死代码清理 → U7任务状态 + 日志) → U8pgvector → 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、监控等