将免费的 DeepSeek 网页端对话反代并适配转换为标准的 OpenAI 与 Anthropic 兼容 API 协议(目前支持 chat completions 和 messages,包括流式返回与工具调用)。
- 零成本 API 代理:使用 DeepSeek 免费网页端,无需官方 API Key,即可获得 OpenAI / Anthropic 兼容接口
- 双协议支持:同时兼容 OpenAI Chat Completions 与 Anthropic Messages API,主流客户端即插即用
- 工具调用就绪:OpenAI function calling 完整实现,XML 解析 + 三层自修复管道(文本修复 → JSON 修复 → 模型兜底),覆盖 10+ 异常格式
- Rust 实现:单可执行文件 + 单 TOML 配置,跨平台原生高性能
- 多账号池:空闲最久优先轮转,支持水平扩展并发
去 releases 下载对应平台后解压即可。
.
├── ds-free-api # 可执行文件
├── LICENSE
├── README.md
├── README.en.md
└── config.example.toml # 配置示例
复制 config.example.toml 为 config.toml,和可执行文件保持在同一个路径下,或者使用 ./ds-free-api -c <config_path> 指定配置路径。
# 直接运行 (同目录下需要 config.toml)
./ds-free-api
# 指定配置路径
./ds-free-api -c /path/to/config.toml
# 调试模式
RUST_LOG=debug ./ds-free-api这里只展示必填项。一个账号对应一个并发量。
并发说明:DeepSeek 免费 API 对每个 session 有速率限制(
Messages too frequent. Try again later.),单账号在频繁请求时会触发限流。本项目内置以下机制保障稳定:
- 限流自动检测:监听 SSE
hint事件中的rate_limit信号,快速识别限流- 指数退避重试:检测到限流后自动重试,间隔为 1s→2s→4s→8s→16s,最多 6 次
stop_stream智能触发:仅在客户端主动断连时调用,正常完成时跳过,避免请求冲突推荐并行数 = 账号数 ÷ 2。实测 4 账号 + 2 并发可 100% 通过全部压测场景。单账号 + 单并发在上述重试机制下也可跑通。
[server]
host = "127.0.0.1"
port = 5317
# API 访问令牌,留空则不鉴权
# [[server.api_tokens]]
# token = "sk-your-token"
# description = "开发测试"
# 邮箱和手机号二选一或都填,手机号目前好像只支持 +86
[[accounts]]
email = "user1@example.com"
mobile = ""
area_code = ""
password = "pass1"这里分享一个免费的测试账号,不要发敏感信息(虽然程序每次会收尾删除会话,但是可能会遗留)。
rivigol378@tatefarm.com
test12345
counterfeit1341@wplacetools.com
test12345
idyllic4202@wplacetools.com
test12345
slowly1285@wplacetools.com
test12345
想要自己多整几个账号并发的话,可以研究一下临时邮箱(有些可能不行),然后加魔法在国际版中多注册几个账号。
推荐临时邮箱网站:tempmail.la (有些后缀可能不行, 建议多尝试几次)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / |
健康检查 |
| POST | /v1/chat/completions |
聊天补全(支持流式与工具调用) |
| GET | /v1/models |
模型列表 |
| GET | /v1/models/{id} |
模型详情 |
| POST | /anthropic/v1/messages |
Anthropic Messages API(支持流式与工具调用) |
| GET | /anthropic/v1/models |
模型列表(Anthropic 格式) |
| GET | /anthropic/v1/models/{id} |
模型详情(Anthropic 格式) |
config.toml 中 model_types(默认 ["default", "expert"])自动映射:
| OpenAI 模型 ID | DeepSeek 类型 |
|---|---|
deepseek-default |
快速模式 |
deepseek-expert |
专家模式 |
Anthropic 兼容层使用相同的模型 ID,通过 /anthropic/v1/messages 调用。
- 深度思考:默认已开启。如需显式关闭,请求体中加
"reasoning_effort": "none"。 - 智能搜索:默认关闭。如需开启,请求体中加
"web_search_options": {"search_context_size": "high"}。
需要 Rust 1.95.0+(见 rust-toolchain.toml)。
# 一键检查 (check + clippy + fmt + audit + unused deps)
just check
# 运行测试
cargo test
# 运行 HTTP 服务
just serve
# 统一协议调试 CLI
just adapter-cli
# e2e 测试(需要服务已在 5317 端口运行,场景正交)
just e2e-basic # 基础功能(双端点)
just e2e-repair # 工具调用修复专项
just e2e-stress # 多迭代压测(全部场景)
# 使用 e2e 专属配置启动服务
just e2e-serveflowchart TB
%% ========== 样式定义:提高对比度,统一圆角 ==========
classDef client fill:#dbeafe,stroke:#2563eb,stroke-width:3px,color:#1e40af,rx:12,ry:12
classDef gateway fill:#fef9c3,stroke:#ca8a04,stroke-width:3px,color:#854d0e,rx:10,ry:10
classDef adapter fill:#fae8ff,stroke:#a21caf,stroke-width:2px,color:#701a75,rx:8,ry:8
classDef core fill:#dcfce7,stroke:#15803d,stroke-width:2px,color:#14532d,rx:8,ry:8
classDef external fill:#fee2e2,stroke:#dc2626,stroke-width:3px,color:#991b1b,rx:4,ry:4
%% ========== 节点定义 ==========
Client(["🖥️ 客户端<br/>OpenAI / Anthropic 协议"]):::client
subgraph GW ["🌐 接入层 (axum HTTP)"]
Server(["🔀 路由 / 鉴权"]):::gateway
end
subgraph PL ["📦 协议处理层 (Protocol Layer)"]
direction LR
subgraph AC ["🔀 Anthropic 兼容层 (anthropic_compat)"]
A2OReq["Anthropic → OpenAI<br/>请求映射"]:::adapter
O2AResp["OpenAI → Anthropic<br/>响应映射"]:::adapter
end
subgraph OA ["⚙️ OpenAI 适配层 (openai_adapter)"]
ReqParse["请求解析"]:::adapter
RespTrans["响应转换"]:::adapter
end
end
subgraph CL ["⚡ 核心逻辑层 (ds_core)"]
direction TB
Pool["🔄 账号池轮转"]:::core
Pow["⛏️ PoW 求解"]:::core
Chat["💬 对话编排"]:::core
Upload["📄 历史文件上传"]:::core
end
DeepSeek[("🔴 DeepSeek API")]:::external
%% ========== 请求链路(实线 →) ==========
Client -->|"OpenAI / Anthropic 协议"| Server
Server -->|"OpenAI 流量"| ReqParse
Server -->|"Anthropic 流量"| A2OReq
A2OReq --> ReqParse
ReqParse --> Pool
Pool --> Pow
Pow --> Chat
Chat -->|"拆分多轮历史"| Upload
Upload -->|"completion + 文件引用"| DeepSeek
%% ========== 响应链路(虚线 -.-→) ==========
Chat -.->|"SSE 数据流"| RespTrans
RespTrans -.->|"OpenAI 响应"| Server
RespTrans -.->|"待转换响应"| O2AResp
O2AResp -.->|"Anthropic 响应"| Server
%% ========== 子图背景与边框(增强层次) ==========
style GW fill:#fefce8,stroke:#eab308,stroke-width:2px
style PL fill:#fafafa,stroke:#a3a3a3,stroke-width:2px
style AC fill:#fdf4ff,stroke:#c026d3,stroke-width:1px
style OA fill:#f5f3ff,stroke:#8b5cf6,stroke-width:1px
style CL fill:#f0fdf4,stroke:#22c55e,stroke-width:2px
- OpenAI 请求:
JSON body→normalize校验/默认值 →tools提取 →promptChatML 构建 →resolver模型映射 →ChatRequest - OpenAI 响应:
DeepSeek SSE bytes→sse_parser→state补丁状态机 →converter格式转换 →tool_parserXML 解析 →StopStream截断 →OpenAI SSE bytes - Anthropic 请求:
Anthropic JSON→to_openai_request()→ 进入 OpenAI 请求管道 - Anthropic 响应: OpenAI 输出 →
from_chat_completion_stream()/from_chat_completion_bytes()→Anthropic SSE/JSON
py-e2e-tests/ 是基于 JSON 场景驱动的端到端测试框架,无需 pytest 依赖。分为三层:
| 层级 | 命令 | 覆盖范围 |
|---|---|---|
| Basic | just e2e-basic |
基础功能场景(双端点 OpenAI + Anthropic),安全并发数 |
| Repair | just e2e-repair |
工具调用异常格式修复专项(OpenAI 单端点),安全并发数 |
| Stress | just e2e-stress |
全部场景 × 3 次迭代,安全并发数 + 1 并发 |
场景文件在 scenarios/ 中按类型独立存放:
py-e2e-tests/
├── scenarios/
│ ├── basic/
│ │ ├── openai/ # 7 个基础场景(对话、推理、流式、工具调用等)
│ │ └── anthropic/ # 3 个基础场景(对话、推理、工具调用)
│ └── repair/ # 10 个工具损坏格式场景
├── runner.py # 单次运行入口
├── stress_runner.py # 多迭代压测入口
└── config.toml # e2e 专用服务端配置
每个场景为独立 JSON 文件,包含请求参数和校验规则:
{
"name": "场景名称",
"endpoint": "openai|anthropic",
"category": "basic|repair",
"models": ["deepseek-default", "deepseek-expert"],
"messages": [{"role": "user", "content": "..."}],
"tools": [...],
"tool_choice": "auto",
"request": {"stream": false},
"checks": {
"has_tool_calls": true,
"tool_names": ["get_weather"],
"finish_reason": "tool_calls",
"no_error": true
}
}可选: 建议通过这个e2e测试后再提PR
DeepSeek 官方 API 非常便宜,请大家多多支持官方服务。
本项目的初心是想体验官方网页端灰度测试的最新模型。
严禁商用,避免对官方服务器造成压力,否则风险自担。
还有deepseek依旧是国一模!!!