站三界导航
首页 PHP代码php调用chatgpt接口并实现流数据方法

php调用chatgpt接口并实现流数据方法

  • PHP代码
  • 来源:站三界导航
  • 48阅读
  • 2023-06-20

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);//完成后结束长链接请求

本文结束
本文来自投稿,不代表站三界导航立场,如若转载,请注明出处:https://www.zhansanjie.com/article/details/45951.html

版权声明:

1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

2、本站仅提供信息发布平台,不承担相关法律责任。

3、若侵犯您的版权或隐私,请联系本站管理员删除。

4、本文由会员转载自互联网,如果您是文章原创作者,请联系本站注明您的版权信息。

分享
站三界导航
本站声明:本站严格遵守国家相关法律规定,非正规网站一概不予收录。本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,站三界导航不承担任何责任。在此特别感谢您对站三界导航的支持与厚爱。