模型适配器

通过 AIChannel.stream() 一次适配上游协议。

Downcity 核心只有一种模型协议。OpenAI Chat Completions 只在 HTTP 边界适配:

City SDK / CityModel ------\
                            -> ModelCall -> AIService -> AIChannel.stream()
OpenAI Chat Completions ---/                           -> ModelStreamEvent

OpenAI-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 校验;
  • 计量、余额检查和扣费结算。