# OpenAI 格式转换适配器

# 1. 初始化与配置加载

  • 加载客户端密钥 ( client_api_keys.json ):读取本地 JSON 文件,存储允许调用此适配器的 API Key,用于鉴权。
  • 加载上游账户 ( topclient.json ):读取 topclient 账号的信息,包括 /v1/models ,获取模型列表
  • 环境初始化:在程序启动时,自动检查账户是否可用

# 2. 身份验证与安全

  • 客户端鉴权 ( authenticate_client ):所有发送到 /v1/chat/completions 的请求都必须在 Header 中携带正确的 Authorization: Bearer <key> ,否则会被拦截。

# 3. 账户轮询与负载均衡

  • 获取最佳账户 ( get_best_retool_account ):为了提高稳定性,程序实现了一套简单的轮询机制:
    • 优先选择报错次数少、且距离上次使用时间最久的账户。
    • 如果某个账户连续报错(超过 MAX_ERROR_COUNT ),会进入冷却期。

# 4. 核心转换逻辑 (API 适配)

这是代码最核心的部分,当收到一个 OpenAI 格式的聊天请求时,它会执行以下流程:

  1. 可能需要申请新会话 ID
  2. 消息格式化:将 OpenAI 的消息列表(user, assistant)转换为 上游 要求的文本格式(Human: ..., Assistant: ...)。
  3. 创建线程 ( retool_get_thread_id ):调用 上游 API 创建一个新的对话线程。
  4. 发送消息 ( retool_send_message ):将格式化后的文本发送给 上游 的 Agent,并获得一个任务 ID ( runId )。
  5. 轮询状态 ( retool_get_message ):由于 上游 是异步处理,程序会不断查询任务状态(最多等待 300 秒),直到任务状态变为 COMPLETED 并获取回复内容。
  6. 可能需要会话缓存 LRU

# 5. 响应处理与流式模拟

  • 非流式响应:直接将 上游 返回的完整文本封装成 OpenAI 的 JSON 格式返回。
  • 模拟流式响应 ( retool_stream_generator )这是一个特殊的处理。由于 上游 原始接口不一定直接支持 OpenAI 标准的 SSE 流,该程序会先拿到 上游 的完整回复,然后人为地将其切割成小块(Chunks),以 0.01 秒的间隔 “假装” 成流式输出发送给客户端,从而提升用户感官上的体验。

# 6. 错误处理与容错

  • 自动重试:如果一个 上游 账户请求失败,程序会自动尝试列表中的下一个可用账户。
  • 状态标记:如果发现账户 Token 过期(401/403 错误),会自动将该账户标记为无效,不再调用。
更新于