fix: PSR-4 compliance — rename core/middleware/services to PascalCase for Linux server compatibility
This commit is contained in:
70
app/Core/AI.php
Normal file
70
app/Core/AI.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace App\Core;
|
||||
|
||||
use App\Services\InvoiceExtractionService;
|
||||
|
||||
/**
|
||||
* Gemini AI Integration for Invoice Extraction
|
||||
* Optimized for Jordan UBL 2.1 Compliance
|
||||
*/
|
||||
class AI
|
||||
{
|
||||
private static string $baseUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lite-latest:generateContent";
|
||||
|
||||
/**
|
||||
* Extract Data from Invoice Image or PDF (Base64)
|
||||
*/
|
||||
public static function extractInvoiceData(string $base64Data, string $mimeType): ?array
|
||||
{
|
||||
$apiKey = env('GEMINI_API_KEY');
|
||||
if (!$apiKey) {
|
||||
error_log('AI Error: GEMINI_API_KEY is missing');
|
||||
return null;
|
||||
}
|
||||
|
||||
$service = new InvoiceExtractionService();
|
||||
$prompt = $service->buildExtractionPrompt();
|
||||
|
||||
$payload = [
|
||||
"contents" => [
|
||||
[
|
||||
"parts" => [
|
||||
["text" => $prompt],
|
||||
[
|
||||
"inline_data" => [
|
||||
"mime_type" => $mimeType,
|
||||
"data" => $base64Data
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
"generationConfig" => [
|
||||
"response_mime_type" => "application/json"
|
||||
]
|
||||
];
|
||||
|
||||
$ch = curl_init(self::$baseUrl . "?key=" . $apiKey);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($httpCode !== 200) {
|
||||
error_log("AI Error: Gemini API returned code $httpCode. Response: " . $response);
|
||||
return null;
|
||||
}
|
||||
|
||||
$result = json_decode($response, true);
|
||||
$textResponse = $result['candidates'][0]['content']['parts'][0]['text'] ?? null;
|
||||
|
||||
if (!$textResponse) return null;
|
||||
|
||||
return json_decode($textResponse, true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user