京东言犀API调用前必须确认app_key、app_secret、access_Token三个参数:app_key为应用唯一标识,app_secret仅创建时可见,access_token需用前两者申请且2小时过期须缓存刷新。

京东言犀 API 调用前必须确认的三个业务参数
京东言犀大模型不开放通用接口,必须走京东云「言犀智能创作」服务,且需提前在 京东云控制台 → ai与大模型 → 言犀智能创作 中完成应用创建和权限开通。真正影响调用成败的不是代码,而是这三个参数是否准确填对:
-
app_key:应用创建后生成的唯一标识,不是京东账号ID,也不是API Key -
app_secret:对应密钥,仅创建时可见一次,丢失需重置 -
access_token:非静态值,需用app_key+app_secret向https://api.jd.com/oauth2/token申请,有效期2小时,必须缓存并自动刷新
php 发起 POST 请求获取商品文案的关键写法
京东言犀要求请求体为 jsON,且必须带 Content-Type: application/json 和 Authorization: Bearer {access_token}。常见错误是直接用 file_get_contents() 拼 URL,或漏掉认证头导致 401。
'为一款【无线降噪蓝牙耳机,支持30小时续航,IPX5防水】生成3条电商主图文案,每条不超过60字,突出卖点,口语化', 'model' => 'yanxi-pro', // 目前可用值:yanxi-base / yanxi-pro 'max_tokens' => 200, 'temperature' => 0.7 ]; $options = [ 'http' => [ 'method' => 'POST', 'header' => [ "Content-Type: application/jsonrn", "Authorization: Bearer {$access_token}rn" ], 'content' => json_encode($data, JSON_UNESCAPED_UNICODE) ] ]; $context = stream_context_create($options); $result = file_get_contents('https://api.jd.com/yanxi/v1/chat/completions', false, $context); if ($result === false) { throw new Exception('HTTP request failed'); } $response = json_decode($result, true); echo $response['choices'][0]['message']['content'] ?? '无返回内容'; ?>
返回结果里文案提取容易踩的坑
京东言犀返回结构和 openai 不同:response['choices'] 是数组,但每项的文本不在 text 字段,而在 message['content'];且当请求失败时,错误信息藏在 response['Error']['message'],不是 HTTP 状态码决定成败。
- 不要假设
$response['choices'][0]['text']存在 —— 这是 OpenAI 风格,言犀不用 - 检查
isset($response['choices'][0]['message']['content'])前,先判断isset($response['error']) - 若返回
"error": {"code": "INVALID_PARAMETER", "message": "prompt cannot be empty"},说明prompt字段为空或含非法字符(如未转义的换行)
生产环境必须处理的两个实际问题
本地跑通不等于线上可用。真实业务中,access_token 刷新和并发请求是高频故障源。
立即学习“PHP免费学习笔记(深入)”;
-
access_token必须持久化存储(如 redis 或文件),不能每次请求都重新申请;刷新逻辑要加锁,避免多进程同时触发重复申请 - 京东言犀接口有 QPS 限制(默认 5次/秒),PHP-FPM 场景下若未做请求合并或队列缓冲,高并发时大量 429 错误
- 提示词(
prompt)中避免硬编码商品参数,应使用占位符 +sprintf()或模板引擎拼接,否则难以维护和 A/B 测试
京东言犀不是“调个 API 就出文案”的玩具,它的业务参数强耦合京东生态,app_key 和 access_token 的生命周期管理比调用本身更关键。很多人卡在第一步——以为拿到文档就能跑,其实连控制台里那个「应用状态」是不是「已上线」都没确认。