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

1.注册deepseek并新建密钥

2 php服务端代码

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前端代码

html 复制代码
<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返回的块状数据是这样,我不知道这种具体是什么格式,所以只能用正则把它取下来

html 复制代码
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}]}
相关推荐
老王爱玩车11 分钟前
动态内存管理
c语言·开发语言·学习·面试
2501_9159090615 分钟前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
I'm Jie17 分钟前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
开发语言·rust·开源
qq_5434478228 分钟前
DNS解析怎么排查?故障处理与运维实用手册
运维·服务器·网络·php
kimnoic34 分钟前
Python常用命令提示符使用方法详解
开发语言·python
Crazy________35 分钟前
05Linux内存管理核心原理与运维实战
java·开发语言
Nebula_g37 分钟前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase
扶风ff43 分钟前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
狗凯之家源码网1 小时前
AI 步数修改提交系统源码应用场景与落地指南
android·数据库·人工智能·运动步数
程序员老陆1 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++