--- title: "feat: AgentKit Phase 4 — 企业级生产化升级" status: completed created: 2026-06-06 plan_type: feat depth: deep origin: AgentKit 全能力成熟度评估 + GEO 系统集成需求 branch: feat/agentkit-phase4-production --- # AgentKit Phase 4 — 企业级生产化升级 ## Summary 基于 AgentKit 全能力成熟度审计和 GEO 系统集成需求,本计划解决 5 大生产级差距:进化系统执行断裂、记忆系统不可扩展、LLM 单 Provider、核心引擎缺超时/取消、Server 缺实时通信。覆盖 12 个 Implementation Unit,分 3 个交付阶段,以"GEO 系统完美运行"为验收底线。 ## Problem Frame Phase 3 完成了基础设施搭建(持久化、记忆接入、进化设计、SKILL.md、可观测性),但审计发现多个"设计完整但执行断裂"的问题: ### 五大生产级差距 1. **进化系统名存实亡(35% 成熟度)** - A/B 测试被禁用(lifecycle.py:172-188),整个验证循环被绕过 - `_current_module` 从未被设置(lifecycle.py:74),prompt 优化永远短路 - PromptOptimizer 仅注入 few-shot + 追加失败模式,无 LLM 驱动重写 - StrategyTuner 纯随机扰动,无代码路径调用 - ABTester 结果仅内存,进程重启丢失 2. **记忆系统不可扩展(65% 成熟度)** - EpisodicMemory 客户端 O(N) 余弦(episodic.py:90-111),>1000 条不可用 - Episodic 未从配置初始化(app.py:173, config_driven.py:329-332 是 `pass`) - 无嵌入缓存,每次 embed() 调 API - Enhanced search 首个 KB 404 即全量降级(http_rag.py:198-202) 3. **LLM 仅单 Provider(60% 成熟度)** - 仅 OpenAICompatibleProvider,Anthropic/Gemini/文心等无原生实现 - 无 Provider 级重试/熔断/退避 - chat_stream() 无 fallback 链 - HTTP 超时硬编码 60s 4. **核心引擎缺超时/取消(80% 成熟度)** - ReAct 循环无超时强制执行,可无限运行 - 无 CancellationToken 支持 - BaseAgent.execute() 不读 timeout_seconds - Agent 状态更新无锁,并发竞态 5. **Server 缺实时通信(75% 成熟度)** - 无 WebSocket,流式响应仅 SSE - SSE 创建新 ReActEngine 忽略 Agent 配置 - SSE 访问私有属性 `_tool_registry`/`_llm_model` - 无 Evolution/Memory API 路由 ### GEO 系统的关键依赖 GEO 系统以"Mode A"(纯 HTTP API)集成 AgentKit,关键路径: - **内容生成**:`content_generator` skill → ReAct 引擎 → HttpRAGService 知识库检索 → LLM 生成 - **引用检测**:`citation_detector` skill → custom_handler → 回调 GEO 内部 API - **GEO 优化**:`geo_optimizer` skill → ReAct 引擎 + 质量门控 - **监控/Schema/竞品/趋势**:各 skill → ReAct/custom 模式 **GEO 的容错模式**:AgentKit 不可用时降级到直接 LLM 调用。这意味着 AgentKit 的价值在于**质量提升**而非**功能可用**——如果 AgentKit 不比直接调用更好,就没有存在意义。 ## Requirements | ID | Requirement | Priority | Source | |----|-------------|----------|--------| | R1 | 进化系统可运行:A/B 测试启用、_current_module 自动设置、PromptOptimizer LLM 驱动 | P0 | 进化系统审计 | | R2 | EpisodicMemory 使用 pgvector 原生搜索,支持百万级数据 | P0 | 记忆系统审计 | | R3 | EpisodicMemory 从配置自动初始化,Server 和 ConfigDrivenAgent 统一接入 | P0 | 记忆系统审计 | | R4 | 新增 Anthropic Provider(Messages API 原生实现) | P0 | LLM 审计 + GEO 需求 | | R5 | ReAct 循环超时强制执行 + CancellationToken 支持 | P0 | 核心引擎审计 | | R6 | Provider 级重试/熔断/指数退避 | P1 | LLM 审计 | | R7 | chat_stream() 支持 fallback 链 | P1 | LLM 审计 | | R8 | WebSocket 端点支持双向实时通信 | P1 | Server 审计 | | R9 | SSE 流修复:使用 Agent 配置、不访问私有属性 | P1 | Server 审计 | | R10 | Evolution/Memory API 路由 | P1 | Server 审计 | | R11 | 嵌入缓存 + Enhanced Search 部分降级修复 | P1 | 记忆系统审计 | | R12 | 新增 Gemini Provider | P2 | LLM 审计 | | R13 | Agent 状态锁 + 配置热加载 | P2 | 核心引擎审计 | ## Key Technical Decisions ### KTD-1: 进化系统修复策略 — 修复而非重写 **决策**:在现有 EvolutionMixin 架构上修复断裂点,不引入 GEPA 式遗传算法。 **理由**: - 现有管线设计完整(reflect → optimize → A/B test → apply/rollback),只需接通 - GEPA 需要"用自然语言反思替代梯度更新"的完整评估管线,当前无评估数据 - GEO 的 8 个 skill 都是 `llm_generate`/`custom` 模式,进化收益有限 - 修复后即可实现"执行轨迹 → LLM 反思 → 质量门控 → 安全应用"的最小闭环 **替代方案**:引入 GEPA 遗传算法 → 需要评估管线 + 统计显著 A/B + 大量执行数据,当前不具备条件 ### KTD-2: EpisodicMemory pgvector 原生搜索 — 复用 GEO 数据库 **决策**:EpisodicMemory 直接使用 GEO 共享的 PostgreSQL + pgvector,通过 SQLAlchemy session 执行 `<=>` 操作符。 **理由**: - docker-compose 已配置 AgentKit 与 GEO 共享 PostgreSQL - GEO 的 `KnowledgeChunk` 已使用 pgvector `Vector(1536)` + HNSW 索引 - AgentKit 的 `EpisodicMemory` 模型(在 geo/backend/app/models/agent.py)已有 `embedding_id` 字段 - 无需引入新数据库,复用现有基础设施 **替代方案**:独立 pgvector 实例 → 增加运维复杂度,与 GEO 数据不共享 ### KTD-3: LLM Provider 架构 — 抽象层 + 原生实现 **决策**:保留 `LLMProvider` ABC,新增 `AnthropicProvider` 和 `GeminiProvider` 原生实现,不依赖 OpenAI 兼容层。 **理由**: - Anthropic Messages API 格式与 OpenAI 不同(`content` 数组 vs `content` 字符串,`tool_choice` 结构不同) - Gemini 有独特的 `generateContent` API 和安全设置 - 通过 OpenAI 兼容层适配会丢失原生功能(如 Anthropic 的 extended thinking、Gemini 的 grounding) - GEO 的 `content_generator` 和 `deai_agent` 对输出质量敏感,原生 API 更可靠 ### KTD-4: 超时与取消 — asyncio.wait_for + CancellationToken **决策**:ReAct 循环使用 `asyncio.wait_for()` 强制超时,新增 `CancellationToken` 支持优雅取消。 **理由**: - `asyncio.wait_for()` 是 Python 标准库,无额外依赖 - CancellationToken 模式与 GEO 的 `agent_execution_context` 兼容 - Server 的 `cancel_task` 端点已有,只需 ReAct 循环配合 ### KTD-5: WebSocket — FastAPI 原生 WebSocket **决策**:使用 FastAPI 原生 `WebSocket` 端点,不引入 Socket.IO 等第三方库。 **理由**: - GEO 前端已有 `agents.ts` API 客户端,WebSocket 原生支持即可 - 减少依赖,降低安全风险 - FastAPI WebSocket 与现有路由体系一致 ## Scope Boundaries ### In Scope - 进化系统修复(A/B 测试启用、_current_module 接入、LLM PromptOptimizer) - EpisodicMemory pgvector 原生搜索 + 配置初始化 - Anthropic Provider + Gemini Provider - Provider 级重试/熔断 - ReAct 超时 + CancellationToken - WebSocket 端点 - SSE 流修复 - Evolution/Memory API 路由 - 嵌入缓存 + Enhanced Search 部分降级 ### Out of Scope - GEPA 遗传算法(需评估管线,Phase 5) - 多 Agent 协作编排(L4 级,Phase 5) - RAG 自纠错循环(L5 级,Phase 5) - 配置热加载(P2,可后续) - Agent 状态锁(P2,可后续) - 文心/豆包/元宝等国内 Provider(P2,可后续通过社区贡献) ### Deferred to Follow-Up Work - Contextual Retrieval(Anthropic 2024 突破,需 chunk 处理层) - 评估管线(Ragas + Phoenix 集成) - 多 Agent RAG 编排(supervisor-worker 拓扑) - 配置 Schema 验证(Pydantic 模型) - 性能基准测试 ## High-Level Technical Design ### 架构总览 ``` ┌─────────────────────────────────────────────────────────────┐ │ GEO Frontend (Next.js) │ │ agents.ts → WebSocket + REST API │ └────────────────────────┬────────────────────────────────────┘ │ HTTP / WebSocket ┌────────────────────────▼────────────────────────────────────┐ │ AgentKit Server (:8001) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ REST API │ │WebSocket │ │ SSE │ │ Evolution API │ │ │ │ (tasks, │ │ (real- │ │ (stream) │ │ (/evolution) │ │ │ │ agents) │ │ time) │ │ │ │ │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └───────┬───────┘ │ │ │ │ │ │ │ │ ┌────▼────────────▼────────────▼────────────────▼───────┐ │ │ │ Core Engine │ │ │ │ ReActEngine (timeout + cancel) │ │ │ │ ConfigDrivenAgent (_current_module auto-set) │ │ │ │ EvolutionMixin (A/B test enabled + LLM PromptOptimizer)│ │ │ └────┬──────────┬──────────┬──────────┬─────────────────┘ │ │ │ │ │ │ │ │ ┌────▼───┐ ┌───▼────┐ ┌──▼───┐ ┌───▼──────┐ │ │ │Memory │ │LLM │ │Skills│ │Evolution │ │ │ │System │ │Gateway │ │System│ │System │ │ │ │ │ │ │ │ │ │ │ │ │ │Working │ │OpenAI │ │YAML │ │LLM │ │ │ │(Redis) │ │Anthropic│ │MD │ │Reflector │ │ │ │ │ │Gemini │ │Pipeline│ │ABTester │ │ │ │Episodic│ │+retry │ │ │ │(enabled) │ │ │ │(pgvec) │ │+breaker│ │ │ │PromptOpt │ │ │ │ │ │ │ │ │ │(LLM) │ │ │ │Semantic│ │ │ │ │ │Store │ │ │ │(RAG) │ │ │ │ │ │(SQLite) │ │ │ └────┬───┘ └────────┘ └──────┘ └──────────┘ │ │ │ │ │ ┌────▼──────────────────────────────────────────────────┐ │ │ │ PostgreSQL + pgvector (shared with GEO) │ │ │ │ Redis (shared with GEO) │ │ │ └───────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### 进化系统修复后数据流 ``` 任务完成 → TraceRecorder.end_trace() 生成 ExecutionTrace → EvolutionMixin.evolve_after_task() → Reflector.reflect(trace) → Reflection (LLM 或规则) → if reflection.outcome == "should_optimize": → PromptOptimizer.optimize(module, trace, reflection) → LLM 驱动重写 instruction (新增) → 注入 few-shot demos (已有) → ABTester.assign_group(task_id) → control/treatment → ABTester.record_result(task_id, group, score) → if ABTester.is_significant(test_id): → apply change (treatment wins) or rollback (control wins) → else: → keep current, log inconclusive → EvolutionStore.persist(event) ``` ### EpisodicMemory pgvector 搜索流程 ``` MemoryRetriever.retrieve(query) → EpisodicMemory.search(query, top_k=5) → Embedder.embed(query) → query_embedding (带缓存) → SQLAlchemy: SELECT * FROM episodic_memories ORDER BY embedding <=> :query_embedding LIMIT :top_k → 时间衰减混合评分: score = alpha * (1 - cosine_distance) + (1-alpha) * time_decay → 返回 top_k 结果 ``` ### LLM Provider 重试/熔断流程 ``` LLMGateway.chat(request) → Provider.chat() (primary) → CircuitBreaker.allow? → yes → RetryPolicy.execute(): → attempt 1 → fail → backoff 1s → attempt 2 → fail → backoff 2s → attempt 3 → fail → CircuitBreaker.record_failure() → if failures >= threshold: open circuit → CircuitBreaker.allow? → no (circuit open) → skip to fallback → Fallback: try next provider/model in chain ``` --- ## Implementation Units ### Phase A: 核心修复(P0 — GEO 运行依赖) --- ### U1. EpisodicMemory pgvector 原生搜索 + 配置初始化 **Goal**: 将 EpisodicMemory 从客户端 O(N) 余弦切换到 pgvector `<=>` 操作符,支持百万级数据;从 Server 和 ConfigDrivenAgent 配置自动初始化。 **Requirements**: R2, R3 **Dependencies**: 无 **Files**: - `src/agentkit/memory/episodic.py` — 重写 search/retrieve 使用 pgvector - `src/agentkit/memory/embedder.py` — 新增嵌入缓存 - `src/agentkit/server/app.py` — EpisodicMemory 初始化 - `src/agentkit/core/config_driven.py` — EpisodicMemory 初始化 - `src/agentkit/server/config.py` — Episodic 配置段 - `tests/unit/test_episodic_vector_search.py` — 更新测试 - `tests/unit/test_memory_integration.py` — 更新测试 **Approach**: 1. EpisodicMemory 新增 `session_factory` 参数,search/retrieve 使用 `text("embedding <=> :query_vec")` 原生 pgvector 查询 2. 保留 `_alpha` 混合评分:pgvector 返回 top_k*3 候选,Python 端做时间衰减重排 3. 无 pgvector 时降级到客户端余弦(现有逻辑) 4. Embedder 新增 `EmbeddingCache`(LRU + TTL),避免重复 embed 调用 5. ServerConfig 新增 `memory.episodic` 配置段(session_factory、pgvector_enabled、table_name) 6. create_app() 和 ConfigDrivenAgent 从配置创建 EpisodicMemory **Patterns to follow**: GEO 的 `HybridRetriever`(pgvector + ILIKE + RRF 融合) **Test scenarios**: - pgvector 搜索返回 top_k 结果按相似度排序 - 无 pgvector 时降级到客户端余弦 - 时间衰减重排:近期条目优先 - 嵌入缓存命中/未命中 - 配置初始化 EpisodicMemory 成功/失败降级 - 大数据量(10000+ 条)搜索性能 **Verification**: 全量测试通过 + EpisodicMemory 集成测试覆盖 pgvector 路径 --- ### U2. ReAct 超时强制执行 + CancellationToken **Goal**: ReAct 循环支持超时强制退出和优雅取消,防止任务无限运行。 **Requirements**: R5 **Dependencies**: 无 **Files**: - `src/agentkit/core/react.py` — 超时 + 取消支持 - `src/agentkit/core/protocol.py` — CancellationToken 类型 - `src/agentkit/core/base.py` — 传递 timeout_seconds - `src/agentkit/core/config_driven.py` — 传递 timeout - `src/agentkit/server/routes/tasks.py` — cancel 端点传递 token - `tests/unit/test_react_engine.py` — 更新测试 - `tests/unit/test_base_agent.py` — 更新测试 **Approach**: 1. 新增 `CancellationToken` 数据类:`is_cancelled: bool`,`cancel()` 方法,`check()` 抛 `TaskCancelledError` 2. ReActEngine.__init__ 新增 `default_timeout: float = 300.0` 3. execute() 用 `asyncio.wait_for()` 包裹主循环,超时抛 `TaskTimeoutError` 4. 每步循环开始检查 `token.check()` 5. BaseAgent.execute() 从 `TaskMessage.timeout_seconds` 读取超时 6. Server cancel 端点设置 CancellationToken **Patterns to follow**: Python asyncio.wait_for + CancellationToken 模式 **Test scenarios**: - 超时触发 TaskTimeoutError,返回部分结果 - CancellationToken 取消,返回已完成步骤 - 超时 0 表示无限(向后兼容) - 正常完成不受超时影响 - 并发取消和超时竞争 **Verification**: 全量测试通过 + 超时/取消场景覆盖 --- ### U3. 进化系统修复 — A/B 测试启用 + _current_module 接入 **Goal**: 修复进化系统的 3 个断裂点,使自我进化管线可运行。 **Requirements**: R1 **Dependencies**: U2(超时机制防止进化循环失控) **Files**: - `src/agentkit/evolution/lifecycle.py` — 启用 A/B 测试、自动设置 _current_module - `src/agentkit/evolution/ab_tester.py` — 持久化、确定性分组 - `src/agentkit/evolution/prompt_optimizer.py` — LLM 驱动重写 - `src/agentkit/evolution/strategy_tuner.py` — 接入进化管线 - `src/agentkit/core/config_driven.py` — 自动 set_current_module - `src/agentkit/skills/base.py` — EvolutionConfig 扩展 - `tests/unit/test_evolution_lifecycle.py` — 更新测试 - `tests/unit/test_ab_tester.py` — 新增测试 - `tests/unit/test_prompt_optimizer.py` — 新增测试 **Approach**: 1. **A/B 测试启用**: - lifecycle.py: 移除 TODO bypass,调用 ABTester - ABTester: 改用 hash-based 分组(`hash(task_id) % 2`),确定性可复现 - ABTester: 结果持久化到 EvolutionStore - 最小样本量 10(从 30 降低,适配 GEO 低频场景) - 样本不足时不应用变更,记录"insufficient data" 2. **_current_module 自动设置**: - ConfigDrivenAgent._handle_react() 在执行前自动 `set_current_module()` - 从 SkillConfig 提取当前 prompt 作为 module 3. **LLM PromptOptimizer**: - 新增 `LLMPromptOptimizer`:用 LLM 分析失败模式,重写 instruction - 保留 `BootstrapPromptOptimizer`(原 PromptOptimizer 重命名)作为 fallback - 工厂函数 `create_prompt_optimizer(optimizer_type, llm_gateway)` 4. **StrategyTuner 接入**: - EvolutionMixin.evolve_after_task() 在 prompt 优化后检查 strategy 优化 - StrategyTuner 改用贝叶斯优化(简化版:高斯过程 1D) **Patterns to follow**: GEO 的 `EnhancedRAG`(LLM 驱动优化模式) **Test scenarios**: - A/B 测试:control/treatment 分组确定性 - A/B 测试:最小样本量不足时不应用 - A/B 测试:统计显著时应用/回滚 - _current_module 自动设置 - LLM PromptOptimizer 生成优化 instruction - StrategyTuner 贝叶斯优化 - 进化管线端到端:reflect → optimize → A/B test → apply/rollback **Verification**: 全量测试通过 + 进化端到端测试 --- ### U4. Anthropic Provider 原生实现 **Goal**: 新增 AnthropicProvider,支持 Claude Messages API 原生调用。 **Requirements**: R4 **Dependencies**: 无 **Files**: - `src/agentkit/llm/providers/anthropic.py` — 新增 AnthropicProvider - `src/agentkit/llm/gateway.py` — 注册 Anthropic provider - `src/agentkit/llm/config.py` — Anthropic 配置 - `tests/unit/test_anthropic_provider.py` — 新增测试 **Approach**: 1. AnthropicProvider 实现 LLMProvider ABC 2. 使用 httpx 直接调用 `https://api.anthropic.com/v1/messages` 3. 支持 Messages API 特有功能: - `content` 数组格式(text + tool_use + tool_result) - `tool_choice` 结构(`{"type": "auto"|"any"|"tool", "name": "..."}`) - `system` 顶层参数 - `max_tokens` 必填 - extended thinking(可选) 4. 流式支持:SSE `event: content_block_delta` 5. 错误处理:429 rate limit / 529 overload / 500 server error 6. 配置:`api_key`、`model`、`max_tokens`、`thinking_enabled` **Patterns to follow**: OpenAICompatibleProvider 的接口模式 **Test scenarios**: - 标准 chat 请求/响应 - tool_calls 请求/响应 - 流式 chat(content_block_delta) - 错误处理(429/529/500) - API key 缺失报错 - 模型别名解析 **Verification**: 全量测试通过 + Anthropic Provider 单元测试覆盖 --- ### Phase B: 增强能力(P1 — GEO 质量提升) --- ### U5. Provider 级重试/熔断/指数退避 **Goal**: 每个 Provider 内置重试策略和熔断器,提高 LLM 调用可靠性。 **Requirements**: R6 **Dependencies**: U4(Anthropic Provider 也需要重试) **Files**: - `src/agentkit/llm/retry.py` — 新增 RetryPolicy + CircuitBreaker - `src/agentkit/llm/providers/openai.py` — 集成重试 - `src/agentkit/llm/providers/anthropic.py` — 集成重试 - `src/agentkit/llm/config.py` — 重试/熔断配置 - `tests/unit/test_llm_retry.py` — 新增测试 **Approach**: 1. `RetryPolicy`:max_retries=3, base_delay=1.0, max_delay=30.0, exponential_base=2 2. `CircuitBreaker`:failure_threshold=5, recovery_timeout=60.0, half_open_max=1 3. Provider.chat() 包裹在 RetryPolicy + CircuitBreaker 中 4. 可重试错误:429/529/500/网络超时;不可重试:400/401/403 5. 配置化:per-provider retry 和 circuit_breaker 配置 **Patterns to follow**: resilience4j / tenacity 模式 **Test scenarios**: - 重试成功(第 2 次成功) - 重试耗尽抛异常 - 指数退避延迟 - 熔断器打开/半开/关闭状态转换 - 不可重试错误立即抛出 - 配置化重试参数 **Verification**: 全量测试通过 + 重试/熔断单元测试 --- ### U6. chat_stream() Fallback 链支持 **Goal**: LLMGateway.chat_stream() 支持 fallback 模型链,与 chat() 对齐。 **Requirements**: R7 **Dependencies**: U5(重试机制) **Files**: - `src/agentkit/llm/gateway.py` — stream fallback - `tests/unit/test_llm_gateway.py` — 更新测试 **Approach**: 1. chat_stream() 在 provider 失败时切换到 fallback model 2. 流式失败的特殊处理:已发送 chunk 后无法切换,记录错误并终止 3. 未发送任何 chunk 时可安全切换到 fallback **Test scenarios**: - 首个 provider 失败,fallback 成功 - 已发送 chunk 后失败,终止并记录 - 所有 provider 失败,抛异常 **Verification**: 全量测试通过 --- ### U7. WebSocket 端点 **Goal**: 新增 WebSocket 端点支持双向实时通信,客户端可发送取消/参数变更指令。 **Requirements**: R8 **Dependencies**: U2(CancellationToken) **Files**: - `src/agentkit/server/routes/ws.py` — 新增 WebSocket 路由 - `src/agentkit/server/app.py` — 注册 WebSocket 路由 - `tests/unit/test_websocket.py` — 新增测试 **Approach**: 1. `WS /api/v1/ws/tasks/{task_id}` — 任务执行实时推送 2. 客户端消息类型:`cancel`(取消任务)、`ping`(心跳) 3. 服务端消息类型:`step`(ReAct 步骤)、`result`(最终结果)、`error`、`pong` 4. 连接认证:URL 参数 `?api_key=xxx` 或首条消息认证 5. 多客户端订阅同一任务(fan-out) 6. 任务完成后自动关闭连接 **Patterns to follow**: FastAPI WebSocket 官方模式 **Test scenarios**: - WebSocket 连接/认证 - 接收 ReAct 步骤实时推送 - 发送 cancel 取消任务 - 任务完成自动关闭 - 未认证连接拒绝 - 多客户端订阅 **Verification**: 全量测试通过 + WebSocket 集成测试 --- ### U8. SSE 流修复 **Goal**: 修复 SSE 流端点的 3 个问题:忽略 Agent 配置、访问私有属性、无 fallback。 **Requirements**: R9 **Dependencies**: 无 **Files**: - `src/agentkit/server/routes/tasks.py` — 修复 SSE 流 - `src/agentkit/core/react.py` — 暴露公共接口 - `tests/unit/test_server_routes.py` — 更新测试 **Approach**: 1. SSE 流使用 Agent 的公共方法获取配置(`get_tools()`, `get_model()`, `get_system_prompt()`) 2. ConfigDrivenAgent 新增 `get_react_config()` 返回 max_steps/timeout 等 3. SSE 流复用 Agent 已有的 ReActEngine 实例 4. 流式 fallback:provider 失败时尝试 fallback model **Test scenarios**: - SSE 流使用 Agent 配置的 max_steps - SSE 流不访问私有属性 - SSE 流 fallback 到备选模型 **Verification**: 全量测试通过 --- ### U9. Evolution + Memory API 路由 **Goal**: 新增 Evolution 和 Memory 管理 API,支持前端展示和运维操作。 **Requirements**: R10 **Dependencies**: U3(进化系统修复) **Files**: - `src/agentkit/server/routes/evolution.py` — 新增 Evolution API - `src/agentkit/server/routes/memory.py` — 新增 Memory API - `src/agentkit/server/app.py` — 注册路由 - `tests/unit/test_evolution_api.py` — 新增测试 - `tests/unit/test_memory_api.py` — 新增测试 **Approach**: 1. Evolution API: - `GET /api/v1/evolution/events` — 进化事件列表(分页、过滤) - `GET /api/v1/evolution/skills/{name}/versions` — Skill 版本历史 - `POST /api/v1/evolution/trigger` — 手动触发进化 - `GET /api/v1/evolution/ab-tests` — A/B 测试列表 2. Memory API: - `GET /api/v1/memory/episodic` — 情景记忆搜索 - `GET /api/v1/memory/semantic/search` — 知识库搜索代理 - `DELETE /api/v1/memory/episodic/{key}` — 删除记忆条目 **Test scenarios**: - Evolution 事件列表分页 - Skill 版本历史查询 - 手动触发进化 - 记忆搜索 - 未授权访问拒绝 **Verification**: 全量测试通过 + API 路由测试 --- ### U10. 嵌入缓存 + Enhanced Search 部分降级修复 **Goal**: 嵌入结果缓存减少 API 调用;Enhanced Search 对每个 KB 独立降级而非全量降级。 **Requirements**: R11 **Dependencies**: U1(EpisodicMemory 重构) **Files**: - `src/agentkit/memory/embedder.py` — 嵌入缓存 - `src/agentkit/memory/http_rag.py` — 部分降级修复 - `tests/unit/test_episodic_vector_search.py` — 更新测试 - `tests/unit/test_http_rag_service.py` — 更新测试 **Approach**: 1. `EmbeddingCache`:LRU 缓存(max_size=1000, TTL=3600s),基于文本 SHA-256 哈希 2. OpenAIEmbedder.embed() 先查缓存,命中直接返回 3. HttpRAGService.enhanced_search():逐 KB 尝试 enhanced,单个 404 降级到 standard 仅该 KB 4. 合并所有 KB 结果后统一排序 **Test scenarios**: - 缓存命中返回相同向量 - 缓存未命中调用 API - 缓存 TTL 过期重新获取 - 部分 KB enhanced 404,其余 KB 仍用 enhanced - 所有 KB 降级到 standard **Verification**: 全量测试通过 --- ### Phase C: 扩展能力(P2 — 未来准备) --- ### U11. Gemini Provider 原生实现 **Goal**: 新增 GeminiProvider,支持 Google Gemini API 原生调用。 **Requirements**: R12 **Dependencies**: U5(重试机制) **Files**: - `src/agentkit/llm/providers/gemini.py` — 新增 GeminiProvider - `src/agentkit/llm/gateway.py` — 注册 Gemini provider - `src/agentkit/llm/config.py` — Gemini 配置 - `tests/unit/test_gemini_provider.py` — 新增测试 **Approach**: 1. GeminiProvider 实现 LLMProvider ABC 2. 使用 httpx 调用 `https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent` 3. 支持 Gemini 特有功能: - `contents` 数组格式 - `safetySettings` 配置 - `toolConfig`(function_calling 配置) - 流式:`streamGenerateContent` 4. 认证:API key 作为 URL 参数 `?key=xxx` **Test scenarios**: - 标准 generateContent 请求/响应 - function_calling 请求/响应 - 流式 generateContent - safetySettings 过滤 - API key 缺失报错 **Verification**: 全量测试通过 --- ### U12. Agent 状态锁 + 配置热加载 **Goal**: Agent 状态更新加锁防竞态;配置文件变更自动热加载。 **Requirements**: R13 **Dependencies**: 无 **Files**: - `src/agentkit/core/base.py` — asyncio.Lock 保护状态 - `src/agentkit/server/config.py` — 文件监听 + 热加载 - `src/agentkit/server/app.py` — 热加载集成 - `tests/unit/test_base_agent.py` — 更新测试 - `tests/unit/test_server_config.py` — 更新测试 **Approach**: 1. BaseAgent 新增 `_status_lock: asyncio.Lock`,所有状态更新在锁内 2. ServerConfig 新增 `watch_config()` 方法:使用 `watchfiles` 监听 YAML 变更 3. 变更时重新加载配置,更新 LLMGateway/SkillRegistry 等组件 4. 热加载期间拒绝新请求(drain 模式) **Test scenarios**: - 并发状态更新无竞态 - 配置文件变更触发重载 - 重载期间请求排队等待 - 无效配置不覆盖当前配置 **Verification**: 全量测试通过 --- ## Phased Delivery | Phase | Units | 交付物 | GEO 影响 | |-------|-------|--------|----------| | **A: 核心修复** | U1-U4 | pgvector 记忆 + 超时取消 + 进化修复 + Anthropic Provider | GEO 内容生成质量提升 + Claude 模型支持 | | **B: 增强能力** | U5-U10 | 重试熔断 + stream fallback + WebSocket + SSE 修复 + API 路由 + 缓存 | GEO 系统稳定性 + 实时监控 + 运维可见 | | **C: 扩展能力** | U11-U12 | Gemini Provider + 状态锁 + 热加载 | 多模型选择 + 运维友好 | ## Risks & Mitigations | Risk | Likelihood | Impact | Mitigation | |------|-----------|--------|------------| | pgvector 查询与 GEO 数据库冲突 | Low | High | 使用独立 schema `agentkit.episodic_memories`,不影响 GEO 表 | | Anthropic API 格式差异导致 tool_calls 解析错误 | Medium | Medium | 严格按 Messages API 文档实现,覆盖 tool_use/tool_result 测试 | | A/B 测试样本不足导致进化无法应用 | High | Low | 设置低阈值 min_samples=10,不足时记录日志不阻塞 | | WebSocket 连接泄漏 | Medium | Medium | 心跳检测 + 超时自动断开 + 连接数上限 | | 进化应用有害变更 | Medium | High | A/B 测试统计显著才应用 + 自动回滚 + 质量门控 | ## Success Metrics | Metric | Current | Target | |--------|---------|--------| | EpisodicMemory 搜索延迟(1 万条) | >2s (O(N) 客户端) | <100ms (pgvector ANN) | | ReAct 循环超时保护 | 无 | 100% 任务有超时 | | 进化系统可运行性 | A/B 测试禁用 | A/B 测试启用 + 统计显著才应用 | | LLM Provider 覆盖 | 1 (OpenAI 兼容) | 3 (OpenAI + Anthropic + Gemini) | | Provider 调用可靠性 | 无重试/熔断 | 3 次重试 + 熔断保护 | | 实时通信 | 仅 SSE | WebSocket + SSE 双通道 | | API 路由覆盖 | 无 Evolution/Memory | 完整 CRUD + 搜索 | | 全量测试 | 1037 passed | 1200+ passed |