we-need-ds
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Fail
- child_process — Shell command execution capability in hooks/session-start.js
- network request — Outbound network request in hooks/session-start.js
- child_process — Shell command execution capability in hooks/user-prompt-submit.js
- child_process — Shell command execution capability in lib/ctl.js
- fs module — File system access in lib/ctl.js
- network request — Outbound network request in lib/ctl.js
- child_process — Shell command execution capability in lib/state.js
- execSync — Synchronous shell command execution in lib/state.js
- fs.rmSync — Destructive file system operation in lib/state.js
- os.homedir — User home directory access in lib/state.js
- process.env — Environment variable access in lib/state.js
- fs module — File system access in lib/state.js
- network request — Outbound network request in lib/state.js
- process.env — Environment variable access in proxy.js
- child_process — Shell command execution capability in test_consume.js
- execSync — Synchronous shell command execution in test_consume.js
- fs.rmSync — Destructive file system operation in test_consume.js
- process.env — Environment variable access in test_consume.js
- fs module — File system access in test_consume.js
- network request — Outbound network request in test_consume.js
- child_process — Shell command execution capability in test_full.js
- execSync — Synchronous shell command execution in test_full.js
- fs.rmSync — Destructive file system operation in test_full.js
- process.env — Environment variable access in test_full.js
- fs module — File system access in test_full.js
- network request — Outbound network request in test_full.js
- fs module — File system access in test_simulation.js
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Claude Code plugin that unlocks full-power We need reasoning chains in DeepSeek Pro models: turn-aware DSH minimal simulation (official one-line persona + Bash/Edit pair on decision turns, full MCP tools + DSH persona on execution turns). Works with cc-haha.
we-need-ds 🎯
首个专为 Claude Code 与 cc-haha 打造的 DeepSeek Pro 满血 "We need" 深度思维链原生增强插件
English Documentation | 简体中文
🧐 背景:为什么你的 DeepSeek 总是“不聪明”?
近期开源社区(参考 DeepSeek Harness 社区的深入研究)发现了一个极其关键的模型机制:DeepSeek-V4-Pro 系列模型在不同工具上下文下的推理能力存在显著的“双面性”:
| 模式 | 表现特征 | 核心原因 |
|---|---|---|
| 🟢 "We need..." 满血深度规划 | 面对复杂工程任务,首先自发进行宏观全局拆解、边界推演、架构设计,展现极高水准的 AGI 战略规划能力。 | 模型首轮仅看到基础必要工具,触发 RL(强化学习)训练中的深度推理甜点区。 |
| 🔴 "Let me..." 浅层工具试探 | 陷入微观琐碎的工具调用纠结,输出频繁试错、不断摸索,思维链退化为机械式的工具调用循环(Tool-Churning)。 | 客户端首轮注入数十个 MCP 工具、技能扩展、复杂 Schema,模型的注意力机制被过度牵引。 |
行业现状与生态空白
- DSH 社区验证了原理,但 Claude Code 生态依然缺席:现有的解决方案大多停留在 Python 独立运行脚本或专有终端框架中。
- Claude Code 生态的巨大矛盾:现代开发者在 Claude Code 中普遍挂载了大量 MCP 工具(数据库、浏览器、绘图、终端等)。如果为了诱导 "We need" 而手动把 MCP 全关掉,开发体验直接报废;如果不关,DeepSeek 就会永远陷在 "Let me" 的泥潭里。
- 提示词(Prompt 催眠)治标不治本:无论在 System Prompt 里如何强调“请使用 We need 思考”,只要底层的 JSON 请求体里依然带有一长串复杂的 Tool Schemas,模型就会被注意力机制强制牵引回工具试探中。
💡 我们的解决方案:轮次结构感知动态解耦(Turn-Aware DSH Minimal Simulation, v5.2)
we-need-ds 是专为 Claude Code 与 cc-haha 原生设计的全自动增强插件,无需关闭任何 MCP,零感知唤醒满血 DeepSeek:
sequenceDiagram
autonumber
participant User as 开发者
participant CC as Claude Code / cc-haha 宿主
participant Proxy as we-need-ds 代理 (:20329)
participant Router as 9router / 中转商 / 官方端点
User->>CC: 输入任务: /we-need-ds 重构登录与鉴权系统
Note over CC,Proxy: 会话开启/执行指令:透明代理就绪,多 Provider 池自动接管
CC->>Proxy: 判定轮请求 (新任务文本, 包含全部 30+ 个 MCP 工具 Schema)
rect rgb(235, 248, 255)
Note over Proxy: v5.2 DSH 极简模拟(常态化,不限首轮):<br/>命中 DS Pro 目标模型 + 判定轮 → 系统提示词替换为 DSH 官方单行<br/>工具裁切为 [Bash, Edit] 两件套 (对齐 DSH 极简模式)<br/>剥离 user 消息中的 system-reminder 噪声 + 注入 thinking 预算<br/>根据 API Key 自动反向路由到真实的对应上游
end
Proxy->>Router: 转发极简后的纯净请求
Router-->>CC: DeepSeek 触发 RL 甜点区,吐出 "We need..." 深度规划链 (SSE 零延迟直通)
Note over CC,Proxy: 模型开始执行具体步骤或调用工具
CC->>Proxy: 执行轮请求 (tool / tool_result 回传)
rect rgb(240, 253, 244)
Note over Proxy: v5.1 全量放行:全量 MCP/Skill 恢复可用<br/>人格同步切换为 DSH 单行 (executionDshPersona)
end
Proxy->>Router: 原样透传
Router-->>CC: 正常调用 ComfyUI/数据库/各种 MCP 完成执行!
✨ 核心特性矩阵
- ⚡ 单服务商接管 + 直连副本逃生口(Single-Provider Hook & Direct-Copy Escape):
- 只接管
providers.json中当前默认(activeId)且确实提供 DeepSeek Pro 模型的那一个服务商,其余服务商的baseUrl一律不动,保持各自真实上游; - 接管的同时,为该服务商复制一份带
· 直连副本后缀的临时 provider,其baseUrl指向原始真实上游——这就是逃生口:万一 daemon 死掉、本体指向死端口,你在 cc-haha 里切到副本即可立刻直连,再从容off/boot/on; - 副本同时充当冗余账本:即使
runtime-state.json丢失/损坏,也能从副本的baseUrl把本体救回真实上游; - 收到请求时根据 API Key / Token 动态回源到真实上游地址,多窗口、多标签页切换模型零干扰。
- 只接管
- 🎯 轮次结构感知极简模拟(Turn-Aware DSH Minimal, v5.2 判定轮满血触发):
- 纯请求结构判定:末条为新 user 文本 = 判定轮(等待模型规划),末条为 tool/tool_result = 执行轮(工具续跑);
- 每个判定轮(不限会话首轮)自动模拟 DeepSeek Harness 官方极简模式:系统提示词替换为 DSH 官方单行
You are a helpful software engineer assistant.,工具裁切为Bash + Edit两件套(映射 DSH 的 bash + str_replace_editor);v5.2 新增:剥离 user 消息中的<system-reminder>噪声块(对照实验证明 reminder 噪声会压灭思维链),并在 Anthropic 路径注入thinking预算(对照实验证明 thinking 字段缺失即无法触发 "We need"); - **每个执行轮(v5.1)**保留全量工具放行,同时人格也切换为 DSH 单行——客户端只校验 JSON 协议结构(tool_use/tool_result),人格文本不做硬校验,替换协议安全;执行链结束后下一次新任务重新进入极简,全程零配置。
executionDshPersona: false可退回 v5 行为(执行轮完全透传)。
- 🛡️ 多重防呆生命周期与无死锁保障:
- 宿主钩子自动接管:SessionStart 钩子拉起 daemon 并仅在账本
enabled(你此前执行过on且未off)时自动重接管;UserPromptSubmit 钩子每条新消息自检复活;SessionEnd 钩子会话结束把指向代理的 provider 还原直连但保留拦截意图(下个会话自动重接管)——想永久关闭请显式执行/we-need-ds:off(在支持插件 hooks 的宿主上生效); - 重启后手动恢复(不依赖宿主钩子,不做系统级注册):Windows 关机/重启会直接杀死 daemon 且绕过所有钩子,被接管的本体会停留在指向死代理端口的"孤儿"状态。但其余服务商和直连副本始终直连,所以你总能发消息、也能跑恢复命令——不再有"全部指向死端口、连 on 都发不出"的死锁。恢复:在 cc-haha 切到直连副本(或任意未接管的 provider)后执行
/we-need-ds:on(或终端node lib/ctl.js boot)——拉起 daemon + 修复孤儿 + 按账本重新接管。本插件不注册计划任务、不写 Startup 文件夹,卸载即干净(见下方"重启后的手动恢复"); - 常驻守护:daemon 默认常驻不退出(
idleAutoShutdownMinutes: 0); - 非目标模型 100% 零侵入:Claude / GPT / Gemini / Qwen 纯字节流直通。
- 宿主钩子自动接管:SessionStart 钩子拉起 daemon 并仅在账本
📂 Claude Code 配置文件组织体系
~/.claude/ # Claude Code 用户全局配置根目录
├── settings.json # 官方设置文件 (管理 enabledPlugins, permissions 等)
├── cc-haha/ # cc-haha 定制目录 (https://github.com/NanmiCoder/cc-haha)
│ └── providers.json # Provider 路由表 (baseUrl, activeId, 模型映射等)
├── we-need-ds/ # 插件集中数据目录 (跨版本持久化)
│ ├── runtime-state.json # 运行时账本 (原始 URL 映射表 / keyMap / 拦截开关)
│ └── we-need-ds.log # 运行日志
└── plugins/ # 插件系统根目录 (Plugin V2 规范)
├── installed_plugins.json # 已安装插件注册表与 cache 映射
├── known_marketplaces.json # 插件市场源列表
└── cache/ # 插件运行时隔离沙盒
└── claude-plugins-official/
└── we-need-ds/<version>/ # we-need-ds 运行时代码
├── config.json # 插件核心配置
├── proxy.js # 拦截代理核心
├── lib/state.js # 状态机与映射池
└── skills/ # 官方标准技能入口
🚀 使用指南
🅰️ 在 cc-haha 中使用
⚠️ 先读:接管会改写 providers.json,且关机/重启后依然保留
本插件的接管方式是把被选中 provider 的baseUrl改写为本地代理地址(http://127.0.0.1:20329)。这个改写写进的是 cc-haha 的配置文件~/.claude/cc-haha/providers.json,关机、重启、关闭 cc-haha 都不会自动撤销它。因此:
- 只要 daemon 还活着,一切正常;
- 若 daemon 死了(重启会直接杀死它)而本体还指向代理端口,那个 provider 就"连不上"了——但不会全盘卡死:接管时插件同时生成了一份
· 直连副本(baseUrl指向你的原始真实上游),其余未被接管的 provider 也全部保持直连。你随时可以切到副本或任意未接管 provider 发消息、并跑恢复命令。- 养成习惯:退出 cc-haha / 关机前执行一次
/we-need-ds:off,把本体还原直连、清除副本,账本干净。忘了也没关系,见下方"重启后的手动恢复"。
- 选择要接管哪个服务商(两种方式,二选一):
- 方式 A · 插件代选(推荐,无需手动预设置):直接执行
/we-need-ds:on或/we-need-ds,插件会先列出你配置的所有 provider(标注哪个含 DeepSeek Pro 模型🎯、哪个是当前默认⭐),若含 DS 模型的有多个会让你选一个,然后接管它。接管非默认 provider 时插件会自动把 cc-haha 的activeId切到它——因为 sidecar 按activeId路由,不同步切换的话新会话仍会走旧 provider。 - 方式 B · 手动预设置:先在 cc-haha 里把你真正要用的那个 DeepSeek Pro 服务商设为默认,再执行
/we-need-ds:on(省略--provider),插件直接接管当前默认。 - 终端等价命令:
node lib/ctl.js list查看清单;node lib/ctl.js on --provider <id 或名称>指定接管目标。 - 接管与否只看该 provider 声明的
models字段:插件读取providers.json里这个服务商的models(main/haiku/sonnet/opus 等映射),只要其中任一模型名命中 DeepSeek Pro 判定(在targetModels列表内,或含deepseek字样、或含独立的ds词元(前后为分隔符/边界,避免models/adsl之类子串误伤)且同时含v4|pro|flash特征)才接管。像 9Router 这类中转站,即使它实际能转发 DeepSeek 模型,只要它的models字段里没写 deepseek 系模型名,插件就判定它"非 DS provider"而不接管(保持直连、不裁剪)。所以请选择models里确实声明了 DeepSeek Pro 模型的服务商。 - 其余服务商的
baseUrl一律不动,保持各自真实上游——这正是防死锁的关键:daemon 万一死了,你还有大量直连入口和自动生成的直连副本可切换。
- 方式 A · 插件代选(推荐,无需手动预设置):直接执行
- 开启即接管 + 建副本:
- 执行
/we-need-ds:on(或on --provider <id>):拉起 daemon、把目标 DS 服务商的baseUrl切到代理端口、并复制一份· 直连副本(指向原始真实上游)作为逃生口。 - 切换接管目标后再
on:旧本体自动还原直连、新目标被接管,副本始终只保留一份。
- 执行
- 退出前手动 off(推荐习惯):
- 关闭 cc-haha / 关机前执行
/we-need-ds:off,把本体还原直连并清除副本,账本干净。即便忘了 off,重启后也能从副本或任意未接管 provider 直连发消息、再跑boot/on恢复,不会卡死。
- 关闭 cc-haha / 关机前执行
- 日常使用:
- 在聊天框直接输入:
/we-need-ds 帮我重构用户鉴权模块并编写测试用例 - 想要先行进行深度推演不写代码时:
/we-need-ds:plan 规划大型系统重构方案
- 在聊天框直接输入:
🅱️ 在纯正官方 Claude Code 中使用
- 设置上游与代理:
- 在环境变量中指定上游中转地址(如 9router 或商业 API):
export ANTHROPIC_UPSTREAM_BASE_URL="http://127.0.0.1:20128" - 将 Claude Code 端点指向
we-need-ds代理:export ANTHROPIC_BASE_URL="http://127.0.0.1:20329"
- 在环境变量中指定上游中转地址(如 9router 或商业 API):
- 运行与体验:
- 正常启动
claude即可,所有deepseek-v4-pro*判定轮请求自动进入 DSH 极简环境触发 "We need" 思维链,工具执行轮全量放行,其他模型(Claude / GPT / Gemini 等)全量透传直通。
- 正常启动
🎮 命令矩阵全景
| 技能命令 | 功能说明 | 典型使用场景 |
|---|---|---|
/we-need-ds <任务> |
一键启动满血思维链并执行 | 默认主入口,附带任务,自动开启拦截并执行 |
/we-need-ds:plan <任务> |
调用只读规划专家子代理 | 超大项目、重构任务,想先看 Markdown 蓝图而不动代码 |
/we-need-ds:doctor |
一键深度体检 | 排查代理端口、环境模式、Provider 池接管与连通状态 |
/we-need-ds:test |
运行轮次结构感知自测试套件 | 覆盖判定轮极简、执行轮放行、非目标模型透传、M1/M3 边界、非 DS 安全底线的完整断言 |
/we-need-ds:status |
查看当前运行与拦截状态 | 查看当前代理进程、拦截开关、被接管的提供商清单与日志 |
/we-need-ds:list |
列出全部 provider 及接管建议 | 查看每个 provider 是否含 DS 模型、哪个是当前默认、哪个已在代理中,再决定接管谁 |
/we-need-ds:on |
手动开启拦截环境 | 默认接管当前默认 DS 服务商;on --provider <id> 可指定接管任意含 DS 模型的服务商(自动同步 activeId)并建直连副本 |
/we-need-ds:off |
手动关闭拦截并还原端点 | 还原被接管的本体到真实上游并清除直连副本 |
/we-need-ds:restart |
优雅重启代理 daemon | 代理卡死(如被大量挂起的上游请求占满)或更新代码后需重载时:杀旧进程→拉起新 daemon→按账本自动重新接管 |
🔌 重启后的手动恢复(本插件不做任何系统级注册)
Windows 关机/重启会直接杀死 daemon 进程,且绕过所有会话钩子——被接管的本体会停留在指向死代理端口的"孤儿"状态。本插件刻意不做任何系统层面的持久化(不注册计划任务、不写 Startup 文件夹):插件就应该是插件,装完不偷偷改系统,卸载即干净。
v2.2.0 起死锁已被根治:代理只接管当前默认的那一个服务商,其余服务商和自动生成的 · 直连副本 始终保持直连。所以重启后哪怕 daemon 死了,你依然能正常发消息(走任意未接管 provider 或副本),恢复命令也发得出去——不再有"全部指向死端口、连 on 都发不出"的死锁。
因此电脑重启后、或 cc-haha / Claude Code 完全重开后,需要显式启动一次拦截(和平时用 skill 的方式一样):
- 在 Claude Code 里执行
/we-need-ds:on—— 拉起 daemon + 修复孤儿 + 按账本接管,一步到位; - 或在终端跑
node "<CACHE>\lib\ctl.js" boot—— 不依赖宿主的等价恢复命令,读账本enabled状态自愈(开启态拉起 daemon + 修复孤儿 + 重新接管,关闭态清理残留)。
会话进行中的自愈(UserPromptSubmit 钩子:每条新消息自检 daemon、死亡则复活重接管)在支持插件 hooks 的宿主(如原生 Claude Code)上仍然生效,与上述手动启动不冲突。cc-haha 的 sidecar 是常驻 server 模式、不执行插件 hooks,所以 cc-haha 下以手动 on/boot 为准。
失败即还原(防死锁):任何恢复路径(on / boot / 钩子)如果拉起 daemon 失败,都会把仍指向代理端口的 provider 自动还原为真实上游直连——绝不留"端点指向死代理、用户无法使用、恢复命令也发不出"的死锁状态。还原不是单向的:下一条消息若账本 enabled 且 daemon 存活、无 provider 被接管,UserPromptSubmit 钩子会自动重新接管——恢复后的第一轮立即回到代理+裁剪。status / doctor 若检测到 provider 指向代理端口但 daemon 未运行,会打印醒目告警并给出恢复命令。
⚙️ 配置文件说明 (config.json)
{
"port": 20329,
"targetBaseUrl": "auto",
"targetModels": [
"deepseek-v4-pro-0813",
"deepseek-v4-pro",
"deepseek-v4-flash",
"deepseek-v4-flash-0731"
],
"bootstrapCoreTools": [
"Bash",
"Edit"
],
"logDetails": false,
"idleAutoShutdownMinutes": 0,
"executionDshPersona": true,
"thinkingBudget": 8000,
"upstreamRetries": 1,
"upstreamRetryBackoffMs": 500,
"upstreamHeaderTimeoutMs": 30000,
"upstreamBodyTimeoutMs": 30000,
"upstreamIdleTimeoutMs": 600000
}
| 配置项 | 默认值 | 说明 |
|---|---|---|
port |
20329 |
本地透明代理监听端口(仅绑定 127.0.0.1)。若被其他程序占用请改此值;测试环境变量 WE_NEED_DS_TEST_PORT 可临时覆盖,不影响生产配置。 |
targetBaseUrl |
"auto" |
上游解析策略。"auto" = 按请求携带的 API Key 在账本中动态路由回各 Provider 真实上游;设为具体 URL 则强制所有请求回源到该地址。 |
targetModels |
DS V4 全家桶 | 需要触发拦截处理的模型列表(内置归一化引擎,下划线/空格/连字符/路径前缀/大小写变体均能精准匹配)。列表之外的模型(Claude / GPT / Gemini / Qwen 等)一律字节级原样透传,绝不修改。 |
bootstrapCoreTools |
["Bash","Edit"] |
判定轮保留的极简工具集(对齐 DSH 极简模式的 bash + str_replace_editor 两件套)。此外,会话历史中已被调用过的工具也会自动保留,防止协议校验失败。 |
logDetails |
false |
设为 true 时在日志中记录每个透传请求的 URL 与上游(调试路由问题用)。 |
idleAutoShutdownMinutes |
0 |
空闲自动释放开关。默认 0 = 常驻不退出;设为正数 N 则代理空闲超过 N 分钟后自动还原所有 Provider 并退出,下次新消息由 UserPromptSubmit 钩子自动拉起并重新接管。 |
executionDshPersona |
true |
执行轮(工具续跑)是否也同步切换为 DSH 极简人格。默认 true(全程 DSH 人格,仅工具集不同);设为 false 则执行轮完全原样透传(保留 Claude Code 原始人格)。 |
thinkingBudget |
8000 |
判定轮注入的 Anthropic extended thinking 预算。实测对照实验证明:thinking 字段必须存在才能触发 "We need" 思维链(budget 大小无所谓,但字段缺失即失败)。默认 8000 = 判定轮在 Anthropic 路径注入 thinking: {type:"enabled", budget_tokens:8000};设 0 关闭注入。内置 max_tokens 守卫:宿主小 max_tokens 请求(如标题生成,≤ budget)自动跳过注入,避免 max_tokens > budget_tokens 的 400。OpenAI 路径始终不注入(防中转站 400)。 |
stripSystemPersona |
(缺省=生效) | 人格替换总开关。默认所有命中 DS 目标模型的请求都替换为 DSH 单行人格;显式设为 false 可完全关闭人格替换(仅保留工具裁切)。 |
upstreamRetries |
1 |
上游不稳定时的重试次数(不含首次,默认共 2 次尝试)。只对可重试失败重试:空 body、连接被重置、408/409/425/429、5xx、超时;确定性错误(DNS 解析失败 ENOTFOUND、主机不可达、非法 URL 等)不重试直接失败——这类错误重试只会叠加延迟。客户端断开后不再发起任何重试。代理刻意保守:上游本身可能已有重试,代理再叠多重试会放大成重试风暴。设为 0 关闭重试。 |
upstreamRetryBackoffMs |
500 |
重试退避基数(毫秒),按 2 的幂递增(500→1000→…),总封顶 60s;若上游返回 Retry-After 头则取两者较大值(Retry-After 被 clamp 到 0–60s,防恶意/异常头把代理挂死)。 |
upstreamHeaderTimeoutMs |
30000 |
响应头超时(毫秒)。请求发出后若上游在此时间内连响应头都没返回(连接级挂起),判定为可重试失败,快速失败而非拖到 socket 硬超时。 |
upstreamBodyTimeoutMs |
30000 |
非流式 body 超时(毫秒)。仅对非流式(Content-Type 不是 text/event-stream)响应生效:头已到但在此时间内一个 body 字节都没有("只发头不发体"的挂起),判定为可重试失败。流式响应不受此门约束——推理模型(如 deepseek-v4-pro)首 token 可能合法地慢到几十秒甚至更久,头到齐后代理会无限等待首字节,绝不误杀。 |
upstreamIdleTimeoutMs |
600000 |
socket 空闲超时(毫秒)。上游连接上连续无任何活动达到该时长即判定为死连接并销毁(默认 10 分钟,覆盖长思考链的流式静默期)。 |
⚠️ 边界与注意事项
- 账本信任链:插件把 provider 的
baseUrl改写为代理地址时,会把"改写瞬间的 baseUrl"记为真实上游(originalUrl)。因此请确保 cc-haha 里每个 provider 的 baseUrl 指向的是真实上游(官方端点或你自己的中转,如 9router 的:20128)。若你把某个 provider 手动配成了另一个代理地址,插件会把这个代理地址当作真实上游记录并还原——这是设计边界,不是 bug。开启拦截前用/we-need-ds:doctor核对各 provider 的原始上游是否符合预期。 - 两条版本编号线:README 与文档中反复出现的 v5 / v5.1 / v5.2 指的是机制版本(轮次感知 DSH 极简模拟这套算法的演进代号);插件本身遵循 semver(见
plugin.json与 CHANGELOG,当前2.4.x)。两者独立编号:机制 v5.2 对应插件 2.4.4。GitHub Releases 以 semver 为准。 - 端口占用:代理默认绑定
127.0.0.1:20329。若被占用请改config.json的port;插件在端口变更时会自动把指向旧端口的 provider 先还原再按新端口接管,不会把代理地址误记为真实上游。 - 测试隔离(跑测试套件必读):自测试套件会改写 providers.json 与 runtime-state.json。为避免污染你正在使用的生产环境,跑测试前务必设置三个隔离环境变量,让测试全程读写临时目录、绝不碰生产文件:
WE_NEED_DS_TEST_PORT(测试端口)、WE_NEED_DS_PROVIDERS_PATH(临时 providers.json 路径)、WE_NEED_DS_DATA_DIR(临时数据目录)。test_full.js/test_consume.js已内置自动隔离(用os.tmpdir()临时目录),直接node test_full.js即可;手动跑ctl on/off等接管命令时若不想碰生产,同样设这三个变量。 - 接管态路由与漂移可观测(v2.4.4):接管态下(账本
providers非空)代理按 API Key 精确回源——若请求携带的 key 未在keyMap命中,代理直接返回 502 显式失败,绝不静默把请求错发到defaultUpstream(防止你改了被接管 provider 的 key 后请求被带新 key 误发到 DeepSeek 官方、只看到一个费解的 401);无 key 请求与纯 Claude Code 模式(providers为空)仍按defaultUpstream/环境变量兜底。由于 cc-haha 的 sidecar 不执行插件 hooks,如果你编辑/重建了被接管的 provider(id 漂移)或新增了 DS 服务商并设为默认,接管会悬空、"We need" 静默失效——doctor会检出并打印接管漂移告警及恢复命令(重新执行on)。boot/restart清理残留 daemon 时也已加防护:只杀确认是本插件(/health-check应答 ok,或无应答但进程映像为node.exe)的进程,端口被无关程序占用时跳过/中止而非误杀。
📄 开源许可证
本项目基于 MIT License 开源。欢迎提交 PR 与 Issue!
作者: YixuAn
鸣谢: cc-haha 客户端项目 & DeepSeek Harness (DSH) 社区
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found