Kimi Code + Claude Code (DeepSeek) 结对编程: 一个开发, 一个审查
为什么让两个不同的模型结对
单独用一个模型开发,最大的问题不是它不够强,而是它会自我认可:同一个模型写的代码,自己再看一遍,容易沿着同样的思路漏掉同类错误——错误的假设、被忽略的边界条件,第一遍没发现,第二遍大概率也发现不了。
把 Kimi Code 和 Claude Code(跑 DeepSeek 模型)凑成一对,各司其职:
理由 |
说明 |
|---|---|
盲点互补 |
两个厂商的训练数据、工具链、思维习惯不同,交叉审查的命中率远高于自我复查 |
成本可控 |
审查是"读多写少"的活,DeepSeek V4 Flash 输出参考价 $0.28/M tokens,便宜的一方正好干这个 |
角色隔离 |
审查方只读不写,天然不会和开发方改同一行代码打架;"写"和"评"的责任分开,问题清单喂回开发方,闭环清晰 |
分工:
角色 |
工具 |
模型 |
动作 |
|---|---|---|---|
开发 |
Kimi Code CLI |
kimi-for-coding |
改文件、跑测试、提交 |
审查 |
Claude Code |
deepseek-v4-flash |
只读 git diff,输出问题清单 |
备注
下文中的 "Claude Code" 均指接了 DeepSeek 后端的 Claude Code CLI。两款工具都是终端里的编码 Agent,自带文件读写、命令执行、多轮决策能力,结对不需要任何额外的框架。
环境准备
1. 安装 Kimi Code CLI
Kimi Code CLI 是 Moonshot 开源的终端编码 Agent,命令是 kimi,通过 npm 安装:
# 国内网络先切镜像, 已有镜像可跳过
npm config set registry https://registry.npmmirror.com
npm install -g @moonshot-ai/kimi-code
# OAuth 登录, 会打印一个网址和验证码, 浏览器确认即可
kimi login
验证安装:
kimi -p "用一句话介绍你自己"
-p(prompt 模式)是后续所有自动化的基础:不进入交互界面,执行完一条指令就退出,并且自动批准文件读写等常规操作,适合脚本驱动。
2. 安装 Claude Code 并接入 DeepSeek
npm install -g @anthropic-ai/claude-code
DeepSeek 提供了 Anthropic 兼容端点,Claude Code 不需要改代码,只改几个环境变量即可接入(2026-06-23 起 DeepSeek 官方发布了集成指南)。推荐写进 ~/.claude/settings.json 的 env 块,CLI 和 VS Code 扩展共用:
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic",
"ANTHROPIC_AUTH_TOKEN": "<你的 DeepSeek API Key>",
"ANTHROPIC_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-v4-flash",
"CLAUDE_CODE_SUBAGENT_MODEL": "deepseek-v4-flash",
"CLAUDE_CODE_AUTO_COMPACT_WINDOW": "786432"
}
}
几个关键点:
配置 |
说明 |
|---|---|
|
必须是 |
|
填 DeepSeek 的 API Key,不是 Anthropic 的 |
|
主力模型; |
|
轻量模型,映射给 Haiku 档和子代理,审查用它足够 |
警告
deepseek-chat / deepseek-reasoner 这两个旧模型名已于 2026-07-24 退役,请求会报 404 model not found。网上老教程的配置记得换成 deepseek-v4-pro[1m] / deepseek-v4-flash。
警告
API Key 不要进 git:如果 settings.json 会被提交,把 env 块挪到 ~/.claude/settings.local.json(本地文件,不进仓库),或者直接在 shell 里 export ANTHROPIC_AUTH_TOKEN=...。
验证:进入 claude 交互界面跑 /status,确认 Base URL 显示 api.deepseek.com/anthropic;再跑一句 claude -p "说一句你好"。
结对的核心规则
动手之前先立三条规矩,它们是后面所有工作流的地基:
同一时刻只有一个 Agent 改文件。两个 Agent 同时写同一个工作区,互相覆盖是必然结局。
审查方只读。审查命令里显式限制工具白名单(见下文
--allowedTools),从机制上保证它改不了东西。审查的对象永远是 git diff。审查方只看"这次改了什么",不看整个仓库——上下文小、速度快、意见聚焦;也避免审查方被既有代码带偏。
在这个基础上,有串行和并行两种组织方式:
串行(推荐入门):开发方改完提交,审查方审最后一次提交,问题喂回开发方修复,循环。简单可靠,一次只有一个 Agent 在工作。
并行(进阶):用
git worktree给每个 Agent 一个独立工作区,开发在主区,审查在另一个 worktree 读 diff。适合审查要花很长时间的大改动,后面"进阶玩法"再展开。
方式一: 设计 + 评审(先定方案再动手)
开发之前,先让一方出设计、另一方挑刺,这是性价比最高的检查——设计阶段的漏洞改起来只要改文档,代码阶段改起来要动真金白银。
终端 A(Kimi 出设计):
你是资深架构师。任务: {任务描述}
请输出一份设计文档, 保存到 docs/design-{主题}.md, 内容包括:
1. 方案概述与备选方案对比
2. 关键数据结构 / 接口定义
3. 边界情况与异常处理策略
4. 对现有代码的影响面
终端 B(Claude Code 评审设计):
claude -p "你是设计评审员, 只评审 docs/design-{主题}.md, 不要修改任何文件。
找出设计漏洞: 性能瓶颈、数据一致性问题、安全风险、影响面遗漏、可维护性问题。
每条意见给出文档中的出处, 按严重程度分级。" \
--dangerously-skip-permissions \
--allowedTools "Read,Grep,Glob"
把评审意见贴回终端 A:"按以下意见修订设计:..."。来回一到两轮,方案就比单模型自说自话扎实得多。
方式二: 开发 + 审查(手动结对, 两个终端)
最直观的结对:两个终端并排,一个写一个查。
终端 A(Kimi 开发):
你是资深开发者。任务: {任务描述}
流程:
1. 先浏览相关代码, 说明你的实现方案
2. 按方案实现, 改动保持最小
3. 运行相关测试确认通过
完成后停下, 不要提交, 等我的下一步指令。
开发完成后,你手动提交(提交动作留在人手里,是关键的检查点):
git add -A
git commit -m "feat: {任务描述}"
终端 B(Claude Code 审查):
claude -p "你是严格的代码审查员。审查最后一次提交 (git show HEAD), 不要修改任何文件。
规则:
1. 每条问题必须给出 文件:行号 证据
2. 按严重程度分级: 阻断(必须修) / 建议(应该修) / 观察(了解即可)
3. 关注: 边界条件、错误处理、资源泄漏、并发问题、测试覆盖
4. 只报确实存在的问题, 不写客套话" \
--dangerously-skip-permissions \
--allowedTools "Read,Grep,Glob"
审查输出通常是一份带 文件:行号 的问题清单。把清单原样贴回终端 A,补一句"按以上意见逐条修复",Kimi 会对照着改。改完再提交、再审,循环:
sequenceDiagram
participant K as 终端A: Kimi (开发)
participant G as Git
participant C as 终端B: Claude Code (审查)
K->>G: 实现并提交
G->>C: git show HEAD
C-->>K: 问题清单 (文件:行号 + 分级)
K->>G: 修复并提交
G->>C: 新一轮 diff
C-->>K: 通过 ✓
两个终端各开一个 tmux 窗口很顺手;不想贴来贴去的话,方式三把它自动化。
方式三: 全自动结对(脚本驱动)
两个 CLI 都支持无头模式(kimi -p / claude -p),所以"开发 → 提交 → 审查 → 修复"整条链路可以写成一个脚本,人在旁边只看结果。
#!/usr/bin/env bash
# pair.sh — Kimi 开发 + Claude Code (DeepSeek) 审查, 循环直到审查通过
# 用法: ./pair.sh "任务描述"
set -euo pipefail
TASK="${1:?用法: ./pair.sh \"任务描述\"}"
MAX_ROUNDS="${MAX_ROUNDS:-3}"
echo "==> [1] Kimi 开发: $TASK"
kimi -p "你是资深开发者, 任务: $TASK
- 先读相关代码再动手, 改动保持最小
- 改完运行相关测试, 保证通过
- 不要执行 git commit, 提交由脚本处理"
echo "==> [2] 提交改动"
git add -A
git commit -m "dev(kimi): $TASK"
for round in $(seq 1 "$MAX_ROUNDS"); do
echo "==> [3] 第 $round 轮审查 (Claude Code + DeepSeek)"
claude -p "你是严格的代码审查员, 只审查下面的 diff, 不要修改任何文件。
规则:
1. 每条问题必须给出 文件:行号 证据
2. 按严重程度分级: 阻断(有 bug 或安全风险) / 建议(值得改) / 观察(了解即可)
3. 只报告确实存在的问题, 不写客套话
4. 最终只输出一个 JSON 对象, 不要 markdown 代码块:
{\"findings\": [{\"file\": \"...\", \"line\": 1, \"level\": \"阻断\", \"description\": \"...\"}]}
没有问题则输出 {\"findings\": []}
diff:
$(git show --format=fuller HEAD)" \
--output-format json \
--dangerously-skip-permissions \
--allowedTools "Read,Grep,Glob" > /tmp/review.json
# 从 claude 的 JSON 输出中提取"必须处理"的问题, 生成反馈
python3 - <<'PY' > /tmp/feedback.txt
import json
outer = json.load(open("/tmp/review.json"))
text = outer.get("result", "")
i, j = text.find("{"), text.rfind("}")
findings = json.loads(text[i:j+1]).get("findings", []) if i >= 0 else []
serious = [f for f in findings if f.get("level") in ("阻断", "建议")]
if not serious:
print("PASS")
else:
for f in serious:
print(f"[{f['level']}] {f['file']}:{f['line']} — {f['description']}")
PY
if grep -q '^PASS$' /tmp/feedback.txt; then
echo "==> 审查通过, 共 $round 轮"
exit 0
fi
echo "==> [4] 问题清单:"
cat /tmp/feedback.txt
echo "==> 交回 Kimi 修复"
kimi -p "代码审查发现以下问题, 逐条修复:
$(cat /tmp/feedback.txt)
修复后运行相关测试, 不要执行 git commit"
git add -A
git commit -m "fix(kimi): 第 $round 轮审查问题修复"
done
echo "==> 达到最大轮数 $MAX_ROUNDS, 仍有问题待处理, 见 /tmp/feedback.txt"
逐段拆解:
kimi -p无头开发:prompt 模式不弹交互界面,自动批准常规操作,跑完退出。指令里明确"不要 commit",把提交权留给脚本;提交:人(或脚本)提交,Kimi 的改动变成一个干净的 diff,供下一环审查;
claude -p无头审查:三个参数是安全关键——--dangerously-skip-permissions免去逐条确认,--allowedTools "Read,Grep,Glob"把工具白名单锁成只读,--output-format json让输出可被程序解析;解析 JSON:claude 的 json 输出是
{"result": "..."}结构,审查清单在result字段里,用 python 提取;只把"阻断/建议"两级问题喂回 Kimi,"观察"级不阻塞;循环:修复后重新提交、再审,直到
PASS或超过MAX_ROUNDS。
警告
kimi -p 模式会自动批准文件读写等常规操作,等于把工作区交给了模型。脚本只在你信任的目录(比如一个专门的项目仓库)里跑,别拿去对 ~ 或生产服务器用。
审查 prompt 怎么写才有效
审查质量九成取决于 prompt。上面两个模板里藏着四条经验:
强制证据:"每条问题必须给出 文件:行号"。没有这个要求,模型会输出"整体结构可以优化"之类的空话;有行号,你(和修复方)才能逐条核实——审查方也可能说错,行号让它说的话可证伪;
分级:阻断 / 建议 / 观察。分级既给修复方排了优先级,也让脚本能只把高级别问题喂回去,避免在鸡毛蒜皮上空转;
禁止客套:"只报确实存在的问题,不写客套话"。模型默认有迎合倾向,不约束它,一半的输出是"整体完成得很好,建议..."
只审 diff:"审查下面的 diff",把范围钉死。范围越小,意见越具体;顺便省 token。
如果审查意见和你的判断冲突,当场追问它:"给出这个结论的依据"。两个模型互相制衡,最后的判断权在你。
进阶玩法
git hook: 提交即审查
把审查挂到 post-commit hook,每次 Kimi 提交完自动触发:
# .git/hooks/post-commit
#!/usr/bin/env bash
claude -p "你是严格的代码审查员, 审查最后一次提交 (git show HEAD), 不要修改任何文件。
每条问题给出 文件:行号 证据, 按 阻断/建议/观察 分级, 只报确实存在的问题。" \
--dangerously-skip-permissions \
--allowedTools "Read,Grep,Glob"
适合有审查意识的仓库:每笔提交都有一份独立的、来自另一个模型的意见。
交互式深审: /code-review
无头模式的审查胜在自动化,但讨论感弱。大改动、拿不准的改动,开一个 Claude Code 交互会话,让它审查当前 diff,针对每条意见追问"为什么""有没有反例",把审查变成对话。修起来慢,但适合关键路径。
worktree 并行: 一个写一个审, 互不阻塞
开发要跑很久时,可以让审查方在另一个 worktree 上并行读 diff:
git worktree add ../project-review HEAD~1
cd ../project-review
claude -p "审查 ../project 最后一次提交 (git -C ../project show HEAD), 不要修改任何文件" \
--dangerously-skip-permissions --allowedTools "Read,Grep,Glob"
两个 Agent 各有各的工作区,物理上不可能互相覆盖;开发不被打断,审查意见开发完再统一处理。
角色互换: 防止盲区固化
长期固定"Kimi 写、DeepSeek 审",等于默认了 Kimi 的开发水平总是对的。每过一段时间交换一次角色(DeepSeek 开发、Kimi 审),两边的问题都会暴露出来,也顺带比较两个模型在你项目上的真实水平。
常见坑
坑 |
现象 |
处理 |
|---|---|---|
两个 Agent 同时改文件 |
改动互相覆盖,git 状态混乱 |
严格遵守串行;要并行就用 worktree |
审查全是空话 |
"整体不错,建议优化" |
prompt 强制 文件:行号 + 禁止客套 |
互相认同错误 |
修复方照单全收错误意见 |
逐条核实行号;拿不准让审查方给依据 |
DeepSeek 报 404 model not found |
旧教程的 |
换成 |
DeepSeek 工具调用偶发失败 |
diff 编辑偶尔重试、丢工具调用 |
这是已知现象(成功率低于官方 Claude),审查只用只读工具影响很小;开发方仍用 Kimi |
上下文超限报 400 |
DeepSeek 上下文窗口较小 |
设置 |
API Key 泄漏 |
settings.json 被 git 提交 |
key 放 |
无头模式误操作 |
|
只在受信任的目录跑;提交动作保留在脚本/人手里 |
总结
分工:Kimi Code 写代码、Claude Code(DeepSeek)审 diff,审查方永远只读;
闭环:开发 → 提交 → 审查 → 问题清单喂回开发 → 再审查,直到通过;
自动化:两个 CLI 的无头模式(
kimi -p/claude -p --output-format json)让整个闭环可以脚本化,post-commithook 让审查零成本;边界:审查意见要带 文件:行号 证据,最后判断权在你手里。