# Python OpenAI SDK 配置第三方 API：Base URL 设置与流式调用

> 用 Python OpenAI SDK 调用第三方 Chat Completions 接口，讲清 base\_url、API Key、模型 ID、流式输出与 401、404、超时排查。以 TokenDance 为例。

- 原文：https://token.help/articles/python-openai-sdk-tokendance
- 作者：词元有方编辑部
- 成稿时间：2026-09-28T10:11:25.000Z
- 发布时间：2026-09-29T07:58:48.000Z
- 最后更新：2026-09-29T07:58:48.000Z
- 分类：接入教程
- 核验方式：已做模拟验证
- 核验时间：2026-09-28T00:00:00.000Z
- 适用版本：OpenAI Python SDK 3.19.2（模拟验证）

引用本文请使用上方原文链接；配置与结论以文中版本和核验时间为准。来源内容的许可说明保留在正文中。

用 Python OpenAI SDK 配置第三方 API，需要先确认服务支持 **Chat Completions**，再设置 `base_url`、`api_key` 和模型 ID。本文以 TokenDance 为例，演示普通对话与流式调用；其他服务的基础地址、密钥和模型 ID 请按各自文档填写。

下面写一个独立脚本：输入密钥和模型 ID，发送一条短消息，输出回答。最后再改成流式展示，适合做命令行助手的起点。

## 1. 创建虚拟环境并安装 SDK

准备 Python 3.10 或更新版本。在一个新的练习目录执行对应系统的命令。

macOS / Linux：

```bash
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade openai
```

Windows PowerShell：

```powershell
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade openai
```

Windows 示例直接使用虚拟环境的 Python，不需要修改脚本执行策略。后面的 `python chat.py` 在 Windows 中替换为 `.\.venv\Scripts\python.exe chat.py` 即可。

## 2. 准备密钥和支持的模型

在 [API 密钥页](https://tokendance.space/keys?utm_source=journal\&utm_medium=content\&utm_content=python-openai-sdk-tokendance)创建密钥，到[模型列表](https://tokendance.space/models?utm_source=journal\&utm_medium=content\&utm_content=python-openai-sdk-tokendance)选择支持 **OpenAI Chat Completions** 的模型并复制 ID。

本例使用 `client.chat.completions.create()`。不要只把它改成 `client.responses.create()` 就认为可以通用：Responses 是另一种协议，需要对应的模型支持与参数格式。

## 3. 配置 base\_url 并运行 Python 示例

新建 `chat.py`，粘贴以下内容：

```python
import os
from getpass import getpass

import openai
from openai import OpenAI


def main():
    api_key = os.getenv("TOKENDANCE_API_KEY") or getpass("TokenDance API Key: ")
    model = os.getenv("TOKENDANCE_MODEL") or input("模型 ID: ").strip()
    if not api_key.strip() or not model.strip():
        raise SystemExit("密钥和模型 ID 都不能为空。")

    with OpenAI(
        api_key=api_key.strip(),
        base_url="https://tokendance.space/gateway/v1",
        timeout=60.0,
        max_retries=0,
    ) as client:
        try:
            response = client.chat.completions.create(
                model=model.strip(),
                messages=[
                    {
                        "role": "user",
                        "content": "请把以下内容整理为三项待办：整理需求、核对接口、准备演示。",
                    }
                ],
            )
            if not response.choices:
                raise SystemExit("响应没有 choices，请检查平台调用记录。")
            print(response.choices[0].message.content or "未返回文本内容。")
            if response.usage:
                print("Token 用量：", response.usage.model_dump())
        except openai.APITimeoutError:
            raise SystemExit("请求超时；先查调用日志，再决定是否重试。")
        except openai.APIConnectionError:
            raise SystemExit("连接失败；检查网络及基础地址。")
        except openai.APIStatusError as exc:
            raise SystemExit(
                f"HTTP {exc.status_code}：请结合平台错误信息检查密钥、模型和额度。"
            )


if __name__ == "__main__":
    main()
```

运行：

```bash
python chat.py
```

按提示输入密钥和模型 ID。密钥不显示在终端里，也不需要硬编码到源文件。若已经设置了 `TOKENDANCE_API_KEY` 和 `TOKENDANCE_MODEL` 环境变量，脚本会直接读取。

`base_url` 到 `/gateway/v1` 为止，由 SDK 拼接后续接口路径。示例关闭了自动重试，方便初次调试时判断一次执行对应哪些请求；正式应用应结合业务的超时和重试策略单独设计。

## 4. 用 stream=True 读取流式输出

如果想让回答逐段出现，将上一段代码中从 `response = ...` 到打印用量的部分，替换成下面这一段，放在原来的 `try` 内，并保持相同缩进：

```python
with client.chat.completions.create(
    model=model.strip(),
    messages=[{"role": "user", "content": "用三条清单说明如何准备项目演示。"}],
    stream=True,
) as stream:
    for chunk in stream:
        if not chunk.choices:
            continue
        text = chunk.choices[0].delta.content
        if text:
            print(text, end="", flush=True)
print()
```

流式响应读取的是 `delta.content`，不是一次性回答的 `message.content`。某些事件没有 `choices` 或没有文本，因此要先判断再访问。上面的代码只显示正文，没有额外申请流式用量字段，用量请到平台查看。

## 5. 核对调用，再接入真实业务

执行后，到 TokenDance 的[调用日志](https://tokendance.space/activity?utm_source=journal\&utm_medium=content\&utm_content=python-openai-sdk-tokendance)核对时间、模型和状态。示例只测试文本生成，不代表工具调用、图片输入或 JSON 输出等能力也已验证。

常见问题可以按下面的顺序处理：

- **`No module named openai`**：确认安装 SDK 和运行脚本使用同一个 Python；优先使用 `python -m pip`。
- **401**：检查密钥是否有效、是否带空格。
- **404**：核对基础地址与模型 ID；不要在 `base_url` 里重复加 `/chat/completions`。
- **429**：读取平台返回的具体原因，再决定等待、降低并发或调整限额。
- **超时**：先检查请求是否已到达服务端，避免马上重发造成重复调用。

如果需要把结果交给其他程序，下一步可以自行解析回答并保存到文件。把密钥留在运行环境中，代码仓库只保存不含凭据的程序。

## 参考资料

接口与 SDK 用法核对日期：2026-09-28。本文不宣称已完成生产接口付费调用。

- [TokenDance：OpenAI Chat Completions 与 Python 示例](https://tokendance.space/docs/protocol-openai-chat-completions)
- [OpenAI Python SDK 官方仓库：安装、流式响应及异常处理](https://github.com/openai/openai-python)

## 核验参考来源

- https://tokendance.space/docs/protocol-openai-chat-completions
- https://github.com/openai/openai-python
