欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > php调用deepseek接口api并流式输出

php调用deepseek接口api并流式输出

2025/4/2 13:58:27 来源:https://blog.csdn.net/pandamf/article/details/146580745  浏览:    关键词:php调用deepseek接口api并流式输出

 1.注册deepseek并新建密钥

2 php服务端代码

$json = file_get_contents('php://input');
$jsonData = json_decode($json, true);
$datas=  ['model'=>'deepseek-chat','messages'=>[['role'=>'user','content'=>$jsonData['content']]],'stream'=>true];
send('https://api.deepseek.com/chat/completions',$datas,'handleResponseData');
function send(string $url,$postdata,callable $callback){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 返回结果而不是直接输出$headers = ["Content-Type: application/json", // 设置内容类型为JSON"Authorization: Bearer sk-69**************9d" // 设置认证头信息,例如Bearer Token];curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 设置头信息curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($postdata));curl_setopt($curl, CURLOPT_WRITEFUNCTION, function ($curl, $data) use ($callback) {// 调用回调函数处理数据$callback($data);return strlen($data); // 返回接收到的数据长度});$response = curl_exec($curl); // 执行请求并获取响应if ($response === false) {echo 'Curl error: ' . curl_error($curl); // 检查是否有错误发生}curl_close($curl); // 关闭cURL会话//echo "123";
}function handleResponseData($data) {echo $data;flush(); // 刷新输出缓冲区
}

流式输出有几个关键点

1.报文stream为true

2.curl 开启  CURLOPT_RETURNTRANSFER,使用CURLOPT_WRITEFUNCTION处理返回数据

3前端代码

<body>
<div id="app"></div>
</body>
<script>
reading();
async function reading(){const resp =await fetch('http://localhost/test.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({content:'如何评价自由高达的机设'}),dataType:"text/event-stream"})const reader=resp.body.getReader()const decoder=new TextDecoder()let container = document.getElementById('app');while(1){const {done,value}=await reader.read()if(done){break;}let txt=decoder.decode(value)let output = handleData(txt);container.innerHTML+=output;}
}function handleData(dataString){const regex = /"content":"([^"]*)"/g;let matches;let finalStr='';while ((matches = regex.exec(dataString)) !== null) {finalStr+=matches[1];}//转换行let s = finalStr.replace(/\\n/g, '<br>');return  s;}</script>

前端难点是处理报文,因为deepseek返回的块状数据是这样,我不知道这种具体是什么格式,所以只能用正则把它取下来

data: {"id":"bbadf0e5-3ed5-417a-89f7-146a4869c15d","object":"chat.completion.chunk","created":1743091685,"model":"deepseek-chat","system_fingerprint":"fp_3d5141a69a_prod0225","choices":[{"index":0,"delta":{"content":"am"},"logprobs":null,"finish_reason":null}]}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词