<?php declare(strict_types=1); ini_set('display_errors', 'On'); ini_set('error_reporting', E_ALL); const BAIDU_ERNIE_API_KEY = '********************************'; // API Key const BAIDU_ERNIE_SECRET_KEY = '********************************'; // Secret Key /** * 获取access_token * 说明:access_token有效时间为2592000秒(即30天),可将其缓存避免频繁调用接口获取。 * * @return string|false access_token字符串,若获取失败则返回false */ function get_access_token(): string|false { $accessToken = false; $filename = __DIR__ . '/access_token.cache'; // 缓存文件路经 // 优先从缓存文件获取access_token if (file_exists($filename)) { $array = json_decode(file_get_contents($filename), true); // access_token未过期,可直接使用 if (time() < (int)$array['expires_time']) { $accessToken = (string)$array['access_token']; // echo '[DEBUG] 从缓存中获取access_token' . PHP_EOL; // } } // 调用接口重新获取access_token if ($accessToken === false) { $api = 'https://aip.baidubce.com/oauth/2.0/token'; $api .= '?grant_type=client_credentials'; $api .= '&client_id=' . BAIDU_ERNIE_API_KEY; $api .= '&client_secret=' . BAIDU_ERNIE_SECRET_KEY; $json = file_get_contents($api); if (is_string($json)) { $array = json_decode($json, true); if (is_array($array) && isset($array['access_token'])) { $accessToken = (string)$array['access_token']; // echo '[DEBUG] 调用接口获取access_token' . PHP_EOL; // // 设置access_token失效时间点(提前10分钟失效) $array['expires_time'] = time() + $array['expires_in'] - 600; // 将access_token保存到缓存中 file_put_contents($filename, json_encode($array), FILE_APPEND | LOCK_EX); } } } return $accessToken; } $accessToken = get_access_token(); $accessToken === false && exit('获取access_token失败'); $content = '只准备了5杯水,来了一亿个领导,应该怎么分配?'; $api = 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-speed-128k'; $api .= "?access_token=$accessToken"; // 设置Header参数(必填) $header = ['Content-Type' => 'application/json']; // 使用固定值application/json // 设置Body参数(需以JSON字符串格式POST给服务器) $body = ['messages' => [['role' => 'user', 'content' => $content]]]; $body = json_encode($body); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $array = json_decode($response, true); isset($array['error_code']) && exit($array['error_msg']); // 请求错误时服务器返回示例 // -------------------------------------------------- // { // "error_code": 110, -- 错误码 // "error_msg": "Access token invalid or no longer valid" -- 错误描述信息,帮助理解和解决发生的错误 // } echo "问:$content" . PHP_EOL; echo "答:{$array['result']}" . PHP_EOL; // 请求成功时服务器返回示例 // -------------------------------------------------- // { // "id": "as-fkiyg0zixm", -- 本轮对话的id // "object": "chat.completion", -- 回包类型,可能值:chat.completion=多轮对话返回 // "created": 1709088025, -- 时间戳 // "result": "PHP是世界上最好の语言", -- 对话返回结果 // "is_truncated": false, -- 当前生成的结果是否被截断 // "need_clear_history": false, -- 表示用户输入是否存在安全风险,是否关闭当前会话,清理历史会话信息 // "usage": { -- token统计信息 // "prompt_tokens": 2, -- 问题tokens数 // "completion_tokens": 335, -- 回答tokens数 // "total_tokens": 337 -- tokens总数 // } // } // 官方文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/s/6ltgkzya5
Copyright © 2024 码农人生. All Rights Reserved