fischer-agentkit/docs/plans/2026-06-06-008-feat-agentki...

626 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "feat: AgentKit Phase 3 — 持久化·记忆·进化·技能·可观测性升级"
status: active
created: 2026-06-06
plan_type: feat
depth: deep
origin: Hermes Agent 对比分析 + 5 大问题评估
branch: feat/agentkit-phase3-upgrade
---
# AgentKit Phase 3 升级计划
## Summary
基于 Hermes Agent 对标分析和 AgentKit 现状评估,本计划解决 5 个核心问题:无法持久运行、记忆系统未接入、进化架构断层、技能能力不足、缺乏可观测性。覆盖 P0+P1+P2 共 10 项升级,分 3 个交付阶段实施,保持主干代码不变,在 `feat/agentkit-phase3-upgrade` 分支开发。
## Problem Frame
AgentKit 当前是一个"有框架但未接入"的状态:
- **持久化断层**docker-compose 配置了 Redis + PostgreSQL但 TaskStore 纯内存,进程重启丢失所有状态
- **记忆断层**:三层记忆架构设计完整,但 Agent 循环中零记忆调用ReActEngine 不读写记忆
- **进化断层**EvolutionConfig 定义了配置但 EvolutionMixin 不读取Reflector 基于硬编码规则A/B 测试数据伪造
- **技能断层**Skill 是纯数据容器,无自动创建/编排/策展能力,不支持 SKILL.md 开放标准
- **可观测性断层**:无结构化日志、无 metrics、无执行轨迹导出
Hermes Agent 的核心创新是"执行轨迹 → LLM 反思 → 技能沉淀 → 复用加速"的闭环飞轮。AgentKit 需要建立类似但适配企业场景的进化能力。
## Requirements
| ID | 需求 | 优先级 | 来源 |
|----|------|--------|------|
| R1 | TaskStore 持久化到 Redis/PG进程重启不丢状态 | P0 | 持久运行评估 |
| R2 | 记忆系统接入 Agent 循环,执行前检索上下文,执行后写入轨迹 | P0 | 记忆架构评估 |
| R3 | LLM 驱动反思器替换硬编码 Reflector | P0 | 进化架构评估 |
| R4 | EpisodicMemory 实现 pgvector 向量检索 | P1 | 记忆架构评估 |
| R5 | 执行轨迹记录器,为反思和可观测性提供数据 | P1 | 进化+可观测性 |
| R6 | 技能编排/Pipeline 能力 | P1 | 技能完备性评估 |
| R7 | EvolutionStore 持久化 | P1 | 进化架构评估 |
| R8 | SKILL.md 格式 + 渐进式分层 | P2 | 技能完备性评估 |
| R9 | 上下文压缩与 Prompt 缓存 | P2 | Token 成本优化 |
| R10 | 可观测性(结构化日志 + metrics + 健康检查增强) | P2 | 生产运维 |
## Scope Boundaries
### In Scope
- 10 项升级R1-R10分 3 个交付阶段
- 保持现有 API 向后兼容
- 分支开发模式,不修改主干
### Out of Scope
- 多平台消息网关Telegram/Discord/Slack 等——定位差异AgentKit 是 AI 引擎而非个人 Agent
- 子代理并行执行——需要更复杂的调度架构,留待 Phase 4
- 技能自动创建 + Curator——依赖 LLM 反思器和执行轨迹,留待 Phase 4
- agentskills.io 技能市场——需要社区基础设施,留待 Phase 4
- SemanticMemory 的 RAG/知识图谱后端实现——依赖外部服务,当前保持适配器模式
### Deferred to Follow-Up Work
- RateLimiter 迁移到 Redis 分布式限流
- 多 worker 模式下的状态共享
- 优雅关闭SIGTERM 信号处理)
- 用户建模user_id + 偏好跟踪)
---
## Key Technical Decisions
### KTD1: TaskStore 持久化策略 — Redis 优先
**决策**TaskStore 默认使用 Redis 后端InMemoryTaskStore 仅用于开发/测试。
**理由**
- docker-compose 已配置 Redis基础设施就绪
- TaskStore 已有 `RedisTaskStore` 实现(`server/task_store.py`),只需设为默认
- Redis 天然支持 TTL与任务过期清理需求一致
- 避免引入新的存储依赖
**替代方案**PostgreSQL 后端——更持久但延迟更高,适合归档而非活跃任务状态。
### KTD2: 记忆集成方式 — MemoryRetriever 注入 ReActEngine
**决策**:在 ReActEngine.execute() 中注入 `MemoryRetriever | None` 参数,执行前检索相关上下文注入 system_prompt执行后写入轨迹到 EpisodicMemory。
**理由**
- ReActEngine 是所有执行模式的底层引擎,在此层集成覆盖面最广
- MemoryRetriever 已实现三层并行检索 + 权重融合,无需重写
- 注入方式而非继承方式,保持 ReActEngine 的独立性
**替代方案**:在 ConfigDrivenAgent 层集成——更简单但只覆盖 ConfigDrivenAgent不覆盖直接使用 ReActEngine 的场景。
### KTD3: 反思器策略 — LLM-in-the-loop + 规则降级
**决策**:新增 `LLMReflector`,通过 LLM 分析执行轨迹生成反思。保留 `RuleBasedReflector`当前实现作为降级方案LLM 不可用时自动切换。
**理由**
- GEPA 的核心洞见是"自然语言反思比数值奖励更有效",这需要 LLM 级别的反思
- 企业场景需要降级策略LLM 不可用时不能完全失去反思能力
- 不直接使用 DSPy/GEPA 框架——AgentKit 已有 LLMGateway无需引入新依赖
**替代方案**:集成 DSPy + GEPA——更强大但引入重依赖且 AgentKit 的定位不需要 GEPA 的完整进化流水线。
### KTD4: 执行轨迹存储 — SQLite 本地 + 可选 PG
**决策**:执行轨迹默认存储在本地 SQLite`~/.agentkit/traces/`),可选配置 PostgreSQL 后端用于大规模部署。
**理由**
- 与 Hermes Agent 一致SQLite FTS5轻量级
- 单机部署无需 PG降低使用门槛
- PG 后端用于多实例部署场景
### KTD5: 技能编排 — 复用现有 PipelineEngine
**决策**:技能编排复用 `orchestrator/pipeline_engine.py` 的 PipelineEngine新增 `SkillPipeline` 适配层将 Skill 包装为 Pipeline Step。
**理由**
- PipelineEngine 已实现顺序/并行/条件执行,功能完整
- 避免重复造轮子,只需一个适配层
- Pipeline YAML 格式已定义,用户可声明式编排技能
### KTD6: SKILL.md 格式 — YAML 元数据 + Markdown 正文
**决策**SKILL.md 采用 YAML frontmatter + Markdown 正文的混合格式,兼容 agentskills.io 标准。
**理由**
- YAML frontmatter 机器可读解析元数据Markdown 正文人机可读(描述技能步骤)
- 与现有 YAML 配置格式兼容,迁移成本低
- agentskills.io 标准使用纯 MarkdownYAML frontmatter 是其超集
---
## High-Level Technical Design
### 进化飞轮架构
```mermaid
graph LR
A[任务执行] --> B[执行轨迹记录]
B --> C[LLM 反思分析]
C --> D{质量达标?}
D -->|否| E[Prompt 优化]
D -->|是| F[技能沉淀]
E --> G[A/B 测试]
G --> H{统计显著?}
H -->|是| I[应用/回滚]
H -->|否| J[继续收集样本]
F --> K[技能库]
K -->|复用| A
I --> K
```
### 记忆集成数据流
```mermaid
sequenceDiagram
participant Client
participant Agent as ConfigDrivenAgent
participant Engine as ReActEngine
participant Retriever as MemoryRetriever
participant Episodic as EpisodicMemory
Client->>Agent: handle_task(task)
Agent->>Retriever: get_context(task.input_data)
Retriever->>Episodic: search(similar tasks)
Episodic-->>Retriever: relevant memories
Retriever-->>Agent: context string
Agent->>Engine: execute(messages + context)
Engine-->>Agent: result + trace
Agent->>Episodic: store(trace summary)
Agent-->>Client: TaskResult
```
### 三阶段交付依赖
```mermaid
graph TD
subgraph Phase A - 基础设施
U1[U1: TaskStore 持久化]
U2[U2: 执行轨迹记录器]
U3[U3: EvolutionStore 持久化]
end
subgraph Phase B - 核心能力
U4[U4: 记忆接入 Agent 循环]
U5[U5: Episodic 向量检索]
U6[U6: LLM 反思器]
U7[U7: 技能编排]
end
subgraph Phase C - 增强
U8[U8: SKILL.md 格式]
U9[U9: 上下文压缩与缓存]
U10[U10: 可观测性]
end
U1 --> U4
U2 --> U4
U2 --> U6
U3 --> U6
U4 --> U5
U6 --> U8
```
---
## Implementation Units
### U1. TaskStore 持久化到 Redis
**Goal**: 将 TaskStore 默认后端从内存切换到 Redis确保进程重启后任务状态不丢失。
**Requirements**: R1
**Dependencies**: 无
**Files**:
- Modify: `src/agentkit/server/task_store.py` — 将 `create_task_store()` 默认使用 Redis 后端
- Modify: `src/agentkit/server/app.py``create_app()` 中根据配置选择 TaskStore 后端
- Modify: `src/agentkit/server/config.py` — 新增 `task_store_backend` 配置项
- Modify: `src/agentkit/cli/main.py` — serve 命令传递 task_store 配置
- Test: `tests/unit/test_task_store_redis.py`
**Approach**:
1. `RedisTaskStore` 已存在于 `task_store.py`,验证其功能完整性
2. `create_task_store()` 工厂函数增加 `backend` 参数,默认 `redis`
3. `ServerConfig` 新增 `task_store` 配置块backend/redis_url/ttl/max_records
4. `create_app()``ServerConfig` 读取配置,创建对应 TaskStore
5. InMemoryTaskStore 保留用于测试,通过 `backend: memory` 显式启用
**Patterns to follow**: `src/agentkit/server/task_store.py``RedisTaskStore` 的现有实现
**Test scenarios**:
- Happy path: 创建任务 → 重启模拟(关闭 Redis 连接再重连)→ 查询任务仍存在
- Edge case: Redis 不可用时降级到 InMemoryTaskStore 并打 warning 日志
- Edge case: TTL 过期后任务自动清理
- Error path: Redis 连接失败时的错误处理和降级
- Integration: serve 命令启动后提交任务,查询任务状态
**Verification**: `PYTHONPATH=src pytest tests/unit/test_task_store_redis.py -v` 全部通过
---
### U2. 执行轨迹记录器
**Goal**: 在 ReActEngine 执行过程中记录完整的执行轨迹每步动作、输入输出、耗时、Token 用量),为反思和可观测性提供数据。
**Requirements**: R5
**Dependencies**: 无
**Files**:
- Create: `src/agentkit/core/trace.py` — TraceStep + ExecutionTrace 数据类 + TraceRecorder
- Modify: `src/agentkit/core/react.py` — execute() 中注入 TraceRecorder记录每步
- Modify: `src/agentkit/core/protocol.py` — TaskResult 新增 `trace` 字段
- Test: `tests/unit/test_trace_recorder.py`
**Approach**:
1. 定义 `TraceStep`step/action/tool_name/input/output/duration_ms/tokens_used/error`ExecutionTrace`task_id/agent_name/skill_name/steps/total_duration/total_tokens/outcome/quality_score
2. `TraceRecorder` 类:`start_trace()`、`record_step()`、`end_trace()`、`get_trace()`
3. `ReActEngine.execute()` 新增 `trace_recorder: TraceRecorder | None = None` 参数
4. 每次工具调用和 LLM 调用后调用 `record_step()`
5. `TaskResult` 新增可选 `trace: ExecutionTrace | None` 字段
6. 轨迹默认存储在内存中(单次请求生命周期),后续 U3 持久化
**Patterns to follow**: `src/agentkit/core/react.py``ReActStep``ReActResult` 的现有数据结构
**Test scenarios**:
- Happy path: 执行 3 步 ReAct 循环,验证轨迹包含 3 个 TraceStep
- Happy path: 工具调用记录 tool_name/input/output/duration
- Edge case: 无工具调用的纯 LLM 响应,轨迹只有 1 步
- Error path: 工具调用失败TraceStep.error 非空
- Integration: ConfigDrivenAgent 通过 ReActEngine 执行任务TaskResult 包含 trace
**Verification**: `PYTHONPATH=src pytest tests/unit/test_trace_recorder.py -v` 全部通过
---
### U3. EvolutionStore 持久化
**Goal**: 将进化事件从内存迁移到 SQLite 持久化存储,支持进化历史查询和回滚。
**Requirements**: R7
**Dependencies**: 无
**Files**:
- Modify: `src/agentkit/evolution/evolution_store.py` — 新增 SQLite 后端,替换内存存储
- Create: `src/agentkit/evolution/models.py` — SQLAlchemy ORM 模型EvolutionEvent/SkillVersion/ABTestResult
- Test: `tests/unit/test_evolution_store_persistent.py`
**Approach**:
1. 定义 SQLAlchemy ORM 模型:`EvolutionEvent`id/agent_name/event_type/trace_id/reflection_id/proposal_id/status/created_at、`SkillVersion`id/skill_name/version/content/parent_version/created_at、`ABTestResult`id/test_id/variant/score/sample_count/created_at
2. `EvolutionStore` 新增 `backend` 参数,默认 `sqlite`(路径 `~/.agentkit/evolution.db`
3. `record()`/`query()`/`rollback()` 方法操作 SQLite
4. 保留内存后端用于测试
5. 首次运行自动创建表结构
**Patterns to follow**: `src/agentkit/evolution/evolution_store.py` 的现有接口
**Test scenarios**:
- Happy path: 记录进化事件 → 关闭连接 → 重新打开 → 查询到事件
- Happy path: 记录技能版本 → 查询版本历史
- Edge case: 空数据库首次查询返回空列表
- Error path: SQLite 文件不可写时的错误处理
- Integration: EvolutionMixin.evolve_after_task() 写入 EvolutionStore
**Verification**: `PYTHONPATH=src pytest tests/unit/test_evolution_store_persistent.py -v` 全部通过
---
### U4. 记忆接入 Agent 循环
**Goal**: 将 MemoryRetriever 注入 ReActEngine执行前检索相关上下文注入 system_prompt执行后写入轨迹摘要到 EpisodicMemory。
**Requirements**: R2
**Dependencies**: U1, U2
**Files**:
- Modify: `src/agentkit/core/react.py` — execute() 新增 `memory_retriever` 参数,执行前检索上下文
- Modify: `src/agentkit/core/config_driven.py` — 根据 config.memory 自动实例化三层记忆,注入 ReActEngine
- Modify: `src/agentkit/core/base.py` — BaseAgent 新增 `use_memory_retriever()` 方法
- Modify: `src/agentkit/server/app.py` — create_app() 中初始化 Memory 组件
- Test: `tests/unit/test_memory_integration.py`
**Approach**:
1. `ReActEngine.__init__` 新增 `memory_retriever: MemoryRetriever | None = None`
2. `execute()` 开始前:调用 `memory_retriever.get_context_string(task_input)` 获取相关记忆
3. 将记忆上下文追加到 system_prompt 的末尾(`## Relevant Past Experience` 段落)
4. `execute()` 结束后:将执行轨迹摘要写入 EpisodicMemory
5. `ConfigDrivenAgent.__init__` 根据 `config.memory` 配置自动创建 WorkingMemory/EpisodicMemory/MemoryRetriever
6. `create_app()` 中从 ServerConfig 读取 memory 配置,初始化 Memory 组件
**Patterns to follow**: `src/agentkit/memory/retriever.py``MemoryRetriever` 接口
**Test scenarios**:
- Happy path: 执行任务时检索到相关历史记忆,注入 system_prompt
- Happy path: 任务完成后轨迹摘要写入 EpisodicMemory
- Edge case: 无记忆时正常执行memory_retriever=None
- Edge case: 记忆检索失败时不影响任务执行
- Integration: 连续执行两个相似任务,第二个任务能检索到第一个的记忆
**Verification**: `PYTHONPATH=src pytest tests/unit/test_memory_integration.py -v` 全部通过
---
### U5. EpisodicMemory 向量检索实现
**Goal**: 实现 EpisodicMemory 的 pgvector cosine distance 排序,替代当前的时间衰减排序,支持语义相似度检索。
**Requirements**: R4
**Dependencies**: U4
**Files**:
- Modify: `src/agentkit/memory/episodic.py` — 实现 pgvector 向量检索
- Create: `src/agentkit/memory/embedder.py` — Embedder 接口 + OpenAIEmbedder 实现
- Test: `tests/unit/test_episodic_vector_search.py`
**Approach**:
1. 新增 `Embedder` 抽象基类:`embed(text: str) -> list[float]`
2. 新增 `OpenAIEmbedder`:调用 OpenAI Embeddings APItext-embedding-3-small
3. `EpisodicMemory.store()` 中调用 embedder 生成 embedding存入 pgvector Vector 列
4. `EpisodicMemory.search()` 中实现 cosine distance 排序,与时间衰减混合:`score = alpha * cosine_similarity + (1-alpha) * time_decay`
5. 默认 `alpha=0.7`(语义相似度权重更高),可通过配置调整
6. `retrieve(key)` 方法实现:先 embed query再按 cosine distance 排序
**Patterns to follow**: `src/agentkit/memory/episodic.py` 的现有接口
**Test scenarios**:
- Happy path: 存入 3 条记忆,用语义相似查询检索到最相关的
- Happy path: 时间衰减 + 语义相似度混合排序
- Edge case: embedder 不可用时降级到纯时间衰减排序
- Edge case: 空查询返回空结果
- Error path: pgvector 扩展未安装时的错误提示
**Verification**: `PYTHONPATH=src pytest tests/unit/test_episodic_vector_search.py -v` 全部通过
---
### U6. LLM 反思器
**Goal**: 新增 LLMReflector通过 LLM 分析执行轨迹生成结构化反思。保留 RuleBasedReflector 作为降级方案。
**Requirements**: R3
**Dependencies**: U2, U3
**Files**:
- Create: `src/agentkit/evolution/llm_reflector.py` — LLMReflector 类
- Modify: `src/agentkit/evolution/reflector.py` — 重命名为 RuleBasedReflector保持接口兼容
- Modify: `src/agentkit/evolution/lifecycle.py` — EvolutionMixin 支持 reflector 类型选择
- Modify: `src/agentkit/skills/base.py` — EvolutionConfig 新增 `reflector_type` 字段
- Test: `tests/unit/test_llm_reflector.py`
**Approach**:
1. `LLMReflector` 接收 `ExecutionTrace`,构建反思 Prompt包含轨迹详情 + 质量评分)
2. 调用 LLM Gateway 生成结构化反思(失败根因/成功模式/改进建议)
3. 输出与 `Reflection` 数据类兼容outcome/quality_score/patterns/insights/suggestions
4. `EvolutionMixin` 新增 `reflector_type` 配置:`llm`(默认)/ `rule` / `auto`LLM 优先,失败降级到 rule
5. LLM 反思使用辅助模型(非主模型),降低成本
6. `EvolutionConfig` 新增 `reflector_type``auxiliary_model` 字段,与 EvolutionMixin 对齐
**Patterns to follow**: `src/agentkit/evolution/reflector.py``Reflector` 接口和 `Reflection` 数据类
**Test scenarios**:
- Happy path: LLM 分析执行轨迹,生成包含 insights 和 suggestions 的 Reflection
- Happy path: auto 模式下 LLM 失败时降级到 RuleBasedReflector
- Edge case: 执行轨迹为空时返回默认 Reflection
- Edge case: LLM 返回非结构化文本时的解析容错
- Integration: EvolutionMixin 使用 LLMReflector 完成完整进化流程
**Verification**: `PYTHONPATH=src pytest tests/unit/test_llm_reflector.py -v` 全部通过
---
### U7. 技能编排
**Goal**: 复用 PipelineEngine 实现 Skill 编排,支持将多个 Skill 串联为 Pipeline 执行。
**Requirements**: R6
**Dependencies**: U4
**Files**:
- Create: `src/agentkit/skills/pipeline.py` — SkillPipeline 适配层
- Modify: `src/agentkit/skills/registry.py` — 新增 pipeline 注册和查询
- Modify: `src/agentkit/server/routes/skills.py` — 新增 pipeline API 端点
- Test: `tests/unit/test_skill_pipeline.py`
**Approach**:
1. `SkillPipeline` 类:封装 PipelineEngine将 Skill 包装为 Pipeline Step
2. 每个 Skill 在 Pipeline 中作为一个 Step输入为上一步的输出
3. 支持顺序执行、条件分支(根据 Skill 输出决定下一步)、并行执行
4. Pipeline 定义格式复用 `orchestrator/pipeline_schema.py` 的 PipelineConfig
5. SkillPipeline 可通过 YAML 定义或编程式构建
6. SkillRegistry 新增 `register_pipeline()``get_pipeline()` 方法
**Patterns to follow**: `src/agentkit/orchestrator/pipeline_engine.py` 的 PipelineEngine 接口
**Test scenarios**:
- Happy path: 3 个 Skill 顺序执行,输出正确传递
- Happy path: 条件分支 — 根据 Skill A 的输出决定执行 Skill B 还是 Skill C
- Edge case: Pipeline 中某个 Skill 失败时,后续 Skill 不执行
- Edge case: 空 Pipeline0 个 Skill直接返回空结果
- Integration: 通过 API 提交 Pipeline 任务,查询执行状态
**Verification**: `PYTHONPATH=src pytest tests/unit/test_skill_pipeline.py -v` 全部通过
---
### U8. SKILL.md 格式 + 渐进式分层
**Goal**: 支持 SKILL.md 格式的技能定义实现渐进式分层加载Level 0 概要 / Level 1 完整 / Level 2 参考)。
**Requirements**: R8
**Dependencies**: U6
**Files**:
- Create: `src/agentkit/skills/skill_md.py` — SKILL.md 解析器
- Modify: `src/agentkit/skills/loader.py` — 新增 `load_from_skill_md()` 方法
- Modify: `src/agentkit/skills/base.py` — SkillConfig 新增 `skill_md_path``disclosure_level` 字段
- Modify: `src/agentkit/cli/skill.py` — 新增 `skill create` 命令生成 SKILL.md 模板
- Test: `tests/unit/test_skill_md.py`
**Approach**:
1. SKILL.md 格式YAML frontmattername/description/intent/quality_gate/execution_mode+ Markdown 正文trigger/steps/pitfalls/verification
2. 解析器提取 frontmatter 生成 SkillConfig正文按标题分段存储
3. 渐进式分层:
- Level 0frontmatter 中的 name + description~50 tokens常驻加载
- Level 1完整正文按需加载当 IntentRouter 匹配到该技能时)
- Level 2references/ 和 templates/ 目录(深度加载,技能执行时)
4. SkillLoader 新增 `load_from_skill_md(path)` 方法
5. CLI `skill create` 生成 SKILL.md 模板文件
**Patterns to follow**: `src/agentkit/skills/loader.py``load_from_file()` 方法
**Test scenarios**:
- Happy path: 解析 SKILL.md 文件,生成正确的 SkillConfig
- Happy path: Level 0 只加载 name + description
- Happy path: Level 1 加载完整步骤
- Edge case: frontmatter 缺失时使用默认值
- Edge case: Markdown 正文缺少标准段落时的容错处理
- Integration: SkillLoader 从 SKILL.md 加载技能,注册到 SkillRegistry
**Verification**: `PYTHONPATH=src pytest tests/unit/test_skill_md.py -v` 全部通过
---
### U9. 上下文压缩与 Prompt 缓存
**Goal**: 实现上下文压缩(长会话自动压缩历史消息)和 Prompt 缓存(会话内 Prompt 不重复渲染)。
**Requirements**: R9
**Dependencies**: U4
**Files**:
- Create: `src/agentkit/core/compressor.py` — ContextCompressor 类
- Modify: `src/agentkit/prompts/template.py` — 新增 `render_cached()` 方法和缓存机制
- Modify: `src/agentkit/core/react.py` — execute() 中注入压缩逻辑
- Test: `tests/unit/test_context_compressor.py`
**Approach**:
1. `ContextCompressor`:当消息总 Token 数超过阈值(默认 4000调用 LLM 将历史消息压缩为摘要
2. 压缩策略:保留最近 N 条消息 + 早期消息的 LLM 摘要
3. `PromptTemplate.render_cached()`:对相同变量输入返回缓存结果,变量变化时重新渲染
4. 缓存 key 基于 variables 的 hash缓存存储在 PromptTemplate 实例上
5. ReActEngine.execute() 中在每次 LLM 调用前检查消息长度,超阈值则压缩
**Patterns to follow**: Hermes Agent 的上下文压缩机制LLM 摘要 + 缓存快照)
**Test scenarios**:
- Happy path: 10 条历史消息压缩为摘要 + 最近 3 条
- Happy path: 压缩后 Token 数低于阈值
- Happy path: 相同变量输入命中 PromptTemplate 缓存
- Edge case: 压缩后仍超阈值时递归压缩
- Edge case: LLM 压缩调用失败时保留原始消息
**Verification**: `PYTHONPATH=src pytest tests/unit/test_context_compressor.py -v` 全部通过
---
### U10. 可观测性
**Goal**: 实现结构化日志、metrics 端点和增强健康检查。
**Requirements**: R10
**Dependencies**: U2
**Files**:
- Create: `src/agentkit/core/logging.py` — 结构化日志配置
- Create: `src/agentkit/server/routes/metrics.py` — /api/v1/metrics 端点
- Modify: `src/agentkit/server/routes/health.py` — 增强健康检查Redis/PG/LLM/AgentPool 状态)
- Modify: `src/agentkit/server/app.py` — 注册 metrics 路由,初始化结构化日志
- Test: `tests/unit/test_observability.py`
**Approach**:
1. 结构化日志:使用 Python `structlog`JSON 格式输出,包含 trace_id/agent_name/skill_name
2. Metrics 端点:`GET /api/v1/metrics` 返回任务计数/成功率/平均耗时/Token 用量/Agent 池状态
3. 增强健康检查:`GET /api/v1/health` 返回 Redis 连通性/PG 连通性/LLM Provider 可用性/AgentPool 大小
4. Metrics 数据从 TaskStoreRedis和 EvolutionStoreSQLite聚合
5. 健康检查中 LLM 可用性通过轻量级 ping发送空请求验证 API Key 有效)
**Patterns to follow**: `src/agentkit/server/routes/health.py` 的现有健康检查接口
**Test scenarios**:
- Happy path: 结构化日志输出 JSON 格式,包含 trace_id
- Happy path: /api/v1/metrics 返回正确的任务计数和成功率
- Happy path: /api/v1/health 检查 Redis/PG/LLM 状态
- Edge case: Redis 不可用时健康检查返回 degraded 状态
- Edge case: 无任务数据时 metrics 返回零值
**Verification**: `PYTHONPATH=src pytest tests/unit/test_observability.py -v` 全部通过
---
## Phased Delivery
### Phase A: 基础设施U1, U2, U3
无外部依赖的底层能力,为后续所有单元提供基础。
- U1: TaskStore 持久化 → 进程重启不丢状态
- U2: 执行轨迹记录器 → 为反思和可观测性提供数据
- U3: EvolutionStore 持久化 → 进化可追溯
### Phase B: 核心能力U4, U5, U6, U7
依赖 Phase A 的核心升级,建立飞轮闭环。
- U4: 记忆接入 Agent 循环 → 跨会话上下文延续
- U5: Episodic 向量检索 → 语义记忆召回
- U6: LLM 反思器 → 真正的反思能力
- U7: 技能编排 → 多技能 Pipeline
### Phase C: 增强U8, U9, U10
提升用户体验和生产就绪度。
- U8: SKILL.md 格式 → 开放标准兼容
- U9: 上下文压缩与缓存 → Token 成本优化
- U10: 可观测性 → 生产运维
---
## Risks & Mitigations
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| LLM 反思器增加 API 调用成本 | 中 | 使用辅助模型更便宜auto 模式降级到规则 |
| pgvector 向量检索延迟 | 中 | 混合排序(语义+时间衰减),限制返回数量 |
| 记忆注入增加 Prompt Token | 中 | Token 预算管理,超预算时截断 |
| 技能编排增加复杂度 | 低 | 复用现有 PipelineEngine渐进式引入 |
| SQLite EvolutionStore 并发写入 | 低 | 单写多读模式,写操作加锁 |
| 向后兼容性破坏 | 高 | 所有新参数默认 None不改变现有行为 |
---
## System-Wide Impact
- **API 兼容性**:所有新增参数默认 None现有 API 调用无需修改
- **配置变更**`agentkit.yaml` 新增 `task_store`/`memory`/`evolution` 配置块,均为可选
- **部署变更**Redis 从可选变为推荐TaskStore 默认后端),已在 docker-compose 中配置
- **依赖变更**:新增 `structlog`(可观测性),`pgvector` 向量检索需要 pgvector 扩展
- **测试变更**:新增 10 个测试文件,约 50+ 测试用例
---
## Open Questions
1. **Embedder 选型**OpenAI Embeddings vs 本地模型(如 sentence-transformers建议默认 OpenAI可选本地
2. **LLM 反思的辅助模型**:使用主模型还是更便宜的模型?建议默认使用主模型,可通过 `auxiliary_model` 配置
3. **SKILL.md 与现有 YAML 的共存策略**是否需要迁移工具建议双格式共存SkillLoader 自动识别
---
## Sources & Research
- Hermes Agent 官方文档: https://hermes-agent.nousresearch.com/docs/developer-guide/architecture
- GEPA 论文: ICLR 2026 Oral "Reflective Prompt Evolution Can Outperform Reinforcement Learning"
- Hermes Agent 记忆系统: https://hermes-agent.ai/blog/hermes-agent-memory-system
- Hermes Curator: https://hermes-agent.nousresearch.com/docs/user-guide/features/curator
- AgentKit 现有计划: `docs/plans/006-refactor-agentkit-v2-phase2-plan.md`