架构设计
phi-agent 与依赖 crate 之间的关系,以及关键设计决策。
仓库
每个 crate 是独立的 git 仓库,发布到 crates.io:
| Crate | 仓库 | crates.io |
|---|---|---|
agent-base |
hibuka-labs/agent-base | ✅ |
agent-works |
hibuka-labs/agent-works | ✅ |
phi-agent |
hibuka-labs/phi-agent(本仓库) | ✅ |
phi-kernel-tools |
hibuka-labs/phi-kernel-tools | ✅ |
phi-tools |
hibuka-labs/phi-tools | ✅ |
phi-telemetry |
hibuka-labs/phi-telemetry | ✅ |
log-core |
hibuka-labs/log-core | ✅ |
所有 crate 使用纯版本依赖 version = "0.1",无 path、无 monorepo。
cargo add phi-agent 从 crates.io 拉取所需依赖。
依赖链
graph TB
AB[agent-base<br/>运行时内核<br/>Tool trait · LLM 客户端 · Events]
AB --> AW[agent-works<br/>MCP · Skills · Focus]
AB --> PKT[phi-kernel-tools<br/>内核工具]
AB --> YT[your-tools<br/>自定义工具实现]
AB --> PTEL[phi-telemetry<br/>指标采集 · 成本追踪]
AB --> LOG[log-core<br/>结构化日志]
AW --> PA
PKT --> PA
YT --> PA
PTEL -.-> PA
LOG -.-> PA
PA[phi-agent<br/>Builder 工厂 · 渲染器<br/>配置 · 会话 · CLI]
各 Crate 职责
agent-base
运行时内核 — cargo add agent-base 如果只需要引擎:
- AgentRuntime — 核心事件循环(LLM 对话 → 工具调用 → 循环)
- Tool trait — 所有工具实现的接口
- LlmClient trait — LLM 提供商的抽象层
- RuntimeEvent — 每轮对话中发出的所有事件:
| 变体 | 触发条件 | 关键字段 |
|---|---|---|
TextDelta |
LLM 文本流式输出 | text |
ThoughtDelta |
LLM 思考 / 推理 | text |
ToolCallStarted |
工具开始执行 | tool_name、args_json |
ToolCallFinished |
工具执行结束(成功 / 失败) | tool_name、summary |
AwaitingApproval |
工具需要用户审批 | request(risk_level、action_key) |
PlanUpdated |
任务计划创建或更新 | objective、plan[] |
UserEvent |
工具执行期间发出的自定义事件 | event(Progress / Structured / SubAgentEvent) |
RunFinished |
回合结束 | — |
RunCancelled |
回合取消 | — |
Checkpoint |
状态检查点(预留) | checkpoint |
- AgentBuilder — 组装 Agent 的构建器模式 |
||
- TurnContext + on_turn_end hook — 可观测性接口 |
agent-works
基于 agent-base — cargo add agent-works 获取工具箱:
- MCP — Model Context Protocol 支持
- Skills — 插件/技能系统
- Focus — 带类型的结构化 LLM 调用
- Multi-Agent — 子 Agent 调度与编排
phi-kernel-tools
内核原语,通过 feature flag 控制。文件工具默认开启,shell 和多 Agent 按需启用:
| Feature | 能力 | 默认 |
|---|---|---|
file |
read_file、write_file、list_files |
开启 |
shell |
执行 Shell 命令 | 关闭 |
multi-agent |
启动子 Agent(spawn_agent、send_message 等) |
关闭 |
phi-agent
框架层 — cargo add phi-agent 获取完整功能:
- base_agent_builder() — 预配置的构建器工厂
- PhiAgent — AgentRuntime 的高级封装
- EventRenderer — 终端 / JSON / 静默输出
- 配置解析、会话管理、系统提示词
- phi CLI — cargo install phi-agent
可观测性
phi-agent 自动采集结构化指标。每个 session 写入 session_metrics.json:
- 每轮:token 用量、延迟分解(TTFT、LLM、工具)、工具调用、结果、thinking
- 每会话:总计、P50/P95/P99 延迟、工具分布、错误率、费用估算
- 自定义扩展:业务逻辑通过
custom字段注入数据
// session_metrics.json — 示例
{
"session_id": "20260729_abc12345",
"model": "claude-sonnet",
"total_turns": 5,
"total_input_tokens": 15000,
"total_output_tokens": 12000,
"estimated_cost": 0.18,
"p50_turn_ms": 32000,
"p95_turn_ms": 52000,
"tool_breakdown": { "shell": 5, "check_quality": 3 },
"outcome": "completed",
"custom": { "product": "phi-bard", "prompt_version": "v3" }
}
环境变量:
| 变量 | 默认值 | 说明 |
|---|---|---|
PHI_METRICS_ENABLED |
true |
设为 false 关闭指标采集 |
PHI_NODE_ID |
"" |
多节点部署时的节点标识 |
PHI_COST_PER_1K_TOKENS |
内置 | 自定义模型定价(每千 token 的 input_cost,output_cost) |
完整规范、phi-dash 计划和数据分析工作流详见 可观测性设计文档。
关键设计决策
内核工具,非应用工具
phi-agent 提供内核工具(文件读写、Shell、子 Agent 调度)通过 feature flag 控制——文件工具默认开启,shell 和多 Agent 按需启用。但不预设任何应用工具(无网页搜索、数据库连接器)。工具通过 AgentBuilder::register_tool() 外部注册。
文件记忆,无向量库
phi-agent 内置基于文件系统的记忆功能(.phi/memory/),但没有向量数据库、embedding、语义搜索。每个决策都可追溯到 prompt。
可观测性默认开启
每个 session 自动写入 session_metrics.json。Token 消耗、延迟分布、工具调用统计全部记录。phi metrics 查看。详见 可观测性。
会话隔离
每个会话有独立目录和文件锁,防止多进程并发访问。详见 高级用法。