# Python：把 OpenAI SDK 指向开放权重模型

> 用官方 openai 包从 Python 调用开放权重 LLM：单次调用、带并发限制的异步批量、流式输出，以及每个请求的费用。

- URL: https://llmwithcrypto.com/zh/docs/python/
- 最后更新: 2026-10-23
- 发布者: LLMwithCrypto (https://llmwithcrypto.com)

官方 `openai` 包可以直接使用：创建客户端时传入我们的 base URL 和你的密钥。除了模型名，代码里的其他部分都保持不变。

**快速回答 — 如何从 Python 调用 LLMwithCrypto？**

用 `pip install openai` 安装官方包，然后用 `base_url="https://llmwithcrypto.com/api/v1"` 和你在 `LLMWITHCRYPTO_API_KEY` 中的密钥创建客户端。**LLMwithCrypto** 像 OpenAI API 一样响应 `client.chat.completions.create()`，支持 12 个开放权重模型，例如 `deepseek-v4-pro` 或 `gpt-oss-120b`。流式、异步和 tool call 都照常可用，依据 2026 年 10 月 23 日的文档。

## 你需要准备什么

| 属性 | 值 |
| --- | --- |
| Python | 3.9 或更新版本 |
| 包 | `openai`（官方）；credits 调用使用 `requests` |
| Base URL | `https://llmwithcrypto.com/api/v1` |
| 密钥 | 在环境变量 `LLMWITHCRYPTO_API_KEY` 中，绝不要写在代码里 |
| Model id | 在 [models 页面](https://llmwithcrypto.com/zh/models/) 上，或从 `client.models.list()` 中获取 |

## 如何发送一个请求？

创建一次客户端并复用：它会在调用之间保持连接。在这里，SDK 不会自行读取任何环境变量来获取 base URL，所以要显式传入。

*one_call.py*

```python
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://llmwithcrypto.com/api/v1",
    api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)

resp = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "system", "content": "Answer in two sentences."},
        {"role": "user", "content": "What is a context window?"},
    ],
    max_tokens=200,
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, "in,", resp.usage.completion_tokens, "out")

```

## 如何一次跑很多请求？

将 `AsyncOpenAI` 与 `asyncio.gather` 配合使用，并用信号量限制同时运行的请求数。4 是一个稳妥的起点；在不超出 rate limit 的前提下再往上调。每个账户都有每分钟请求数和 token 上限，显示在 dashboard 中；联系 support 可以调高。

*many_calls.py*

```python
import asyncio
import os

from openai import AsyncOpenAI

client = AsyncOpenAI(
    base_url="https://llmwithcrypto.com/api/v1",
    api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)
LIMIT = asyncio.Semaphore(4)


async def summarize(text):
    async with LIMIT:
        resp = await client.chat.completions.create(
            model="deepseek-v4.1-flash",
            messages=[
                {"role": "system", "content": "Summarize in one sentence."},
                {"role": "user", "content": text},
            ],
            max_tokens=80,
        )
        return resp.choices[0].message.content


async def main():
    docs = ["First report text...", "Second report text...", "Third report text..."]
    for summary in await asyncio.gather(*(summarize(d) for d in docs)):
        print("-", summary)


asyncio.run(main())

```

## 如何流式返回答案？

传入 `stream=True` 并遍历各个分块；每个分块都带有 `delta.content` 中的一段文本。使用 `stream_options={"include_usage": True}` 时，最后一个分块带有 token 计数。[流式页面](https://llmwithcrypto.com/zh/docs/streaming/) 说明了格式。

*stream.py*

```python
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://llmwithcrypto.com/api/v1",
    api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)

stream = client.chat.completions.create(
    model="deepseek-v4.1-flash",
    messages=[{"role": "user", "content": "Write a haiku about latency."}],
    stream=True,
    stream_options={"include_usage": True},
    max_tokens=120,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
    if chunk.usage:
        print("\n", chunk.usage.prompt_tokens, "in,", chunk.usage.completion_tokens, "out")

```

## 我如何知道一次请求花了多少钱？

将 `usage` 计数乘以模型每百万 token 的价格。截至 2026 年 10 月 23 日，DeepSeek V4 Pro 每百万输入 token 收费 $1.254，每百万输出 token 收费 $3.762；示例中硬编码了这两个数字，因此价格变动时请从[定价页面](https://llmwithcrypto.com/zh/pricing/) 更新。仪表板会显示每次调用的确切费用。

*cost.py*

```python
import os

from openai import OpenAI

# prices per 1M tokens of the models you use, copied from the pricing page
PRICES = {"deepseek-v4-pro": (1.254, 3.762)}

client = OpenAI(
    base_url="https://llmwithcrypto.com/api/v1",
    api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)
resp = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[{"role": "user", "content": "Give me three names for a coffee shop."}],
    max_tokens=100,
)
price_in, price_out = PRICES[resp.model]
cost = (resp.usage.prompt_tokens * price_in + resp.usage.completion_tokens * price_out) / 1_000_000
print(resp.choices[0].message.content)
print(f"cost: ${cost:.6f}")

```

## 如何迁移现有的 OpenAI 应用？

通常只需在一个文件中做三处更改：

1. **客户端。** 添加 `base_url`，并在创建 `OpenAI()` 或 `AsyncOpenAI()` 的位置从 `LLMWITHCRYPTO_API_KEY` 读取密钥。
2. **模型名称。** 将每个 `gpt-…` 名称替换为[模型页面](https://llmwithcrypto.com/zh/models/) 中的 id。搜索整个项目：模型名称会藏在配置文件、prompt 和测试中。
3. **你依赖的功能。** Chat、流式传输和系统 prompt 在所有模型上都能用。工具调用和 JSON 输出取决于模型，因此请用你选定的模型运行现有测试。

其余一切照旧：你的 prompt、重试逻辑、对 `choices` 和 `usage` 的解析。[切换指南](https://llmwithcrypto.com/zh/guides/switch-openai-sdk-to-open-models/) 详细说明了这些内容。

## 密钥应该放在哪里？

放在环境变量中，绝不要放在代码里。本地用应用加载并在 `.gitignore` 中列出的 `.env` 文件就够了；生产环境中，使用主机或 CI 的密钥存储。为每个应用或服务分配各自的密钥，这样就能撤销其中一个而不影响其他。为每个应用、agent 或队友各建一个 API 密钥，并可在 dashboard 中单独吊销任意一个，不影响其他密钥。

## Python：常见问题

### SDK 会自动重试吗？

会，`openai` 包默认会对部分错误重试两次（`max_retries`）。[错误页面](https://llmwithcrypto.com/zh/docs/errors/) 列出了哪些错误值得重试。

### 我可以继续使用我的 OpenAI 代码吗？

可以。API 使用 OpenAI chat completions 格式：把 OpenAI SDK、LangChain 或任何 OpenAI 兼容工具指向我们的 base URL 并带上你的密钥，再改一下模型名即可。[切换指南](https://llmwithcrypto.com/zh/guides/switch-openai-sdk-to-open-models/) 列出了需要检查的内容。

### 哪些 Python 框架可用？

任何接受 OpenAI 兼容 base URL 的框架。[LangChain 页面](https://llmwithcrypto.com/zh/docs/langchain/) 展示了 LangChain 和 LlamaIndex。

---

LLMwithCrypto: LLMwithCrypto 是一个兼容 OpenAI 的开放权重模型 LLM API，涵盖 DeepSeek V4 Pro、DeepSeek V4.1 Flash、DeepSeek R1、Qwen3.5 397B A17B、Qwen3 235B A22B Instruct、gpt-oss-120b、gpt-oss-20b、GLM-4.7、Llama 3.3 70B Instruct、Gemma 4 31B、Mistral Large 3、Mistral Small 4，按 token 从预付加密货币余额中扣费，价格比公共托管商的中位价低 5%。无需 KYC：无需身份证件、无需自拍、无需文件。不存储提示词和输出。
