当前位置:   article > 正文

PHP 文心千帆API接口对接_单轮多function

单轮多function

 一:API 调用流程简介

  1. 创建一个智能云应用。根据实际需求创建智能云应用。创建成功后,获取AppID、API Key、Secret Key 等信息。
  2. API 授权。对应用的 AppID 进行授权。
  3. 获取接口访问凭证 access_token 。根据第1步获取的 API Key 和 Secret Key ,
    获取 access_token ,通过 access_token 鉴权调用者身份。
  4. 调用API接口。调用创建chat接口,详见本文说明。

二:具体功能实现

 Chat.php

  1. <?php
  2. namespace bdchat;
  3. class Chat {
  4. private $client_id;// API Key
  5. private $client_secret;// Secret Key
  6. private $message;// 聊天上下文信息
  7. public function __construct($client_id, $client_secret) {
  8. $this->client_id = $client_id;
  9. $this->client_secret = $client_secret;
  10. }
  11. public function runErnieBot($message) {
  12. $curl = curl_init();
  13. curl_setopt_array($curl, array(
  14. CURLOPT_URL => "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token={$this->getAccessToken()}",
  15. CURLOPT_TIMEOUT => 30,
  16. CURLOPT_RETURNTRANSFER => true,
  17. CURLOPT_CUSTOMREQUEST => 'POST',
  18. CURLOPT_POSTFIELDS =>$message,
  19. CURLOPT_HTTPHEADER => array(
  20. 'Content-Type: application/json'
  21. ),
  22. ));
  23. $response = curl_exec($curl);
  24. curl_close($curl);
  25. return $response;
  26. }
  27. public function runErnieBotTurbo($message) {
  28. $curl = curl_init();
  29. curl_setopt_array($curl, array(
  30. CURLOPT_URL => "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token={$this->getAccessToken()}",
  31. CURLOPT_TIMEOUT => 30,
  32. CURLOPT_RETURNTRANSFER => true,
  33. CURLOPT_CUSTOMREQUEST => 'POST',
  34. CURLOPT_POSTFIELDS =>$message,
  35. CURLOPT_HTTPHEADER => array(
  36. 'Content-Type: application/json'
  37. ),
  38. ));
  39. $response = curl_exec($curl);
  40. curl_close($curl);
  41. return $response;
  42. }
  43. /**
  44. * 使用 AK,SK 生成鉴权签名(Access Token)
  45. * @return string 鉴权签名信息(Access Token)
  46. */
  47. private function getAccessToken(){
  48. $curl = curl_init();
  49. curl_setopt_array($curl, array(
  50. CURLOPT_URL => "https://aip.baidubce.com/oauth/2.0/token?client_id=".$this->client_id."&client_secret=".$this->client_secret."&grant_type=client_credentials",
  51. CURLOPT_TIMEOUT => 30,
  52. CURLOPT_RETURNTRANSFER => true,
  53. CURLOPT_CUSTOMREQUEST => 'POST',
  54. CURLOPT_HTTPHEADER => array(
  55. 'Content-Type: application/json',
  56. 'Accept: application/json'
  57. ),
  58. ));
  59. $response = curl_exec($curl);
  60. curl_close($curl);
  61. $rtn = json_decode($response);
  62. return $rtn->access_token;
  63. }
  64. }

 这里我使用的是多轮

  1. public function run() {
  2. $user_id = 1;//用户ID
  3. $msg = "如何成为更好的人";//用户聊天内容
  4. $is_stream = 0;//是否以流式接口的形式返回数据,默认false。
  5. $cacheKey = $user_id.'@chatlog';// 缓存文件名
  6. $old_content = cache($cacheKey);
  7. include_once CMF_ROOT . 'vendor/baidubce/Chat.php';
  8. $chat = new Chat('ClientId','ClientSecret');//自行更改一下配置
  9. $messages = [];
  10. $my_msg = [];
  11. $my_msg['role'] = 'user';
  12. $my_msg['content'] = $msg;
  13. if (!$old_content) {
  14. // 之前该用户没有存在聊天记录
  15. $messages['messages'][] = $my_msg;
  16. } else {
  17. // 之前有聊天记录
  18. $messages = json_decode($old_content,true);
  19. $messages['messages'][] = $my_msg;
  20. }
  21. $messages['stream'] = $is_stream == 1 ? true : false;
  22. $data = json_encode($messages,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
  23. $response = $chat->runErnieBotTurbo($data);
  24. $res = [];
  25. if ($is_stream == 1) {
  26. $str_arr = explode("data: ",$response);
  27. array_shift($str_arr);
  28. $res_msg = [];
  29. for ($i=0; $i < count($str_arr); $i++) {
  30. $arr = [];
  31. $arr = json_decode($str_arr[$i],true);
  32. $res_msg[] = $arr['result'];
  33. }
  34. $res['result'] = implode("\n\n",$res_msg);
  35. } else {
  36. $res = json_decode($response,true);
  37. }
  38. $assistant_msg = [];
  39. $assistant_msg['role'] = 'assistant';
  40. $assistant_msg['content'] = $res['result'];
  41. $messages['messages'][] = $assistant_msg;
  42. cache($cacheKey,json_encode($messages));
  43. $this->success('请求成功!',$messages);
  44. }

三:相关问题

 01 单轮与多轮的区别

多轮的需要在请求参数中将之前发送与返回的数据也加上,上面的代码示例是用的多轮,不过推荐大家使用单轮响应的方式。

 

 02 注意流式接口返回数据与其他不同,需要对数据进行处理

 03 可能会遇到的问题

最开始对接的时候,提示以下错误信息:(无权限访问该用户数据。)

{"error_code":6,"error_msg":"No permission to access data"}

 首先这种问题需要考虑创建应用是否勾选相关接口权限。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/725801
推荐阅读
相关标签
  

闽ICP备14008679号