中文 ▾
获取 API 密钥

DeepSeek API SDK:使用 OpenAI SDK 并切换接口

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

更新于

一个连接器模块连接多个服务器塔,说明使用一个 SDK 切换接口

要点

  • 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 头。

如果你的代码调用嵌入接口,你需要为该部分使用另一个提供商,并可以在此处保留聊天功能。按任务拆分是上述环境变量模式的常见原因。

迁移检查清单

当在现有项目中将一个接口切换到另一个接口时,请逐步完成简短清单,而不是一次性更改所有内容。

  1. 验证接口可用性。 发送一个 curl 请求并确认你收到了文本。调用 GET /v1/models 并检查 id uncensored 是否在列表中。
  2. 更改这三个值。 基础 URL、密钥、模型名称,仅此而已。暂时不要触碰提示词。
  3. 运行你现有的测试。 如果你有提示词回归测试,请运行它们并记录哪些失败。失败通常是行为性的,例如不同的输出格式,而不是协议错误。
  4. 检查参数。 移除接口不需要的选项。如果你使用它们,请保留 temperature、top_p、stop 和 seed。
  5. 分别测试流式输出和工具。 流式输出的错误通常隐藏在假设特定块布局的客户端代码中。工具调用需要一个模型能很好地遵循的模式,所以请用你真正的函数进行测试。
  6. 在实际流量上衡量成本和延迟。 比较一天的请求,而不是一个提示词。

请在分支中或配合功能标志执行此操作,将少量流量路由到新的接口。由于客户端代码是共享的,回滚只需更改环境变量。

处理重试并监控使用情况

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。

你的密钥只需填写一份表单即可获得

创建账户,复制密钥,更改基础 URL。这就是全部设置。

获取 API 密钥