orderBy('title') ->paginate(20); $categories = ChatbotKnowledge::getCategories(); return view('chatbot::admin.index', compact('knowledgeEntries', 'categories')); } /** * Show the form for creating a new knowledge entry. */ public function create(): \Illuminate\View\View { $categories = ChatbotKnowledge::getCategories(); return view('chatbot::admin.create', compact('categories')); } /** * Store a newly created knowledge entry. */ public function store(Request $request): \Illuminate\Http\RedirectResponse { $validated = $request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string', 'restrictions' => 'nullable|string', 'category' => 'required|string|in:' . implode(',', array_keys(ChatbotKnowledge::getCategories())), ]); $validated['active'] = $request->has('active'); ChatbotKnowledge::create($validated); return redirect() ->route('admin.chatbot.index') ->with('success', 'Informação adicionada à base de conhecimento com sucesso!'); } /** * Show the form for editing a knowledge entry. */ public function edit(ChatbotKnowledge $chatbot_knowledge): \Illuminate\View\View { $entry = $chatbot_knowledge; $categories = ChatbotKnowledge::getCategories(); return view('chatbot::admin.edit', compact('entry', 'categories')); } /** * Update a knowledge entry. */ public function update(Request $request, ChatbotKnowledge $chatbot_knowledge): \Illuminate\Http\RedirectResponse { $validated = $request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string', 'restrictions' => 'nullable|string', 'category' => 'required|string|in:' . implode(',', array_keys(ChatbotKnowledge::getCategories())), ]); $validated['active'] = $request->has('active'); $chatbot_knowledge->update($validated); return redirect() ->route('admin.chatbot.index') ->with('success', 'Informação atualizada com sucesso!'); } /** * Delete a knowledge entry. */ public function destroy(ChatbotKnowledge $chatbot_knowledge): \Illuminate\Http\RedirectResponse { $chatbot_knowledge->delete(); return redirect() ->route('admin.chatbot.index') ->with('success', 'Informação removida da base de conhecimento.'); } /** * Display conversations listing with visitor contacts. */ public function conversations(): \Illuminate\View\View { $conversations = ChatbotConversation::with('messages') ->whereNotNull('visitor_name') ->orderBy('created_at', 'desc') ->paginate(20); return view('chatbot::admin.conversations', compact('conversations')); } /** * Display a specific conversation with all messages. */ public function showConversation(ChatbotConversation $conversation): \Illuminate\View\View { $conversation->load('messages'); return view('chatbot::admin.conversation-show', compact('conversation')); } /** * Delete a conversation. */ public function destroyConversation(ChatbotConversation $conversation): \Illuminate\Http\RedirectResponse { $conversation->delete(); return redirect() ->route('admin.chatbot.conversations') ->with('success', 'Conversa removida com sucesso.'); } /** * Display chatbot settings. */ public function settings(): \Illuminate\View\View { $settings = [ 'chatbot_enabled' => Setting::get('chatbot_enabled', 'off'), 'chatbot_provider' => Setting::get('chatbot_provider', 'openrouter'), 'chatbot_openrouter_api_key' => Setting::get('chatbot_openrouter_api_key'), 'chatbot_openrouter_model' => Setting::get('chatbot_openrouter_model', 'openai/gpt-3.5-turbo'), 'chatbot_llamacpp_base_url' => Setting::get('chatbot_llamacpp_base_url', 'http://172.17.0.1:8080'), 'chatbot_llamacpp_model' => Setting::get('chatbot_llamacpp_model', ''), 'chatbot_welcome_message' => Setting::get('chatbot_welcome_message', 'Olá! Como posso ajudar você hoje?'), 'chatbot_custom_instructions' => Setting::get('chatbot_custom_instructions'), 'chatbot_max_tokens' => Setting::get('chatbot_max_tokens', '500'), 'chatbot_temperature' => Setting::get('chatbot_temperature', '0.7'), ]; return view('chatbot::admin.settings', compact('settings')); } /** * Update chatbot settings. */ public function updateSettings(Request $request): \Illuminate\Http\RedirectResponse { $validated = $request->validate([ 'chatbot_enabled' => 'nullable|in:on,off', 'chatbot_provider' => 'required|in:openrouter,llamacpp', 'chatbot_openrouter_api_key' => 'nullable|string|max:255', 'chatbot_openrouter_model' => 'nullable|string|max:255', 'chatbot_llamacpp_base_url' => 'nullable|string|max:255', 'chatbot_llamacpp_model' => 'nullable|string|max:255', 'chatbot_welcome_message' => 'required|string|max:500', 'chatbot_custom_instructions' => 'nullable|string', 'chatbot_max_tokens' => 'required|integer|min:50|max:2000', 'chatbot_temperature' => 'required|numeric|min:0|max:2', ]); foreach ($validated as $key => $value) { if ($key === 'chatbot_enabled') { Setting::set($key, $value ?? 'off', 'chatbot'); } else { Setting::set($key, $value, 'chatbot'); } } // Ensure enabled is set properly when checkbox is not checked if (!$request->has('chatbot_enabled')) { Setting::set('chatbot_enabled', 'off', 'chatbot'); } return redirect() ->route('admin.chatbot.settings') ->with('success', 'Configurações do chatbot atualizadas com sucesso!'); } /** * Display the chatbot rules listing. */ public function rulesIndex(): \Illuminate\View\View { $rules = ChatbotRule::orderBy('order') ->orderBy('id') ->paginate(30); return view('chatbot::admin.rules.index', compact('rules')); } /** * Show the form for creating a new chatbot rule. */ public function rulesCreate(): \Illuminate\View\View { return view('chatbot::admin.rules.create'); } /** * Store a newly created chatbot rule. */ public function rulesStore(Request $request): \Illuminate\Http\RedirectResponse { $validated = $request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string|max:2000', 'order' => 'nullable|integer|min:0|max:9999', ]); $validated['active'] = $request->has('active'); $validated['order'] = $validated['order'] ?? 0; ChatbotRule::create($validated); return redirect() ->route('admin.chatbot.rules.index') ->with('success', 'Regra criada com sucesso! A IA passará a segui-la nas próximas conversas.'); } /** * Show the form for editing a chatbot rule. */ public function rulesEdit(ChatbotRule $rule): \Illuminate\View\View { return view('chatbot::admin.rules.edit', compact('rule')); } /** * Update a chatbot rule. */ public function rulesUpdate(Request $request, ChatbotRule $rule): \Illuminate\Http\RedirectResponse { $validated = $request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string|max:2000', 'order' => 'nullable|integer|min:0|max:9999', ]); $validated['active'] = $request->has('active'); $validated['order'] = $validated['order'] ?? 0; $rule->update($validated); return redirect() ->route('admin.chatbot.rules.index') ->with('success', 'Regra atualizada com sucesso!'); } /** * Delete a chatbot rule. */ public function rulesDestroy(ChatbotRule $rule): \Illuminate\Http\RedirectResponse { $rule->delete(); return redirect() ->route('admin.chatbot.rules.index') ->with('success', 'Regra removida com sucesso.'); } }