embeddingService->embed($request->string('message')->toString()); } catch (OllamaUnavailableException $e) { return response()->json([ 'message' => 'Ollama is unavailable. Could not generate embedding.', ], 503); } $ticket = Ticket::query()->create([ 'message' => $request->string('message')->toString(), 'embedding' => $embedding, ]); try { $result = $this->semanticSearchService->findBestArticle($ticket); } catch (OllamaUnavailableException $e) { return response()->json([ 'message' => 'Ticket saved, but Ollama ranking is unavailable.', 'ticket_id' => $ticket->id, ], 202); } return response()->json([ 'ticket_id' => $ticket->id, 'best_article' => $result['best_article'], 'confidence' => $result['confidence'], 'explanation' => $result['explanation'], 'top_3_candidates' => $result['top_3_candidates'], ], 201); } }