- 98浏览
- 2022-07-01
header("Access-Control-Allow-Origin: *");//指定域名访问
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no');
//chatGPT接口
$url = Config::get('site.three');
$db = input('post.', '', 'htmlspecialchars_decode');
$model = isset($db['model'])?json_decode($db['model'], true):'gpt-3.5-turbo';//chatGPT模型
$prompts = isset($db['prompts'])?json_decode($db['prompts'],true):[];//连续对话
$setting = isset($db['setting'])?json_decode($db['setting'],true):'';//预设角色
$apiKey = isset($db['apiKey'])?json_decode($db['apiKey'],true):"";//自有key
$randomness = isset($db['randomness'])?json_decode($db['randomness'],true):0.7;//随机性
$top = isset($db['tops'])?json_decode($db['tops'],true):0.9;//文本多样性
//判断是否输入聊天内容
if(empty($prompts)){
$this->error('聊天内容为空');
exit();
}
// 预设角色
$setting = !isset($setting)?"我给你个设定,你的版本号为chatgpt3.5,请你以gpt-3.5-turbo版回答我的问题":$setting;
// 默认设置信息
$set = [
'model' => $model, //聊天模型
'temperature' => (float)$randomness,//机器人温度值
'top_p' => (float)$top,
// 'frequency_penalty' => 1.0,
// 'presence_penalty' => 0.6,
"stream" => true,//开启数据流模式
'messages' => [
["role" => "system","content" => $setting],
],
];
// 添加连续对话
foreach ($prompts as $k => $v) {
// 上下文对话
array_push($set['messages'], [
'role' => $v['role'],
'content' => $v['content']
]);
}
// 传递参数
$callback = function ($ch, $data)use ($sk){
// 如果发生错误,发送给前端
$complete = @json_decode($data);
if(isset($complete->error)){
if (strpos($complete->error->message, "You didn't provide an API key") === 0) { //未提供API-KEY
return $this->error('未提供API-KEY');
}
if (strpos($complete->error->message, "Rate limit reached") === 0) { //访问频率超限错误返回的code为空,特殊处理一下
return $this->error('访问频率超限,请稍后尝试!');
}
if (strpos($complete->error->message, "Your access was terminated") === 0) { //违规使用,被封禁,特殊处理一下
return $this->error('违规使用,key被封禁,自有key请替换,如不是,请从新提问!');
}
if (strpos($complete->error->message, "You exceeded your current quota") === 0) { //API-KEY余额不足
return $this->error('API-KEY余额不足,自有key请替换,如不是,请从新提问!');
}
if (strpos($complete->error->message, "That model is currently overloaded") === 0) { //OpenAI服务器超负荷
return $this->error('OpenAI服务器超负荷,稍后访问!');
}
}else{
echo $this->parseData($data);//流数据
ob_flush();
flush();
}
return strlen($data);
};
// 请求头
$headers = [
'Accept: application/json',
'Content-Type: application/json',
'Authorization: Bearer ' . $sk,
];
// 发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);// 设置请求的 URL 地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 将结果返回给调用方
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);// 设置请求头部
curl_setopt($ch, CURLOPT_POST, 1); // 设置请求类型为 POST
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($set));
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);// 关闭证书主机名验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);//关闭验证 SSL 证书
curl_setopt($ch, CURLOPT_TIMEOUT, 60);// 设置最长等待响应的时间
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); // 设置连接超时时间为30秒
curl_setopt($ch, CURLOPT_MAXREDIRS, 3); // 设置最大重定向次数为3次
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 允许自动重定向
curl_setopt($ch, CURLOPT_AUTOREFERER, true); // 自动设置Referer
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
//curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:1081");
curl_exec($ch);
curl_close($ch);//完成后结束长链接请求
版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、本文由会员转载自互联网,如果您是文章原创作者,请联系本站注明您的版权信息。