Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DeepSeek Auto Mode Proxy

让 Claude Code + DeepSeek API 的 Auto Mode 安全分类请求不再超时的本地代理工具。

问题背景

Claude Code 的 Auto Mode 在执行 Bash 命令前,会向 API 发送一个「安全分类请求」,由模型判断该命令是否安全。这个分类请求有大约 30 秒的内部超时

DeepSeek V4 Pro 默认开启了「思考模式」(thinking),导致安全分类请求的响应时间达到 28~32 秒,非常接近超时阈值,经常触发超时而被 Claude Code 拒绝执行。

解决方案

本代理运行在本地 127.0.0.1:8787,对请求进行分类拦截:

请求类型 处理方式
安全分类请求 注入 thinking: { type: "disabled" },关闭思考模式,响应降至 2~3 秒
普通对话/工具调用/流式请求 原样转发,保留思考能力
Claude Code
    ↓ http://127.0.0.1:8787
本地代理 ──→ 识别分类请求 → 注入 thinking: disabled
    ↓ https://api.deepseek.com/anthropic
DeepSeek API

前置要求

  • Node.js ≥ 18(Claude Code 的 npm 安装已要求 Node.js,通常无需额外安装)
  • DeepSeek API Key
  • Claude Code 已安装并配置

快速开始

1. 获取脚本

deepseek-auto-proxy.mjs 放到任意目录,例如:

git clone git@github.com:dashxio/deepseek-claude-proxy.git
# 或直接下载 deepseek-auto-proxy.mjs 到本地任意位置

2. 启动代理

在 PowerShell 中运行:

node deepseek-auto-proxy.mjs

输出:

DeepSeek Auto Mode proxy: http://127.0.0.1:8787
Upstream: https://api.deepseek.com/anthropic

保持此窗口运行,不要关闭。

可选检查:语法 node --check deepseek-auto-proxy.mjs(无输出即正确);健康 Invoke-RestMethod http://127.0.0.1:8787/health(应返回 ok True)。

3. 配置 Claude Code

只需将 ANTHROPIC_BASE_URL 从 DeepSeek 直连地址改为本地代理地址,其他配置保持不变。两种方式任选其一

方式 A:settings.json

编辑 %USERPROFILE%\.claude\settings.json,将 env 下的 ANTHROPIC_BASE_URL 改为:

"ANTHROPIC_BASE_URL": "http://127.0.0.1:8787"

方式 B:环境变量

在 PowerShell 中执行(关闭窗口后失效):

$env:ANTHROPIC_BASE_URL="http://127.0.0.1:8787"

如需持久化,写入用户变量(关闭并重新打开 PowerShell 后生效):

[Environment]::SetEnvironmentVariable(
    "ANTHROPIC_BASE_URL",
    "http://127.0.0.1:8787",
    "User"
)

注意: 不要加 /anthropic 后缀,代理会自动添加。

4. 启动 Claude Code

cd 你的项目目录
claude

恢复直连

ANTHROPIC_BASE_URL 改回 https://api.deepseek.com/anthropic 即可(settings.json 或环境变量,取决于你之前的配置方式)。

注意: 使用代理期间,每次启动 Claude Code 前需先在另一个窗口启动代理。

运行效果

代理窗口在请求经过时会打印日志:

# 普通请求 — 原样转发
POST /v1/messages [pass] -> 200

# 安全分类请求 — 已注入 thinking: disabled
POST /v1/messages [classifier patched] -> 200

看到 [classifier patched] 即表示代理已识别分类请求并关闭了思考模式。

自定义端口

默认端口为 8787,可通过环境变量修改:

$env:DS_PROXY_PORT=9999
node .\deepseek-auto-proxy.mjs

Dump 请求调试

当需要排查请求格式问题时,可以启用 dump 功能将请求/响应内容写入文件。

启用请求 dump

$env:DS_DUMP="true"
node .\deepseek-auto-proxy.mjs

每个请求会生成一个 req-<时间戳>.json 文件到 ./dumps/ 目录,包含:

  • 请求方法、URL、上游路径
  • 请求头(x-api-key / authorization 已脱敏)
  • 请求体(客户端发来的原始内容,JSON 自动解析;被分类器 patch 时额外记录 patchedBody
  • 是否被分类器 patch

同时 dump 响应

$env:DS_DUMP="true"
$env:DS_DUMP_RESPONSE="true"
node .\deepseek-auto-proxy.mjs

开启后,响应体会被捕获并写入同一 JSON 文件(文件名前缀变为 res-)。

自定义 dump 目录

$env:DS_DUMP_DIR="./my-dumps"

限制 dump 文件数量

长时间开启 dump 会积累大量文件,可用两个环境变量控制保留策略(默认最多保留 9 个文件,超出后自动删除最旧的):

# 最多保留 100 个文件,超出后自动删除最旧的(0 = 不限制)
$env:DS_DUMP_MAX_FILES="100"

# 只保留 24 小时内的文件,更早的自动删除(0 = 不限制)
$env:DS_DUMP_MAX_AGE_HOURS="24"

清理在每次写入 dump 文件后自动执行,可组合使用(两个条件都满足时同时生效)。清理只针对代理生成的 req-* / res-* dump 文件,不会删除目录中的其他文件。

dump 文件示例

{
  "timestamp": "2026-08-05T12:34:56.789Z",
  "method": "POST",
  "url": "/v1/messages",
  "upstreamPath": "/anthropic/v1/messages",
  "patched": true,
  "request": {
    "headers": {
      "x-api-key": "***redacted***",
      "content-type": "application/json"
    },
    "body": {
      "model": "deepseek-v4-pro",
      "system": [...],
      "messages": [...]
    },
    "patchedBody": {
      "model": "deepseek-v4-pro",
      "thinking": { "type": "disabled" },
      "system": [...],
      "messages": [...]
    }
  },
  "response": {
    "status": 200,
    "headers": { "content-type": "application/json" },
    "body": { ... }
  }
}

说明: request.body 是客户端发来的原始请求体(patch 前);仅当 patchedtrue 时才会出现 request.patchedBody(注入 thinking: disabled 后的实际转发内容)。

注意: dump 文件可能包含对话内容,请妥善保管,调试完毕后及时删除。

安全性: 请求/响应头中的 x-api-key / authorization 以及正文中的 sk-... 令牌(疑似 API Key)都会被替换为 ***redacted***

故障排查

现象 原因 解决
代理窗口无任何请求日志 Claude Code 未使用代理地址 检查 $env:ANTHROPIC_BASE_URL 是否为 http://127.0.0.1:8787
[classifier patched] -> 401 API Key 未传入 检查 $env:ANTHROPIC_AUTH_TOKEN 是否已设置
[classifier patched] -> 502 代理无法连接 DeepSeek 检查网络连接,确认能访问 api.deepseek.com
启动报端口占用 端口被其他程序使用 换一个端口:$env:DS_PROXY_PORT=9999

技术原理

安全分类请求的识别条件

代理通过 system 消息内容识别安全分类请求(在代理脚本中的 isSecurityClassifier 函数中定义):

  • system 数组中包含以 x-anthropic-billing-header: 开头的文本块
  • system 数组中包含以 You are a security monitor 开头的文本块

两个条件同时满足即判定为安全分类请求。

注意: 分类请求格式可能随 Claude Code 版本变化。已在 Claude Code 2.1.2102.1.221 上验证签名一致。如果升级 Claude Code 后分类请求不再被识别,可能需要更新检测逻辑。

注入内容

对识别到的分类请求,代理向请求体注入:

{
  "thinking": {
    "type": "disabled"
  }
}

同时删除旧版参数 reasoning_effortoutput_config 以保证兼容性。

安全性

  • 代理仅监听 127.0.0.1,局域网内其他机器无法连接
  • 不打印请求正文和 API Key
  • 仅修改安全分类请求,其他请求完整透传

备选方案

如果不想使用代理,也可以:

  1. 使用 acceptEdits 模式claude --permission-mode acceptEdits,Bash 命令由用户手动确认,不依赖云端分类器
  2. 在分类请求中切换模型:修改代理脚本,将分类请求的 model 改为 deepseek-v4-flash[1m],进一步缩短响应时间

许可

MIT

About

本地代理,为 DeepSeek API 的安全分类请求关闭思考模式,解决 Claude Code Auto Mode 超时

Resources

Stars

11 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages