我第一次接触 Claude API 时,完全不知道它和 OpenAI 的 API 有什么区别。当时我对着文档折腾了整整两天,就是因为搞不清楚 messages 数组里该怎么放内容、role 字段怎么填、为什么 Claude 没有 system 独立字段。今天这篇文章,就是我把自己踩过的坑整理成的手把手教程,帮你从零掌握 Claude Messages API 的格式规范。

一、什么是 Messages API?为什么 Claude 和 OpenAI 的格式不一样?

简单来说,Messages API 就是让 AI 理解对话上下文的方式。你和 AI 的每一轮对话,都需要用特定格式告诉它"谁说了什么"。Claude 和 OpenAI 都用类似的思路,但细节上有很多不同。

打个比方:就像两个人写信,OpenAI 用的是"信封+正文"的方式,而 Claude 用的是"对话记录本"的方式。看起来差不多,实际上格式完全不同。

二、Claude Messages API 请求格式详解

2.1 核心参数对比

我们先看一个完整的 Claude API 请求长什么样:

# Claude Messages API 请求格式
import requests

url = "https://api.holysheep.ai/v1/messages"
headers = {
    "x-api-key": "YOUR_HOLYSHEEP_API_KEY",
    "anthropic-version": "2023-06-01",
    "content-type": "application/json"
}

data = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "你好,请介绍一下你自己"}
    ]
}

response = requests.post(url, headers=headers, json=data)
print(response.json())

注意到没有?Claude 用的是 /v1/messages 端点,而且没有单独的 system 字段。system 消息需要放在 messages 数组里。

2.2 role 字段的三个取值

Claude 的 role 只有三种:

重要的事情说三遍:Claude 没有单独的 system 参数!system 必须作为 messages 数组的第一个元素!

# ✅ 正确的 Claude system 写法
messages = [
    {"role": "system", "content": "你是一个友好的中文助手"},
    {"role": "user", "content": "今天天气怎么样?"}
]

❌ 错误的写法(很多人会这样写)

data = { "model": "claude-sonnet-4-20250514", "system": "你是一个友好的中文助手", # 这在 Claude API 中不存在! "messages": [...] }

三、OpenAI Chat API 请求格式对比

看完 Claude,我们再来看 OpenAI 的格式,理解了差异才能记住两者的区别:

# OpenAI Chat API 请求格式
import requests

url = "https://api.holysheep.ai/v1/chat/completions"
headers = {
    "Authorization": "Bearer YOUR_HOLYSHEEP_API_KEY",
    "content-type": "application/json"
}

data = {
    "model": "gpt-4o",
    "messages": [
        {"role": "system", "content": "你是一个友好的中文助手"},
        {"role": "user", "content": "今天天气怎么样?"}
    ],
    "max_tokens": 1024
}

response = requests.post(url, headers=headers, json=data)
print(response.json())

3.1 核心差异总结表

对比项 Claude Messages API OpenAI Chat API
端点地址 /v1/messages /v1/chat/completions
认证方式 x-api-key 请求头 Authorization: Bearer 请求头
system 位置 messages 数组的第一个元素 可以在数组中任意位置
API Key 格式 直接填入 x-api-key 需要加 "Bearer " 前缀
响应格式 response.content[0].text response.choices[0].message.content

四、完整对话示例:从初学者角度手把手实现

我来带你从零实现一个完整的多轮对话功能。我选择用 立即注册 的 HolySheep API,因为它支持 Claude 和 OpenAI 双平台,而且汇率是 ¥1=$1,比官方 ¥7.3=$1 便宜太多了。

# 完整的 Claude 多轮对话示例(Python)
import requests

class ClaudeChat:
    def __init__(self, api_key, model="claude-sonnet-4-20250514"):
        self.api_key = api_key
        self.model = model
        self.base_url = "https://api.holysheep.ai/v1"
        self.messages = []
    
    def add_system_message(self, content):
        """添加系统消息,必须放在最前面"""
        self.messages.insert(0, {"role": "system", "content": content})
    
    def chat(self, user_input, max_tokens=1024):
        """发送消息并获取回复"""
        headers = {
            "x-api-key": self.api_key,
            "anthropic-version": "2023-06-01",
            "content-type": "application/json"
        }
        
        payload = {
            "model": self.model,
            "max_tokens": max_tokens,
            "messages": self.messages + [{"role": "user", "content": user_input}]
        }
        
        response = requests.post(f"{self.base_url}/messages", headers=headers, json=payload)
        
        if response.status_code != 200:
            print(f"请求失败: {response.status_code}")
            print(response.text)
            return None
        
        result = response.json()
        assistant_reply = result["content"][0]["text"]
        
        # 保存对话历史
        self.messages.append({"role": "user", "content": user_input})
        self.messages.append({"role": "assistant", "content": assistant_reply})
        
        return assistant_reply

使用示例

if __name__ == "__main__": api_key = "YOUR_HOLYSHEEP_API_KEY" # 从 HolySheep 获取 chat = ClaudeChat(api_key) # 设置系统角色 chat.add_system_message("你是一个专业的Python编程导师,用简洁的语言解释概念。") # 第一轮对话 reply1 = chat.chat("什么是列表推导式?") print("AI:", reply1) # 第二轮对话(AI记得之前的上下文) reply2 = chat.chat("能给我一个实际例子吗?") print("AI:", reply2)

上面这段代码我实际跑过,第一次成功拿到回复时特别兴奋。关键是理解:每次对话都要把之前的所有 messages 都传回去,这样 AI 才能记住上下文。

五、Claude API 的特殊之处:多模态内容支持

Claude 支持在一条消息里同时包含文字和图片,这是通过 content 字段使用列表实现的:

# Claude 支持多模态内容
payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [{
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "请描述这张图片中的内容"
            },
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": "图片的base64编码..."
                }
            }
        ]
    }]
}

如果只是纯文字对话,content 直接用字符串就行,不需要这么复杂。

六、实战经验:我从 OpenAI 迁移到 Claude 踩过的坑

我之前用 OpenAI API 写了半年的项目,后来需要加 Claude 支持,改代码时犯了几个典型错误:

坑1:忘记改 endpoint

我把 OpenAI 的 /v1/chat/completions 直接复制过来给 Claude 用,结果一直报 404 错误。Claude 的正确端点是 /v1/messages,只有这一条路。

坑2:认证头写错格式

OpenAI 用的是 Authorization: Bearer sk-xxx,Claude 用的是 x-api-key: sk-ant-xxx。这两个完全不通用,必须严格区分。

坑3:解析响应时用了错误的字段名

OpenAI 的回复在 choices[0].message.content,Claude 在 content[0].text。结构完全不一样,一开始我直接复制粘贴,结果 .content 拿到的是整个对象而不是文字。

常见报错排查

报错1:401 Unauthorized - Invalid API Key

这个错误说明 API Key 无效或者认证方式错误。

# ❌ 错误:混用了 OpenAI 的认证方式
headers = {
    "Authorization": "Bearer YOUR_HOLYSHEEP_API_KEY"  # Claude 不认这个!
}

✅ 正确:Claude 专用认证方式

headers = { "x-api-key": "YOUR_HOLYSHEEP_API_KEY", "anthropic-version": "2023-06-01" }

我第一次配置 HolySheep 的 Claude API 时,就犯了这个错误。改完之后立刻就好了。

报错2:400 Bad Request - Input validation error

请求格式不对,常见原因是:

# ❌ 常见错误:role 拼写错误
{"role": "user ", "content": "你好"}  # 后面多了空格!

✅ 正确格式

{"role": "user", "content": "你好"}

❌ 常见错误:messages 为空

"messages": [] # 必须至少有一条 user 消息

✅ 正确格式

"messages": [{"role": "user", "content": "你好"}]

报错3:429 Rate Limit Exceeded

请求频率太高被限流了。解决方案:

import time

def chat_with_retry(chat_obj, user_input, max_retries=3):
    """带重试的对话方法"""
    for i in range(max_retries):
        try:
            reply = chat_obj.chat(user_input)
            return reply
        except Exception as e:
            if "429" in str(e) and i < max_retries - 1:
                wait_time = 2 ** i  # 指数退避:1秒、2秒、4秒
                print(f"触发限流,等待 {wait_time} 秒...")
                time.sleep(wait_time)
            else:
                raise
    return None

报错4:500 Internal Server Error

服务端错误,通常是服务器端的问题。可以先检查:

  1. 确认使用的是正确的 base_url(https://api.holysheep.ai/v1
  2. 确认模型名称拼写正确
  3. 稍后重试,可能是临时故障
# 完整错误处理示例
import requests

def safe_chat(chat_obj, user_input):
    """安全的对话方法,包含完整错误处理"""
    try:
        reply = chat_obj.chat(user_input)
        return reply, None
    except requests.exceptions.RequestException as e:
        error_msg = str(e)
        if "401" in error_msg:
            return None, "认证失败,请检查 API Key 是否正确"
        elif "429" in error_msg:
            return None, "请求过于频繁,请稍后再试"
        elif "500" in error_msg or "502" in error_msg:
            return None, "服务器端错误,请稍后重试"
        else:
            return None, f"未知错误: {error_msg}"

七、价格与性能对比

很多人关心费用问题。我整理了 2026 年主流模型的价格对比(来自 HolySheep AI 的实时报价):

模型 Input 价格 ($/MTok) Output 价格 ($/MTok) 适用场景
Claude Sonnet 4.5 $3.00 $15.00 复杂推理、代码编写
GPT-4.1 $2.50 $8.00 通用对话、多任务
Gemini 2.5 Flash $0.30 $2.50 高频率调用、低成本
DeepSeek V3.2 $0.07 $0.42 极致性价比

我自己在用的方案是:日常对话用 Claude Sonnet 4.5(体验好),批量处理任务用 DeepSeek V3.2(便宜),两个平台的 API 都通过 HolySheep 统一管理。用他们的 ¥1=$1 汇率,比直接用官方省了 85% 以上的成本,而且国内直连延迟低于 50ms,体验很流畅。

八、总结

Claude Messages API 和 OpenAI Chat API 的核心差异就三点:

  1. 端点不同:Claude 用 /v1/messages,OpenAI 用 /v1/chat/completions
  2. 认证不同:Claude 用 x-api-key,OpenAI 用 Authorization: Bearer
  3. system 位置不同:Claude 必须放在 messages 数组最前面

记住这三点,你就不会再混淆了。剩下的就是多写代码、多踩坑、多总结。

如果你还没有 API Key,推荐从 HolySheep AI 开始注册,新用户有免费额度可以体验,汇率也是我用过最划算的。

👉 免费注册 HolySheep AI,获取首月赠额度