|
| 1 | +# Anthropic Extended Thinking 自动启用策略优化 |
| 2 | + |
| 3 | +## 📋 概述 |
| 4 | + |
| 5 | +优化了自定义模型适配器中 Anthropic Extended Thinking 的启用策略,从**基于模型名称检测**改为**所有 Anthropic 协议模型默认启用**。 |
| 6 | + |
| 7 | +## 🎯 修改动机 |
| 8 | + |
| 9 | +1. **简化逻辑**:不再需要维护支持 thinking 的模型名称列表 |
| 10 | +2. **更通用**:适用于所有 Anthropic 兼容的 API(包括第三方代理服务) |
| 11 | +3. **向前兼容**:新发布的 Claude 模型自动支持,无需更新代码 |
| 12 | +4. **容错性好**:不支持的模型会自动忽略 `thinking` 参数,不会报错 |
| 13 | + |
| 14 | +## 🔄 修改内容 |
| 15 | + |
| 16 | +### 1. 核心逻辑简化 |
| 17 | + |
| 18 | +#### **修改前**(基于模型名称检测): |
| 19 | +```typescript |
| 20 | +function isThinkingSupportedModel(modelId: string): boolean { |
| 21 | + const modelIdLower = modelId.toLowerCase(); |
| 22 | + |
| 23 | + const thinkingPatterns = [ |
| 24 | + 'claude-sonnet-4', 'claude-4-sonnet', |
| 25 | + 'claude-3-7-sonnet', 'claude-3.7-sonnet', |
| 26 | + 'claude-haiku-4', 'claude-4-haiku', |
| 27 | + 'claude-opus-4', 'claude-4-opus', |
| 28 | + ]; |
| 29 | + |
| 30 | + return thinkingPatterns.some(pattern => modelIdLower.includes(pattern)); |
| 31 | +} |
| 32 | + |
| 33 | +const shouldEnableThinking = modelConfig.enableThinking !== undefined |
| 34 | + ? modelConfig.enableThinking |
| 35 | + : isThinkingSupportedModel(modelConfig.modelId); // ❌ 需要检查模型名称 |
| 36 | +``` |
| 37 | + |
| 38 | +#### **修改后**(所有 Anthropic 模型默认启用): |
| 39 | +```typescript |
| 40 | +function shouldEnableThinkingByDefault(): boolean { |
| 41 | + // 对于所有 Anthropic 协议的模型,默认启用 thinking |
| 42 | + // 如果模型不支持,服务端会自动忽略此参数 |
| 43 | + return true; |
| 44 | +} |
| 45 | + |
| 46 | +const shouldEnableThinking = modelConfig.enableThinking !== undefined |
| 47 | + ? modelConfig.enableThinking |
| 48 | + : shouldEnableThinkingByDefault(); // ✅ 总是返回 true |
| 49 | +``` |
| 50 | + |
| 51 | +### 2. API 请求格式(不变) |
| 52 | + |
| 53 | +当启用 thinking 时,发送给 Anthropic API 的请求体: |
| 54 | + |
| 55 | +```json |
| 56 | +{ |
| 57 | + "model": "claude-sonnet-4-5-20250929", |
| 58 | + "messages": [...], |
| 59 | + "max_tokens": 32000, |
| 60 | + "thinking": { |
| 61 | + "type": "enabled", |
| 62 | + "budget_tokens": 31999 |
| 63 | + } |
| 64 | +} |
| 65 | +``` |
| 66 | + |
| 67 | +**参数说明:** |
| 68 | +- `thinking.type`: 固定为 `"enabled"` |
| 69 | +- `thinking.budget_tokens`: `Math.min(maxTokens - 1, 31999)` (官方推荐值) |
| 70 | +- `max_tokens`: 自动调整为至少 32000 |
| 71 | + |
| 72 | +### 3. 用户配置行为 |
| 73 | + |
| 74 | +| `enableThinking` 值 | 行为 | |
| 75 | +|---------------------|------| |
| 76 | +| `undefined` (默认) | ✅ 自动启用 thinking(所有 Anthropic 模型) | |
| 77 | +| `true` | ✅ 强制启用 thinking | |
| 78 | +| `false` | ❌ 明确禁用 thinking | |
| 79 | + |
| 80 | +### 4. 配置示例 |
| 81 | + |
| 82 | +#### **简化配置**(推荐,使用默认行为): |
| 83 | +```json |
| 84 | +{ |
| 85 | + "customModels": [ |
| 86 | + { |
| 87 | + "provider": "anthropic", |
| 88 | + "modelId": "claude-sonnet-4-5-20250929", |
| 89 | + "displayName": "Claude Sonnet 4.5", |
| 90 | + "baseUrl": "https://api.anthropic.com", |
| 91 | + "apiKey": "${ANTHROPIC_API_KEY}", |
| 92 | + "maxTokens": 32000 |
| 93 | + // enableThinking 未设置,自动启用 |
| 94 | + } |
| 95 | + ] |
| 96 | +} |
| 97 | +``` |
| 98 | + |
| 99 | +#### **明确禁用**(如果需要): |
| 100 | +```json |
| 101 | +{ |
| 102 | + "customModels": [ |
| 103 | + { |
| 104 | + "provider": "anthropic", |
| 105 | + "modelId": "claude-3-5-sonnet-20241022", |
| 106 | + "displayName": "Claude 3.5 Sonnet (No Thinking)", |
| 107 | + "baseUrl": "https://api.anthropic.com", |
| 108 | + "apiKey": "${ANTHROPIC_API_KEY}", |
| 109 | + "enableThinking": false // 明确禁用 |
| 110 | + } |
| 111 | + ] |
| 112 | +} |
| 113 | +``` |
| 114 | + |
| 115 | +## 🧪 测试更新 |
| 116 | + |
| 117 | +### 修改的测试用例: |
| 118 | + |
| 119 | +1. **自动启用测试**: |
| 120 | + ```typescript |
| 121 | + it('should auto-enable thinking for all Anthropic models when enableThinking is undefined') |
| 122 | + ``` |
| 123 | + - 验证所有 Anthropic 模型默认启用 thinking |
| 124 | + |
| 125 | +2. **明确禁用测试**: |
| 126 | + ```typescript |
| 127 | + it('should respect explicit enableThinking=false to disable thinking') |
| 128 | + ``` |
| 129 | + - 验证用户可以通过 `enableThinking: false` 禁用 |
| 130 | + |
| 131 | +### 测试结果: |
| 132 | +``` |
| 133 | +✓ src/core/customModelAdapter.test.ts (31 tests) 17ms |
| 134 | +Test Files 1 passed (1) |
| 135 | +Tests 31 passed (31) |
| 136 | +``` |
| 137 | + |
| 138 | +## 📝 文档更新 |
| 139 | + |
| 140 | +### 更新的文件: |
| 141 | +1. **`packages/core/src/types/customModel.ts`** |
| 142 | + - 更新 `enableThinking` 字段的注释 |
| 143 | + - 说明默认行为为自动启用 |
| 144 | + |
| 145 | +2. **`packages/cli/src/assets/help/cli-help-knowledge.md`** |
| 146 | + - 更新自定义模型配置说明 |
| 147 | + - 修改 Anthropic 提供商描述 |
| 148 | + - 更新配置示例 |
| 149 | + |
| 150 | +## ✅ 优势总结 |
| 151 | + |
| 152 | +| 方面 | 修改前 | 修改后 | |
| 153 | +|------|--------|--------| |
| 154 | +| **代码复杂度** | 需要维护模型名称模式列表 | 简单的 `return true` | |
| 155 | +| **兼容性** | 仅特定模型名称支持 | 所有 Anthropic 协议模型 | |
| 156 | +| **可维护性** | 新模型需要更新代码 | 无需更新,自动支持 | |
| 157 | +| **第三方服务** | 可能不匹配模型名称 | 完全兼容 | |
| 158 | +| **容错性** | 不支持的模型不启用 | 不支持的模型自动忽略参数 | |
| 159 | +| **用户体验** | 需要了解哪些模型支持 | 开箱即用,无需配置 | |
| 160 | + |
| 161 | +## 🔍 技术细节 |
| 162 | + |
| 163 | +### 为什么不支持的模型不会报错? |
| 164 | + |
| 165 | +根据 Anthropic API 设计: |
| 166 | +- 不支持 `thinking` 参数的模型会**忽略**此字段 |
| 167 | +- API 不会返回错误,而是正常处理其他参数 |
| 168 | +- 这是 API 设计的向前兼容策略 |
| 169 | + |
| 170 | +### 性能影响 |
| 171 | + |
| 172 | +- ✅ 无性能影响 |
| 173 | +- ✅ 请求体大小增加可忽略(约 50 字节) |
| 174 | +- ✅ 不支持的模型处理时间无变化 |
| 175 | + |
| 176 | +## 📚 相关文档 |
| 177 | + |
| 178 | +- [Anthropic Extended Thinking 官方文档](https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking) |
| 179 | +- [DeepV Code 自定义模型文档](../docs/custom-models-guide.md) |
| 180 | +- [自定义模型快速开始](../docs/custom-models-quickstart.md) |
| 181 | + |
| 182 | +## 🎉 总结 |
| 183 | + |
| 184 | +此次优化使 Anthropic Extended Thinking 功能更加**简单、通用、易用**: |
| 185 | +1. ✅ 所有 Anthropic 模型默认启用 thinking |
| 186 | +2. ✅ 用户无需关心模型是否支持 |
| 187 | +3. ✅ 代码更简洁,易于维护 |
| 188 | +4. ✅ 完全向后兼容现有配置 |
| 189 | + |
| 190 | +--- |
| 191 | + |
| 192 | +**修改日期**: 2026-01-17 |
| 193 | +**版本**: v1.0.271 |
| 194 | +**影响范围**: `packages/core/src/core/customModelAdapter.ts` |
0 commit comments