将已登录的 chat.deepseek.com Web 会话包装为本地 OpenAI-compatible API,支持 Responses API、Chat Completions、流式 reasoning/output、多轮 session、Chrome/CDP 登录态和 prompt-based tool calling。
An unofficial local OpenAI-compatible API for authenticated DeepSeek Web sessions. Text-only, GitHub-first, and designed for Pi and other OpenAI-compatible clients.
Warning
非官方项目。 本项目调用 DeepSeek Web 私有接口,不隶属于 DeepSeek 或 OpenAI。Web API、登录、PoW、风控和前端 worker 可能随时变化,并可能带来账号限制风险。默认只监听 127.0.0.1;不要把服务直接暴露到公网。使用前请自行确认服务条款、适用法律和账号风险。
POST /v1/responses:流式/非流式 Responses 兼容层POST /v1/chat/completions:流式/非流式 Chat Completions 兼容层GET /v1/models、GET /health- 自动连接 CDP 或启动专用 Chrome/Chromium profile
- 复用并刷新
userToken+ cookies,持久化 owner-onlyauth.json - DeepSeek Web PoW challenge/worker 求解
THINK→ Responses reasoning / Chatreasoning_contentRESPONSE→ Responses output text / Chat content- API key 保护全部
/v1/*路由 - DeepSeek session 与
parent_message_id持久化;切换 flash/pro 或 thinking 不主动分叉 - system/developer/AGENTS/skills、工具 schema、assistant/tool 历史的 prompt 兼容
- 文本工具协议 → Chat
tool_calls/ Responsesfunction_call - Pi
openai-completions与openai-responses配置示例
- Node.js 20 或更高版本
- pnpm 10
- Google Chrome 或 Chromium
- 能访问并登录
https://chat.deepseek.com
git clone https://github.com/kittors/deepseek-web-api.git
cd deepseek-web-api
pnpm install --frozen-lockfile
pnpm build
pnpm start默认地址:
http://127.0.0.1:8787
首次启动流程:
- 尝试验证
data/auth.json,有效时不打开浏览器。 - 否则连接
DS_CDP(默认http://127.0.0.1:9333)。 - 默认本地 CDP 不可用时,启动
data/chrome-profile/专用 Chrome。 - 如未登录,打开可见窗口并等待你完成 DeepSeek 登录。
- 登录验证成功后原子写入
data/auth.json,再启动 HTTP 服务。 - 日常 PoW/browser 工作默认 headless;
DS_SHOW_BROWSER=1可显示窗口。
也可先显式完成登录:
pnpm login首次读取或生成本地 API key:
cat data/.api-keyAPI_KEY="$(cat data/.api-key)"curl http://127.0.0.1:8787/v1/responses \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "deepseek-v4-flash",
"input": "用三句话解释 TypeScript",
"reasoning": {"effort": "medium"}
}'流式:
curl -N http://127.0.0.1:8787/v1/responses \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "deepseek-v4-pro",
"input": "证明根号 2 是无理数",
"stream": true
}'Responses output 可包含 reasoning、assistant message 和 function_call。事件顺序、previous_response_id 与支持边界见 docs/responses-api.md。
curl http://127.0.0.1:8787/v1/chat/completions \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "deepseek-v4-flash",
"messages": [
{"role": "system", "content": "回答要简洁。"},
{"role": "user", "content": "你好"}
]
}'普通回答在 choices[0].message.content;thinking 在兼容字段 reasoning_content。完整字段与限制见 docs/api.md。
| 公共模型 ID | DeepSeek Web model_type |
Search |
|---|---|---|
deepseek-v4-flash |
default |
支持 |
deepseek-v4-pro |
expert |
Web 端不支持,服务端强制关闭 |
兼容别名:
- flash:
flash、default、deepseek-chat - pro:
pro、expert、deepseek-reasoner
DeepSeek Web 只提供 thinking_enabled: boolean。none/off/0/false/disabled 映射为关闭;其他 reasoning.effort 或 thinking level 都映射为开启。
Web 搜索可通过 search_enabled: true、web_search: true 或包含 web/search 类型的工具开启,仅 flash 生效。
推荐先使用 Pi 的 api: "openai-completions":
{
"providers": {
"deepseek-web": {
"baseUrl": "http://127.0.0.1:8787/v1",
"api": "openai-completions",
"apiKey": "$DEEPSEEK_WEB_API_KEY",
"compat": {
"supportsDeveloperRole": true,
"supportsReasoningEffort": true,
"supportsUsageInStreaming": false,
"supportsStore": false
},
"models": [
{"id": "deepseek-v4-flash", "reasoning": true, "input": ["text"]},
{"id": "deepseek-v4-pro", "reasoning": true, "input": ["text"]}
]
}
}
}Responses 路径、thinking level、AGENTS.md/skills、MCP-backed tools、tool-call 历史和多轮行为见 docs/pi.md。该文档提供两套可复制的完整 models.json 配置。
继续同一会话有三种方式:
- 传回本服务返回的
previous_response_id; - 传回
conversation/chat_session_id; - 像 Pi 一样发送完整稳定历史,由
SessionStore匹配。
服务端保存 DeepSeek session 和最后一个可信 response_message_id。切换公开模型或 thinking 开关时,只要历史或显式 ID 匹配,就继续同一 DeepSeek session。
同一 session 不支持并发写入。并行请求可能复用同一个 parent 并在上游形成分支。
DeepSeek Web 没有 OpenAI 原生 function calling。本项目把 tools/functions 和选择策略写入 prompt,并要求模型输出:
<tool_call>
{"name":"tool_name","arguments":{"key":"value"}}
</tool_call>
解析成功后映射为标准结构。工具结果轮也会进入 session/history 匹配。
这仍是提示词模拟:不能保证模型一定调用工具、严格遵守 JSON Schema 或正确并行调用。带工具的流式请求可能在尾部集中输出结构化 call,因为服务必须先清理协议文本。
| 变量 | 默认值 | 说明 |
|---|---|---|
HOST |
127.0.0.1 |
HTTP 监听地址;不建议改为公网地址 |
PORT |
8787 |
HTTP 端口 |
DS_CDP |
http://127.0.0.1:9333 |
Chrome DevTools Protocol endpoint |
DS_DATA_DIR |
./data |
运行时凭据、session、profile 根目录 |
DS_API_KEY |
空 | 一个或多个 API key,逗号/空白分隔;优先于文件 |
DS_API_KEY_FILE |
data/.api-key |
API key 文件,每行一个 |
DS_AUTH_FILE |
data/auth.json |
DeepSeek token/cookie 快照 |
DS_SESSION_FILE |
data/sessions.json |
session lineage 索引 |
DS_CHROME_PROFILE |
data/chrome-profile |
专用 Chrome profile |
DS_CHROME_PATH |
自动发现 | Chrome/Chromium 可执行文件 |
DS_SHOW_BROWSER |
false |
日常请求显示浏览器;登录需要时始终可见 |
DS_POW_JS |
内置当前 worker URL | DeepSeekHashV1 worker chunk URL |
DS_BASE_URL |
https://chat.deepseek.com |
上游地址,主要用于调试 |
DS_DEBUG |
false |
增加调试日志和 HTTP error stack |
DS_TOOL_REASONING |
hidden |
工具轮 reasoning:hidden 或 clean |
可复制 .env.example 为 .env。启动时读取该文件,但不会覆盖已存在的进程环境变量。
以下路径包含凭据或私人会话内容,已由 .gitignore 排除:
.env
data/auth.json
data/.api-key
data/sessions.json
data/chrome-profile/
- 不要提交、上传、打包、截图或粘贴这些内容。
- 保持 loopback 监听;API key 不是充分的公网安全边界。
- 如确需跨主机访问,使用受控网络、TLS reverse proxy、来源限制和独立密钥轮换。
- 认证数据泄漏可能等价于 DeepSeek 登录会话泄漏。
安全披露与账号风险见 SECURITY.md。
pnpm install --frozen-lockfile
pnpm typecheck
pnpm lint
pnpm test
pnpm buildCI 在 Node.js 20 和 22 上执行相同检查。单元测试不访问真实 DeepSeek 账号,也不在 CI 启动登录 e2e。
项目约束:
- TypeScript ESM,Node.js >= 20
node:http,不引入重型 Web 框架- 每个
src/**/*.ts文件不超过 300 行 - strict TypeScript;不使用
any绕过边界类型 - 协议行为改动必须有最小回归测试
- 依赖私有 Web API、前端 PoW worker 和账号风控,可能无预告失效。
- 仅支持文本;不支持图片、文件、音频、视频或上传。
- 工具调用为 prompt 兼容层,不是原生 function calling。
- OpenAI
store、后台 Responses、严格 structured output、hosted tools 和 prompt caching 未实现。 - 输入 token 无可靠上游计数,返回
0;输出 token 使用上游累计值。 - 单 session 并发请求可能分叉。
欢迎 focused issue/PR。提交前请阅读 CONTRIBUTING.md 和 CODE_OF_CONDUCT.md,并确保完整验证通过。报告日志前必须移除所有 token、cookie、key、账号和私人路径。
MIT © 2026 kittors