Anthropic 官方 SDK 会在你给的地址后面拼 /v1/messages,所以:
from anthropic import Anthropic
client = Anthropic(
api_key="sk-你的密钥",
base_url="https://aiapizz.com", # 注意:是站点根,不要带 /v1
)
也可以写成 https://aiapizz.com/anthropic,两种前缀都支持。填成 https://aiapizz.com/v1(带 /v1)也能用 —— 拼出来是 /v1/v1/messages,我们会把重复的版本段折掉,照样走 Anthropic 通道;但还是建议按上面写的填站点根。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/messages | 对话(等价于 /anthropic/v1/messages) |
| POST | /v1/complete | 传统补全 |
| GET | /anthropic/v1/models | 模型列表(Anthropic 形状)。/v1/models 回的是 OpenAI 形状,那种更通用 |
curl https://aiapizz.com/v1/messages \
-H "x-api-key: sk-你的密钥" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"system": "你是一个严谨的技术助手",
"messages": [
{"role": "user", "content": "用三句话介绍你自己"}
]
}'
r = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
system="你是一个严谨的技术助手",
messages=[{"role": "user", "content": "用三句话介绍你自己"}],
)
print(r.content[0].text)
主要参数:
| 参数 | 说明 |
|---|---|
model | 必填,本站模型名 |
max_tokens | 必填(Anthropic 的要求),最大生成长度 |
system | 系统提示词,独立字段 |
messages | 对话数组,content 可以是字符串或内容块数组 |
stream | 是否流式 |
temperature / top_p / top_k | 采样参数 |
tools / tool_choice | 工具调用 |
thinking | 扩展思考(需模型支持) |
本站内部有一个「中枢格式」:不论你用哪种格式进来,只要上游是别的格式,网关都会自动做一次转换。这带来两个必须知道的行为:
"stream": true)会先拿到完整响应,再由网关切块返回。包装出来的是你请求的那个格式的标准事件流 —— OpenAI 的 chat.completion.chunk、Anthropic 的 message_start / content_block_delta / …、Gemini 的 candidates,三种都支持,客户端不用避开任何组合。代价只是首字延迟 = 整段生成时间;要真流式(首字快)就选「上游格式与请求格式一致」的模型。错误返回体同时兼容两家的字段:
{
"type": "error",
"error": {
"message": "API 密钥无效",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
Anthropic SDK 会读 error.message,能正常抛出异常。