Pi LLM 抽象层
位置
packages/ai/src/
设计理念
Pi 的 LLM 抽象层叫 pi-ai,设计目标是:
- 所有 provider 共用一个通用接口
- 支持
generate(非流式)和stream(流式) - Provider 实现各自的消息格式转换
核心接口
typescript
interface AI {
generate(options: GenerateOptions): Promise<GenerateResult>;
stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
countTokens(messages: Message[]): Promise<number>;
}typescript
interface GenerateOptions {
messages: Message[];
tools?: ToolSchema[];
temperature?: number;
maxTokens?: number;
model?: string;
}Provider 实现
Pi 内置的 provider:
| Provider | 实现文件 | 备注 |
|---|---|---|
| OpenAI | providers/openai.ts | Chat Completions API |
| Anthropic | providers/anthropic.ts | Messages API |
| DeepSeek | providers/deepseek.ts | OpenAI-compatible |
| Ollama | providers/ollama.ts | 本地模型 |
providers/google.ts | Gemini |
Provider 注册
typescript
class ModelRegistry {
register(provider: AI, models: string[]): void;
get(modelName: string): AI;
}与 OpenCode 对比
| 维度 | Pi | OpenCode |
|---|---|---|
| 抽象粒度 | 单一 AI interface | Protocol + Endpoint + Auth + Framing |
| Provider 数量 | ~5 | ~20+ |
| 路由 | 按 model name | 按 Route definition |
| 复杂度 | 低 | 高(Effect/Schema-driven) |
与 Hermes 对比
| 维度 | Pi | Hermes |
|---|---|---|
| 核心接口 | AI.generate/stream | OpenAI SDK + ProviderTransport |
| 适配方向 | 每个 provider 一个实现 | OpenAI-compatible 窄腰 + adapter |
| 复杂度 | 低 | 中(transport/adapter 两层) |
Pi 的 pi-ai 适合学习:清晰、简洁、每个 provider 独立实现,没有任何运行时抽象泄漏。