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

27 KiB
Raw Blame History

title status created plan_type depth origin branch
feat: AgentKit Phase 3 — 持久化·记忆·进化·技能·可观测性升级 active 2026-06-06 feat deep Hermes Agent 对比分析 + 5 大问题评估 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

进化飞轮架构

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

记忆集成数据流

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

三阶段交付依赖

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.pycreate_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.pyRedisTaskStore 的现有实现

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. 定义 TraceStepstep/action/tool_name/input/output/duration_ms/tokens_used/errorExecutionTracetask_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.pyReActStepReActResult 的现有数据结构

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 模型:EvolutionEventid/agent_name/event_type/trace_id/reflection_id/proposal_id/status/created_atSkillVersionid/skill_name/version/content/parent_version/created_atABTestResultid/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.pyMemoryRetriever 接口

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 / autoLLM 优先,失败降级到 rule
  5. LLM 反思使用辅助模型(非主模型),降低成本
  6. EvolutionConfig 新增 reflector_typeauxiliary_model 字段,与 EvolutionMixin 对齐

Patterns to follow: src/agentkit/evolution/reflector.pyReflector 接口和 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_pathdisclosure_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.pyload_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 structlogJSON 格式输出,包含 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