Panduan praktis & terstruktur cara membuat AI Agent otonom berbasis PHP & CodeIgniter 4. Dilengkapi arsitektur ReAct, Tool Calling, integrasi LLM API, serta proteksi keamanan CSRF & Prepared Statements.
Dipublikasikan: | Terakhir diperbarui:
Kecerdasan Buatan (AI) telah berkembang pesat dari sekadar chatbot interaktif menjadi AI Agent Otonom yang mampu berpikir, mengambil keputusan, dan mengeksekusi instruksi kompleks secara mandiri. Meskipun Python sering dianggap sebagai bahasa utama pengembangan AI, PHP 8.2+ dan CodeIgniter 4 terbukti menjadi kombinasi yang sangat andal, cepat, dan hemat sumber daya untuk membangun AI Agent skala produksi.
Ringkasan Eksekutif (TL;DR)
- Arsitektur Utama: Menggunakan pola ReAct (Reasoning + Acting) untuk memungkinkan AI menentukan tools yang harus dieksekusi secara dinamis.
- Performa & Framework: CodeIgniter 4 berfungsi sebagai ai agent framework php yang sangat ringan (< 2MB per request), cepat, dan responsif untuk API polling & webhook AI Agent.
- Standard Keamanan: Integrasi penuh dengan CI4 Validation Service, Prepared Statements (mencegah SQL Injection), dan Proteksi CSRF Token.
- Fleksibilitas LLM: Dapat dihubungkan dengan berbagai provider LLM seperti OpenAI (GPT-4o), Google Gemini 1.5 Pro, maupun Model Open-Source lokal (Ollama / Llama 3).
Repository Source Code AI Agent CodeIgniter 4
Dapatkan source code lengkap AI Agent CodeIgniter 4, Tool Registry, & contoh integrasi ReAct loop siap pakai di GitHub.
Daftar Isi Artikel (Table of Contents)
1. Apa Itu AI Agent & Mengapa Menggunakan CodeIgniter 4?
Berbeda dari integrasi LLM biasa yang hanya menghasilkan respons teks statis, AI Agent dilengkapi dengan kemampuan Tool Calling dan Memory Loop. AI Agent dapat membaca database, memangil API pihak ketiga, mengeksekusi logika bisnis, hingga mengembalikan hasil akhir kepada pengguna.
Mengapa memilih CodeIgniter 4 untuk membangun AI Agent di lingkungan PHP?
- ⚡ Eksekusi Super Cepat: CI4 memiliki waktu booting tercepat di antara framework PHP populer lainnya, mengurangi latency saat pemanggilan REST client API LLM.
- 🔒 Keamanan Bawaan: Fitur WAF, CSRF Filter, XSS Sanitization, dan Input Validation siap pakai tanpa dependensi berat.
- 🛠️ Service Layer Modular: Memudahkan pemisahan antara logika Agent Engine, Tool Registry, dan Controller API.
2. Arsitektur ReAct & LLM Tool Calling PHP
Pola ReAct (Reasoning and Acting) adalah arsitektur paling populer dalam pengembangan AI Agent. Agent mengevaluasi permintaan pengguna, memutuskan aksi (tool) yang perlu dipanggil, mengamati output eksekusi tool tersebut, lalu mengulangi proses hingga jawaban akhir ditemukan.
Diagram Flow Arsitektur ReAct AI Agent & LLM Tool Calling PHP pada CodeIgniter 4
3. PHP AI Agent Tutorial: Implementasi CodeIgniter 4
Berikut adalah struktur implementasi lengkap untuk membuat AI Agent di CodeIgniter 4 secara bersih dan mudah dirawat (clean architecture):
Langkah 1: Membuat Tool Interface & Registry
Buat kontrak interface untuk setiap tool yang dapat dieksekusi oleh AI Agent di app/Services/AiAgent/ToolInterface.php:
<?php
namespace App\Services\AiAgent;
interface ToolInterface
{
/**
* Nama unik tool yang dikenali LLM
*/
public function getName(): string;
/**
* Deskripsi fungsi tool untuk panduan reasoning LLM
*/
public function getDescription(): string;
/**
* Skema parameter input (JSON Schema)
*/
public function getParameters(): array;
/**
* Eksekusi logika tool
*/
public function execute(array $args): array;
}
Langkah 2: Membuat Concrete Tool (Database Tool Aman)
Buat tool untuk mengecek data di database secara aman menggunakan CodeIgniter Query Builder di app/Services/AiAgent/Tools/DatabaseTool.php:
<?php
namespace App\Services\AiAgent\Tools;
use App\Services\AiAgent\ToolInterface;
use Config\Database;
class DatabaseTool implements ToolInterface
{
public function getName(): string
{
return 'get_user_stats';
}
public function getDescription(): string
{
return 'Mengambil statistik jumlah transaksi dan total belanja pengguna berdasarkan User ID.';
}
public function getParameters(): array
{
return [
'type' => 'object',
'properties' => [
'user_id' => [
'type' => 'integer',
'description' => 'ID unik pengguna di database'
]
],
'required' => ['user_id']
];
}
public function execute(array $args): array
{
$userId = (int) ($args['user_id'] ?? 0);
if ($userId <= 0) {
return ['status' => 'error', 'message' => 'User ID tidak valid'];
}
$db = Database::connect();
// Menggunakan Prepared Statement / Query Binding bawaan CI4 untuk keamanan 100%
$row = $db->table('transactions')
->select('COUNT(id) as total_trx, SUM(total_amount) as total_spent')
->where('user_id', $userId)
->get()
->getRowArray();
return [
'status' => 'success',
'user_id' => $userId,
'total_trx' => (int) ($row['total_trx'] ?? 0),
'total_spent' => (float) ($row['total_spent'] ?? 0)
];
}
}
Langkah 3: Core Engine LLM Tool Calling PHP
Buat Engine utama AI Agent di app/Services/AiAgent/AiAgentEngine.php yang bertugas mengelola ReAct loop dan komunikasi API:
<?php
namespace App\Services\AiAgent;
use CodeIgniter\HTTP\CURLRequest;
use Config\Services;
class AiAgentEngine
{
private array $tools = [];
private string $apiKey;
private CURLRequest $client;
public function __construct()
{
$this->apiKey = env('OPENAI_API_KEY', '');
$this->client = Services::curlrequest();
}
public function registerTool(ToolInterface $tool): void
{
$this->tools[$tool->getName()] = $tool;
}
/**
* Method helper HTTP Request dengan Exponential Backoff Retry Loop (Menangani HTTP 429 & 5xx)
*/
private function requestWithRetry(string $url, array $payload, int $maxRetries = 3): ?array
{
$attempt = 0;
$delay = 1; // Detik awal
while ($attempt < $maxRetries) {
$response = $this->client->post($url, [
'headers' => [
'Authorization' => 'Bearer ' . $this->apiKey,
'Content-Type' => 'application/json',
],
'json' => $payload,
'http_errors' => false
]);
$statusCode = $response->getStatusCode();
if ($statusCode === 200) {
return json_decode($response->getBody(), true);
}
// Retry jika terkena Rate Limit Exceeded (HTTP 429) atau Server Error (5xx)
if ($statusCode === 429 || $statusCode >= 500) {
$attempt++;
if ($attempt >= $maxRetries) {
break;
}
sleep($delay);
$delay *= 2; // Exponential delay: 1s, 2s, 4s...
continue;
}
// Error otentikasi / bad request (400, 401, 403) - Hentikan retry
break;
}
return null;
}
public function run(string $userPrompt): string
{
if (empty($this->apiKey)) {
return 'API Key belum dikonfigurasi pada file .env!';
}
$formattedTools = [];
foreach ($this->tools as $tool) {
$formattedTools[] = [
'type' => 'function',
'function' => [
'name' => $tool->getName(),
'description' => $tool->getDescription(),
'parameters' => $tool->getParameters(),
]
];
}
$messages = [
['role' => 'system', 'content' => 'Anda adalah AI Agent berpengalaman di CodeIgniter 4. Gunakan tools jika membutuhkan data faktual.'],
['role' => 'user', 'content' => $userPrompt]
];
// ReAct Loop: Maksimal 3 iterasi eksekusi tool
for ($i = 0; $i < 3; $i++) {
$payload = [
'model' => 'gpt-4o-mini',
'messages' => $messages,
'tools' => $formattedTools,
];
// Eksekusi API via helper Retry
$result = $this->requestWithRetry('https://api.openai.com/v1/chat/completions', $payload);
$choice = $result['choices'][0]['message'] ?? null;
if (!$choice) {
return 'Gagal menerima respon dari server LLM setelah retry.';
}
if (!empty($choice['tool_calls'])) {
$messages[] = $choice; // Simpan konteks keputusan LLM
foreach ($choice['tool_calls'] as $toolCall) {
$fnName = $toolCall['function']['name'];
$fnArgs = json_decode($toolCall['function']['arguments'], true) ?? [];
if (isset($this->tools[$fnName])) {
$toolOutput = $this->tools[$fnName]->execute($fnArgs);
$messages[] = [
'role' => 'tool',
'tool_call_id' => $toolCall['id'],
'content' => json_encode($toolOutput)
];
}
}
} else {
return $choice['content'] ?? 'Tidak ada respon.';
}
}
return 'Batas iterasi reasoning tercapai.';
}
}
Langkah 4: Controller & Validasi Input Strict
Buat Controller app/Controllers/AiAgentController.php untuk menangani endpoint request dari frontend secara aman:
<?php
namespace App\Controllers;
use App\Services\AiAgent\AiAgentEngine;
use App\Services\AiAgent\Tools\DatabaseTool;
use CodeIgniter\HTTP\ResponseInterface;
class AiAgentController extends BaseController
{
public function index(): string
{
return view('ai_agent/index', [
'title' => 'Demo AI Agent CodeIgniter 4'
]);
}
public function process(): ResponseInterface
{
// 1. Validasi Input Strict & Filter XSS
$rules = [
'prompt' => 'required|min_length[3]|max_length[1000]'
];
if (!$this->validate($rules)) {
return $this->response->setJSON([
'status' => 'error',
'errors' => $this->validator->getErrors()
])->setStatusCode(400);
}
$prompt = esc($this->request->getPost('prompt'));
// 2. Inisialisasi Engine & Registrasi Tools
$engine = new AiAgentEngine();
$engine->registerTool(new DatabaseTool());
// 3. Eksekusi Agent
$answer = $engine->run($prompt);
return $this->response->setJSON([
'status' => 'success',
'answer' => $answer
]);
}
}
4. Perbandingan Performa Framework (Benchmark)
Berikut adalah tabel perbandingan performa saat menjalankan AI Agent ReAct Loop pada berbagai framework backend:
| Metrik Performa | CodeIgniter 4.5+ | Laravel 11 | Python FastAPI |
|---|---|---|---|
| Boot Memory Footprint | ∼ 1.8 MB | ∼ 12.5 MB | ∼ 28.0 MB |
| Average Response Time Overhead | < 15 ms | ∼ 45 ms | ∼ 20 ms |
| Integrasi Database Native | Query Builder Lightweight | Eloquent ORM | SQLAlchemy / Peewee |
| Kemudahan Security Audit | Sangat Mudah (Strict Binding) | Sangat Mudah | Sedang (Perlu lib eksternal) |
6. Streaming Respon AI (SSE) & Manajemen Memory Percakapan di CodeIgniter 4
Dalam aplikasi AI Agent skala produksi, dua fitur lanjutan yang sangat vital untuk meningkatkan User Experience (UX) dan menjaga konteks dialog adalah Server-Sent Events (SSE) Streaming dan Conversation Memory (Session / Redis).
A. Streaming Respon Real-Time dengan Server-Sent Events (SSE)
Mengabaikan waktu tunggu (latency) respons LLM dengan menampilkan kata demi kata (token streaming) secara instan kepada pengguna. Di CodeIgniter 4, kita dapat mengkonfigurasi response header text/event-stream dan mematikan buffer output HTTP:
<?php
namespace App\Controllers;
use CodeIgniter\HTTP\ResponseInterface;
class AiStreamController extends BaseController
{
public function stream()
{
$prompt = esc($this->request->getGet('prompt'));
if (empty($prompt)) {
return $this->response->setStatusCode(400)->setJSON(['error' => 'Prompt wajib diisi']);
}
// 1. Set Header khusus Server-Sent Events (SSE) & matikan Nginx/Apache Buffering
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no'); // Penting untuk Server Nginx
// 2. Bersihkan output buffer PHP bawaan
while (ob_get_level() > 0) {
ob_end_flush();
}
// 3. Panggil API OpenAI dengan opsi 'stream' => true
$ch = curl_init('https://api.openai.com/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . env('OPENAI_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'model' => 'gpt-4o-mini',
'messages' => [['role' => 'user', 'content' => $prompt]],
'stream' => true,
]),
CURLOPT_WRITEFUNCTION => function ($ch, $data) {
echo $data;
flush(); // Dorong chunk data secara instan ke browser
return strlen($data);
}
]);
curl_exec($ch);
curl_close($ch);
exit();
}
}
B. Menyimpan Histori Percakapan (Session & Redis Memory)
Agar AI Agent mampu mengingat konteks dari instruksi sebelumnya, simpan riwayat percakapan menggunakan CodeIgniter 4 Session Service atau Redis Cache Driver dengan teknik Sliding Window (misal: menyimpan 10 pesan terakhir):
<?php
namespace App\Services\AiAgent;
use Config\Services;
class ConversationMemoryManager
{
private $session;
public function __construct()
{
$this->session = Services::session();
}
/**
* Mengambil riwayat percakapan dari Session / Redis
*/
public function getHistory(string $sessionId): array
{
return $this->session->get('agent_chat_' . $sessionId) ?? [];
}
/**
* Menambahkan pesan baru ke memori dengan limit sliding window
*/
public function pushMessage(string $sessionId, string $role, string $content, int $maxHistory = 10): void
{
$key = 'agent_chat_' . $sessionId;
$history = $this->session->get($key) ?? [];
$history[] = [
'role' => $role, // 'user' atau 'assistant'
'content' => $content,
'time' => date('Y-m-d H:i:s')
];
// Pertahankan hanya N percakapan terakhir (Sliding Window Memory)
if (count($history) > $maxHistory) {
$history = array_slice($history, -$maxHistory);
}
$this->session->set($key, $history);
}
}
5. Best Practices Keamanan AI Agent
Saat mendeploy AI Agent ke lingkungan produksi, perhatikan 4 pilar keamanan utama berikut:
- Mitigasi Prompt Injection: Jangan pernah memasukkan input mentah dari user langsung ke sistem prompt tanpa sanitasi. Gunakan
esc()dan CI4 Validation. - Prinsip Least Privilege Database: Batasi hak akses kredensial MySQL yang digunakan oleh Database Tool (gunakan user DB read-only jika hanya untuk query laporan).
- Rate Limiting & CSRF: Aktifkan Throttler Filter di
app/Config/Filters.phpuntuk mencegah serangan DoS pada API LLM Anda. - Manajemen Environment Variable: Simpan seluruh Secret Keys di file
.envdan jangan pernah melakukan commit API key ke repository Git.
7. Integrasi Vector Database (Pgvector / Qdrant) & RAG
Untuk mengizinkan AI Agent membaca dokumen internal (seperti PDF manual, pengetahuan bisnis, atau basis data pengetahuan besar), teknik Retrieval-Augmented Generation (RAG) digunakan bersama Vector Database.
Ekosistem PHP 8.3+ dapat dengan mudah dihubungkan ke PostgreSQL (Extension pgvector) atau Qdrant Vector Search Engine untuk menyimpan dan melakukan pencarian kemiripan vektor (Cosine Similarity / Vector Distance):
Contoh Implementasi Pgvector Query di CodeIgniter 4
Berikut adalah cara membuat Tool Vector Search untuk mencari konteks dokumen paling relevan menggunakan PostgreSQL pgvector di PHP:
<?php
namespace App\Services\AiAgent\Tools;
use App\Services\AiAgent\ToolInterface;
use Config\Database;
class VectorSearchTool implements ToolInterface
{
public function getName(): string
{
return 'search_knowledge_base';
}
public function getDescription(): string
{
return 'Mencari informasi dokumen internal perusahaan berdasarkan pencarian semantik (Vector Embedding).';
}
public function getParameters(): array
{
return [
'type' => 'object',
'properties' => [
'query' => [
'type' => 'string',
'description' => 'Kata kunci atau pertanyaan topik yang dicari dalam dokumen'
]
],
'required' => ['query']
];
}
public function execute(array $args): array
{
$queryText = trim($args['query'] ?? '');
if (empty($queryText)) {
return ['error' => 'Query tidak boleh kosong'];
}
// 1. Generate Vector Embedding via API OpenAI (model text-embedding-3-small)
$vectorArray = $this->generateEmbedding($queryText);
$vectorString = '[' . implode(',', $vectorArray) . ']';
// 2. Query Pencarian Cosine Similarity ke PostgreSQL (pgvector operator <=>)
$db = Database::connect('pgsql');
$sql = "SELECT id, title, content, 1 - (embedding <=> ?::vector) AS similarity
FROM document_embeddings
ORDER BY similarity DESC
LIMIT 3";
$results = $db->query($sql, [$vectorString])->getResultArray();
return [
'status' => 'success',
'query' => $queryText,
'matches' => $results
];
}
private function generateEmbedding(string $text): array
{
$client = \Config\Services::curlrequest();
$response = $client->post('https://api.openai.com/v1/embeddings', [
'headers' => [
'Authorization' => 'Bearer ' . env('OPENAI_API_KEY'),
'Content-Type' => 'application/json'
],
'json' => [
'model' => 'text-embedding-3-small',
'input' => $text
]
]);
$json = json_decode($response->getBody(), true);
return $json['data'][0]['embedding'] ?? [];
}
}
Frequently Asked Questions (FAQ)
Apakah CodeIgniter 4 siap untuk menangani AI Agent di skala produksi?
Sangat siap. CodeIgniter 4 memiliki performa I/O yang cepat, memori footprint kecil, dan fitur keamanan bawaan seperti Prepared Queries dan CSRF Protection yang ideal untuk menangani ribuan request AI Agent secara efisien.
Bisakah AI Agent di CodeIgniter 4 menggunakan model selain OpenAI?
Tentu saja. Anda dapat menghubungkannya dengan Google Gemini API, Anthropic Claude, maupun model open-source lokal seperti Llama 3 via Ollama hanya dengan mengarahkan endpoint REST client CURLRequest di AiAgentEngine.
Bagaimana cara mencegah AI Agent mengeksekusi perintah SQL berbahaya?
Selalu gunakan fungsi $db->table()->where() dengan query binding di CodeIgniter 4 dan jangan pernah mengizinkan AI Agent merangkai query SQL mentah secara bebas dari prompt pengguna.
Rusmawan Abdullah Sani
DevOps Engineer & Lead Developer at infokodingPraktisi pengembangan web, DevOps, dan keamanan jaringan server Linux dengan pengalaman mengelola infrastruktur cloud server berskala produksi. Berfokus membagikan panduan teknis mendalam tentang administrasi server, otomasi deployment, dan tutorial programming di infokoding.com.