# 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**: 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://` 协议 - 拒绝内网 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 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. 添加 `pgvector` 到 `pyproject.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 **目标**:确保所有运行时依赖正确声明。 **依赖**:U8(pgvector 依赖) **Files**: - `pyproject.toml` **Approach**: 1. 添加 `pgvector>=0.2` 到 dependencies(episodic 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(白名单) → 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、监控等)