模型适配器
通过 AIChannel.stream() 一次适配上游协议。
Downcity 核心只有一种模型协议。OpenAI Chat Completions 只在 HTTP 边界适配:
City SDK / CityModel ------\
-> ModelCall -> AIService -> AIChannel.stream()
OpenAI Chat Completions ---/ -> ModelStreamEventOpenAI-compatible 上游使用 stream_openai_compatible_model()。私有 HTTP 协议应实现自己的 Adapter,把 ModelCall 转成厂商请求,并返回 AIChannelStreamResult;AIService 不理解厂商请求格式。
OpenAI Chat Completions 只是同一 Model Protocol 路径外层的 HTTP Adapter。没有 raw passthrough,也没有第二条模型执行链,因此 tools、fallback、reasoning、计量和计费在不同客户端之间保持一致。
Channel 负责:
- 密钥和 base URL;
- 上游模型工厂与协议选择;
- 模型级
provider_options; - usage 解释和计费;
- 私有流到
ModelStreamEvent的转换。
AIService 负责:
- 模型注册表和公开目录;
- 鉴权和可用性;
- 媒体 fallback 与 reasoning 校验;
- 计量、余额检查和扣费结算。