PHP调用大模型API失败主因是鉴权头、请求体结构或响应字段解析错误;需严格设置Authorization和Content-Type头,用json_encode()传索引数组,按平台要求填动态model ID,并优先检查响应体error字段而非仅HTTP状态码。

PHP 调用大模型 API 不是配个 URL 和 key 就能跑通的事,绝大多数失败都卡在鉴权头、请求体结构或响应字段解析这三处。国产模型尤其容易栽在签名计算、服务 ID 动态性、以及 messages 位置校验上。
curl 发请求时 Authorization 和 Content-Type 缺一不可
OpenAI、豆包、小米 MIXR、通义千问等所有主流接口,都强制要求两个 HTTP 头:
-
Authorization: Bearer YOUR_TOKEN—— token 是字符串,不是数组,不能漏掉Bearer前缀(注意后面有个空格) -
Content-Type: application/json—— 漏掉这个头,豆包返回415 Unsupported Media Type,通义千问直接400,不是鉴权错
别用 http_build_query() 拼 body;必须用 json_encode(),且确保参数是索引数组(如 [['role'=>'user','content'=>'hi']]),不是关联键名(如 ['msg'=>[...]])。
model 参数不是通用名,而是动态服务 ID
豆包的 model 必须填控制台生成的 ep- 开头服务 ID(如 ep-20241127160919-2yq8d);通义千问要填 qwen-max 或 qwen-long;智谱 GLM 必须是 glm-4 这类固定值。传错会直接 404 Not Found 或 400 Invalid model,不是 token 无效。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
将小说章节转换为电影分镜剧本。用户上传txt/md/docx文本,AI分析场景、角色、情绪、镜头语言,输出专业分镜脚本。适用于用户提及“分镜”“storyboard”“小说转分镜”“影视改编”“镜头脚本”或需要将小说改编为分镜的场景。
常见错误:
- 复制别人文档里的
ep-ID —— 每个账号、每个环境唯一,过期后失效 - 把飞书登录 Cookie 或网页抓包的临时 token 当作 API Key —— 必须从「字节跳动开放平台 → 我的应用 → 模型服务」里申请
- 小米 MIXR 的
model字段根本不存在 —— 它靠 URL path 区分服务,比如/v1/chat/completions?model=mixr-pro是错的,实际应走/v1/mixr/pro/chat
响应体里 error 字段比 HTTP 状态码更关键
很多接口(尤其是豆包、通义千问)即使返回 200 OK,body 里也可能带 error 字段。只检查 curl_getinfo($ch, CURLINFO_HTTP_CODE) 会漏掉真实失败。
务必先 json_decode($response, true),再判断:
- 是否存在
['error']['message']—— 豆包常见"Invalid model"或"Rate limit exceeded" - 是否存在
['output']['text'](通义)、['result']['text'](讯飞)、['choices'][0]['message']['content'](OpenAI)—— 字段路径完全不同,不能硬套 - 小米 MIXR 响应中
['data']['choices'][0]['delta']['content']只在stream=true时出现,非流式是['data']['choices'][0]['message']['content']
stream=true 在 PHP Web 场景下基本不可用
豆包、通义、讯飞都支持流式,但 PHP-FPM 默认阻塞等待完整响应。设 stream=true 后不手动处理 CURLOPT_WRITEFUNCTION,curl_exec() 会卡死或超时。
真要流式输出,得同时满足:
- 加
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 30000)防止长连接拖垮 FPM 进程 - 写
WRITEFUNCTION回调,按行解析data:前缀,还要处理event:、id:等 SSE 字段 - Nginx 配置
proxy_buffering off和chunked_transfer_encoding on,否则前端收不到分块
多数业务场景没必要强求流式 —— 先关掉 stream,确保 messages 上下文正确、token 有效、响应字段可稳定提取,才是优先级最高的事。


















