|
@@ -14,37 +14,16 @@ class Deepseek extends Api
|
|
protected $noNeedLogin = ['*'];
|
|
protected $noNeedLogin = ['*'];
|
|
protected $noNeedRight = ['*'];
|
|
protected $noNeedRight = ['*'];
|
|
|
|
|
|
-
|
|
|
|
- public function index()
|
|
|
|
- {
|
|
|
|
- $params = input();
|
|
|
|
-
|
|
|
|
- $chat = new DeepseekAI();
|
|
|
|
- $response = $chat->completions($params['messages'],$params['model'],$params['type']);
|
|
|
|
- // dump($response);
|
|
|
|
-
|
|
|
|
- return new StreamedResponse(function() use ($response) {
|
|
|
|
- $body = $response->getBody();
|
|
|
|
- while (!$body->eof()) {
|
|
|
|
- echo $body->read(1024); // 每次读取 1024 字节
|
|
|
|
- ob_flush();
|
|
|
|
- flush();
|
|
|
|
- }
|
|
|
|
- }, 200, [
|
|
|
|
- 'Content-Type' => 'application/json', // 根据实际情况设置响应头
|
|
|
|
- ]);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- public function mockDeepSeekStream()
|
|
|
|
|
|
+ public function test()
|
|
{
|
|
{
|
|
-
|
|
|
|
// 这是模拟的文本片段 - 实际应替换为真实的API调用
|
|
// 这是模拟的文本片段 - 实际应替换为真实的API调用
|
|
$textChunks = [
|
|
$textChunks = [
|
|
"你好!这是 DeepSeek 的流式文本响应。\n\n",
|
|
"你好!这是 DeepSeek 的流式文本响应。\n\n",
|
|
"我正在逐块返回文本内容。\n",
|
|
"我正在逐块返回文本内容。\n",
|
|
"这种方式可以实现实时输出效果。\n",
|
|
"这种方式可以实现实时输出效果。\n",
|
|
"这种方式可以实现实时输出效果。\n",
|
|
"这种方式可以实现实时输出效果。\n",
|
|
|
|
+ "这种方式可以实现实时输出效果。\n",
|
|
|
|
+ "这种方式可以实现实时输出效果。\n",
|
|
"最后一块内容。\n"
|
|
"最后一块内容。\n"
|
|
];
|
|
];
|
|
|
|
|
|
@@ -89,6 +68,7 @@ class Deepseek extends Api
|
|
// 设置cURL选项
|
|
// 设置cURL选项
|
|
curl_setopt_array($ch, [
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
|
|
+ CURLOPT_SSL_VERIFYHOST => false,
|
|
CURLOPT_SSL_VERIFYPEER => false,
|
|
CURLOPT_SSL_VERIFYPEER => false,
|
|
CURLOPT_POST => true,
|
|
CURLOPT_POST => true,
|
|
CURLOPT_POSTFIELDS => json_encode($data),
|
|
CURLOPT_POSTFIELDS => json_encode($data),
|
|
@@ -98,80 +78,26 @@ class Deepseek extends Api
|
|
'Accept: text/event-stream' // 重要:声明接受事件流
|
|
'Accept: text/event-stream' // 重要:声明接受事件流
|
|
],
|
|
],
|
|
CURLOPT_WRITEFUNCTION => function($ch, $data) {
|
|
CURLOPT_WRITEFUNCTION => function($ch, $data) {
|
|
- // 实时处理流数据
|
|
|
|
- $lines = explode("\n", $data);
|
|
|
|
-
|
|
|
|
- foreach ($lines as $line) {
|
|
|
|
- if (strpos($line, 'data: ') === 0) {
|
|
|
|
- $jsonStr = substr($line, 6); // 移除"data: "前缀
|
|
|
|
|
|
|
|
- // 跳过结束标记
|
|
|
|
- if (trim($jsonStr) === '[DONE]') {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // 解析JSON数据
|
|
|
|
- $eventData = json_decode($jsonStr, true);
|
|
|
|
-
|
|
|
|
- if (isset($eventData['choices'][0]['delta']['content'])) {
|
|
|
|
- $content = $eventData['choices'][0]['delta']['content'];
|
|
|
|
-
|
|
|
|
- // 输出内容并立即刷新缓冲区
|
|
|
|
- echo $content;
|
|
|
|
- ob_flush();
|
|
|
|
- flush();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ echo $data;
|
|
|
|
+ ob_flush();
|
|
|
|
+ flush();
|
|
|
|
|
|
return strlen($data); // 返回已处理数据长度
|
|
return strlen($data); // 返回已处理数据长度
|
|
}
|
|
}
|
|
]);
|
|
]);
|
|
|
|
|
|
-// 执行请求
|
|
|
|
|
|
+ // 执行请求
|
|
$response = curl_exec($ch);
|
|
$response = curl_exec($ch);
|
|
|
|
|
|
-// 错误处理
|
|
|
|
|
|
+ // 错误处理
|
|
if (curl_errno($ch)) {
|
|
if (curl_errno($ch)) {
|
|
echo 'Error: ' . curl_error($ch);
|
|
echo 'Error: ' . curl_error($ch);
|
|
}
|
|
}
|
|
|
|
|
|
-// 关闭连接
|
|
|
|
|
|
+ // 关闭连接
|
|
curl_close($ch);
|
|
curl_close($ch);
|
|
|
|
|
|
- // 创建cURL句柄
|
|
|
|
- /* $ch = curl_init();
|
|
|
|
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
|
|
|
|
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
|
|
- curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
|
- curl_setopt($ch, CURLOPT_POST, true);
|
|
|
|
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
- curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
|
|
- 'Content-Type: application/json',
|
|
|
|
- 'Authorization: Bearer ' . $apiKey,
|
|
|
|
- 'Accept: text/event-stream' // 重要:声明接受事件流
|
|
|
|
- ]);
|
|
|
|
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 直接输出
|
|
|
|
- curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $chunk) {
|
|
|
|
- // 直接输出接收到的数据块
|
|
|
|
- echo $chunk;
|
|
|
|
-// ob_flush();
|
|
|
|
-// flush();
|
|
|
|
- return strlen($chunk); // 必须返回写入的字节数
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- // 执行请求
|
|
|
|
- curl_exec($ch);
|
|
|
|
-
|
|
|
|
- // 检查错误
|
|
|
|
- if (curl_errno($ch)) {
|
|
|
|
- // 错误处理
|
|
|
|
- echo "\n\n[ERROR] API请求失败: " . curl_error($ch);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- curl_close($ch);*/
|
|
|
|
-
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|