123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- namespace App\Http\Controllers\API;
- use App\Http\Controllers\Controller;
- use App\Models\LlmMessage;
- use App\Models\LlmSession;
- use App\Services\LLM\DeepSeekService;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\Request;
- use Illuminate\Http\Response;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Str;
- use Symfony\Component\HttpFoundation\StreamedResponse;
- class DeepSeekChatController extends Controller
- {
- public function getLlmList(): JsonResponse
- {
- $list = config('llm');
- $llmList = [];
- foreach ($list as $key => $item) {
- if (!isset($item['enabled']) || !$item['enabled']) {
- continue;
- }
- $llmList[] = [
- 'name' => $item['name'],
- 'model' => $item['model'],
- ];
- }
- return $this->success(['data' => $llmList]);
- }
- // 重命名
- public function renameSession(Request $request, $sessionId): JsonResponse
- {
- $userId = Auth::id();
- $title = $request->input('title');
- if (!$title) {
- return $this->badRequest('会话标题不能为空');
- }
- $session = LlmSession::query()
- ->where('session_id', $sessionId)
- ->where('user_id', $userId)
- ->first();
- if (!$session) {
- return $this->badRequest('会话不存在或无权访问');
- }
- $session->update([
- 'title' => $title,
- ]);
- return $this->success(['data' => $session]);
- }
- // 删除接口
- public function deleteSession(Request $request, $sessionId)
- {
- $userId = Auth::id();
- $session = LlmSession::query()
- ->where('session_id', $sessionId)
- ->where('user_id', $userId)
- ->first();
- if (!$session) {
- return $this->badRequest('会话不存在或无权访问');
- }
- $session->delete();
- $session->messages()->delete();
- }
- /**
- * 添加会话
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function addSession(Request $request): JsonResponse
- {
- $userId = Auth::id();
- if (!$request->input('title')) {
- return $this->badRequest('会话标题不能为空');
- }
- $list = config('llm');
- $modelMap = array_column($list, null, 'model');
- $llm = $modelMap[$request->input('model')] ?? null;
- if (!$llm || !$llm['enabled']) {
- return $this->badRequest('LLM服务未启用或未配置');
- }
- $session = LlmSession::create([
- 'session_id' => Str::uuid(),
- 'user_id' => $userId,
- 'title' => $request->input('title', ''),
- 'model' => $llm['model'],
- ]);
- return $this->success(['data' => $session]);
- }
- /**
- * 获取会话列表
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function getSessionList(Request $request): JsonResponse
- {
- $userId = Auth::id();
- $sessions = LlmSession::where('user_id', $userId)
- ->where('updated_at', '>', now()->subDays(30))
- ->orderBy('updated_at', 'desc')->get();
- return $this->success(['data' => $sessions]);
- }
- /**
- * 获取对话详情
- *
- * @param Request $request
- * @param int $sessionId
- * @return JsonResponse
- */
- public function getSessionDetail(Request $request, $sessionId): JsonResponse
- {
- $userId = Auth::id();
- $session = LlmSession::where('id', $sessionId)
- ->where('user_id', $userId)
- ->first();
- if (!$session) {
- return $this->error('会话不存在或无权访问', 404);
- }
- // 获取会话详情,包括消息历史
- $sessionData = [
- 'session' => $session->toArray(),
- 'messages' => $session->messages ?? []
- ];
- return $this->success(['data' => $sessionData]);
- }
- public function handleStream(Request $request): StreamedResponse
- {
- // 一个session进行多轮对话
- $sessionId = $request->input("session_id");
- $list = config('llm');
- $modelMap = array_column($list, null, 'model');
- $llm = $modelMap[$request->input('model')] ?? null;
- // 获取该session的历史对话记录
- $history = [];
- if ($sessionId) {
- // 获取该session的历史对话记录
- $session = LlmSession::query()->where('session_id', $sessionId)->firstOrFail();
- $history = $session->messages->map(function ($item) {
- return [
- 'role' => $item['role'],
- 'content' => $item['content'],
- ];
- });
- }
- return new StreamedResponse(function () use ($llm, $request, $history) {
- // 1. 设置SSE头
- header('Content-Type: text/event-stream');
- header('Cache-Control: no-cache');
- header('Connection: keep-alive');
- header('X-Accel-Buffering: no');
- header('Transfer-Encoding: chunked');
- if (!$llm) {
- return [
- 'role' => 'assistant',
- 'content' => '服务器错误,请稍后再试~',
- ];
- }
- // 2. 获取请求参数
- $prompt = $request->input('prompt', '');
- // 追加该会话上下文
- $message = array_merge($history ? $history->toArray() : [], [
- ['role' => 'user', 'content' => $prompt],
- ]);
- DeepSeekService::streamedResponseChat($llm, $message, $request->input("session_id"));
- }, 200, [
- 'Content-Type' => 'text/event-stream',
- ]);
- }
- }
|