第十五章:模型提供方和执行提供方是两条轴
15.1 不要用一个 adapter 包办所有差异
模型提供方负责消息转换、模型能力、认证、流事件与用量。执行提供方负责文件、进程、工作目录、网络边界和实际运行位置。它们都叫适配器时,容易混在一起,但替换模型与把工具搬到远程机器是不同工作。
Pi 的模型流函数是前一类接口。DeepSeek 的能力服务设计则说明后一个方向:工具使用抽象能力,提供方负责实际执行世界。阅读时应记录每条边界在哪个进程、哪个工作区与哪套权限下生效。
15.2 能力差异需要明确协商
不同模型可能支持不同工具形式、图片、推理设置和上下文限制。简单把供应商名称换掉,不保证请求仍然合法。宿主应在构造请求前确认能力,再决定转换、拒绝或降级。
降级必须说明丢失了什么。若把结构化调用转成文本描述,就不能继续假设 schema 约束仍由服务端保证;若某模型不接受一种消息顺序,转换器也不能无声丢掉工具错误,让下一轮误认为执行成功。
15.3 重试与故障分类
模型服务临时不可达,可以在明确的错误契约下重试;参数不合法、上下文过长和认证失败则通常需要不同处理。DeepSeek 的传输错误会转为统一 LlmError,说明供应商细节与上层控制之间有规范化边界。DeepSeek Harness · transport.ts L20–34
本书实验只对适配器显式抛出的 TransientModelError 做有限重试,并把每次尝试计入请求预算。它不重试工具副作用,也不把所有异常都标为临时故障。真实适配器应说明失败发生在请求前、响应中,还是已收到完整回复之后。
15.4 远程工具需要更完整的身份
一个路径 src/main.ts 没有工作区与执行端身份就不完整。远程任务还需要进程句柄、租约、连接重建和取消协议。网络断开时,本地看不到结果并不意味着远程进程退出。
Codex 的统一执行接口用可继续交互的进程标识区分 yielded 与 exited。这种句柄思想可以用于本地,也可以启发远程设计,但不能据此声称某个远程后端天然拥有精确恢复。Codex · process_manager.rs L877–891
15.5 教学替身怎样与真实模型接轨
先让脚本模型通过同一份消息与流协议,验证工具、日志和验收。之后接真实提供方时,主要新增协议翻译、认证与能力协商,而不改动宿主的权限和完成条件。
本书没有提供某家最新 API 的可执行调用代码,也没有要求密钥。读者扩展时应按目标提供方当前官方文档实现,并单独测试认证、流断开和用量字段。不要把教学 StreamFn 的简化事件直接当作真实 API 格式。