Skip to content

Commit 480c2d8

Browse files
JusterZhuclaude
andauthored
refactor: remove UpgradeMode from sample server DTOs and logic (#116)
- Remove UpgradeMode from VerifyDTO and VerificationResultDTO - Remove UpgradeMode-based filtering and logging in Program.cs Co-authored-by: Claude <noreply@anthropic.com>
1 parent fcebc19 commit 480c2d8

4 files changed

Lines changed: 96 additions & 22 deletions

File tree

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# 用 VS Code Claude Code + DeepSeek V4 Pro 写代码的一些记录
2+
3+
## 一、背景
4+
5+
Claude Code 的 VS Code 插件出来之后我一直想试试,但这东西默认走 Anthropic 自己的 API,Opus 4.6 输出价格 $25/百万 token,高强度用一个月账单不太好看。后来发现 DeepSeek 官方提供了兼容 Anthropic 协议的 API 端点,输出价格 $0.87/百万 token,差了一个数量级。于是就搭起来用了段时间,这篇文章是把整个过程和感受记下来,给想试的人一个参考。
6+
7+
---
8+
9+
## 二、环境搭建
10+
11+
### 2.1 装插件
12+
13+
VS Code 里按 `Ctrl+Shift+X` 搜 "Claude Code",发布者是 Anthropic,点安装就行。装完右上角会出现一个闪电图标,那是打开 Claude Code 面板的入口。
14+
15+
没什么特别的,跟装其他扩展一样。
16+
17+
### 2.2 配置 DeepSeek 的 API 密钥
18+
19+
[platform.deepseek.com](https://platform.deepseek.com) 注册账号,在 API Keys 页面创建一个 Key。注意关掉弹窗就看不到了,提前存好。
20+
21+
然后在 VS Code 里按 `Ctrl+Shift+P`,打开 `Open User Settings (JSON)`,加这段配置:
22+
23+
```json
24+
"claudeCode.environmentVariables": [
25+
{ "name": "ANTHROPIC_BASE_URL", "value": "https://api.deepseek.com/anthropic" },
26+
{ "name": "ANTHROPIC_AUTH_TOKEN", "value": "sk-你的DeepSeek_API_Key" },
27+
{ "name": "ANTHROPIC_MODEL", "value": "deepseek-v4-pro[1m]" },
28+
{ "name": "ANTHROPIC_DEFAULT_OPUS_MODEL", "value": "deepseek-v4-pro[1m]" },
29+
{ "name": "ANTHROPIC_DEFAULT_SONNET_MODEL", "value": "deepseek-v4-pro[1m]" },
30+
{ "name": "ANTHROPIC_DEFAULT_HAIKU_MODEL", "value": "deepseek-v4-flash" },
31+
{ "name": "CLAUDE_CODE_SUBAGENT_MODEL", "value": "deepseek-v4-flash" },
32+
{ "name": "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC", "value": "1" },
33+
{ "name": "CLAUDE_CODE_EFFORT_LEVEL", "value": "max" },
34+
{ "name": "API_TIMEOUT_MS", "value": "600000" }
35+
]
36+
```
37+
38+
说几个注意点:
39+
40+
- **`[1m]` 后缀加上**,否则默认上下文只有 64K,Claude Code 跑 agent 模式几个来回就超了。
41+
- **SUBAGENT_MODEL 我设成了 Flash**,文件搜索、索引这些辅助任务没必要上 Pro,省点钱。
42+
- **`DISABLE_NONESSENTIAL_TRAFFIC` 设 1**,DeepSeek 的兼容端点对某些预检请求会返回 404,设了这个直接跳过,省得报错刷屏。
43+
44+
配置完重启 VS Code,打开 Claude Code 面板输入 `/model`,返回 `deepseek-v4-pro` 就说明通了。
45+
46+
另外这些环境变量配置其实不用自己手敲——有其他 AI Agent 的话可以代劳,比如 OpenClaw 里通过 MCP 工具直接写 settings.json,一句话搞定。
47+
48+
### 2.3 实际用起来的感受
49+
50+
快捷键:`Ctrl+Shift+I` 打开面板,`Ctrl+Esc` 切换焦点,`Ctrl+N` 新建对话。
51+
52+
几个场景的感受:
53+
54+
**写代码。** 需求明确的时候它干得不错。比如"写一个支持断点续传的 HTTP 上传客户端,用 asyncio,带进度回调"——生成的代码结构清晰,分片逻辑、md5 校验、重试机制都带了,基本改改就能用。
55+
56+
**重构。** 选中一段老代码让它拆函数加类型注解,它能理解意图,但有个毛病——容易过度工程化。50 行的函数它能给你拆成 5 个文件 8 个类,你得自己往回拉。
57+
58+
**Debug。** 报错堆栈丢给它定位方向还行,但深层的逻辑漏洞它经常"自圆其说",给一个看似合理但实际错误的解释。最终还是靠自己。
59+
60+
---
61+
62+
## 三、一些心得
63+
64+
### 3.1 智能程度:能干活,但得有人带着
65+
66+
SWE Verified 上 V4 Pro 是 80.6%,Opus 4.6 Max 是 80.8%,数字看不出什么差距。实际用下来,**需求明确、路径清晰的任务**——比如"实现一个 Redis 分布式锁"、"写 JWT 中间件"——它完成度很高。但需求模糊、需要自己判断决策的地方,它就容易写出看似正确但细节不对的东西。
67+
68+
我的感受是:把它当成一个效率放大器比较合适。**你自己心里得有清晰的思路,知道每一步要什么,它能帮你把想法快速落地。** 反过来,如果你自己都不知道该怎么写,指望它给你一个完整的架构设计,那大概率会失望。
69+
70+
### 3.2 测试:帮得上忙,但核心流程还是得人走
71+
72+
写单元测试、集成测试这种套路固定的工作,它做得不错。给个函数它能快速生成 edge case 覆盖、mock 依赖、assert 断言,比自己手写快不少。搭测试环境、写 Dockerfile、配 CI 这类事也基本零失误。
73+
74+
但"帮我写测试看看能不能测出 bug"——这件事它做不好。生成的测试大概率只走 happy path,隐藏的并发竞争条件、异常状态流转它发现不了。**找 bug 还是靠人的直觉和对代码的理解。**
75+
76+
### 3.3 性价比:划算,但得看场景
77+
78+
价格上 DeepSeek V4 Pro 确实便宜很多:输入 $0.435、输出 $0.87(每百万 token)。Opus 4.6 是 $5 和 $25。差了将近 29 倍。
79+
80+
但这里有个反直觉的事。我之前遇到一个依赖注入容器的生命周期问题,涉及多个框架层的交互,比较复杂。用 DeepSeek V4 Pro 调了大半天,token 烧了将近 1 亿,来回改了好几轮都没解决。后来切回 Opus 4.6,20 分钟定位问题,10 分钟修完。算下来 DeepSeek 花了大概 $80 加大半天时间,Opus 花了大概 $50 加半小时。
81+
82+
**贵的模型不一定更贵。** 如果任务难度高,更强的模型虽然单价贵,但总成本(算上你的时间)反而更低。如果任务简单明确——写 CRUD、写测试、写配置——那 DeepSeek V4 Pro 确实划算。
83+
84+
我现在是**日常开发用 DeepSeek,遇到疑难杂症切回 Opus**。成本能控住,关键时刻效率也不掉。
85+
86+
---
87+
88+
## 四、总结
89+
90+
VS Code Claude Code + DeepSeek V4 Pro 这套组合,对于预算有限的个人开发者和中小团队来说是个实惠的选择。配置简单、日常编码够用、成本低。缺点是复杂推理不如顶级闭源模型、偶尔过度工程化、没有多模态能力。
91+
92+
适合的场景是"你心里有清晰的代码蓝图,需要一个人快速把代码落地"。它不是自动驾驶,是一个能提效的辅助工具。
93+
94+
**模型选型看场景,日常省钱、关键时刻舍得用好模型,互补着来比较实际。**

src/Server/DTOs/VerificationResultDTO.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,6 @@ public record VerificationResultDTO
7272
/// </summary>
7373
public bool? IsFreeze { get; set; }
7474

75-
/// <summary>
76-
/// 升级模式: 1=VersionChain, 2=CrossVersion
77-
/// </summary>
78-
public int? UpgradeMode { get; set; }
79-
8075
/// <summary>
8176
/// 是否为跨版本升级包
8277
/// </summary>

src/Server/DTOs/VerifyDTO.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,4 @@ public class VerifyDTO
2727
/// </summary>
2828
public string? ProductId { get; set; }
2929

30-
/// <summary>
31-
/// 升级模式: 1=VersionChain(逐版本链式升级), 2=CrossVersion(跨版本升级)
32-
/// </summary>
33-
public int? UpgradeMode { get; set; }
3430
}

src/Server/Program.cs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,12 @@
4141
// ── Verification handler (shared across URL variants) ──────────
4242
var handleVerification = (VerifyDTO request) =>
4343
{
44-
Console.WriteLine($"[Verification] AppKey={request.AppKey}, Version={request.Version}, AppType={request.AppType}, Platform={request.Platform}, ProductId={request.ProductId}, UpgradeMode={request.UpgradeMode}");
44+
Console.WriteLine($"[Verification] AppKey={request.AppKey}, Version={request.Version}, AppType={request.AppType}, Platform={request.Platform}, ProductId={request.ProductId}");
4545

4646
if (!Version.TryParse(request.Version ?? "0.0.0.0", out var currentVersion))
4747
return Results.Ok(HttpResponseDTO<IEnumerable<VerificationResultDTO>>.Success(
4848
Array.Empty<VerificationResultDTO>(), "Invalid version format."));
4949

50-
var requestUpgradeMode = request.UpgradeMode ?? 1;
51-
5250
var available = versionStore
5351
.Where(v =>
5452
{
@@ -59,13 +57,6 @@
5957
if (!string.IsNullOrEmpty(request.ProductId) && !string.IsNullOrEmpty(v.ProductId) &&
6058
!string.Equals(v.ProductId, request.ProductId, StringComparison.OrdinalIgnoreCase))
6159
return false;
62-
if (requestUpgradeMode == 1 && v.IsCrossVersion == true) return false;
63-
if (requestUpgradeMode == 2)
64-
{
65-
if (v.IsCrossVersion != true) return false;
66-
if (!string.Equals(v.FromVersion, request.Version, StringComparison.OrdinalIgnoreCase))
67-
return false;
68-
}
6960
return true;
7061
})
7162
.OrderByDescending(v => new Version(v.Version!))
@@ -89,14 +80,12 @@
8980
Version = v.Version, AppType = v.AppType, Platform = v.Platform,
9081
ProductId = v.ProductId, IsForcibly = v.IsForcibly,
9182
Format = v.Format ?? ".zip", Size = v.Size, IsFreeze = v.IsFreeze,
92-
UpgradeMode = requestUpgradeMode,
9383
IsCrossVersion = v.IsCrossVersion ?? false,
9484
FromVersion = v.FromVersion
9585
});
9686
}
9787

98-
var modeLabel = requestUpgradeMode == 2 ? "CrossVersion" : "VersionChain";
99-
Console.WriteLine($"[Verification] Returning {results.Count} packages (Mode: {modeLabel})");
88+
Console.WriteLine($"[Verification] Returning {results.Count} packages");
10089
foreach (var r in results)
10190
Console.WriteLine($" {r.Version}{r.Name} ({(r.IsCrossVersion == true ? $"Cross {r.FromVersion}{r.Version}" : "Full")})");
10291

0 commit comments

Comments
 (0)