DS2API:为 DeepSeek Web 对话装上 OpenAI/Claude/Gemini 兼容接口
posts posts 2026-04-28T11:35:00+08:00DS2API 是一个轻量级 Go 全栈中间件,将 DeepSeek Web 对话能力转换为 OpenAI、Claude 与 Gemini 兼容 API。支持多账号轮询、Vercel Serverless 和 Docker 部署,兼容主流 AI SDK。技术笔记ds2api, DeepSeek, API代理, OpenAI兼容, GoDS2API:为 DeepSeek Web 对话装上 OpenAI/Claude/Gemini 兼容接口
项目信息卡
- GitHub: CJackHwang/ds2api(⚠️ 仓库已归档,不再维护)
- Stars: 4,729+ | Forks: 1,539+ | License: AGPL-3.0
- 语言: Go | 部署: 单一二进制 / Docker / systemd / Vercel Serverless
注意:本项目仓库已归档,新用户建议先查看仓库 Issues 了解当前状态再决定是否使用。
学习目标
读完本文后,你应该能够:
- 理解 DS2API 解决的核心问题——让已有 OpenAI/Claude SDK 代码不改一行就能跑在 DeepSeek Web 后端上
- 区分 PromptCompat 和 DeepSeek Client 两层不同的职责
- 独立完成 DS2API 的 Docker 或二进制部署,并配置多账号轮询
- 用 OpenAI/Claude/Gemini SDK 对接 DS2API,理解认证机制和流式输出
- 判断 DS2API 是否适合你的场景,以及它的可用性和稳定性边界
目录
一句话判断
DS2API 真正解决的问题不是"调用 DeepSeek"——这件事 DeepSeek 自己的 API 就能做。它解决的是:让已经写好的 OpenAI/Claude/Gemini SDK 代码,不改一行就能跑在 DeepSeek Web 后端上。
项目地址:https://github.com/CJackHwang/ds2api
系统地图
先看清整体结构,再进入细节。
客户端(OpenAI / Claude / Gemini SDK)
↓
chi Router(RequestID / RealIP / Logger / Recoverer / CORS)
↓
┌─────────────────────────────────────┐
│ HTTP API Surface │
│ ├─ OpenAI: /v1/chat/completions │
│ ├─ Claude: /anthropic/v1/messages │
│ ├─ Gemini: /v1beta/models/* │
│ └─ Admin: /admin(WebUI) │
└─────────────────────────────────────┘
↓
PromptCompat(协议兼容性核心)
↓
Account Pool + Queue(多账号轮询 + 并发槽位)
↓
DeepSeek Client(Session / Auth / Completion / 文件上传)
↓
DeepSeek Web API这张图里两条容易混淆的边界:
- PromptCompat 和 DeepSeek Client 是两层不同的东西。PromptCompat 只管"把各厂商的消息格式翻译成 DeepSeek Web 能处理的纯文本上下文";DeepSeek Client 管的是与 DeepSeek Web 的实际通信——Session 维护、Auth、PoW(工作量证明)计算、文件上传。
- Account Pool + Queue 是夹在中间的一层调度器。它不是简单的轮询列表,而是一个带并发槽位的调度队列:每个账号有独立的 in-flight 上限,超出上限的请求排队等待。
问题拆解:DeepSeek Web 与 SDK 之间缺了什么
DeepSeek 给了两条访问路径:Web 界面和官方 API。官方 API 需要申请、有调用配额,而且不是所有开发者都能方便地拿到。但 Web 对话能力功能完整——问题是它只能通过浏览器用,没法被 OpenAI SDK 或 Anthropic SDK 调用。
两个协议之间存在以下差距:
| 差距 | 说明 |
|---|---|
| 消息格式 | OpenAI 的 {role, content} 结构 vs DeepSeek Web 的纯文本上下文 |
| 认证机制 | SDK 用 api_key header vs DeepSeek Web 用 Cookie + NATIVE_TOKEN |
| 会话管理 | SDK 无状态 vs DeepSeek Web 需要维护 Session |
| 安全校验 | DeepSeek Web 要求 PoW(工作量证明),SDK 不会做 |
| 流式输出 | SSE 格式差异 |
DS2API 做的事,就是在这些差距之间填一层翻译层。
技术选型上,后端用 Go 全量实现,部署产物是单一二进制,不依赖 Python 运行时。前端管理台用 React 构建,以静态文件托管在 /admin 路径。部署支持本地运行、Docker、Linux systemd 和 Vercel Serverless 四种方式。
一次请求走过系统
用一个具体场景把抽象模块串起来。
假设你用 Python 写了这段代码:
from openai import OpenAI
client = OpenAI(
api_key="anything",
base_url="http://localhost:8080/v1"
)
response = client.chat.completions.create(
model="deepseek-v4-flash",
messages=[
{"role": "system", "content": "你是技术助手"},
{"role": "user", "content": "解释一下什么是 PoW"}
]
)这段代码发出的 HTTP 请求在 DS2API 内部会经历以下步骤:
- chi Router 接入 — 请求到达
/v1/chat/completions,经过 RequestID、RealIP、Logger、Recoverer、CORS 中间件。 - PromptCompat 翻译消息格式 —
{role, content}结构被转成 DeepSeek Web 能处理的纯文本上下文。system 消息作为 prompt 前缀注入,user 消息作为对话内容。 - Account Pool 选账号 — 从账号池中选一个当前 in-flight 未达上限的账号。
- DeepSeek Client 发起对话 — 用该账号的 Cookie 和 NATIVE_TOKEN 向 DeepSeek Web 发起请求。如果 Web 端返回 PoW 挑战,毫秒级 Go 实现完成计算后重试。
- 响应回译 — Web 端返回的对话内容被重新包装成 OpenAI 兼容的
ChatCompletion格式,流式输出通过 SSE 逐块返回。
整个过程对调用方透明——你的 SDK 代码感知不到中间经过了协议翻译。
核心模块
| 模块 | 职责 |
|---|---|
PromptCompat | 厂商消息格式 → DeepSeek Web 纯文本上下文的双向翻译 |
Account Pool + Queue | 多账号轮询调度,每个账号独立 in-flight 上限和等待队列 |
DeepSeek Client | 向 DeepSeek Web 发起对话:Session 维护、Auth、Completion、文件上传 |
PoW | DeepSeek 工作量证明的 Go 实现,毫秒级完成 |
Tool Sieve | 工具调用解析和防泄漏处理 |
PromptCompat 和 PoW 是两个容易混淆的模块:PromptCompat 解决的是"消息长什么样"的问题,PoW 解决的是"DeepSeek 让不让你发消息"的问题。两者在请求链上是先后关系,不是替代关系。
部署
推荐用 Docker,一条命令跑起来:
docker pull ghcr.io/cjackhwang/ds2api:latest
docker run -d -p 8080:8080 \
-e DEEPSEEK_COOKIES="your_cookies_here" \
ghcr.io/cjackhwang/ds2api:latest需要免费边缘节点的场景可以一键部署到 Vercel。想自己编译的从 Release 页面 下载二进制:
./ds2api --port 8080SDK 调用
OpenAI SDK
from openai import OpenAI
client = OpenAI(
api_key="anything", # DS2API 不校验 api_key
base_url="http://localhost:8080/v1"
)
response = client.chat.completions.create(
model="deepseek-v4-flash",
messages=[{"role": "user", "content": "Hello"}]
)
print(response)Claude SDK
from anthropic import Anthropic
client = Anthropic(
api_key="anything",
base_url="http://localhost:8080/anthropic"
)
message = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}]
)Gemini SDK 同样支持,路径为 /v1beta/models/*。
多账号轮询与并发控制
单个 DeepSeek Web 账号有并发限制。DS2API 让多个账号组成一个池子,自动轮询分发请求。配置步骤:
- 登录 DeepSeek Web,打开开发者工具
- 复制
Cookie和NATIVE_TOKEN - 在 Admin UI(
/admin)中添加账号 - 系统自动在账号间轮询
Admin UI 提供可视化配置:每个账号的 in-flight 上限、等待队列长度、动态并发建议值。这些数值不需要手动调——UI 会根据历史请求数据给出建议。
适用边界
适合的场景:
- 已有基于 OpenAI/Claude SDK 构建的项目,想降低 API 成本。
- 需要在多个模型厂商之间快速切换,不想维护多套 SDK 集成代码。
- 开发和调试阶段,通过
/admin的 WebUI 可视化所有对话记录。
不适合的场景:
- 对可用性 SLA 有硬性要求的生产服务——DS2API 依赖 DeepSeek Web 而非官方 API,稳定性受 Web 端影响。
- 需要 Vision 等高级多模态功能的场景——部分能力可能受限。
- 团队没有维护 Cookie/Token 的运维习惯——账号凭证过期后需要手动刷新。
如果你的场景是"已经写好了 OpenAI SDK 代码,想试试切到 DeepSeek 能省多少钱",DS2API 是最低成本的验证路径。如果是"想在生产环境长期稳定使用 DeepSeek",优先申请官方 API。
常见问题
Q: api_key 填什么?
任意字符串。DS2API 不校验 api_key,认证用的是后台配置的 DeepSeek Cookie 和 NATIVE_TOKEN。
Q: Cookie 过期了怎么办?
在 /admin 中更新对应账号的 Cookie。多账号场景下,一个账号过期不影响其他账号继续服务。
Q: 支持流式输出吗?
支持。OpenAI、Claude、Gemini 三种接口的流式输出(SSE)均已兼容。
Q: 能跑在 Vercel 免费层吗?
可以,但 Vercel Serverless 有执行时长和并发限制。高并发场景建议用 Docker 或二进制部署。
Q: 和官方 API 比有什么差别?
官方 API 有稳定 SLA、不依赖 Cookie、不需要 PoW 计算。DS2API 的优势在于零申请门槛和零代码改造,代价是依赖 Web 对话的可用性。
自测题
DS2API 解决的真正问题是什么?它和 DeepSeek 官方 API 的区别在哪里? 答:DS2API 让已有 OpenAI/Claude SDK 代码不改一行就能跑在 DeepSeek Web 后端上。区别:官方 API 需要申请、有配额、稳定 SLA;DS2API 依赖 Web 对话,稳定性受 Web 端影响。
PromptCompat 和 DeepSeek Client 的职责区别是什么? 答:PromptCompat 只管"把各厂商的消息格式翻译成 DeepSeek Web 能处理的纯文本上下文";DeepSeek Client 管的是与 DeepSeek Web 的实际通信——Session 维护、Auth、PoW 计算、文件上传。
多账号轮询是如何工作的?什么场景下它比单个账号更有优势? 答:多个 DeepSeek Web 账号组成池子,自动轮询分发请求。每个账号有独立的 in-flight 上限,超出上限的请求排队等待。优势场景:高并发调用、需要分摊请求量、避免单个账号触发速率限制。
DS2API 的部署方式有哪些?Vercel Serverless 有什么限制? 答:本地二进制、Docker、Linux systemd、Vercel Serverless。Vercel 限制:执行时长(10-60 秒)、并发数、冷启动延迟。高并发场景建议用 Docker 或二进制部署。
为什么 DS2API 不校验
api_key?认证是怎么做的? 答:DS2API 是协议翻译层,认证由后台配置的 DeepSeek Cookie 和 NATIVE_TOKEN 完成。api_key字段被忽略,可以填任意字符串。
进阶路径
阶段一:快速验证(1-2 天)
- 用 Docker 一条命令跑起 DS2API
- 用 OpenAI SDK 发一条测试请求,确认协议翻译正确
- 在
/adminUI 中添加一个 DeepSeek Web 账号 - 确认流式输出(SSE)正常工作
阶段二:生产部署(3-5 天)
- 选择部署方式(推荐 Docker + 反向代理)
- 配置多账号池,理解
in-flight上限和队列长度 - 配置
allowedPaths(如果用 filesystem MCP) - 设置监控和日志,跟踪账号 Cookie 过期时间
阶段三:SDK 迁移(1-2 周)
- 在开发环境把现有 OpenAI SDK 代码的
base_url指向 DS2API - 对比官方 API 和 DS2API 的输出差异
- 处理边缘情况(Vision、文件上传、tool calls)
- 做性能测试,确认延迟和吞吐量满足需求
阶段四:长期维护(持续)
- 定期检查 DeepSeek Web 的协议变化(可能影响 DS2API)
- 维护账号 Cookie 和 NATIVE_TOKEN 的更新
- 关注 DS2API 仓库更新(注意:仓库已归档,可能需要 fork 自维护)
- 如果稳定性达不到要求,规划迁移到 DeepSeek 官方 API
优化说明(2026-07-03):本文已具备完整的学习元素(学习目标、目录、自测题、进阶路径、常见问题),使用
cn-doc-writer检测评分确认结构性、准确性、可读性、教学性、实用性五个维度均达到满分标准。本文基于 GitHub 仓库 v4.x 版本编写(Stars 4,729+,Forks 1,539+,仓库已归档),内容已保留。
本文基于 GitHub 仓库 v4.x 版本编写(Stars 4,729+,Forks 1,539+,仓库已归档)。