首页 > 编程语言 >使用 AJAX、PHP 和服务器发送事件从 OpenAI 的 API 流式传输数据

使用 AJAX、PHP 和服务器发送事件从 OpenAI 的 API 流式传输数据

时间:2023-11-12 15:01:53浏览次数:39  
标签:ch text 传输数据 AJAX API 服务器发送 curl data response

如何使用服务器发送事件 (SSE) 将数据从上述 API 流式传输到使用 JavaScript 和 PHP 的浏览器客户端?我已经研究这个问题好几个小时了,但我似乎无法弄清楚出了什么问题。作为参考,我尝试在这里调整解决方案:Stream DATA From openai GPT-3 API using PHP

我的代码的其余部分或多或少与上面问题中的代码相同。我修改的唯一不起作用的部分是:


curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($curl, $data) {

# str_repeat(' ',1024*8) is needed to fill the buffer and will make streaming the data possible

$data = json_decode($data, true);

 

$text = $data['choices'][0]['text'];

 

echo $text . str_repeat(' ', 1024 * 8);

return strlen($data);

});


首先,我尝试仅返回“choices”数组中的“text”属性(请参阅下面的示例 API 响应)。

这是我收到的回复:

注意:尝试访问 C:FILE_PATHsse.php 中 null 类型值的数组偏移量。

其次,如何将“文本”实时传输到客户端上的元素?这是我到目前为止的实现。

JavaScript


$.ajax({

type: "POST",

url: "sse.php",

data: JSON.stringify({

prompt: "What is the best way to",

num_completions: 1,

temperature: 0.5,

}),

contentType: "application/json",

success: function (response) {

const source = new EventSource("sse.php");

 

source.onmessage = function (event) {

const div = document.getElementById("response");

div.innerHTML += event.data + "<br>";

console.log(event);

};

},

});


API 流式传输的数据样本块如下所示。我试图仅将“文本”部分流回浏览器。


data: {"id": "cmpl-XXXXXXXXXXXXXXXXXXXXXXX", "object": "text_completion", "created": 1671700494, "choices": [{"text": " Best", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}

 

data: {"id": "cmpl-XXXXXXXXXXXXXXXXXXXXXXX", "object": "text_completion", "created": 1671700494, "choices": [{"text": " way", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}

 

data: {"id": "cmpl-XXXXXXXXXXXXXXXXXXXXXXX", "object": "text_completion", "created": 1671700494, "choices": [{"text": " to", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}

 

data: [DONE]


我应该如何实现这个?

要使用服务器发送事件(SSE)从灵动Ai的API流式传输数据到JavaScript和PHP的浏览器客户端,您可以按照以下步骤进行操作:

  1. 在PHP中创建一个用于处理SSE请求的端点,例如"sse.php"。
  2. 在"sse.php"文件中将以下代码添加到PHP代码的顶部,以设置响应的MIME类型和缓存控制:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
  1. 在"sse.php"文件中,使用curl执行API请求,并在回调函数中处理返回的数据。修改您的代码如下:
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://api.lingdong.com/v1/engines/davinci/completions');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, JSON.stringify([
  "prompt" => "What is the best way to",
  "num_completions" => 1,
  "temperature" => 0.5,
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'Content-Type: application/json',
  'Authorization: Bearer YOUR_API_KEY'
]);

// Send the API request and handle the response
$response = curl_exec($ch);
if ($response === false) {
  // Handle the curl error
  echo 'error: ' . curl_error($ch) . "\n";
  exit;
}

curl_close($ch);

// Process the API response
$data = json_decode($response, true);
$text = $data['choices'][0]['text'];

echo 'data: ' . $text . "\n\n"; // Send the data to the client
flush(); // Flush the output buffer

请确保替换YOUR_API_KEY为您的灵动Ai API密钥。

  1. 在JavaScript中的success回调函数中添加以下代码,以使用EventSource监听SSE数据:
const source = new EventSource("sse.php");

source.onmessage = function (event) {
  const div = document.getElementById("response");
  div.innerHTML += event.data + "<br>";
  console.log(event);
};
  1. 在HTML中添加一个包含id为"response"的元素,用于显示从服务器接收到的数据:
<div id="response"></div>

通过以上步骤,您应该能够使用JavaScript和PHP的浏览器客户端从灵动Ai的API流式传输数据。当"SSE.php"端点收到数据时,它将将数据发送到客户端,并客户端将数据添加到具有"id"为"response"的元素中,实现实时数据传输。

请确保替换"YOUR_API_KEY"为您的灵动Ai API密钥,并根据需要调整其他部分以满足您的代码需求。

标签:ch,text,传输数据,AJAX,API,服务器发送,curl,data,response
From: https://blog.51cto.com/M82A1/8329451

相关文章

  • 原生JavaScript 与 jQuery 执行Ajax请求
    原生JavaScript和jQuery都可以用来执行Ajax请求,以下是它们的基本实现方式的比较:原生JavaScript实现Ajax请求:varxhr=newXMLHttpRequest();xhr.open("GET","https://api.example.com/data",true);xhr.onreadystatechange=function(){if(xhr.readyState==4&&......
  • SpringBoot整合Ajax
    使用springboot整合ajax实现登录验证及查询信息。添加jar依赖<dependencies><!--<dependency>--><!--<groupId>org.aspectj</groupId>--><!--<artifactId>aspectjweaver</artifactId>-->......
  • Ajax与Flash的优缺点比较
    1.Ajax的优势:1.可搜索性2.开放性3.费用4.易用性5.易于开发。2.Flash的优势:1.多媒体处理2.兼容性3.矢量图形4.客户端资源调度3.Ajax的劣势:1.它可能破坏浏览器的后退功能2.使用动态页面更新使得用户难于将某个特定的状态保存到收藏夹中,不过这些都有相关方法解决。4.Fl......
  • 23.11.10(Ajax和Json的数据传输问题)
    使用Ajax写查询功能,后端数据一直传不到前端,遇到parse解析的卡住原因:传来的json数据格式不正确,后端Java还respond了一个success解决方法:把success去掉<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script>$(d......
  • 服务器发送了一个意外的数据包。 received: 3, expected: 20
     [root@node02local]#vim/etc/ssh/sshd_config#最后一行添加[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1[root@node02local]#systemctlreloadsshd ......
  • Xshell通过SSH连接阿里云报错“服务器发送了一个意外的数据包” xshell连接ubuntu
     ubuntu连接旧版本就会显示报错1.登录到阿里云服务器上 2.解决方法命令: vim/etc/ssh/sshd_config加到最后一行打开sshd_config并且将下面的复制进去保存,然后重启reboot即可。[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh......
  • ASP.NET Ajax exception - Two components with the same id can't be added to the a
    There'sacoupleofexceptionstolookoutforwhenyoustartdevelopingcustomASP.NETAjaxclientcontrols. Theyare:MicrosoftJScriptruntimeerror:Sys.InvalidOperationException:Twocomponentswiththesameid'ctl00_MainContentPlaceHold......
  • 10 Mar 10 Auto Complete Ajax Scripts
    In2005whenGoogleimplementedGoogleSuggest,Ajaxtookoff.EverywebdeveloperwastryingtoduplicatewhatGoogleaccomplished.Itsnow2008andtherearetonsofwaystoaccomplishGoogleSuggest.Belowisalistof10AutoCompleteScriptswithvar......
  • 某音用SSL证书上了一把“安全锁”,加密保护网络传输数据安全
    依照《网络安全法》、《数据安全法》等相关法律法规,网络运营者应当按照网络安全等级保护制度的要求,采用数据加密等措施来防止网络数据泄露或者被窃取、篡改。某音作为头部的音乐创意短视频社交平台,每天都有数以亿计的用户在上面观看、发布视频,而这会产生大量包含个人账号、密码等用......
  • 若依框架AjaxResult改造适应Swagger接口文档
    一、概述若依框架后端使用的响应对象AjaxResult,和Swagger存在不兼容问题,导致返回体即使使用了Swagger注解,但是Swagger接口文档中,不显示返回体的对象Swagger文档: 若依Gitee上,也存在此问题:https://gitee.com/y_project/RuoYi-Vue/commit/6805a96e533f56b86aaeecccc2693c6ff40......