<?php
// +----------------------------------------------------------------------
// | likeadmin快速开发前后端分离管理后台(PHP版)
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | 开源版本可自由商用,可去除界面版权logo
// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
// | github下载:https://github.com/likeshop-github/likeadmin
// | 访问官网:https://www.likeadmin.cn
// | likeadmin团队 版权所有 拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeadminTeam
// +----------------------------------------------------------------------

namespace app\api\controller;

use IFlytek\Xfyun\Speech\ChatClient;
use WebSocket\Client;

/**
 * 讯飞
 * Class WechatController
 */
class XunFeiController extends BaseApiController
{
    public array $notNeedLogin = ['chat'];

    private $app_id='2eda6c2e';

    private $api_key='12ec1f9d113932575fc4b114a2f60ffd';

    private $api_secret='MDEyMzE5YTc5YmQ5NjMwOTU1MWY4N2Y2';

    public function chat()
    {
        header('X-Accel-Buffering: no');
        $parmas=$this->request->param('content');
        if(empty($parmas)){
            return $this->success('success');
        }
        $chat=new ChatClient($this->app_id,$this->api_key,$this->api_secret);
        $client = new Client($chat->assembleAuthUrl('wss://spark-api.xf-yun.com/v2.1/chat'));
        // 连接到 WebSocket 服务器
        if ($client) {
            // 发送数据到 WebSocket 服务器
            $data = $this->getBody($this->app_id,$parmas);

            $client->send($data);
            // 从 WebSocket 服务器接收数据
            $answer = "";
            while(true){
                $response = $client->receive();
                $resp = json_decode($response,true);
                $code = $resp["header"]["code"];
                // echo "从服务器接收到的数据: " . $response;
                if(0 == $code){
                    $status = $resp["header"]["status"];
                    if($status != 2){
                        $content = $resp['payload']['choices']['text'][0]['content'];
                        $answer .= $content;
                        print($answer);
                        ob_flush(); // 刷新输出缓冲区
                        flush(); // 刷新系统输出缓冲区
                    }else{
                        $content = $resp['payload']['choices']['text'][0]['content'];
                        $answer .= $content;
                        $total_tokens = $resp['payload']['usage']['text']['total_tokens'];
                        print("\n本次消耗token用量:\n");
                        print($total_tokens);
                        ob_flush(); // 刷新输出缓冲区
                        flush(); // 刷新系统输出缓冲区
                        break;
                    }
                }else{
                    return $this->fail( "服务返回报错".$response);
                    break;
                }
            }
            ob_flush(); // 刷新输出缓冲区
            flush(); // 刷新系统输出缓冲区
            return $this->success('success');

        } else {
            return $this->fail('无法连接到 WebSocket 服务器');
        }
    }

		//构造参数体
		function getBody($appid,$question){
			$header = array(
				"app_id" => $appid,
				"uid" => "1"
			);
			
			$parameter = array(
				"chat" => array(
					"domain" => "generalv2",
					"temperature" => 0.5,
					"max_tokens" => 1024
				)
			);
			
			$payload = array(
				"message" => array(
					"text" => array(
						array("role" => "user", "content" => $question)
					)
				)
			);
			
			$json_string = json_encode(array(
				"header" => $header,
				"parameter" => $parameter,
				"payload" => $payload
			));

			return $json_string;

		}

}