# 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 格式的聊天请求时,它会执行以下流程:
- 可能需要申请新会话 ID
- 消息格式化:将 OpenAI 的消息列表(user, assistant)转换为 上游 要求的文本格式(Human: ..., Assistant: ...)。
- 创建线程 (
retool_get_thread_id):调用 上游 API 创建一个新的对话线程。 - 发送消息 (
retool_send_message):将格式化后的文本发送给 上游 的 Agent,并获得一个任务 ID (runId)。 - 轮询状态 (
retool_get_message):由于 上游 是异步处理,程序会不断查询任务状态(最多等待 300 秒),直到任务状态变为COMPLETED并获取回复内容。 - 可能需要会话缓存 LRU
# 5. 响应处理与流式模拟
- 非流式响应:直接将 上游 返回的完整文本封装成 OpenAI 的 JSON 格式返回。
- 模拟流式响应 (
retool_stream_generator):这是一个特殊的处理。由于 上游 原始接口不一定直接支持 OpenAI 标准的 SSE 流,该程序会先拿到 上游 的完整回复,然后人为地将其切割成小块(Chunks),以 0.01 秒的间隔 “假装” 成流式输出发送给客户端,从而提升用户感官上的体验。
# 6. 错误处理与容错
- 自动重试:如果一个 上游 账户请求失败,程序会自动尝试列表中的下一个可用账户。
- 状态标记:如果发现账户 Token 过期(401/403 错误),会自动将该账户标记为无效,不再调用。