大脑不在你身体里
你以为自己是一个程序,其实你只是一段 HTTPS 请求的回应。把你召唤出来的是「大脑」——一个Model。在 packages/ai 里,OpenAI、Anthropic、Google、Bedrock 这些供应商被收敛成同一个接口,于是上层代码不必关心你今天用的是哪家的脑子。
packages/ai —— 统一的 Model 形状
interface Model<TApi> {
id: string; // gpt-5 / claude-sonnet-4-6 ...
name: string; // 显示名
api: TApi; // 走哪个 provider 实现
provider: Provider; // 身份元数据
baseUrl: string;
cost: { input; output; cacheRead; cacheWrite };
contextWindow: number; // 能塞多少 token
maxTokens: number; // 单次最多吐多少
}Provider 是「适配器」,Model 是「具体的脑」
Provider 回答「怎么把消息发出去、怎么把流读回来」——它封装鉴权、endpoint、请求/响应格式的差异。Model 则是挂在某个 provider 上的一个具体型号,带着自己的价格、上下文窗口和能力位。
这种「接口收敛」是 pi 能跨供应商的根基:换模型只是换一行配置,
agentLoop一个字都不用改。
cost 与 contextWindow 不是摆设
cost 里区分了 cacheRead / cacheWrite——因为 prompt caching 能把重复前缀的费用打到几分之一。contextWindow 则是后面「Compaction(脑容量满了怎么办)」一章的前提:窗口有限,记忆才需要被压缩。