BaiduAi.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace app\controller\api;
  3. use laytp\controller\Api;
  4. use think\App;
  5. class BaiduAi extends Api
  6. {
  7. public $noNeedLogin = ['chatBaidu'];
  8. public function __construct(App $app)
  9. {
  10. parent::__construct($app);
  11. header("Access-Control-Allow-Origin: *");
  12. header("Content-Type: text/event-stream");
  13. header("X-Accel-Buffering: no");
  14. set_time_limit(0);
  15. session_start();
  16. }
  17. public function chatBaidu($context){
  18. $responsedata = "";
  19. $postData = array(
  20. 'messages' => [],
  21. 'stream' => true
  22. );
  23. if (!empty($context)) {
  24. $context = array_slice($context, -5);
  25. foreach ($context as $message) {
  26. $postData['messages'][] = ['role' => 'user', 'content' => $message[0]];
  27. $postData['messages'][] = ['role' => 'assistant', 'content' => $message[1]];
  28. }
  29. }
  30. $postData['messages'][] = ['role' => 'user', 'content' => $_POST['message']];
  31. $accessToken = $this->getAccessToken();
  32. $postData = $_SESSION['data'];
  33. $ch = curl_init();
  34. curl_setopt_array($ch, array(
  35. CURLOPT_URL => "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=".$accessToken,
  36. CURLOPT_RETURNTRANSFER => true,
  37. CURLOPT_POST => true,
  38. CURLOPT_POSTFIELDS => $postData,
  39. CURLOPT_HTTPHEADER => array(
  40. 'Content-Type: application/json',
  41. 'Content-Length: ' . strlen($postData)
  42. ),
  43. CURLOPT_WRITEFUNCTION => function ($ch, $data) {
  44. global $responsedata;
  45. $complete = json_decode($data);
  46. if (isset($complete->error_code)) {
  47. $error = array(
  48. 'id' => $complete->id,
  49. 'error_code' => $complete->error_code,
  50. 'error_msg' => $complete->error_msg
  51. );
  52. echo json_encode($error);
  53. flush();
  54. $responsedata = $data;
  55. } else {
  56. echo $data;
  57. $responsedata .= $data;
  58. flush();
  59. }
  60. return strlen($data);
  61. }
  62. ));
  63. curl_exec($ch);
  64. curl_close($ch);
  65. $responsearr = explode("}\n\ndata: {", $responsedata);
  66. $answer = "";
  67. foreach ($responsearr as $msg) {
  68. $contentarr = json_decode("{" . trim($msg) . "}", true);
  69. if (isset($contentarr['results'])) {
  70. $results = $contentarr['results'];
  71. foreach ($results as $result) {
  72. if (isset($result['result'])) {
  73. $answer .= $result['result'] . "\n";
  74. }
  75. }
  76. }
  77. }
  78. }
  79. private function getAccessToken(){
  80. $curl = curl_init();
  81. $postData = array(
  82. 'grant_type' => 'client_credentials',
  83. 'client_id' => "biAmXmmAbUX4O4dP1YRL3LuX",
  84. 'client_secret' => "dhTZSa083FfhIsSPahGsroVF5yEPpkHw"
  85. );
  86. curl_setopt_array($curl, array(
  87. CURLOPT_URL => 'https://aip.baidubce.com/oauth/2.0/token',
  88. CURLOPT_CUSTOMREQUEST => 'POST',
  89. CURLOPT_RETURNTRANSFER => true,
  90. CURLOPT_POSTFIELDS => http_build_query($postData)
  91. ));
  92. $response = curl_exec($curl);
  93. curl_close($curl);
  94. $rtn = json_decode($response);
  95. return $rtn->access_token;
  96. }
  97. }