Files
sibedas/app/Services/OpenAIService.php

251 lines
10 KiB
PHP

<?php
namespace App\Services;
use OpenAI;
use Illuminate\Support\Facades\Storage;
class OpenAIService
{
protected $client;
public function __construct()
{
$this->client = OpenAI::client(env('OPENAI_API_KEY'));
}
public function generateGeneralText($prompt, $mainContent)
{
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are an expert assistant. Your task is to generate a concise response based on the provided prompt and main content.
Guidelines:
- Summarize the key points in exactly 5 bullet points.
- Ensure the response is clear and relevant to the prompt.
- Use simple and professional language."
],
['role' => 'user', 'content' => "Prompt: $prompt \nMain Content: $mainContent"],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function generateClassifyMainContent($prompt, $mainContent)
{
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are an expert assistant in classifying questions based on whether their answers must be retrieved from a database or can be explained generally.
Your task is to return one of the following two labels:
- \"DATABASE\" → If the question requires specific data that can only be obtained from a database.
- \"GENERAL\" → If the question can be answered without accessing a database.
Consider the following context: \"$mainContent\"
Respond with only one of the labels: \"DATABASE\" or \"GENERAL\"."
],
['role' => 'user', 'content' => $prompt],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function generateQueryBasedMainContent($prompt, $mainContent)
{
// Load file JSON
$jsonPath = public_path('templates/contentTemplatePrompt.json'); // Sesuaikan path
$jsonData = json_decode(file_get_contents($jsonPath), true);
// Periksa apakah kategori ada dalam JSON
if (!isset($jsonData[$mainContent])) {
return "Template prompt tidak ditemukan.";
}
// Ambil template berdasarkan kategori
$promptTemplate = $jsonData[$mainContent]['prompt'];
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
['role' => 'system', 'content' => $promptTemplate],
['role' => 'user', 'content' => $prompt],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function validateSyntaxQuery($queryResponse)
{
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are a MariaDB SQL expert. Your task is to validate the syntax of an SQL query to ensure it follows proper MariaDB syntax rules.
Guidelines:
- Check for any syntax errors, missing keywords, or incorrect clause usage.
- Ensure the query is well-structured and adheres to best practices.
- Verify that all SQL keywords are used correctly and in the right order.
- If the query is valid, respond with: \"VALID\".
- If the query has issues, respond with: \"INVALID\".
Always respond with either \"VALID\" or \"INVALID\"."
],
['role' => 'user', 'content' => $queryResponse],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function generateNLPFromQuery($inputUser, $resultQuery) {
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are an expert assistant. Your task is to analyze the database query results and transform them into a human-readable answer based on the user's question.
Guidelines:
- Understand the user's question and extract the key intent.
- Summarize or format the query results to directly answer the user's question.
- Ensure the response is clear, concise, and relevant.
- If the query result is empty or does not match the question, provide a polite response indicating that no data is available.
Always provide a well-structured response that makes sense based on the input question."
],
['role' => 'user', 'content' => "User's question: $inputUser \nDatabase result: $resultQuery"],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
public function generateFinalText($nlpResult) {
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are an expert text formatter. Your task is to take the given NLP result and format it into a structured, human-readable text suitable for rendering inside an HTML <div>.
Guidelines:
- Preserve the meaning and clarity of the content.
- Use proper line breaks for readability.
- If the text contains lists, convert them into bullet points.
- Emphasize important keywords using <strong> tags if necessary.
- Ensure the response remains clean and concise without extra explanations."
],
['role' => 'user', 'content' => "Here is the NLP result that needs formatting:\n\n$nlpResult"],
],
]);
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([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are an expert assistant with deep knowledge in multiple fields, including programming, data science, and business strategy. Provide clear, concise, and accurate responses."
],
[
'role' => 'user',
'content' => $prompt
],
],
]);
return trim($response['choices'][0]['message']['content'] ?? 'No response');
}
// 1. Buat fungsi untuk akses data advertisements
// 2. Buat fungsi untuk akses data business_or_industries
// 3. Buat fungsi untuk akses data customers
// 4. Buat fungsi untuk akses data pbg_task
// 5. Buat fungsi untuk akses data pbg_task_retribution
// 6. Buat fungsi untuk akses data spatial_plannings
// 7. Buat fungsi untuk akses data tourisms
// 8. Buat fungsi untuk akses data umkms
}