Claude API 写代码实战:2026 年最顺手的 3 种调用姿势
用 stream 的时候,一定要处理最后一个。
上周我接了个私活,甲方要求做一个代码审查工具——用户贴代码进去,AI 给出优化建议和重构方案。说实话这种需求用 Claude 来做简直是杀鸡用牛刀,但 Claude Opus 4.6 写代码的能力确实是目前第一梯队的,尤其是长上下文理解和代码生成质量,比我自己手写靠谱多了。
用 Claude API 写代码,核心就三步:拿到 API Key、选对调用方式、把 System Prompt 调好。下面我把自己踩过的坑和最终跑通的 3 种方案全部摊开讲,代码直接复制就能跑。
先说结论
| 方案 | 适用场景 | 上手难度 | 推荐度 |
|---|---|---|---|
| OpenAI SDK 兼容调用 | 已有 OpenAI 代码想切模型 | ⭐ | ⭐⭐⭐⭐⭐ |
| Anthropic 官方 SDK | 需要用 Claude 独有特性 | ⭐⭐ | ⭐⭐⭐⭐ |
| HTTP 直接请求 | 轻量级脚本/非 Python 项目 | ⭐⭐⭐ | ⭐⭐⭐ |
我最终选了方案一,改一行 base_url 就能在 GPT-5 和 Claude Opus 4.6 之间来回切,省心。
环境准备
Python 3.9+,装两个包就够了:
pip install openai anthropic
方案一:OpenAI SDK 兼容调用(最推荐)
这是我日常用得最多的方式。为什么?因为我项目里本来就有一堆 OpenAI 的调用代码,不想为了换个模型把半个项目重写一遍。
from openai import OpenAI
client = OpenAI(
api_key="your-key",
base_url="https://api.ofox.ai/v1" # 聚合接口,一个 Key 调 Claude/GPT/Gemini
)
def code_review(code_snippet: str) -> str:
"""让 Claude 做代码审查"""
response = client.chat.completions.create(
model="claude-sonnet-4-20250514",
messages=[
{
"role": "system",
"content": (
"你是一个资深代码审查员。针对用户提交的代码,你需要:\n"
"1. 指出潜在 bug 和安全隐患\n"
"2. 给出性能优化建议\n"
"3. 提供重构后的完整代码\n"
"回复用中文,代码块标注语言类型。"
)
},
{
"role": "user",
"content": f"请审查以下代码:\n```python\n{code_snippet}\n```"
}
],
temperature=0.3,
max_tokens=4096,
stream=True # 流式输出,体验好很多
)
result = ""
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
print(content, end="", flush=True)
result += content
print()
return result
# 测试一段有问题的代码
test_code = """
import sqlite3
def get_user(username):
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
query = f"SELECT * FROM users WHERE name = '{username}'"
cursor.execute(query)
result = cursor.fetchone()
return result
"""
review = code_review(test_code)
跑完实测,Claude 精准揪出了 SQL 注入漏洞、连接没关闭、没有错误处理这三个问题,还给了参数化查询 + context manager 的重构版本。响应时间大概 1.2 秒首 token,流式输出体验很顺滑。
方案二:Anthropic 官方 SDK
需要用到 Claude 的独有能力(比如超长上下文、extended thinking)时,官方 SDK 更合适。
import anthropic
client = anthropic.Anthropic(api_key="your-anthropic-key")
def generate_code(task_description: str) -> str:
"""让 Claude 根据需求描述生成代码"""
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=4096,
messages=[
{
"role": "user",
"content": (
f"请根据以下需求生成 Python 代码,要求:\n"
f"1. 代码可直接运行\n"
f"2. 包含类型注解\n"
f"3. 包含 docstring\n"
f"4. 包含简单的单元测试\n\n"
f"需求:{task_description}"
)
}
]
)
return message.content[0].text
# 让 Claude 写一个 LRU 缓存
result = generate_code("实现一个线程安全的 LRU 缓存,支持 TTL 过期")
print(result)
好处是 API 参数和官方文档完全一致,没有兼容性问题。缺点是只能调 Claude,想换 GPT-5 或 Gemini 3 就得改代码。
方案三:HTTP 直接请求
写轻量脚本不想装 SDK,直接 requests 怼:
import requests
import json
def claude_code_gen(prompt: str) -> str:
"""纯 HTTP 调用 Claude 生成代码"""
headers = {
"Authorization": "Bearer your-key",
"Content-Type": "application/json"
}
payload = {
"model": "claude-sonnet-4-20250514",
"messages": [
{
"role": "system",
"content": "你是一个 Python 专家,生成的代码要求生产级质量。"
},
{"role": "user", "content": prompt}
],
"temperature": 0.2,
"max_tokens": 4096
}
response = requests.post(
"https://api.ofox.ai/v1/chat/completions",
headers=headers,
json=payload,
timeout=60
)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
raise Exception(f"API 错误: {response.status_code} - {response.text}")
# 测试
code = claude_code_gen("写一个 FastAPI 的文件上传接口,支持多文件、大小限制、类型校验")
print(code)
非 Python 项目里这个方案特别有用,Node.js / Go / Rust 直接发 HTTP 就行,不用找第三方 SDK。
调用链路长这样
用聚合接口的好处就是这个——同一套代码,换个 model 参数就能切模型。我做那个代码审查工具时,就用这个方式做了个 A/B 测试,发现 Claude Opus 4.6 在代码理解上确实比其他模型强一截。
踩坑记录
坑 1:System Prompt 太长导致代码质量下降
一开始我把所有要求塞进 system prompt 里,足足 2000 字。结果 Claude 生成的代码又臭又长,像在凑字数。后来把 system prompt 精简到 200 字以内,代码质量立刻上来了。
教训:system prompt 要简洁,具体需求放 user message 里。
坑 2:temperature 设太高,代码跑不通
默认 temperature=1.0 写代码简直是灾难,生成的变量名天马行空,逻辑也经常跑偏。最后我固定用 0.2-0.3,稳定多了。创意性需求(比如取名、写注释)可以开到 0.5。
坑 3:流式输出没处理好,丢了最后几个 token
用 stream 的时候,一定要处理最后一个 chunk.choices[0].finish_reason == "stop" 的情况。我之前有个 bug,循环里只判断了 delta.content 是否存在,最后一个 chunk 的 content 是 None,直接被跳过,导致代码块的 ```结尾偶尔丢失。
坑 4:Claude 的 Anthropic SDK 不支持 system 字段放 messages 里
用方案二的官方 SDK,system prompt 要用 system 参数单独传,不能像 OpenAI 那样放在 messages 数组里。这个坑我排了半小时,报错信息还特别不明显。
# ❌ 错的
messages=[{"role": "system", "content": "..."}]
# ✅ 对的
message = client.messages.create(
model="claude-sonnet-4-20250514",
system="你是一个代码专家", # system 单独传
messages=[{"role": "user", "content": "..."}],
max_tokens=4096
)
用方案一的 OpenAI 兼容接口就没这个问题,system 放 messages 里没事,聚合网关会自动帮你转换格式。
进阶技巧:让 Claude 写更好代码的 Prompt 模板
跟 Claude 交流写代码,我摸索出一套好用的 prompt 结构:
CODING_SYSTEM_PROMPT = """你是一个资深全栈工程师。
生成代码遵循以下原则:
- 类型安全,使用类型注解
- 错误处理完善,不要用裸 except
- 函数职责单一,不超过 30 行
- 变量命名语义化
直接输出代码,不需要解释。"""
# 用户消息模板
USER_TEMPLATE = """
## 任务
{task}
## 技术栈
{tech_stack}
## 约束
{constraints}
## 输入输出示例
{examples}
"""
把需求结构化之后,Claude 生成的代码质量和一致性都会提升很多,亲测有效。
小结
三种方案各有适用场景:想省事切模型用方案一(OpenAI 兼容),想用 Claude 全部特性用方案二(官方 SDK),轻量级场景用方案三(HTTP)。我个人 90% 的场景都在用方案一,ofox.ai 是一个 AI 模型聚合平台,一个 API Key 可以调用 Claude Opus 4.6、GPT-5、Gemini 3 等 50+ 模型,改一行 base_url 就能切换,省去了管理多个 API Key 的麻烦。
最近 Claude Code 那边还出了 51 万行代码泄露的事,搞得挺热闹。不过单纯用 API 调 Claude 写代码这件事本身很稳,关键在于 prompt 写得好不好。多花时间调 prompt,比纠结用哪个模型有用多了。
更多推荐



所有评论(0)