架构设计¶
设计概览¶
agentabi 采用分层架构,包含三个核心概念:
- Session — 面向消费者的 API
- Provider — 每个 agent 的适配层
- IR(中间表示) — 通用事件格式
graph TD
A[你的代码] --> B[Session]
B --> C{Provider 注册表}
C --> D[ClaudeNativeProvider]
C --> E[CodexNativeProvider]
C --> F[GeminiNativeProvider]
C --> G[OpenCodeNativeProvider]
D --> H[claude CLI]
E --> I[codex CLI]
F --> J[gemini CLI]
G --> K[opencode CLI]
D --> L[IR 事件]
E --> L
F --> L
G --> L
L --> B
Provider 模型¶
Provider 协议¶
每个 provider 实现一个通用协议,包含四个方法:
is_available()— 此 provider 是否可用?capabilities()— 支持哪些功能?stream(task)— 执行并逐个产出 IR 事件run(task)— 执行并返回汇总结果
Provider 类型¶
Native Provider 将 agent CLI 作为子进程运行,解析其结构化输出(JSON/JSONL)为 IR 事件。不需要额外 Python 依赖。
SDK Provider 使用 agent 的官方 Python SDK。提供更紧密的集成,但需要安装可选依赖。
回退链¶
每个 agent 有一个有序的 provider 列表。注册表按顺序尝试:
claude_code → [ClaudeNativeProvider, ClaudeSDKProvider]
codex → [CodexNativeProvider, CodexSDKProvider]
gemini_cli → [GeminiNativeProvider, GeminiSDKProvider]
opencode → [OpenCodeNativeProvider]
如果 native provider 可用(CLI 在 PATH 中),优先使用。否则尝试 SDK provider。
中间表示(IR)¶
IR 是一组 TypedDict 事件类型,将所有 agent 的输出归一化为通用格式。灵感来自编译器 IR(如 LLVM IR)— 每个 agent 的原生事件格式被"编译"为 IR 事件。
设计原则¶
- 能力并集 — IR 支持所有 agent 的所有功能。Agent 特有的字段设为可选。
- TypedDict 而非 dataclass — 事件是普通字典,便于序列化且零开销。
- 判别联合 — 每个事件都有
type字段用于模式匹配。 - 增量演进 — 可以添加新的事件类型和可选字段而不破坏现有消费者。
事件分类¶
| 类别 | 事件 | 用途 |
|---|---|---|
| 会话生命周期 | session_start, session_end |
会话边界 |
| 消息流 | message_start, message_delta, message_end |
文本流式输出 |
| 工具执行 | tool_use, tool_result |
工具调用追踪 |
| 元数据 | usage, error, file_diff |
统计和诊断 |
| 权限 | permission_request, permission_response |
审批流程 |
项目结构¶
src/agentabi/
├── __init__.py # 公开 API 导出
├── session.py # Session 类 + run_sync()
├── auto_detect.py # Agent 发现
├── providers/
│ ├── base.py # Provider 协议 + default_run()
│ ├── registry.py # Provider 链注册表
│ ├── claude_native.py # Claude 子进程 provider
│ ├── claude_sdk.py # Claude SDK provider
│ ├── codex_native.py # Codex 子进程 provider
│ ├── codex_sdk.py # Codex SDK provider
│ ├── gemini_native.py # Gemini 子进程 provider
│ ├── gemini_sdk.py # Gemini SDK provider
│ └── opencode_native.py # OpenCode 子进程 provider
└── types/
└── ir/
├── events.py # IR 事件 TypedDict
├── session.py # SessionResult
├── task.py # TaskConfig
├── capabilities.py # AgentCapabilities
├── permissions.py # 权限类型
├── helpers.py # 事件创建辅助函数
└── type_guards.py # 运行时类型守卫