Skip to content

Repository files navigation

deepseek-web-api

CI Node.js License: MIT

将已登录的 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/modelsGET /health
  • 自动连接 CDP 或启动专用 Chrome/Chromium profile
  • 复用并刷新 userToken + cookies,持久化 owner-only auth.json
  • DeepSeek Web PoW challenge/worker 求解
  • THINK → Responses reasoning / Chat reasoning_content
  • RESPONSE → 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 / Responses function_call
  • Pi openai-completionsopenai-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

首次启动流程:

  1. 尝试验证 data/auth.json,有效时不打开浏览器。
  2. 否则连接 DS_CDP(默认 http://127.0.0.1:9333)。
  3. 默认本地 CDP 不可用时,启动 data/chrome-profile/ 专用 Chrome。
  4. 如未登录,打开可见窗口并等待你完成 DeepSeek 登录。
  5. 登录验证成功后原子写入 data/auth.json,再启动 HTTP 服务。
  6. 日常 PoW/browser 工作默认 headless;DS_SHOW_BROWSER=1 可显示窗口。

也可先显式完成登录:

pnpm login

首次读取或生成本地 API key:

cat data/.api-key

API 示例

API_KEY="$(cat data/.api-key)"

Responses API

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 messagefunction_call。事件顺序、previous_response_id 与支持边界见 docs/responses-api.md

Chat Completions

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:flashdefaultdeepseek-chat
  • pro:proexpertdeepseek-reasoner

DeepSeek Web 只提供 thinking_enabled: booleannone/off/0/false/disabled 映射为关闭;其他 reasoning.effort 或 thinking level 都映射为开启。

Web 搜索可通过 search_enabled: trueweb_search: true 或包含 web/search 类型的工具开启,仅 flash 生效。

Pi 集成

推荐先使用 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 配置。

多轮 session

继续同一会话有三种方式:

  1. 传回本服务返回的 previous_response_id
  2. 传回 conversation / chat_session_id
  3. 像 Pi 一样发送完整稳定历史,由 SessionStore 匹配。

服务端保存 DeepSeek session 和最后一个可信 response_message_id。切换公开模型或 thinking 开关时,只要历史或显式 ID 匹配,就继续同一 DeepSeek session。

同一 session 不支持并发写入。并行请求可能复用同一个 parent 并在上游形成分支。

Tool calling 说明

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:hiddenclean

可复制 .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 build

CI 在 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 并发请求可能分叉。

Contributing

欢迎 focused issue/PR。提交前请阅读 CONTRIBUTING.mdCODE_OF_CONDUCT.md,并确保完整验证通过。报告日志前必须移除所有 token、cookie、key、账号和私人路径。

License

MIT © 2026 kittors

About

Unofficial local OpenAI-compatible API for authenticated DeepSeek Web sessions

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages