06.1 API、模型与流式调用
关注源码
src/services/api/claude.tssrc/services/api/*src/utils/model/model.ts
services/api 负责的不是单次 HTTP 请求
它要把运行时状态翻译为稳定的模型请求,涉及:
- provider 选择
- model alias 解析
- betas/header/body 参数
- prompt cache 相关 header
- streaming 事件规范化
- 错误与重试
- usage/cost/telemetry
claude.ts 在做什么
这个文件会综合考虑:
- 当前模型
- provider
- tools schema
- system prompt
- thinking config
- task budget
- prompt cache 策略
- fast mode / effort / advisor / context management betas
然后发起 streaming request,并把结果重新映射成内部消息流。
为什么模型选择属于平台层
utils/model/model.ts 展示出模型选择不是简单 settings 读取,而是综合:
- 订阅类型
- provider
- 1m context 可用性
- 用户 override
- plan mode 特判
因此模型选择实际上属于平台策略的一部分。
API 层和运行时层的分工
运行时层决定:
- 本轮消息和工具是什么
- 是否要继续、压缩、恢复
API 层决定:
- 如何把这些内容编码成 provider 可接受的请求
- 如何解释 provider 返回的 streaming 事件和 usage
这让 query loop 不需要了解太多具体 API 协议细节。
设计上的关键点
1. prompt cache 是 API 层一等约束
header、工具顺序、thinking 配置、context management 都会影响缓存命中,因此 API 层有大量 cache-aware 逻辑。
2. provider 适配被压在平台层
上层运行时尽量只关心“模型能力”,而不是第一方、Bedrock、Vertex 等差异。
3. streaming 事件是统一出口
无论底层 API 怎么流式返回,上层看到的都是统一 StreamEvent / message 语义。