模型抽象、流式、追踪与兄弟包
前四章讲完了引擎主线和挂件。这一章收尾三个「横切」能力——模型怎么解耦、流式怎么走、追踪怎么记——再俯瞰两条建立在引擎之上的扩展线(sandbox agent、realtime 语音) 。
1. 模型抽象:provider 无关靠两个方法
1.1 思路
整个引擎只通过一个窄接口跟 LLM 打交道。换供应商(OpenAI / Vercel AI SDK / 自研),只要实现这接口,循环代码一行不改。
1.2 真实实现
Model 接口(model.ts:573)只有三个方法,两个是核心:
// model.ts:573 Model(真实源码,节选)
export interface Model {
getResponse(request: ModelRequest): Promise<ModelResponse>; // 非流式
getStreamedResponse(request: ModelRequest): AsyncIterable<StreamEvent>; // 流式
getRetryAdvice?(args: ModelRetryAdviceRequest): ...; // 可选:重试建议
}
- 输入
ModelRequest(model.ts:439):系统指令、input items、工具/交接的序列化形式、modelSettings、tracing 开关。 - 输出
ModelResponse(model.ts:542):usage、output(消息/工具调用等)、responseId、providerData。 - 查找模型 用
ModelProvider.getModel(name)(model.ts:600)——把字符串模型名解析成Model实例。
主循环里调用点是 getResponseWithRetry(preparedCall.model, {...})(run.ts:1008),preparedCall.model 就是一个 Model。引擎从不直接 import OpenAI。