php 7.3 调用 claude api 报错“缺少 max_tokens”是因为 anthropic /v1/messages 接口强制要求顶层 json 字段 max_tokens 为正整数,不可省略、不可嵌套、不可为字符串或 null;需用 json_encode 生成标准 json 并确认输出含 "max_tokens": 1024。

PHP 7.3 调用 Claude API 时提示缺少 max_tokens,说明请求体中没传这个必填字段——Anthropic 的 /v1/messages 接口要求显式指定输出长度上限,不支持缺省。
确认请求体结构是否合规
Anthropic 官方接口不接受 OpenAI 风格的 max_completion_tokens 或省略该参数。必须在 JSON 请求体顶层写明 max_tokens,且值为正整数(不能是字符串或 null)。
- ✅ 正确写法:
"max_tokens": 1024 - ❌ 错误写法:
"max_tokens": "1024"、"max_tokens": null、完全不包含该字段 - 注意:该字段和
model、messages同级,不是嵌套在messages里
检查 PHP 代码中的 json_encode 调用
常见问题是 PHP 数组构造后未正确转成 JSON 字符串,或字段被意外过滤。确保你传给 curl_setopt($ch, CURLOPT_POSTFIELDS, ...) 的是纯字符串,且含 max_tokens:
- 用
json_encode($data, JSON_UNESCAPED_UNICODE)生成请求体 - 打印
json_encode($data)看输出是否真包含"max_tokens":... - 避免用
http_build_query()或直接拼字符串,必须是标准 JSON
参考最小可用示例(PHP 7.3+)
以下代码可直接运行,重点看 max_tokens 的位置和类型:
php
$apiKey = 'sk-ant-...';
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.anthropic.com/v1/messages',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'model' => 'claude-3-haiku-20240307',
'max_tokens' => 1024,
'messages' => [['role' => 'user', 'content' => '你好']]
]),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'x-api-key: ' . $apiKey,
'anthropic-version: 2023-06-01'
]
]);
echo curl_exec($ch);
curl_close($ch);
?>
额外注意点
如果仍报错,再排查两处隐性问题:
- 模型本身有最大
max_tokens上限(如 haiku 最高 4096,sonnet-5 可达 8192),别设超了 - 某些网关(如 TaoToken)可能对参数做二次校验,确认你用的是 Anthropic 原生地址
https://api.anthropic.com,而非兼容层
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











