resolveSession($request, $categoryId); // ── Jawab soalan melalui RAG ────────────────────────────────────── $result = $this->ragService->ask($question, $categoryId); // ── Log secara async (jangan tangguh response) ──────────────────── LogChatInteractionJob::dispatch( $session->session_token, auth()->id(), $categoryId, $question, $result['answer'], $result['sources'], $result['context_chunks'], $result['model_used'], $result['tokens_used'], $result['response_time'], $result['has_answer'], ); return [ 'answer' => $result['answer'], 'has_answer' => $result['has_answer'], 'sources' => $result['sources'], 'session_token' => $session->session_token, ]; } private function resolveSession(Request $request, ?int $categoryId): ChatSession { $token = $request->session()->get('chat_session_token'); if ($token) { $session = ChatSession::where('session_token', $token)->first(); if ($session) { return $session; } } // Buat sesi baru $session = ChatSession::create([ 'user_id' => auth()->id(), 'category_id' => $categoryId, 'ip_address' => $request->ip(), 'user_agent' => $request->userAgent(), ]); $request->session()->put('chat_session_token', $session->session_token); return $session; } }