上周接了个私活,甲方要求做一个合同解析工具,核心逻辑是把 PDF 合同丢给大模型,让它提取关键条款、识别风险点,再生成结构化 JSON。我一开始用 DeepSeek V3 写了个初版,效果还行但在复杂嵌套逻辑上老是出幺蛾子。后来换成 Claude Opus 4.6 的 API 来辅助写代码,对长上下文的理解能力和代码生成的准确率确实是目前第一梯队。这篇文章把我这一周用 Claude API 写代码的完整流程、配置方案和踩过的坑全部记录下来。
直接回答标题问题:用 Claude API 写代码,核心是调用 Claude Opus 4.6 或 Sonnet 4.6 的 Messages API,通过 system prompt 设定编程助手角色,把需求描述和已有代码作为 user message 传入,模型会返回完整可运行的代码。你可以用官方 SDK 直连,也可以通过兼容 OpenAI 协议的聚合平台(改个 base_url 就行),后者对网络环境没要求,延迟也更稳定。
先说结论
折腾了一周,我的最终方案和关键数据:
| 维度 | 我的选择 | 原因 |
|---|---|---|
| 模型 | Claude Opus 4.6 | 复杂逻辑生成准确率最高,长上下文不迷路 |
| 调用方式 | OpenAI 兼容协议 | 代码改动最小,切模型只改 model 参数 |
| 接入方案 | 聚合 API 平台 | 免代理直连,延迟约 300ms,省心 |
| 日均花费 | ≈ 15-25 元人民币 | 中等强度使用,主要是 Opus 贵 |
| 代码一次通过率 | 约 78% | 比我之前用的方案高了 20 个百分点 |
环境准备
Python 3.10+,装两个包就够了:
pip install openai anthropic
为什么装两个?因为我会演示两种调用方式,你根据自己情况选一种就行。
方案一:用 Anthropic 官方 SDK 直连
最"正统"的方式,直接用 Anthropic 的 Python SDK:
from anthropic import Anthropic
client = Anthropic(api_key="your-anthropic-key")
def ask_claude_to_code(requirement: str, existing_code: str = "") -> str:
"""让 Claude 根据需求生成/修改代码"""
system_prompt = """你是一个资深 Python 开发者。要求:
1. 生成完整可运行的代码,不要省略任何部分
2. 包含类型注解和简洁的 docstring
3. 考虑边界情况和错误处理
4. 如果是修改已有代码,只输出修改后的完整版本"""
user_message = f"需求:{requirement}"
if existing_code:
user_message += f"\n\n已有代码:\n```python\n{existing_code}\n```"
response = client.messages.create(
model="claude-opus-4-6-20260201",
max_tokens=4096,
system=system_prompt,
messages=[
{"role": "user", "content": user_message}
]
)
return response.content[0].text
# 实测:让它写一个合同条款提取器
result = ask_claude_to_code(
requirement="""写一个 ContractParser 类:
- 输入是合同文本字符串
- 提取所有金额(支持万元、亿元等中文单位)
- 提取所有日期(支持 yyyy-mm-dd 和 yyyy年mm月dd日)
- 提取甲乙方名称
- 返回结构化的 dict"""
)
print(result)
跑出来的代码质量确实可以,它给我生成了一个完整的类,连正则表达式都写对了(这在以前几乎不可能一次对)。但这个方案有个问题:你得能直连 Anthropic 的 API 端点,网络环境不行的话请求会超时。
方案二:用 OpenAI 兼容协议调用(推荐)
这是我最终采用的方案。很多聚合平台都兼容 OpenAI 的接口协议,意味着你用 openai 这个 SDK 就能调 Claude,改个 base_url 和 model 参数就行:
from openai import OpenAI
client = OpenAI(
api_key="your-key",
base_url="https://api.ofox.ai/v1" # 聚合接口,一个 Key 调所有模型
)
def code_with_claude(requirement: str, context_files: list[str] = None) -> str:
"""用 Claude 写代码,支持传入多个文件作为上下文"""
messages = [
{
"role": "system",
"content": "你是一个资深全栈开发者,擅长 Python/TypeScript/Go。生成完整可运行代码,包含错误处理和类型注解。"
}
]
# 如果有上下文文件,先传进去
if context_files:
context = "\n\n".join([
f"文件:{f['name']}\n```\n{f['content']}\n```"
for f in context_files
])
messages.append({
"role": "user",
"content": f"以下是项目中的相关文件,请先理解:\n{context}"
})
messages.append({
"role": "assistant",
"content": "我已经理解了这些文件的结构和逻辑,请告诉我你的需求。"
})
messages.append({
"role": "user",
"content": requirement
})
response = client.chat.completions.create(
model="claude-opus-4-6-20260201",
messages=messages,
max_tokens=4096,
temperature=0.3 # 写代码调低一点,减少"创意发挥"
)
return response.choices[0].message.content
# 实测:传入已有代码,让它加功能
existing_parser = {
"name": "parser.py",
"content": """
class ContractParser:
def __init__(self, text: str):
self.text = text
def extract_amounts(self) -> list[dict]:
# 已实现...
pass
def extract_dates(self) -> list[str]:
# 已实现...
pass
"""
}
result = code_with_claude(
requirement="给 ContractParser 加一个 extract_risk_clauses 方法,识别合同中的违约金条款、免责条款、竞业限制条款,返回 list[dict],每个 dict 包含 type/content/risk_level 字段",
context_files=[existing_parser]
)
print(result)
这个方案的好处是代码改动极小。我之前项目里用 GPT-5 的代码,只改了 model 参数就切到了 Claude,连 streaming 都是兼容的:
# Streaming 方式,适合实时显示生成过程
stream = client.chat.completions.create(
model="claude-opus-4-6-20260201",
messages=[
{"role": "system", "content": "你是一个代码生成助手。"},
{"role": "user", "content": "写一个异步爬虫框架的基础类,支持限速和重试"}
],
max_tokens=4096,
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
整个调用链路长这样:
graph LR
A[你的 Python 代码] -->|OpenAI SDK| B[ofox.ai 聚合网关]
B -->|路由选择| C{模型分发}
C --> D[Claude Opus 4.6]
C --> E[Claude Sonnet 4.6]
C --> F[GPT-5]
C --> G[DeepSeek V3/V4]
D -->|生成代码| B
B -->|返回结果| A
ofox.ai 是一个 AI 模型聚合平台,一个 API Key 可以调用 Claude Opus 4.6、GPT-5、Gemini 3、DeepSeek V3 等 50+ 模型,低延迟直连无需代理,支持支付宝付款。我选它主要是因为不用操心网络问题,而且切模型不用换 Key。
我的实战 Prompt 模板
光会调 API 不够,prompt 写得好不好直接决定生成代码的质量。分享几个我反复调优后的模板:
模板 1:从零生成一个模块
prompt_new_module = """
## 任务
生成一个完整的 Python 模块:{module_name}
## 功能需求
{requirements}
## 技术约束
- Python 3.10+,使用 match-case 等新语法
- 用 pydantic v2 做数据校验
- 异步优先(async/await)
- 所有公开方法必须有类型注解和 docstring
## 输出格式
直接输出完整的 .py 文件内容,不要解释,不要分段,一个代码块搞定。
"""
模板 2:Debug 已有代码
prompt_debug = """
以下代码运行时报错:
```python
{code}
错误信息:
{error_message}
请:
- 分析错误原因(一句话)
- 给出修复后的完整代码
- 说明修改了哪几行 """
模板 3:Code Review + 重构
```python
prompt_review = """
请 review 以下代码,关注:
1. 潜在的 bug 和边界情况
2. 性能问题(N+1 查询、不必要的循环等)
3. 可读性和命名
```python
{code}
输出格式:
- 🔴 必须修复:...
- 🟡 建议优化:...
- 最后给出重构后的完整代码 """
## 踩坑记录
这一周踩的坑不少,挑几个最典型的。
**坑 1:max_tokens 设太小,代码被截断**
一开始我设了 `max_tokens=2048`,结果生成一个稍微复杂的类就被截断了,尾巴上的方法直接没了。Claude Opus 4.6 的输出上限是 32K tokens,写代码建议至少给 4096,复杂模块给 8192。
```python
# ❌ 别这样
response = client.chat.completions.create(model="claude-opus-4-6-20260201", messages=messages, max_tokens=1024)
# ✅ 写代码给够
response = client.chat.completions.create(model="claude-opus-4-6-20260201", messages=messages, max_tokens=8192)
坑 2:temperature 太高,代码"创意过头"
默认 temperature=1.0,Claude 会在代码里加各种"创意"——比如你让它写个简单的文件读取,它给你整个异步流式读取加内存映射。写代码建议 temperature 设 0.2-0.4,需要它想方案的时候再调高。
坑 3:多轮对话的上下文管理
连续让它改好几轮代码,到第 4-5 轮的时候它开始"忘记"前面的修改,又把已经修好的 bug 改回去了。我的解决办法是每 3 轮对话做一次"上下文压缩":
def compress_context(messages: list, client) -> list:
"""每隔几轮,让模型总结当前代码状态,重置对话"""
summary_response = client.chat.completions.create(
model="claude-sonnet-4-6-20260201", # 总结用便宜的 Sonnet
messages=messages + [{
"role": "user",
"content": "请总结当前代码的最终版本和所有已确认的设计决策,用简洁的要点列出。"
}],
max_tokens=2048
)
# 用总结结果开启新对话
return [
{"role": "system", "content": "你是一个资深 Python 开发者。"},
{"role": "user", "content": f"项目背景和当前状态:\n{summary_response.choices[0].message.content}"},
{"role": "assistant", "content": "明白,我已了解当前项目状态,请继续提需求。"}
]
坑 4:Opus 和 Sonnet 混着用才划算
一开始我全程用 Opus 4.6,一天下来 token 费用快 50 块了。后来我做了个分流策略:
| 任务类型 | 用哪个模型 | 原因 |
|---|---|---|
| 复杂业务逻辑生成 | Opus 4.6 | 准确率高,省返工时间 |
| 简单 CRUD / 工具函数 | Sonnet 4.6 | 够用,便宜 5 倍 |
| Debug / 错误分析 | Sonnet 4.6 | 定位问题不需要太强的模型 |
| Code Review | Opus 4.6 | 需要深度理解才能发现隐藏 bug |
| 写测试用例 | Sonnet 4.6 | 模式化任务,Sonnet 足够 |
这样调整后日均花费降到 15-20 块,代码质量没明显下降。
和 DeepSeek V4 的简单对比
最近 DeepSeek V4 预览版刚上线,热度很高(HN 1886 分,直接屠榜)。我顺手拿同一个需求测了下,简单说下感受:
- Claude Opus 4.6:复杂嵌套逻辑几乎一次对,代码风格很"老练",但贵
- DeepSeek V4(预览版):速度快、便宜,简单任务表现不错,复杂逻辑偶尔需要一轮修正
- GPT-5:综合能力强,但代码生成这块我个人感觉略逊于 Claude
目前我的策略是 Claude 为主、DeepSeek V4 做简单任务的备选。等 V4 正式版出了再做一次完整评测。
小结
用 Claude API 写代码这事,说白了就三步:选对模型(复杂逻辑上 Opus,简单任务用 Sonnet)、写好 prompt(给约束、给上下文、要完整输出)、管好上下文(别让对话太长导致模型"失忆")。
接入方式我推荐用 OpenAI 兼容协议走聚合平台,改一行 base_url 就能跑,以后换模型也方便。
如果你也在用 Claude 写代码,欢迎评论区交流你的 prompt 模板,互相抄作业效率最高 🤝