Today, we’ll use OpenAI’s GPT API to generate human-readable summaries from our Laravel audit logs — making them easier to understand for non-technical users or managers.
🧠 Step 1: Install OpenAI SDK
composer require openai-php/laravel
Publish the config:
php artisan vendor:publish --tag="openai-config"
Set your .env
:
OPENAI_API_KEY=sk-xxxx...
📝 Step 2: Create a GPT summarizer helper
Create app/Helpers/AuditSummaryHelper.php
:
namespace App\Helpers;
use OpenAI\Laravel\Facades\OpenAI;
class AuditSummaryHelper
{
public static function summarizeLogs(array $logs): string
{
$descriptions = collect($logs)->map(function ($log) {
return "- " . $log->created_at->format('Y-m-d H:i') . ": {$log->description} by " . optional($log->causer)->name;
})->implode("\n");
$prompt = <<<PROMPT
You are an audit assistant. Summarize the following Laravel audit logs in plain English:
$descriptions
Summary:
PROMPT;
$response = OpenAI::chat()->create([
'model' => 'gpt-4o',
'messages' => [
['role' => 'user', 'content' => $prompt],
],
'max_tokens' => 300,
]);
return $response->choices[0]->message->content ?? 'No summary generated.';
}
}
📄 Step 3: Add “Summarize” button to dashboard
In your audit_logs/index.blade.php
, add a form:
<form method="POST" action="{{ route('audit.logs.summary') }}" class="mb-4">
@csrf
<button class="bg-green-500 text-white px-3 py-1 rounded">Summarize This Page</button>
</form>
📡 Step 4: Add summary route and controller method
In web.php
:
Route::post('/audit-logs/summary', [\App\Http\Controllers\AuditLogController::class, 'summarize'])->name('audit.logs.summary');
In AuditLogController.php
:
use App\Helpers\AuditSummaryHelper;
use Spatie\Activitylog\Models\Activity;
public function summarize(Request $request)
{
$logs = Activity::with('causer')->latest()->take(20)->get();
$summary = AuditSummaryHelper::summarizeLogs($logs);
return back()->with('summary', $summary);
}
✅ Step 5: Show the summary in the view
At the top of index.blade.php
, add:
@if(session('summary'))
<div class="bg-yellow-100 text-yellow-800 p-3 rounded mb-4">
<strong>GPT Summary:</strong><br>
{!! nl2br(e(session('summary'))) !!}
</div>
@endif
You’ll now see something like:
GPT Summary:
On June 4th, Admin updated 5 vehicle renewals and deleted 1 expired customer plan. No suspicious actions detected.
✅ Tomorrow (Day 4), we’ll use GPT to detect anomalies and suspicious user behavior automatically.