Merge remote-tracking branch 'origin/feature/chatbot-sidebar' into dev

This commit is contained in:
arifal
2025-03-04 17:32:37 +07:00
7 changed files with 356 additions and 266 deletions

View File

@@ -88,9 +88,42 @@ class ChatbotController extends Controller
try {
// Panggil service untuk generate text
$response = $this->openAIService->mainGenerateText($request->input('prompt'));
$classifyResponse = $this->openAIService->classifyMainGenerateText($request->input('prompt'));
info($classifyResponse);
// Pastikan hasil klasifikasi valid sebelum melanjutkan
$validCategories = [
'reklame', 'business_or_industries', 'customers',
'pbg', 'retribusi', 'spatial_plannings',
'tourisms', 'umkms'
];
if (!in_array($classifyResponse, $validCategories)) {
return response()->json([
'error' => ''
], 400);
}
$queryResponse = $this->openAIService->createMainQuery($classifyResponse, $request->input('prompt'));
info($queryResponse);
$firstValidation = $this->openAIService->validateSyntaxQuery($queryResponse);
$secondValidation = $this->openAIService->validateSyntaxQuery($queryResponse);
$formattedResultQuery = "[]";
return response()->json(['response' => $response]);
if($firstValidation === "VALID" && $secondValidation === "VALID")
{
$queryResponse = str_replace(['```sql', '```'], '', $queryResponse);
$queryResult = DB::select($queryResponse);
info($queryResult);
$formattedResultQuery = json_encode($queryResult, JSON_PRETTY_PRINT);
info($formattedResultQuery);
}
$nlpResult = $this->openAIService->generateNLPFromQuery($request->input('prompt'), $formattedResultQuery);
$finalGeneratedText =$this->openAIService->generateFinalText($nlpResult);
return response()->json(['response' => $finalGeneratedText]);
} catch (\Exception $e) {
// Tangani error dan log exception
\Log::error("Error generating text: " . $e->getMessage());

View File

@@ -153,6 +153,72 @@ class OpenAIService
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function classifyMainGenerateText($prompt) {
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are an assistant that classifies text into one of the following categories:
- reklame (ads or product/service promotions)
- business_or_industries (business or industries in general)
- customers (customers, consumers, or service users)
- pbg (tasks related to Building Approval)
- retribusi (retributions related to PBG)
- spatial_plannings (spatial planning)
- tourisms (tourism and tourist destinations)
- umkms (Micro, Small, and Medium Enterprises)
Respond with only one of the categories above without any additional explanation."
],
[
'role' => 'user',
'content' => "Classify the following text:\n\n" . $prompt
],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function createMainQuery($classify, $prompt)
{
// Load file JSON
$jsonPath = public_path('templates/table_config.json');
$jsonConfig = json_decode(file_get_contents($jsonPath), true);
// Pastikan kategori tersedia dalam konfigurasi
if (!isset($jsonConfig[$classify])) {
return "Error: Kategori tidak ditemukan dalam konfigurasi.";
}
// Ambil nama tabel dan kolom
$tableName = $jsonConfig[$classify]['table_name'];
$columns = implode(', ', $jsonConfig[$classify]['list_column']);
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are an AI assistant that generates only valid MariaDB queries based on user requests.
Use the following table information to construct the SQL query:
- Table Name: $tableName
- Available Columns: $columns
Generate only the SQL query without any explanation or additional text."
],
[
'role' => 'user',
'content' => $prompt
],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function mainGenerateText($prompt) {
$response = $this->client->chat()->create([