Panduan troubleshooting komprehensif untuk AI Agent PHP: mengatasi Error 401 Unauthorized, 429 Rate Limit, Timeout, tool tidak dipanggil, MCP gagal koneksi, JSON tidak valid.
Daftar Isi
- TL;DR: Panduan Cepat Diagnosis Error AI Agent PHP
- Apa Solusi Terbaik untuk Troubleshooting Error AI Agent di PHP?
- Tabel Cepat Diagnosis & Solusi Error AI Agent PHP
- Konfigurasi Monolog JSON Telemetri Error AI Agent
- Error 401 Unauthorized (API Key Tidak Valid)
- Error 429 Too Many Requests (Rate Limit & Kuota)
- cURL Timeout dan 504 Gateway Timeout
- MCP Server Gagal Terkoneksi (Model Context Protocol)
- Tool Tidak Dipanggil oleh AI
- Token Habis (Context Length Exceeded)
- FAQ: Tanya Jawab Error Utama AI Agent PHP
- 1. Bagaimana cara mengatasi Error 401 Unauthorized pada AI Agent PHP?
- 2. Apa langkah penanganan terbaik saat terkena Error 429 Rate Limit?
- 3. Mengapa koneksi MCP Server sering gagal pada lingkungan web server PHP-FPM?
- 4. Bagaimana mencegah cURL Timeout pada AI Agent yang memiliki banyak tools?
Terakhir diperbarui:
TL;DR: Panduan Cepat Diagnosis Error AI Agent PHP
- Error 401 Unauthorized: Kunci API di
.envsalah atau memiliki spasi tersembunyi. - Error 429 Rate Limit: Melebihi kuota TPM/RPM; tangani dengan exponential backoff dan sliding window.
- cURL Timeout 504: Inferensi agen melebihi 30 detik; naikkan
CURLOPT_TIMEOUTdan gunakan async queue. - MCP Gagal Terkoneksi: Masalah pada transport JSON-RPC stdio atau path eksekusi binary PHP.
- Context Length Exceeded: Token prompt melebihi batas model; atasi dengan context sliding window.
Apa Solusi Terbaik untuk Troubleshooting Error AI Agent di PHP?
Direct Answer:Troubleshooting AI Agent PHP berfokus pada isolasi kegagalan pada 5 titik kritis: validasi variabel$_ENV['OPENAI_API_KEY']untuk mencegahHTTP 401, penanganan jeda$delaySecvia exponential backoff padaHTTP 429, konfigurasi opsiCURLOPT_TIMEOUTdanCURLOPT_CONNECTTIMEOUTpadacURL error 28, pemeriksaan stream descriptorproc_open()padaMcpServer, serta pemangkasan array$historypada exceptionContextLengthExceeded.
Dalam panduan ini, setiap kendala teknis dilengkapi akar penyebab (*root cause*), potongan kode penanganan defensif, konfigurasi telemetri Monolog JSON, serta matriks perbaikan cepat yang diselaraskan dengan dokumentasi resmi platform AI.
Tabel Cepat Diagnosis & Solusi Error AI Agent PHP
| Kode Error / Masalah | Akar Penyebab Utama | Langkah Solusi Cepat | Komponen Terkait |
|---|---|---|---|
| Error 401 Unauthorized | API Key salah, kedaluwarsa, atau terdapat spasi di .env | Trimming string .env dan regenerate key di OpenAI Dashboard | OpenAIClient / Environment |
| Error 429 Too Many Requests | Kuota RPM/TPM limit akun habis atau lonjakan request | Gunakan Exponential Backoff dengan Jitter & sliding window | API Gateway / Rate Limiter |
| cURL 28 / HTTP 504 Timeout | Respons ReAct loop memakan waktu > timeout socket cURL | Naikkan CURLOPT_TIMEOUT ke 120s atau delegasikan ke Redis Queue | PHP-FPM / Worker Supervisor |
| MCP Server Gagal Terkoneksi | Path command STDIO salah atau izin eksekusi script ditolak | Verifikasi proc_open transport pipe dan pasang error guard | McpClient / Model Context Protocol |
| Tool Tidak Dipanggil AI | Deskripsi tool terlalu ambigu atau tidak sesuai query | Perjelas docstring tools schema dan set tool_choice: auto | McpServer / System Prompt |
| JSON Parsing Syntax Error | Output LLM memuat teks markdown di luar blok JSON | Ekstraksi regex ```json...``` dan fallback raw string array | Response Parser Helper |
| Context Length Exceeded | Total token dialog history melebihi kapasitas konteks | Terapkan Token Sliding Window & Context Pruning Helper | DatabaseMemory / Tokenizer |

Konfigurasi Monolog JSON Telemetri Error AI Agent
Direct Answer:Perekaman log terstruktur pada AI Agent PHP dikonfigurasi menggunakan driverMonolog\LoggerdenganJsonFormatteruntuk menyimpan konteks lengkap variabel$httpCode, durasi eksekusi$latencyMs, payload argumen$toolPayload, dan metadata$sessionIdke dalam format JSON baris tunggal yang siap diekspor ke Elasticsearch atau Datadog.
Berikut adalah contoh implementasi logger Monolog siap produksi untuk menangkap kejadian 401, 429, dan cURL timeout:
<?php
namespace App\Logging;
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\JsonFormatter;
use Throwable;
class AgentDiagnosticLogger
{
private Logger $logger;
public function __construct(string $logPath = '/home/infokoding/infocoding/writable/logs/ai_agent_error.log')
{
$this->logger = new Logger('ai_agent_telemetry');
// 1. Handler file rotasi harian dengan retensi 14 hari
$handler = new RotatingFileHandler($logPath, 14, Logger::DEBUG);
// 2. Format output sebagai JSON baris tunggal (NDJSON) untuk agregator log
$formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES, true);
$handler->setFormatter($formatter);
$this->logger->pushHandler($handler);
}
/**
* Mencatat detail kegagalan API LLM (401, 429, Timeout) dengan konteks JSON lengkap.
*/
public function logApiFailure(string $endpoint, int $httpCode, string $rawError, array $extraContext = []): void
{
$payload = array_merge([
'timestamp' => date('Y-m-d H:i:s'),
'environment' => $_ENV['CI_ENVIRONMENT'] ?? 'production',
'endpoint' => $endpoint,
'http_code' => $httpCode,
'error_raw' => $rawError,
], $extraContext);
if ($httpCode === 401) {
$this->logger->critical('LLM_AUTH_FAILED: Kunci API tidak valid atau kedaluwarsa.', $payload);
} elseif ($httpCode === 429) {
$this->logger->warning('LLM_RATE_LIMITED: Batas kuota TPM/RPM tercapai, memicu retry.', $payload);
} elseif ($httpCode === 0 || $httpCode === 504) {
$this->logger->error('LLM_SOCKET_TIMEOUT: Sambungan cURL terputus sebelum agen selesai merespons.', $payload);
} else {
$this->logger->error('LLM_UNEXPECTED_ERROR: Terjadi anomali pada pemanggilan LLM.', $payload);
}
}
}Error 401 Unauthorized (API Key Tidak Valid)
Direct Answer:Error401 Unauthorizedterjadi saat kredensial$_ENV['OPENAI_API_KEY']yang disematkan pada headerAuthorization: Bearertidak dikenali oleh gateway OpenAI, memiliki karakter spasi tersembunyi, atau telah dinonaktifkan menurut panduan Dokumentasi Resmi OpenAI Error Codes.
{"error": {"code": "invalid_api_key", "message": "Incorrect API key provided: sk-proj-***"}}Gunakan snippet validasi format kredensial berikut sebelum request dikirim:
<?php
// Validasi sanitasi kunci API OpenAI sebelum runtime
function validateApiKeyPrefix(string $apiKey): string
{
$cleanKey = trim($apiKey);
if (!str_starts_with($cleanKey, 'sk-')) {
throw new \InvalidArgumentException("Format API Key tidak valid. Kunci harus diawali 'sk-'.");
}
return $cleanKey;
}Error 429 Too Many Requests (Rate Limit & Kuota)
Direct Answer:Error429 Too Many Requestsmenandakan agen Anda melampaui batas kecepatan kuota$requestsPerMinute(RPM) atau$tokensPerMinute(TPM) yang diizinkan pada tier akun sesuai spesifikasi Anthropic Rate Limits & Tiering Guide.
{"error": {"code": "rate_limit_exceeded", "message": "You exceeded your current quota, please check your plan."}}Solusi tangguh menggunakan Exponential Backoff dengan Jitter:
<?php
function executeWithExponentialBackoff(callable $callback, int $maxRetries = 3): mixed
{
for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
try {
return $callback();
} catch (\Throwable $e) {
if (str_contains($e->getMessage(), '429') && $attempt < $maxRetries) {
// Formula: 2^attempt + random jitter (0-1 detik)
$delaySec = (2 ** $attempt) + (random_int(100, 1000) / 1000);
usleep((int)($delaySec * 1_000_000));
continue;
}
throw $e;
}
}
throw new \RuntimeException("Batas maksimum retry tercapai.");
}cURL Timeout dan 504 Gateway Timeout
Direct Answer:TimeoutcURL error 28danHTTP 504 Gateway Timeoutterjadi ketika durasi siklus loop$agentLoopmemakan waktu lebih lama daripada konstantaCURLOPT_TIMEOUTdi PHP atau direktiffastcgi_read_timeoutdi Nginx.
Optimasi parameter timeout cURL client:
<?php
// Konfigurasi timeout cURL optimal untuk agen multi-tools
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_CONNECTTIMEOUT => 10, // Maksimal 10 detik untuk handshake
CURLOPT_TIMEOUT => 120, // 120 detik untuk proses ReAct loop penuh
CURLOPT_TCP_KEEPALIVE => 1,
]);MCP Server Gagal Terkoneksi (Model Context Protocol)
Direct Answer:Kegagalan koneksiMcpServerterjadi akibat kesalahan path binary$binaryPathpadaproc_open(), penolakan hak akses berkas, atau ketidaksesuaian format JSON-RPC 2.0 merujuk ke Spesifikasi Resmi Model Context Protocol (MCP).
Berikut adalah penyebab spesifik dan snippet penanganan koneksi MCP defensif di PHP:
- Penyebab 1 (Binary Path): Path command PHP atau Node.js tidak absolut sehingga gagal dieksekusi oleh
proc_open()di lingkungan Nginx/PHP-FPM. - Penyebab 2 (STDIO Buffer Deadlock): Pipe stream terblokir (*deadlock*) karena buffer STDERR penuh sebelum STDOUT sempat dibaca.
- Penyebab 3 (Invalid JSON-RPC Response): Output MCP Server memuat teks peringatan PHP non-JSON (seperti *Deprecated notices*).
<?php
namespace App\MCP;
use RuntimeException;
class SafeMcpTransport
{
/**
* Membuka koneksi STDIO ke server MCP secara aman dengan error guard.
*/
public static function executeMcpCommand(string $binaryPath, string $serverScript, array $jsonPayload): array
{
// 1. Pastikan path executable absolut
if (!file_exists($binaryPath)) {
throw new RuntimeException("Binary runtime tidak ditemukan: {$binaryPath}");
}
$cmd = escapeshellcmd("{$binaryPath} {$serverScript}");
$descriptors = [
0 => ['pipe', 'r'], // STDIN
1 => ['pipe', 'w'], // STDOUT
2 => ['pipe', 'w'], // STDERR
];
$process = proc_open($cmd, $descriptors, $pipes);
if (!is_resource($process)) {
throw new RuntimeException("Gagal menginisialisasi sub-process MCP Server.");
}
// 2. Kirim pesan JSON-RPC
fwrite($pipes[0], json_encode($jsonPayload) . "\n");
fclose($pipes[0]);
// 3. Baca STDOUT & tangkap STDERR
$output = stream_get_contents($pipes[1]);
$errors = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$exitCode = proc_close($process);
if ($exitCode !== 0 || empty($output)) {
throw new RuntimeException("MCP Server crash dengan exit code {$exitCode}. Detail: {$errors}");
}
$decoded = json_decode($output, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException("Respons MCP Server bukan JSON-RPC valid: " . substr($output, 0, 100));
}
return $decoded;
}
}Tool Tidak Dipanggil oleh AI
Direct Answer:Tool tidak dipanggil terjadi akibat deskripsi fungsi$docstringyang kurang jelas, skemaparameters.jsonSchemayang tidak valid, atau ketiadaan instruksi pada parameter$systemPrompt.
Tips perbaikan: Paksa pemanggilan tool spesifik menggunakan tool_choice: {"type": "function", "function": {"name": "target_tool"}} jika task bersifat wajib.
Token Habis (Context Length Exceeded)
Direct Answer:Exceptioncontext_length_exceededterjadi saat akumulasi token dari array$messagesdan output$toolResultsmelampaui kapasitas jendela konteks modelgpt-4o(128.000 token).
{"error": {"code": "context_length_exceeded", "message": "This model maximum context length is 128000 tokens..."}}Potongan kode Context Sliding Window Pruning:
<?php
// Pemangkas riwayat percakapan otomatis berbasis sliding window
function pruneConversationContext(array $history, int $maxAllowedTurns = 8): array
{
if (count($history) <= $maxAllowedTurns) {
return $history;
}
// Ambil N pesan terakhir untuk menjaga batas konteks token
return array_slice($history, -$maxAllowedTurns);
}FAQ: Tanya Jawab Error Utama AI Agent PHP
1. Bagaimana cara mengatasi Error 401 Unauthorized pada AI Agent PHP?
Ringkasan Jawaban:Periksa apakah ada karakter spasi atau newline tersembunyi di file.envAnda, pastikan key diawalisk-, dan lakukan verifikasi ulang di platform dashboard OpenAI bahwa API Key tersebut belum dicabut atau kedaluwarsa.
Gunakan fungsi trim($_ENV["OPENAI_API_KEY"]) saat memuat kredensial ke class client untuk menghindari karakter whitespace yang tidak sengaja terbawa.
2. Apa langkah penanganan terbaik saat terkena Error 429 Rate Limit?
Ringkasan Jawaban:Terapkan algoritma Exponential Backoff dengan Jitter agar request melakukan jeda waktu bertahap (misal: 2 detik, 4 detik, 8 detik) sebelum mencoba ulang, serta pasang rate limiting lokal di aplikasi Anda.
Jika batas akun sering terlampaui di lingkungan produksi, pertimbangkan untuk menaikkan Tier akun OpenAI Anda dari Tier 1 ke Tier 2/3.
3. Mengapa koneksi MCP Server sering gagal pada lingkungan web server PHP-FPM?
Ringkasan Jawaban:Karena environment web server PHP-FPM sering kali tidak memiliki variabel PATH shell yang sama dengan CLI. Gunakan selalu absolute path (misal:/usr/bin/phpatau/usr/bin/node) saat memanggilproc_open.
Pastikan juga direktori kerja memiliki izin baca-tulis yang memadai untuk user www-data atau user virtualhost terkait.
4. Bagaimana mencegah cURL Timeout pada AI Agent yang memiliki banyak tools?
Ringkasan Jawaban:Naikkan CURLOPT_TIMEOUT ke 120 detik, aktifkan fastcgi_read_timeout 120s pada konfigurasi Nginx, atau pisahkan eksekusi task panjang ke sistem asynchronous queue worker (seperti Redis + Supervisor).Dengan async queue, browser pengguna tidak akan terkena blocking HTTP 504 saat agen mengeksekusi banyak tool secara berurutan.
- Logging Forensik adalah Kunci: Catat setiap tool call dan error response ke log terstruktur Monolog untuk mempercepat investigasi bug.
- Resiliensi Transaksi API: Lindungi endpoint dengan retry exponential backoff, timeout proporsional, dan circuit breaker.
- Kontrol Batas Memori: Gunakan sliding window context pruning agar memori dialog tidak pernah memicu token overflow.
Rusmawan Abdullah Sani
Lead Software Engineer & System Architect
Praktisi pengembangan backend PHP modern, arsitektur AI Agent, microservices, dan otomasi server Linux. Terhubung melalui profil LinkedIn.