\App\Models\User::count(), "active_users" => \App\Models\User::where("is_active", true)->count(), "pending_users" => \App\Models\User::where("is_approved", false)->count(), "total_subjects" => Subject::count(), "total_insights" => \App\Models\Insight::count(), ]; $subjects = Subject::all(); $aiDefaultProvider = \App\Models\Setting::where('key', 'ai_default_provider')->value('value'); $aiDefaultModel = \App\Models\Setting::where('key', 'ai_default_model')->value('value'); if (!$aiDefaultProvider) { $aiDefaultProvider = config('services.ai.default_provider', 'openrouter'); } if (!$aiDefaultModel) { $aiDefaultModel = config('services.ai.providers.'.$aiDefaultProvider.'.model', 'inclusionai/ling-3.0-tiny:free'); } $chatDefaultProvider = \App\Models\Setting::where('key', 'chat_default_provider')->value('value'); $chatDefaultModel = \App\Models\Setting::where('key', 'chat_default_model')->value('value'); if (!$chatDefaultProvider) { $chatDefaultProvider = config('services.ai.default_provider', 'openrouter'); } if (!$chatDefaultModel) { $chatDefaultModel = config('services.ai.providers.'.$chatDefaultProvider.'.model', 'inclusionai/ling-3.0-tiny:free'); } return view("superadmin.system.index", compact( "stats", "subjects", "aiDefaultProvider", "aiDefaultModel", "chatDefaultProvider", "chatDefaultModel" )); } public function updateAiSettings(Request $request): RedirectResponse { $request->validate([ "ai_default_provider" => ["required", "string", "max:50"], "ai_default_model" => ["required", "string", "max:255"], ]); $provider = $request->input("ai_default_provider"); $model = $request->input("ai_default_model"); \App\Models\Setting::updateOrCreate( ["key" => "ai_default_provider"], ["value" => $provider, "type" => "string"] ); \App\Models\Setting::updateOrCreate( ["key" => "ai_default_model"], ["value" => $model, "type" => "string"] ); return back()->with("success", __("AI settings updated successfully.")); } public function updateChatSettings(Request $request): RedirectResponse { $request->validate([ "chat_default_provider" => ["required", "string", "max:50"], "chat_default_model" => ["required", "string", "max:255"], ]); $provider = $request->input("chat_default_provider"); $model = $request->input("chat_default_model"); \App\Models\Setting::updateOrCreate( ["key" => "chat_default_provider"], ["value" => $provider, "type" => "string"] ); \App\Models\Setting::updateOrCreate( ["key" => "chat_default_model"], ["value" => $model, "type" => "string"] ); return back()->with("success", __("Chat AI settings updated successfully.")); } public function createSubject(Request $request) { $request->validate([ "name" => ["required", "string", "max:255"], "description" => ["nullable", "string"], "introduction" => ["nullable", "string"], ]); Subject::create([ "user_id" => null, "name" => $request->name, "description" => $request->description, "introduction" => $request->introduction, "is_system" => true, "is_active" => true, ]); return back()->with("success", "System subject created successfully."); } public function updateSubject(Request $request, Subject $subject) { $request->validate([ "name" => ["required", "string", "max:255"], "description" => ["nullable", "string"], "introduction" => ["nullable", "string"], "is_active" => ["boolean"], ]); $subject->update($request->only("name", "description", "introduction", "is_active")); return back()->with("success", "System subject updated successfully."); } public function destroySubject(Subject $subject) { $subject->delete(); return back()->with("success", "System subject deleted successfully."); } public function generateAiSubject(Request $request): RedirectResponse { $request->validate([ "theme" => ["required", "string", "max:255"], ]); $theme = $request->input("theme"); $prompt = "Crie um assunto de aprendizado e treinamento sobre o tema: {$theme}. Retorne APENAS um objeto JSON válido (sem texto adicional, sem markdown, sem code blocks) com os campos: name (string, máximo 255 caracteres, formato: 'Aprendizado e Treinamento de [Tema]'), description (string, máximo 1000 caracteres), introduction (string, máximo 5000 caracteres). Todo o conteúdo deve estar em Português do Brasil. O assunto deve ser educativo, prático e adequado para geração de insights de aprendizagem pela IA."; /** @var \App\Services\AIService $ai */ $ai = app(\App\Services\AIService::class); $result = $ai->generateInsight($theme, $prompt, ["language" => "pt_BR"]); if (!$result["success"]) { return back()->with("error", __("Failed to generate subject: :error", ["error" => $result["error"] ?? __("Unknown error")])); } $content = $result["content"]; $data = $this->extractJsonFromAiResponse($content); if (!$data || !isset($data["name"])) { $data = [ "name" => "Aprendizado e Treinamento de {$theme}", "description" => $theme, "introduction" => $content, ]; } Subject::create([ "user_id" => null, "name" => $data["name"], "description" => $data["description"] ?? null, "introduction" => $data["introduction"] ?? null, "is_system" => true, "is_active" => true, ]); return back()->with("success", __("System subject generated successfully.")); } private function extractJsonFromAiResponse(string $content): ?array { $content = trim($content); if (str_starts_with($content, "```")) { $content = preg_replace("/^```(?:json)?\s*/", "", $content); $content = preg_replace("/\s*```$/", "", $content); } $data = json_decode($content, true); if (json_last_error() === JSON_ERROR_NONE && is_array($data)) { return $data; } if (preg_match("/\{.*\}/s", $content, $matches)) { $data = json_decode($matches[0], true); if (json_last_error() === JSON_ERROR_NONE && is_array($data)) { return $data; } } return null; } }