120 lines
3.4 KiB
PHP
120 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire;
|
|
|
|
use App\Models\Chatbot as ChatbotModel;
|
|
use App\Services\MistralService;
|
|
use App\Services\WeaviateService;
|
|
use Livewire\Component;
|
|
use Livewire\Attributes\On;
|
|
|
|
class Chatbot extends Component
|
|
{
|
|
public ChatbotModel $chatbot;
|
|
public string $userMessage = '';
|
|
public array $messages = [];
|
|
public bool $isSending = false;
|
|
public string $chatbotName = '';
|
|
|
|
public function mount(ChatbotModel $chatbot)
|
|
{
|
|
$this->chatbot = $chatbot;
|
|
$this->loadSettings();
|
|
|
|
// Load messages from session specific to this chatbot's slug
|
|
$this->messages = session()->get("chat_messages_{$chatbot->slug}", [
|
|
[
|
|
'role' => 'assistant',
|
|
'content' => "Bonjour ! Je suis votre assistant virtuel RAG. Je peux répondre à vos questions en me basant sur le contenu de ce site. Que puis-je faire pour vous aujourd'hui ?"
|
|
]
|
|
]);
|
|
}
|
|
|
|
#[On('settings-updated')]
|
|
public function loadSettings()
|
|
{
|
|
// Reload chatbot model from database to get fresh settings
|
|
$this->chatbot->refresh();
|
|
$this->chatbotName = $this->chatbot->name;
|
|
}
|
|
|
|
public function sendMessage(WeaviateService $weaviate, MistralService $mistral)
|
|
{
|
|
$this->validate([
|
|
'userMessage' => 'required|string|max:1000',
|
|
]);
|
|
|
|
$query = trim($this->userMessage);
|
|
|
|
// 1. Add user message
|
|
$this->messages[] = [
|
|
'role' => 'user',
|
|
'content' => $query
|
|
];
|
|
|
|
$this->userMessage = '';
|
|
$this->isSending = true;
|
|
|
|
// Save to session immediately for visual update
|
|
session()->put("chat_messages_{$this->chatbot->slug}", $this->messages);
|
|
|
|
$this->dispatch('message-sent');
|
|
}
|
|
|
|
public function getResponse(WeaviateService $weaviate, MistralService $mistral)
|
|
{
|
|
if (!$this->isSending) {
|
|
return;
|
|
}
|
|
|
|
$lastMessage = end($this->messages);
|
|
if (!$lastMessage || $lastMessage['role'] !== 'user') {
|
|
$this->isSending = false;
|
|
return;
|
|
}
|
|
|
|
$query = $lastMessage['content'];
|
|
|
|
// 2. Search Weaviate for context using the chatbot ID
|
|
$chunks = $weaviate->search($query, (string) $this->chatbot->id, 4);
|
|
|
|
// 3. Generate response via Mistral AI
|
|
$history = array_slice($this->messages, 0, -1);
|
|
$response = $mistral->generateResponse($query, $chunks, $history, $this->chatbot->system_prompt);
|
|
|
|
// Extract sources
|
|
$sources = [];
|
|
if (!empty($chunks)) {
|
|
foreach ($chunks as $chunk) {
|
|
if (isset($chunk['source'])) {
|
|
$sources[] = $chunk['source'];
|
|
}
|
|
}
|
|
}
|
|
$sources = array_unique($sources);
|
|
|
|
// 4. Add assistant response
|
|
$this->messages[] = [
|
|
'role' => 'assistant',
|
|
'content' => $response ?? "Désolé, je n'ai pas pu obtenir de réponse.",
|
|
'sources' => $sources
|
|
];
|
|
|
|
$this->isSending = false;
|
|
|
|
// Save to session
|
|
session()->put("chat_messages_{$this->chatbot->slug}", $this->messages);
|
|
}
|
|
|
|
public function clearChat()
|
|
{
|
|
session()->forget("chat_messages_{$this->chatbot->slug}");
|
|
$this->mount($this->chatbot);
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.chatbot');
|
|
}
|
|
}
|