上周我接了个私活,甲方要求做一个代码审查工具——用户贴代码进去,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。

调用链路长这样

OpenAI SDK / HTTP

路由

路由

路由

路由

流式响应

流式响应

你的代码

API 聚合网关

Claude Opus 4.6

Claude Sonnet 4.6

GPT-5

Gemini 3

用聚合接口的好处就是这个——同一套代码,换个 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,比纠结用哪个模型有用多了。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐