DeepSeek API SDK:使用 OpenAI SDK 并切换接口
DeepSeek API SDK 配置无需安装特殊客户端:DeepSeek 风格 API 遵循 OpenAI 格式,因此 OpenAI SDK 配合不同的 Base URL 即可使用。这一特性也让你只需更改三个值即可切换到其他接口。

要点
- OpenAI Python 和 Node SDK 适用于任何 OpenAI 兼容的接口;你只需更改 Base URL、密钥和模型名称。
- 将这三个值保存在环境变量中,这样切换接口无需编辑代码。
- 切换对于普通聊天、流式输出和工具调用是安全的,但在依赖特定模型功能之前请先进行测试。
- 对于此接口,请使用 https://api.deepseekapi.top/v1 和模型 ID uncensored。
为什么 OpenAI SDK 就是 DeepSeek API SDK
当人们搜索 DeepSeek API SDK 时,他们期望看到一个带有供应商名称的包。实际上,DeepSeek 自己的文档描述了通过 OpenAI SDK 使用不同的基础 URL 调用其 API,因为该 API 遵循 OpenAI 的请求和响应格式。查看他们最新的文档以获取确切的基础 URL 和模型名称;他们是其服务的权威。
这很有用。任何针对 OpenAI 客户端库编写的代码都可以与实现相同接口的任何服务器通信,这里的接口是 POST /v1/chat/completions、POST /v1/responses 和 GET /v1/models。在不同供应商之间切换变成了配置更改,而不是重写。本文的其余部分展示了 Python、Node 和 curl 中的模式,然后是一个使切换变得微不足道的结构。
Python 配置
安装官方包并将其指向接口:
pip install openai
from openai import OpenAI
client = OpenAI(
base_url="https://api.deepseekapi.top/v1",
api_key="YOUR_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise technical assistant."},
{"role": "user", "content": "Explain idempotency in two sentences."},
],
)
print(resp.choices[0].message.content)
print(resp.usage)
在 API 密钥页面获取密钥。新用户只需一键即可领取 $0.50 的试用额度,无需信用卡。DeepSeek API Python 文章更深入地介绍了这种语言,包括错误处理。
Node.js 配置
npm install openai
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.deepseekapi.top/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
stream: true,
messages: [{ role: "user", content: "List four uses of a message queue." }],
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
模式是相同的:Base URL、密钥、模型。流式输出返回 Server-Sent Events,库将它们转换为异步迭代器。工具调用遵循与其他 OpenAI 兼容 API 相同的模式:传递 tools,读取流式 tool_calls,并将结果作为 role: "tool" 消息返回。
使接口可切换
不要硬编码这三个值。从环境变量中读取它们,并将客户端创建封装在一个函数中。然后,从一个接口切换到另一个接口意味着编辑 .env 文件,而不是源代码。
import os
from openai import OpenAI
def make_client():
return OpenAI(
base_url=os.environ.get("LLM_BASE_URL", "https://api.deepseekapi.top/v1"),
api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")
def ask(prompt: str) -> str:
r = make_client().chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
return r.choices[0].message.content
现在,不同的提供商只需要三个环境变量。官方 SDK 在某些版本中也会读取 OPENAI_API_BASE 和 OPENAI_API_KEY,但显式变量更清晰,并在你同时调用多个提供商时避免意外。
如果你使用 TypeScript 或其他语言,想法是相同的:一个工厂函数,三个变量,代码库中没有分散的提供商名称。一个常见的错误是让供应商名称泄漏到函数名、日志消息和变量名中,这使得后续的切换比必要的更困难。按功能命名(ask、summarise)而不是按提供商命名。
保留一个小测试,通过 ask() 发送一个固定的提示词,并检查是否有非空答案。每次更改接口后运行它;它可以在几秒钟内捕获错误的 URL 和密钥。
切换时保持不变和发生变化的内容
| 项目 | 保持不变 | 可能变化 |
|---|---|---|
| 请求形状 | messages、roles、temperature、top_p、stop | 提供商不支持的可选参数 |
| 流式输出 | 带有数据块的 SSE | 使用情况在流中显示的位置 |
| 工具调用 | tools、tool_choice、tool_calls | 模型遵循模式的程度 |
| 模型名称 | 必填字段 | 值本身:此处为 uncensored |
| 上下文窗口 | 提示词和补全 | 大小:此处 100,000 个 token |
| 行为 | 聊天格式 | 风格、优势、拒绝行为 |
最后一行是容易让人踩坑的地方。接口在协议层面兼容,但在行为层面不一定兼容。两个提供商可以接受相同的请求并给出截然不同的答案。此处的模型是一个独立提供商提供的单一开放权重模型,经过调整以在法律允许的成人用途下不进行内容拒绝,它不是 DeepSeek 或任何其他实验室的官方 API。请重新测试你为其他模型调优的提示词。
此接口具备和不具备的功能
- 支持: 聊天补全、Responses 格式、模型列表、流式输出、工具调用、JSON 模式(
response_format配合json_object),以及 temperature、top_p、stop、seed 和 penalties 的透传。 - 不提供: 图像、音频或视频生成、嵌入、微调。
- 限制:100,000 token 上下文窗口,最大 8 MB 请求体,8 个并发请求和每分钟 300 次请求(试用密钥为 2 个并发请求和每分钟 60 次请求)。
- 错误: HTTP 429,代码为
rate_limited或concurrency,临时过载时带有Retry-After: 5头。
如果你的代码调用嵌入接口,你需要为该部分使用另一个提供商,并可以在此处保留聊天功能。按任务拆分是上述环境变量模式的常见原因。
迁移检查清单
当在现有项目中将一个接口切换到另一个接口时,请逐步完成简短清单,而不是一次性更改所有内容。
- 验证接口可用性。 发送一个 curl 请求并确认你收到了文本。调用
GET /v1/models并检查 iduncensored是否在列表中。 - 更改这三个值。 基础 URL、密钥、模型名称,仅此而已。暂时不要触碰提示词。
- 运行你现有的测试。 如果你有提示词回归测试,请运行它们并记录哪些失败。失败通常是行为性的,例如不同的输出格式,而不是协议错误。
- 检查参数。 移除接口不需要的选项。如果你使用它们,请保留 temperature、top_p、stop 和 seed。
- 分别测试流式输出和工具。 流式输出的错误通常隐藏在假设特定块布局的客户端代码中。工具调用需要一个模型能很好地遵循的模式,所以请用你真正的函数进行测试。
- 在实际流量上衡量成本和延迟。 比较一天的请求,而不是一个提示词。
请在分支中或配合功能标志执行此操作,将少量流量路由到新的接口。由于客户端代码是共享的,回滚只需更改环境变量。
处理重试并监控使用情况
SDK 默认会重试部分失败,但你仍应自行处理 429,因为生产环境中的并发限制是真实存在的。捕获速率限制异常,等待 Retry-After 中的秒数(过载时为 5),然后重试几次。失败的请求不会扣费,因此重试对余额是安全的。
每次调用时记录 usage.prompt_tokens 和 usage.completion_tokens。定价为每 1M 输入 token $0.15,每 1M 输出 token $0.50,因此一次包含 2,000 个输入和 600 个输出的调用费用为 2,000 × $0.15 / 1M + 600 × $0.50 / 1M = $0.0003 + $0.0003 = $0.0006。响应标头中还包含 X-Balance-USD,用于显示剩余额度。请参阅 定价页面 了解充值和优惠,并查看 文档 获取完整参数列表。
编辑器和工具
这三个值会传递到任何具有 OpenAI 兼容提供商设置的工具中。在 Cursor 中使用 DeepSeek 风格 API 一文以其中一种编辑器为例进行了介绍。在每个工具中,字段标签略有不同,但你始终输入以 /v1 结尾的 base URL、密钥和模型名称。
更多指南
问题和答案
我必须安装官方的 DeepSeek SDK 吗?
你不需要安装特定于供应商的包。DeepSeek 文档说明使用 OpenAI SDK 并更改基础 URL;请查阅其文档以获取当前详情。
更改哪三个值即可使用此接口?
基础 URL(https://api.deepseekapi.top/v1)、你的 API 密钥和模型 id uncensored。
我现有的 OpenAI 代码可以无需更改地直接使用吗?
聊天、流式输出、JSON 模式和工具调用遵循相同的格式,所以大部分情况下是。不提供嵌入、图像和音频,且由于模型不同,回答也会有所不同。
SDK 是否正确发送了密钥?
是的,它会自动发送带有你密钥的 Authorization: Bearer。