$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', ]); } }