用DeepSeek V4做编程的话还可以再等等
- 内容介绍
- 文章标签
- 相关推荐
DeepSeek V4对AI coding最大的价值就是真正可用的1M上下文,抹平了和御三家的差距。咱们平时AI coding,多追问几句,上下文就会很长,DeepSeek V4的价值就发挥出来了。
但现在看来,DeepSeek V4还有一些兼容性问题,例如:
[Bug] /compact 命令在使用 DeepSeek API 时无法工作(API 返回 thinking-only 响应缺少 text block)
已打开 10:16AM - 25 Apr 26 UTC moyu12-ae bug## 🐛 问题描述 在使用 DeepSeek API(`api.deepseek.com/anthropic`)作为 provider 时,`/compact…` 命令无法正常执行,报错信息为 `Error during compaction`。 ## 🔬 排查过程 ### 特征门控(VHq)返回 false `/compact` 有两个执行路径: 1. **简单压缩路径(RHq)** — 本地 token 计数 + 截断,**不调用 API** 2. **复杂压缩路径(uj6)** — 调用 LLM API 生成 summary `VHq()` 特征门控函数控制是否启用简单压缩路径: ```javascript function VHq() { if (t6(process.env.ENABLE_CLAUDE_CODE_SM_COMPACT)) return !0; if (t6(process.env.DISABLE_CLAUDE_CODE_SM_COMPACT)) return !1; let q = f8("tengu_session_memory", !1), // GrowthBook feature flag → false K = f8("tengu_sm_compact", !1), // GrowthBook feature flag → false z = q && K; // false return z; } ``` 由于没有 GrowthBook 服务端配置,`VHq()` 返回 `false`,导致所有 compact 请求都走 `uj6()` API 路径。 ### uj6() 依赖 API 返回 text block `uj6()` 函数调用 `mb7()`(即 API 请求),然后通过 `nE6()` 从响应中提取 `text` block 内容: ```javascript v = await mb7({ messages: W, summaryRequest: P, ... }); // API call G = nE6(v); // extract text from response ``` ### DeepSeek API 返回 thinking-only 响应 经过实际 HTTP 测试发现,DeepSeek 的 Anthropic 代理在某些 prompt 配置下**只返回 `thinking` block,缺少 `text` block**: | 测试条件 | 结果 | |---------|------| | 标准消息请求 | ✅ 正常返回 thinking + text | | summarization prompt | ✅ 正常返回 thinking + text | | 系统提示抑制思考 | ❌ **只返回 thinking,无 text** | | max_tokens 很小 | ❌ **只返回 thinking,无 text** | ## 🔑 根因 1. **DeepSeek API 兼容性问题**:`api.deepseek.com/anthropic` 没有完全兼容 Anthropic Messages API 格式规范。Anthropic 官方 API 在 extended thinking 模式下始终保证同时返回 `thinking` 和 `text` 两个 block。DeepSeek 在某些情况下只返回 `thinking` block。 2. **缺少降级机制**:当 `uj6()` 中 API 调用失败时,没有 fallback 到简单压缩路径(RHq)。 ## 💡 建议修复方案 ### 方案一:增加环境变量自动检测 建议在 `cc-haha` 中为使用非 Anthropic 官方 API 的用户自动设置 `ENABLE_CLAUDE_CODE_SM_COMPACT=true`,或检测到 provider 不是 Anthropic 时自动启用简单压缩路径。 ### 方案二:uj6() 失败时降级到 RHq() 当 `uj6()` 调用 API 失败时,自动 fallback 到 `RHq()` 简单压缩路径,而不是直接抛错: ```javascript // 伪代码 try { let w = await uj6(Y, K, ...); return { type: "compact", compactionResult: w }; } catch (_) { // Fallback to local compact let H = await RHq($, K.agentId); if (H) return { type: "compact", compactionResult: H }; throw _; } ``` ### 方案三:workaround 文档 在 README 中说明,使用非 Anthropic API 时建议设置环境变量: ```bash export ENABLE_CLAUDE_CODE_SM_COMPACT=true ``` ## 🔧 临时 Workaround ```bash export ENABLE_CLAUDE_CODE_SM_COMPACT=true ``` 这会强制启用简单压缩路径(不调用 API,使用本地 token 计数策略),可以绕过此问题。 ## 📋 环境信息 - **工具版本**: Claude Code Haha v0.1.6 - **API Provider**: DeepSeek(`api.deepseek.com/anthropic`) - **Runtime**: Bun - **操作系统**: macOS 24.2.0
还有就是在CC里,DeepSeek有时候会返回一个只有签名、无实际思考内容的 thinking 块。Claude Code 收到后认为这是空的 thinking 块,就不会把它放进下一条请求的 msg 里。但 DeepSeek 要求所有它产出的 thinking 块(即使内容为空)都必须回传,结果后续回答就会变得莫名其妙。
这些问题看后续DeepSeek怎么优化吧,毕竟现在还是preview版
网友解答:--【壹】--:
v4 pro给我一种基模底子很好,但是 post-training 不足的感觉,可能是 DeepSeek 着急交付,post-training 还没做到极致吧,可能非 preview 版本会有很大进步
DeepSeek V4对AI coding最大的价值就是真正可用的1M上下文,抹平了和御三家的差距。咱们平时AI coding,多追问几句,上下文就会很长,DeepSeek V4的价值就发挥出来了。
但现在看来,DeepSeek V4还有一些兼容性问题,例如:
[Bug] /compact 命令在使用 DeepSeek API 时无法工作(API 返回 thinking-only 响应缺少 text block)
已打开 10:16AM - 25 Apr 26 UTC moyu12-ae bug## 🐛 问题描述 在使用 DeepSeek API(`api.deepseek.com/anthropic`)作为 provider 时,`/compact…` 命令无法正常执行,报错信息为 `Error during compaction`。 ## 🔬 排查过程 ### 特征门控(VHq)返回 false `/compact` 有两个执行路径: 1. **简单压缩路径(RHq)** — 本地 token 计数 + 截断,**不调用 API** 2. **复杂压缩路径(uj6)** — 调用 LLM API 生成 summary `VHq()` 特征门控函数控制是否启用简单压缩路径: ```javascript function VHq() { if (t6(process.env.ENABLE_CLAUDE_CODE_SM_COMPACT)) return !0; if (t6(process.env.DISABLE_CLAUDE_CODE_SM_COMPACT)) return !1; let q = f8("tengu_session_memory", !1), // GrowthBook feature flag → false K = f8("tengu_sm_compact", !1), // GrowthBook feature flag → false z = q && K; // false return z; } ``` 由于没有 GrowthBook 服务端配置,`VHq()` 返回 `false`,导致所有 compact 请求都走 `uj6()` API 路径。 ### uj6() 依赖 API 返回 text block `uj6()` 函数调用 `mb7()`(即 API 请求),然后通过 `nE6()` 从响应中提取 `text` block 内容: ```javascript v = await mb7({ messages: W, summaryRequest: P, ... }); // API call G = nE6(v); // extract text from response ``` ### DeepSeek API 返回 thinking-only 响应 经过实际 HTTP 测试发现,DeepSeek 的 Anthropic 代理在某些 prompt 配置下**只返回 `thinking` block,缺少 `text` block**: | 测试条件 | 结果 | |---------|------| | 标准消息请求 | ✅ 正常返回 thinking + text | | summarization prompt | ✅ 正常返回 thinking + text | | 系统提示抑制思考 | ❌ **只返回 thinking,无 text** | | max_tokens 很小 | ❌ **只返回 thinking,无 text** | ## 🔑 根因 1. **DeepSeek API 兼容性问题**:`api.deepseek.com/anthropic` 没有完全兼容 Anthropic Messages API 格式规范。Anthropic 官方 API 在 extended thinking 模式下始终保证同时返回 `thinking` 和 `text` 两个 block。DeepSeek 在某些情况下只返回 `thinking` block。 2. **缺少降级机制**:当 `uj6()` 中 API 调用失败时,没有 fallback 到简单压缩路径(RHq)。 ## 💡 建议修复方案 ### 方案一:增加环境变量自动检测 建议在 `cc-haha` 中为使用非 Anthropic 官方 API 的用户自动设置 `ENABLE_CLAUDE_CODE_SM_COMPACT=true`,或检测到 provider 不是 Anthropic 时自动启用简单压缩路径。 ### 方案二:uj6() 失败时降级到 RHq() 当 `uj6()` 调用 API 失败时,自动 fallback 到 `RHq()` 简单压缩路径,而不是直接抛错: ```javascript // 伪代码 try { let w = await uj6(Y, K, ...); return { type: "compact", compactionResult: w }; } catch (_) { // Fallback to local compact let H = await RHq($, K.agentId); if (H) return { type: "compact", compactionResult: H }; throw _; } ``` ### 方案三:workaround 文档 在 README 中说明,使用非 Anthropic API 时建议设置环境变量: ```bash export ENABLE_CLAUDE_CODE_SM_COMPACT=true ``` ## 🔧 临时 Workaround ```bash export ENABLE_CLAUDE_CODE_SM_COMPACT=true ``` 这会强制启用简单压缩路径(不调用 API,使用本地 token 计数策略),可以绕过此问题。 ## 📋 环境信息 - **工具版本**: Claude Code Haha v0.1.6 - **API Provider**: DeepSeek(`api.deepseek.com/anthropic`) - **Runtime**: Bun - **操作系统**: macOS 24.2.0
还有就是在CC里,DeepSeek有时候会返回一个只有签名、无实际思考内容的 thinking 块。Claude Code 收到后认为这是空的 thinking 块,就不会把它放进下一条请求的 msg 里。但 DeepSeek 要求所有它产出的 thinking 块(即使内容为空)都必须回传,结果后续回答就会变得莫名其妙。
这些问题看后续DeepSeek怎么优化吧,毕竟现在还是preview版
网友解答:--【壹】--:
v4 pro给我一种基模底子很好,但是 post-training 不足的感觉,可能是 DeepSeek 着急交付,post-training 还没做到极致吧,可能非 preview 版本会有很大进步

