OpenAI SDK 接入 CaMeL Hub:一个 Key 调用 GPT、Claude、Gemini、DeepSeek

OpenAI SDK(PyPI 和 npm 上的 `openai` 包)是 OpenAI 官方发布的客户端库,覆盖 Python、Node.js/TypeScript 等多种语言,把对 Chat Completions / Responses API 的 HTTP 调用封装成了 `client.chat.completions.create(...)` 这样的强类型方法,不用自己手写 `requests.post()`。它只需要改两个参数——`base_url` 和 `api_key`——这也是接入 CaMeL Hub 最快的方式:把这两个参数指向我们的服务,原本只会调 OpenAI 模型的那份代码,就能在同一个账号、同一把 Key、同一张账单下调用 Claude、Gemini、DeepSeek、Grok 等 480+ 个模型。

OpenAI SDK ↗

  1. 创建 CaMeL Hub API Key

    登录 https://api.camel-hub.com/console 控制台,找到名为「API 密钥 / 令牌」的页面(控制台 → 令牌)。点击「新建令牌」,取一个自己认得出的名字(比如 "openai-sdk-test"),生成后立刻复制保存——和 OpenAI 的 Key 一样,它只显示这一次,要当作密钥对待,绝不要提交进代码仓库。
  2. 安装 OpenAI SDK

    按你用的语言安装对应的官方库即可。任何较新的 1.x 版本都能直接用——CaMeL Hub 严格遵循 SDK 期望的请求/响应格式,不需要额外装兼容层或 fork 版本。
    pip install --upgrade openai
    
    # 如果用 Node.js / TypeScript:
    # npm install openai@latest
  3. 把客户端指向 CaMeL Hub

    创建客户端时改两个参数:`base_url` 填 CaMeL Hub 的接入地址,`api_key` 填第 1 步拿到的令牌。SDK 会在你传入的 `base_url` 后面自动拼接 `/chat/completions` 这类路径,所以 `base_url` 本身必须已经带 `/v1` 段——务必使用完整的 `https://api.camel-hub.com/v1`,而不是裸域名 `https://api.camel-hub.com`。
    from openai import OpenAI
    
    client = OpenAI(
        base_url="https://api.camel-hub.com/v1",
        api_key="<你的 CaMeL Hub 密钥>",
    )
  4. 发出第一个请求

    像调用 OpenAI 官方 API 一样调用 `chat.completions.create` 即可。模型名可以从模型广场任选一个,先用通用型的 `gpt-5.5` 试手。
    completion = client.chat.completions.create(
        model="gpt-5.5",
        messages=[
            {"role": "user", "content": "用一句话说明 CaMeL Hub 是做什么的。"}
        ],
    )
    
    print(completion.choices[0].message.content)
  5. 同一段代码切换 GPT、Claude、Gemini、DeepSeek

    这正是让 OpenAI SDK 走 CaMeL Hub 的核心价值:请求格式完全不变,只有 `model` 字段在变。CaMeL Hub 在服务端把每次调用翻译成对应厂商的原生协议,所以同一个客户端实例就能在多家模型之间随意切换。
    for model in ["gpt-5.5", "claude-sonnet-5", "gemini-3.1-pro", "deepseek-v4-flash"]:
        resp = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": "用五个字打个招呼。"}],
        )
        print(model, "->", resp.choices[0].message.content)
  6. 开启流式输出

    把 `stream` 设为 `True` 即可逐 token 接收响应,适合聊天界面或长回复场景,不用等完整结果生成完才开始展示。
    stream = client.chat.completions.create(
        model="gpt-5.5",
        messages=[{"role": "user", "content": "写一首关于 API 网关的俳句。"}],
        stream=True,
    )
    for chunk in stream:
        delta = chunk.choices[0].delta.content
        if delta:
            print(delta, end="", flush=True)
  7. Node.js / TypeScript 写法

    JS/TS 版 SDK 的字段和 Python 版一一对应。密钥建议从环境变量读取,不要写死在仓库里。
    import OpenAI from "openai";
    
    const client = new OpenAI({
      baseURL: "https://api.camel-hub.com/v1",
      apiKey: process.env.CAMEL_HUB_API_KEY,
    });
    
    const completion = await client.chat.completions.create({
      model: "gpt-5.5",
      messages: [
        { role: "user", content: "用一句话说明 CaMeL Hub 是做什么的。" },
      ],
    });
    
    console.log(completion.choices[0].message.content);
  8. 遇到问题先用 curl 排查

    如果 SDK 抛出连接或鉴权错误,直接用 curl 打一次接口,就能分清是密钥本身的问题还是客户端配置的问题。curl 能通但 SDK 报错,几乎都是环境变量或 base_url 写错了(见下方 FAQ)。
    curl https://api.camel-hub.com/v1/chat/completions \
      -H "Authorization: Bearer <你的 CaMeL Hub 密钥>" \
      -H "Content-Type: application/json" \
      -d '{"model": "gpt-5.5", "messages": [{"role": "user", "content": "ping"}]}'

常见问题

调用 Claude 或 Gemini 模型需要换一套 SDK 吗?

不需要。CaMeL Hub 在服务端把每个请求翻译成目标厂商的原生格式,所以同一套 OpenAI SDK 对所有模型都适用。客户端实例不用变,只需要把 `model` 字段从 `gpt-5.5` 换成比如 `claude-sonnet-5` 或 `gemini-3.1-pro`。

base_url 到底要不要带 /v1?

要带,填完整的 `https://api.camel-hub.com/v1`。OpenAI SDK 会在你设置的 `base_url` 后面拼接 `/chat/completions` 之类的路径,所以 `/v1` 必须已经是 `base_url` 的一部分——少写或多写一个 `/v1` 都会拿到 404。

curl 用同一把密钥能通,SDK 却报鉴权错误,为什么?

先检查终端或 CI 环境里有没有设置 `OPENAI_API_KEY` 这个环境变量——SDK 会自动读取它,并且在两者都存在时悄悄覆盖你代码里传的 `api_key`。同时到控制台的「令牌」页面确认这把密钥没有过期或额度已耗尽。

第一次测试该选哪个模型?

通用场景选 `gpt-5.5` 比较稳妥;需要更强的长链路推理选 `claude-sonnet-5`;高并发、追求低成本的场景可以用 `deepseek-v4-flash`。具体的模型名称和实时价格以模型广场为准,再落到生产代码里。