Sebelum memulai praktik, pastikan Anda telah memahami konsep dasar pada materi kelas AI Agent & PHP di infokoding.

BAB 8

Membuat AI Agent Pertama

Membangun AI Agent pertama dari nol dengan PHP: mendefinisikan struktur Agent class, goal, planning multi-step, execution loop dengan OpenAI API, dan siklus reflection.

Terakhir diperbarui:

TL;DR (Ringkasan Cepat)

  • AI Agent adalah class PHP dengan loop: Plan → Execute → Reflect → Repeat.
  • Agent menerima goal dari user, kemudian secara mandiri menentukan langkah-langkah pencapaiannya.
  • Max iterations penting untuk mencegah agent berjalan tanpa henti (infinite loop).
  • Reflection membantu agent mengevaluasi apakah goal sudah tercapai atau perlu iterasi lagi.

Struktur Class Agent

<?php

namespace App\Agent;

use App\OpenAIClient;

class Agent
{
    private OpenAIClient $client;
    private array $tools = [];
    private array $messages = [];
    private int $maxIterations;
    private string $systemPrompt;

    public function __construct(
        OpenAIClient $client,
        string $systemPrompt = '',
        int $maxIterations = 10
    ) {
        $this->client        = $client;
        $this->maxIterations = $maxIterations;
        $this->systemPrompt  = $systemPrompt ?: $this->defaultSystemPrompt();
    }

    private function defaultSystemPrompt(): string
    {
        return '''Kamu adalah AI Agent yang cerdas dan efisien.

INSTRUKSI:
1. Analisis goal yang diberikan user secara teliti.
2. Rencanakan langkah-langkah untuk mencapai goal tersebut.
3. Gunakan tools yang tersedia jika diperlukan.
4. Evaluasi setiap hasil sebelum melanjutkan ke langkah berikutnya.
5. Beri tahu user ketika goal sudah tercapai dengan jelas.

Selalu jawab dalam Bahasa Indonesia.''';
    }

    public function registerTool(object $tool): self
    {
        $this->tools[] = $tool;
        return $this;
    }

    /**
     * Jalankan agent dengan goal tertentu.
     */
    public function run(string $goal): string
    {
        // Inisialisasi percakapan
        $this->messages = [
            ['role' => 'system', 'content' => $this->systemPrompt],
            ['role' => 'user',   'content' => "Goal: $goal"],
        ];

        $toolDefinitions = $this->buildToolDefinitions();
        $finalResponse   = '';

        for ($i = 0; $i < $this->maxIterations; $i++) {
            echo "[Iterasi " . ($i + 1) . "]\n";

            // Kirim ke AI
            $response = $this->client->chat($this->messages, $toolDefinitions);
            $message  = $response['choices'][0]['message'];

            // Tambahkan respons AI ke history
            $this->messages[] = $message;

            // Cek apakah ada tool yang dipanggil
            if (!empty($message['tool_calls'])) {
                $this->handleToolCalls($message['tool_calls']);
                continue; // Lanjut iterasi setelah tool dieksekusi
            }

            // Tidak ada tool call = AI sudah memberikan jawaban akhir
            $finalResponse = $message['content'] ?? '';

            // Cek apakah goal sudah tercapai
            if ($this->isGoalAchieved($finalResponse)) {
                break;
            }
        }

        return $finalResponse;
    }

    private function handleToolCalls(array $toolCalls): void
    {
        foreach ($toolCalls as $toolCall) {
            $toolName = $toolCall['function']['name'];
            $args     = json_decode($toolCall['function']['arguments'], true);

            echo "  → Memanggil tool: $toolName\n";

            // Eksekusi tool
            $result = $this->executeTool($toolName, $args);

            // Tambahkan hasil tool ke messages
            $this->messages[] = [
                'role'         => 'tool',
                'tool_call_id' => $toolCall['id'],
                'content'      => json_encode($result),
            ];
        }
    }

    private function executeTool(string $name, array $args): mixed
    {
        foreach ($this->tools as $tool) {
            if (method_exists($tool, $name)) {
                return $tool->$name(...array_values($args));
            }
        }
        return ['error' => "Tool $name tidak ditemukan"];
    }

    private function isGoalAchieved(string $response): bool
    {
        // Bisa dikembangkan dengan logika yang lebih canggih
        return !empty($response);
    }

    private function buildToolDefinitions(): array
    {
        // Akan diisi di bab berikutnya
        return [];
    }
}

Menjalankan Agent Pertama

<?php
// run-agent.php
require_once __DIR__ . '/vendor/autoload.php';

$config = require __DIR__ . '/config/config.php';
$client = new App\OpenAIClient($config['openai_api_key']);
$agent  = new App\Agent\Agent($client, maxIterations: 5);

$result = $agent->run('Buatkan saya ringkasan singkat tentang keunggulan PHP 8.3 dibandingkan PHP 7.');

echo "\n=== HASIL AGENT ===\n";
echo $result . "\n";

Poin Kunci Bab 8

Kita baru saja membangun kerangka AI Agent pertama! Di bab-bab selanjutnya, kita akan menambahkan tools sehingga agent tidak hanya "berpikir" tapi juga bisa "bertindak" — mengakses database, membaca file, dan memanggil API.