mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-18 23:25:10 +08:00
feat: enhance tool call parsing robustness, authentication flexibility, and streaming output for tool content
This commit is contained in:
259
README.MD
259
README.MD
@@ -4,95 +4,94 @@
|
||||

|
||||

|
||||
[](version.txt)
|
||||
[](DEPLOY.md#docker-部署推荐)
|
||||
[](DEPLOY.md)
|
||||
|
||||
语言 / Language: [中文](README.MD) | [English](README.en.md)
|
||||
|
||||
将 DeepSeek 免费对话版转换为 **OpenAI & Claude 兼容 API**,支持多账号轮询、自动 Token 刷新、可视化管理界面。
|
||||
将 DeepSeek Web 对话能力转换为 OpenAI 与 Claude 兼容 API。当前仓库后端为 **Go 全量实现**,前端保留 React WebUI(构建产物托管于 `static/admin`)。
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
## 当前实现边界
|
||||
|
||||
- 后端:Go(`cmd/`, `api/`, `internal/`),不再依赖 Python 运行时
|
||||
- 前端:React 管理台(源码在 `webui/`,运行时托管静态构建)
|
||||
- 部署:本地运行、Docker、Vercel Serverless
|
||||
|
||||
## 核心能力
|
||||
|
||||
## ✨ 特性
|
||||
- OpenAI 兼容:`/v1/models`、`/v1/chat/completions`
|
||||
- Claude 兼容:`/anthropic/v1/models`、`/anthropic/v1/messages`、`/anthropic/v1/messages/count_tokens`
|
||||
- 多账号轮询与自动 token 刷新
|
||||
- DeepSeek PoW(WASM)计算
|
||||
- Admin API:配置管理、账号测试、导入导出、Vercel 同步
|
||||
- WebUI:`/admin` 单页应用托管
|
||||
- 运维探针:`/healthz`、`/readyz`
|
||||
|
||||
- 🔄 **双协议兼容** - 同时支持 OpenAI 和 Claude (Anthropic) API 格式
|
||||
- 🚀 **多账号轮询** - Round-Robin 负载均衡,支持高并发场景
|
||||
- 🔐 **Token 自动刷新** - 过期自动重新登录,无需手动维护
|
||||
- 🌐 **WebUI 管理** - 可视化添加账号、测试 API、同步 Vercel 配置
|
||||
- 🌍 **多语言切换** - WebUI 内置中英双语,可随时切换
|
||||
- 🔍 **联网搜索** - 支持 DeepSeek 原生搜索增强模式
|
||||
- 🧠 **深度思考** - 支持推理模式,输出思考过程
|
||||
- 🛠️ **工具调用** - 兼容 OpenAI Function Calling 格式
|
||||
- ☁️ **Vercel 一键部署** - 无需服务器,快速上线
|
||||
## 模型支持
|
||||
|
||||
## 📋 模型支持
|
||||
### OpenAI 接口
|
||||
|
||||
### OpenAI 兼容接口 (`/v1/chat/completions`)
|
||||
| 模型 | thinking | search |
|
||||
| --- | --- | --- |
|
||||
| `deepseek-chat` | false | false |
|
||||
| `deepseek-reasoner` | true | false |
|
||||
| `deepseek-chat-search` | false | true |
|
||||
| `deepseek-reasoner-search` | true | true |
|
||||
|
||||
| 模型 | 深度思考 | 联网搜索 | 说明 |
|
||||
|-----|:--------:|:--------:|------|
|
||||
| `deepseek-chat` | ❌ | ❌ | 标准对话模式 |
|
||||
| `deepseek-reasoner` | ✅ | ❌ | 推理模式(输出思考过程) |
|
||||
| `deepseek-chat-search` | ❌ | ✅ | 联网搜索模式 |
|
||||
| `deepseek-reasoner-search` | ✅ | ✅ | 推理 + 联网搜索 |
|
||||
### Claude 接口
|
||||
|
||||
### Claude 兼容接口 (`/anthropic/v1/messages`)
|
||||
| 模型 | 默认映射 |
|
||||
| --- | --- |
|
||||
| `claude-sonnet-4-20250514` | `deepseek-chat` |
|
||||
| `claude-sonnet-4-20250514-fast` | `deepseek-chat` |
|
||||
| `claude-sonnet-4-20250514-slow` | `deepseek-reasoner` |
|
||||
|
||||
| 模型 | 说明 |
|
||||
|-----|------|
|
||||
| `claude-sonnet-4-20250514` | 映射到 deepseek-chat(标准模式) |
|
||||
| `claude-sonnet-4-20250514-fast` | 映射到 deepseek-chat(快速模式) |
|
||||
| `claude-sonnet-4-20250514-slow` | 映射到 deepseek-reasoner(推理模式) |
|
||||
可通过配置中的 `claude_mapping` 或 `claude_model_mapping` 覆盖映射。
|
||||
|
||||
> **提示**:Claude 接口实际调用的是 DeepSeek,响应格式会自动转换为 Anthropic 标准格式。
|
||||
## 快速开始
|
||||
|
||||
## 🚀 快速开始
|
||||
### 1) 本地运行
|
||||
|
||||
### 方式一:Vercel 部署(推荐)
|
||||
|
||||
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FCJackHwang%2Fds2api&env=DS2API_ADMIN_KEY&envDescription=管理面板访问密码(必填)&envLink=https%3A%2F%2Fgithub.com%2FCJackHwang%2Fds2api%23环境变量&project-name=ds2api&repository-name=ds2api)
|
||||
|
||||
1. 点击上方按钮,设置管理密码 `DS2API_ADMIN_KEY`
|
||||
2. 部署完成后访问 `/admin` 管理界面
|
||||
3. 添加 DeepSeek 账号和自定义 API Key
|
||||
4. 点击「同步到 Vercel」保存配置
|
||||
|
||||
> **首次同步会自动验证账号并保存 Token,后续操作无需重复输入凭证。**
|
||||
|
||||
### 方式二:本地开发
|
||||
要求:Go 1.25+
|
||||
|
||||
```bash
|
||||
# 1. 克隆仓库
|
||||
git clone https://github.com/CJackHwang/ds2api.git
|
||||
cd ds2api
|
||||
|
||||
# 2. 准备配置
|
||||
cp config.example.json config.json
|
||||
# 编辑 config.json,添加 DeepSeek 账号信息
|
||||
# 编辑 config.json
|
||||
|
||||
# 3. 启动服务(Go 版本)
|
||||
go run ./cmd/ds2api
|
||||
```
|
||||
|
||||
服务启动后访问 `http://localhost:5001`
|
||||
默认地址:`http://localhost:5001`
|
||||
|
||||
## ⚙️ 配置说明
|
||||
如果访问 `/admin` 提示未构建 WebUI,请执行:
|
||||
|
||||
### 环境变量
|
||||
```bash
|
||||
./scripts/build-webui.sh
|
||||
```
|
||||
|
||||
| 变量 | 说明 | 必填 |
|
||||
|-----|------|:----:|
|
||||
| `DS2API_ADMIN_KEY` | 管理面板密码 | Vercel 必填 |
|
||||
| `DS2API_CONFIG_JSON` | 配置 JSON 或 Base64 编码 | 可选 |
|
||||
| `VERCEL_TOKEN` | Vercel API Token(用于同步) | 可选 |
|
||||
| `VERCEL_PROJECT_ID` | Vercel 项目 ID | 可选 |
|
||||
| `PORT` | 服务端口(默认 5001) | 可选 |
|
||||
### 2) Docker 运行
|
||||
|
||||
### 配置文件格式 (`config.json`)
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# 编辑 .env
|
||||
|
||||
docker-compose up -d
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
### 3) Vercel 部署
|
||||
|
||||
- 入口:`api/index.go`
|
||||
- 路由重写:`vercel.json`
|
||||
- 至少配置:
|
||||
- `DS2API_ADMIN_KEY`
|
||||
- `DS2API_CONFIG_JSON`(JSON 字符串或 Base64)
|
||||
|
||||
## 配置说明
|
||||
|
||||
### `config.json` 示例
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -108,125 +107,59 @@ go run ./cmd/ds2api
|
||||
"password": "your-password",
|
||||
"token": ""
|
||||
}
|
||||
]
|
||||
],
|
||||
"claude_model_mapping": {
|
||||
"fast": "deepseek-chat",
|
||||
"slow": "deepseek-reasoner"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
> **说明**:
|
||||
> - `keys`: 自定义的 API 密钥,用于调用本服务
|
||||
> - `accounts`: DeepSeek 网页版账号,支持邮箱或手机号登录
|
||||
> - `token`: 留空即可,系统会自动获取并刷新
|
||||
### 环境变量(核心)
|
||||
|
||||
## 📡 API 使用
|
||||
| 变量 | 用途 |
|
||||
| --- | --- |
|
||||
| `PORT` | 服务端口,默认 `5001` |
|
||||
| `LOG_LEVEL` | 日志级别:`DEBUG/INFO/WARN/ERROR` |
|
||||
| `DS2API_ADMIN_KEY` | Admin 登录密钥,默认 `admin` |
|
||||
| `DS2API_JWT_SECRET` | Admin JWT 签名密钥(可选) |
|
||||
| `DS2API_JWT_EXPIRE_HOURS` | Admin JWT 过期小时数,默认 `24` |
|
||||
| `DS2API_CONFIG_PATH` | 配置文件路径,默认 `config.json` |
|
||||
| `DS2API_CONFIG_JSON` | 直接注入配置(JSON 或 Base64) |
|
||||
| `DS2API_WASM_PATH` | PoW wasm 文件路径 |
|
||||
| `DS2API_STATIC_ADMIN_DIR` | 管理台静态文件目录 |
|
||||
| `VERCEL_TOKEN` | Vercel 同步 token(可选) |
|
||||
| `VERCEL_PROJECT_ID` | Vercel 项目 ID(可选) |
|
||||
| `VERCEL_TEAM_ID` | Vercel 团队 ID(可选) |
|
||||
|
||||
完整 API 文档请参阅 **[API.md](API.md)**
|
||||
## 鉴权与账号模式
|
||||
|
||||
### 快速示例
|
||||
调用业务接口时(`/v1/*`, `/anthropic/*`)支持两种模式:
|
||||
|
||||
**获取模型列表**:
|
||||
```bash
|
||||
curl http://localhost:5001/v1/models
|
||||
```
|
||||
1. 托管账号模式:`Bearer` 或 `x-api-key` 使用 `config.keys` 中的 key。
|
||||
2. 直通 token 模式:当传入 token 不在 `config.keys` 中时,服务直接把它当作 DeepSeek token 使用。
|
||||
|
||||
**OpenAI 格式调用**:
|
||||
```bash
|
||||
curl http://localhost:5001/v1/chat/completions \
|
||||
-H "Authorization: Bearer your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "deepseek-chat",
|
||||
"messages": [{"role": "user", "content": "你好"}],
|
||||
"stream": true
|
||||
}'
|
||||
```
|
||||
可选请求头:`X-Ds2-Target-Account`,用于指定托管账号。
|
||||
|
||||
**Claude 格式调用**:
|
||||
```bash
|
||||
curl http://localhost:5001/anthropic/v1/messages \
|
||||
-H "x-api-key: your-api-key" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "anthropic-version: 2023-06-01" \
|
||||
-d '{
|
||||
"model": "claude-sonnet-4-20250514",
|
||||
"max_tokens": 1024,
|
||||
"messages": [{"role": "user", "content": "你好"}]
|
||||
}'
|
||||
```
|
||||
## Tool Call 适配说明
|
||||
|
||||
### Python SDK 使用
|
||||
当前实现对 toolcall 做了防泄漏处理:
|
||||
|
||||
```python
|
||||
from openai import OpenAI
|
||||
- `tools` + `stream=true` 时,服务端会先缓冲正文片段
|
||||
- 若识别到工具调用,会只输出结构化 `tool_calls`,不透传原始 JSON 文本
|
||||
- 若最终不是工具调用,再一次性输出普通文本
|
||||
- 解析器支持混合文本、fenced JSON、`function.arguments` 字符串等格式
|
||||
|
||||
client = OpenAI(
|
||||
api_key="your-api-key",
|
||||
base_url="http://localhost:5001/v1"
|
||||
)
|
||||
## 文档与测试
|
||||
|
||||
response = client.chat.completions.create(
|
||||
model="deepseek-reasoner",
|
||||
messages=[{"role": "user", "content": "请解释量子纠缠"}],
|
||||
stream=True
|
||||
)
|
||||
|
||||
for chunk in response:
|
||||
if chunk.choices[0].delta.content:
|
||||
print(chunk.choices[0].delta.content, end="")
|
||||
```
|
||||
|
||||
## 🔧 部署配置
|
||||
|
||||
### Nginx 反向代理
|
||||
|
||||
```nginx
|
||||
location / {
|
||||
proxy_pass http://localhost:5001;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
proxy_buffering off;
|
||||
proxy_cache off;
|
||||
chunked_transfer_encoding on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 120;
|
||||
}
|
||||
```
|
||||
|
||||
### 方式三:Docker 部署
|
||||
- API 文档:`API.md` / `API.en.md`
|
||||
- 部署文档:`DEPLOY.md` / `DEPLOY.en.md`
|
||||
- 贡献指南:`CONTRIBUTING.md` / `CONTRIBUTING.en.md`
|
||||
|
||||
```bash
|
||||
# 1. 克隆仓库并进入目录
|
||||
git clone https://github.com/CJackHwang/ds2api.git
|
||||
cd ds2api
|
||||
|
||||
# 2. 配置环境变量
|
||||
cp .env.example .env
|
||||
# 编辑 .env,填写 DS2API_ADMIN_KEY 和 DS2API_CONFIG_JSON
|
||||
|
||||
# 3. 启动服务
|
||||
docker-compose up -d
|
||||
|
||||
# 4. 查看日志
|
||||
docker-compose logs -f
|
||||
go test ./...
|
||||
```
|
||||
|
||||
> **Docker 优势**:零侵入设计,主代码更新只需 `docker-compose up -d --build`,无需修改 Docker 配置。详见 [DEPLOY.md](DEPLOY.md#docker-部署推荐)。
|
||||
## 免责声明
|
||||
|
||||
## ⚠️ 免责声明
|
||||
|
||||
**本项目基于逆向工程实现,服务稳定性无法保证。**
|
||||
|
||||
- 仅供学习研究使用,**禁止商业用途或对外提供服务**
|
||||
- 建议正式项目使用 [DeepSeek 官方 API](https://platform.deepseek.com/)
|
||||
- 使用本项目产生的任何风险由用户自行承担
|
||||
|
||||
## 📜 鸣谢
|
||||
|
||||
本项目基于以下开源项目:
|
||||
|
||||
- [iidamie/deepseek2api](https://github.com/iidamie/deepseek2api)
|
||||
- [LLM-Red-Team/deepseek-free-api](https://github.com/LLM-Red-Team/deepseek-free-api)
|
||||
|
||||
## 📊 Star History
|
||||
|
||||
[](https://star-history.com/#CJackHwang/ds2api&Date)
|
||||
本项目基于逆向方式实现,仅供学习与研究使用。稳定性和可用性不作保证,请勿用于违反服务条款或法律法规的场景。
|
||||
|
||||
Reference in New Issue
Block a user