用 DeepSeek + Claude 组合,搭一个比 Claude Code 便宜 17 倍的 AI 代码审查 Agent
用 DeepSeek + Claude 组合,搭一个比 Claude Code 便宜 17 倍的 AI 代码审查 Agent
很多人不知道一件事:Claude Code 底层的 agent loop,其实可以拆开来自己搭。
DeepClaude 这个项目最近在 HN 上火了,核心思路是:用 DeepSeek V4 Pro 做推理(便宜),用 Claude 做最终输出(质量高),整体成本比直接用 Claude Code 低 17 倍。
这篇文章带你用 50 行 Python 复现这个思路,做一个能审整个 repo 的代码审查工具。
为什么这个组合有意思
Claude 的输出质量毋庸置疑,但它贵。DeepSeek V4 Pro 的推理能力现在已经非常强,而且价格是 Claude 的零头。
DeepClaude 的做法是:
1. 把问题先扔给 DeepSeek,让它做深度推理,输出一个「思考过程」
2. 把这个思考过程 + 原始问题一起喂给 Claude
3. Claude 基于已有推理直接生成高质量答案,不需要自己再从头想
这样 Claude 的 token 消耗大幅减少,因为它跳过了「思考」阶段,只做「表达」。
动手搭一个 Repo 审查工具
环境准备
pip install openai pathlib
只需要 openai 这个包,因为 DeepSeek 和 Claude 都支持 OpenAI 格式的 API。
完整代码
import os
from pathlib import Path
from openai import OpenAI
# 两个模型都走同一个 base_url,省去多账号管理的麻烦
client = OpenAI(
api_key=os.environ.get("WULIANG_API_KEY"),
base_url="https://api2everything.xyz/v1"
)
def collect_repo_files(repo_path: str, extensions: list[str] = None) -> dict[str, str]:
"""收集 repo 里的代码文件"""
if extensions is None:
extensions = [".py", ".ts", ".js", ".go", ".java", ".rs"]
files = {}
root = Path(repo_path)
for ext in extensions:
for file_path in root.rglob(f"*{ext}"):
# 跳过常见的无关目录
if any(part in file_path.parts for part in ["node_modules", ".git", "__pycache__", "dist", "build"]):
continue
try:
content = file_path.read_text(encoding="utf-8")
if len(content.strip()) > 0:
relative_path = str(file_path.relative_to(root))
files[relative_path] = content
except Exception:
continue
return files
def deepseek_reason(code_context: str) -> str:
"""第一步:让 DeepSeek 做深度推理,找出潜在问题"""
prompt = f"""你是一个资深代码审查专家。请对以下代码进行深度分析,重点关注:
1. 安全漏洞(SQL注入、XSS、未验证输入等)
2. 性能问题(N+1查询、不必要的循环、内存泄漏)
3. 代码质量(重复代码、命名不规范、缺少错误处理)
4. 架构问题(耦合过高、职责不清晰)
代码内容:
{code_context}
请详细列出你发现的所有问题,并说明原因。"""
response = client.chat.completions.create(
model="deepseek-r1", # 用 DeepSeek 做推理,便宜
messages=[{"role": "user", "content": prompt}],
max_tokens=2000
)
return response.choices[0].message.content
def claude_summarize(original_code: str, deepseek_analysis: str) -> str:
"""第二步:把 DeepSeek 的推理结果喂给 Claude,生成可读报告"""
prompt = f"""基于以下代码审查分析,生成一份结构清晰、可直接行动的审查报告。
原始代码:
{original_code[:3000]} # 只传关键部分给 Claude,节省 token
DeepSeek 的分析结果:
{deepseek_analysis}
请输出:
1. 问题摘要(按严重程度排序:Critical / High / Medium / Low)
2. 每个问题的具体修复建议(附代码示例)
3. 整体评分(1-10)和一句话总结"""
response = client.chat.completions.create(
model="claude-sonnet-4-5", # Claude 做最终输出,质量有保障
messages=[{"role": "user", "content": prompt}],
max_tokens=2000
)
return response.choices[0].message.content
def review_repo(repo_path: str):
"""主函数:审查整个 repo"""
print(f"📂 正在扫描 {repo_path}...")
files = collect_repo_files(repo_path)
if not files:
print("没有找到可审查的代码文件")
return
print(f"✅ 找到 {len(files)} 个文件,开始审查...\n")
# 把所有文件拼成一个上下文(实际使用可以按文件分批)
code_context = ""
for path, content in list(files.items())[:10]: # 先处理前10个文件
code_context += f"\n\n### {path}\n```\n{content[:1500]}\n```"
print("🤔 DeepSeek 正在深度推理...")
analysis = deepseek_reason(code_context)
print("✍️ Claude 正在生成报告...")
report = claude_summarize(code_context, analysis)
print("\n" + "="*60)
print("📋 代码审查报告")
print("="*60)
print(report)
# 保存报告
output_path = Path(repo_path) / "code_review_report.md"
output_path.write_text(f"# 代码审查报告\n\n{report}", encoding="utf-8")
print(f"\n💾 报告已保存到 {output_path}")
if __name__ == "__main__":
import sys
repo_path = sys.argv[1] if len(sys.argv) > 1 else "."
review_repo(repo_path)
运行方式
export WULIANG_API_KEY="你的key"
python review.py /path/to/your/project
成本对比
| 方案 | 审查一个中型 repo 的费用 |
|------|------------------------|
| 直接用 Claude Code | ~¥15-30 |
| DeepSeek 推理 + Claude 输出 | ~¥1-3 |
| 纯 DeepSeek | ~¥0.5,但输出格式差一些 |
这个组合的甜点在于:推理用便宜的,表达用贵的,两边都不浪费。
进一步优化方向
- 按文件并发:用
asyncio并行处理多个文件,速度提升 5-10 倍 - 增量审查:结合
git diff,只审查本次改动的代码 - CI 集成:加到 GitHub Actions,每次 PR 自动触发
- 自定义规则:在 prompt 里加入团队的编码规范文档
关于 API 费用
代码里用的 base_url 是 无量Api,国内直连,不需要代理。DeepSeek、Claude、GPT 等 300+ 模型都在一个 key 里,比官方便宜约 65%。注册送 ¥1 余额,够跑好几次审查了。
改一行 base_url 就能用,其他代码完全不用动。
有问题欢迎评论区留言,或者把你跑出来的审查报告截图发出来看看效果。觉得有用的话点个赞,后续还会写 CI 集成和异步并发版本。