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

BAB 11

Membuat Tool Pertama untuk AI Agent PHP

Panduan praktis membuat tool pertama untuk AI Agent PHP: merancang JSON Schema, mengimplementasikan class tool, mengujinya secara unit, dan mengintegrasikannya ke dalam Agent.

Terakhir diperbarui:

TL;DR — Ringkasan Membuat Tool Pertama AI Agent PHP

  • ToolInterface: Kontrak OOP wajib dengan dua method kunci: getDefinition() untuk mengekspos skema JSON dan execute() untuk menjalankan kalkulasi PHP lokal.
  • Flow Komunikasi: LLM bertindak sebagai otak yang memilih tool dan merumuskan argumen JSON, sedangkan PHP Runtime bertindak sebagai eksekutor fungsi nyata.
  • Deskripsi Presisi: Kualitas deskripsi pada skema parameters menentukan tingkat akurasi LLM dalam memanggil tool tanpa halusinasi numerik.
  • Defensive Execution: Selalu validasi tipe data input dan lindungi operasi matematika berisiko (seperti pembagian atau modulo dengan nol).

Membuat Tool Kalkulator Pertama untuk AI Agent PHP

Model AI seperti GPT-4 sangat handal dalam memahami bahasa alami, namun sering mengalami halusinasi (*calculation error*) saat dihadapkan pada perhitungan numerik kompleks, persentase multi-langkah, atau manipulasi data presisi. Dalam ekosistem AI Agent PHP, kita mengatasi keterbatasan ini dengan memberikan Tool Pertama berupa kalkulator matematika deterministik berbasis PHP native.

Diagram Alur: Komunikasi OpenAI Function Calling vs PHP ToolInterface
WebP Lossless • 81 KB • Multimodal Ready
Diagram alur kerja interaksi antara OpenAI LLM Function Calling dan PHP ToolInterface: mulai dari user prompt, inferensi tool_calls, eksekusi dinamis pada runtime CalculatorTool PHP, hingga pengembalian payload JSON response
Gambar 11.1: Alur Komunikasi Dua Arah Function Calling & ToolInterface — LLM menganalisis instruksi pengguna, mengirimkan metadata pemanggilan fungsi beserta argumen JSON, PHP mengeksekusi logika kalkulator di runtime lokal, dan mengembalikan hasil akurat untuk sintesis teks akhir.
Arsitektur Eksekusi Function Calling Calculator (ASCII Flow)
Text-Engine & LLM Scraper Ready
+-----------------------------------------------------------------------------------+
|                        PENGGUNA / USER PROMPT                                     |
|           "Hitung berapa 15% dari 2.450.000 + 350.000"                            |
+-----------------------------------------------------------------------------------+
                                         |
                                         v
+-----------------------------------------------------------------------------------+
| OPENAI LLM (Decision & Argument Synthesis)                                        |
|   - Menganalisis kebutuhan aritmatika                                             |
|   - Memilih tool: "calculate"                                                     |
|   - Menghasilkan tool_calls: { operation: "add", a: 367500, b: 350000 }           |
+-----------------------------------------------------------------------------------+
                                         |
                                         v
+-----------------------------------------------------------------------------------+
| PHP AGENT CORE (ToolInterface Dispatcher)                                         |
|   - getDefinition(): Validasi JSON Schema                                         |
|   - execute(args): Panggil App\Tools\CalculatorTool                               |
+-----------------------------------------------------------------------------------+
                                         |
                                         v
+-----------------------------------------------------------------------------------+
| RUNTIME PHP EKSEKUSI (Deterministic Math Evaluation)                              |
|   - (float) $a = 367500; (float) $b = 350000;                                     |
|   - match ($operation) => $result = 717500;                                       |
|   - JSON Response: {"status":"success","result":717500,"expression":"..."}        |
+-----------------------------------------------------------------------------------+
                                         |
                                         v
+-----------------------------------------------------------------------------------+
| LLM FINAL RESPONSE SYNTHESIS                                                      |
|   "Hasil 15% dari 2.450.000 (367.500) ditambah 350.000 adalah 717.500."           |
+-----------------------------------------------------------------------------------+

One-line Takeaway: Diagram teks ASCII memudahkan ekstraksi struktural oleh LLM scraper dan memperkaya konteks semantik halaman.

Implementasi ToolInterface: Kontrak Standar Tool AI Agent PHP

Untuk memastikan modularitas dan kemudahan penambahan (*pluggability*) berbagai tools di masa depan, seluruh tool wajib tunduk pada sebuah interface kontrak standar. Interface ini memisahkan dua tanggung jawab utama: Discovery (skema fungsi untuk LLM) dan Execution (pemrosesan logika PHP):

<?php

namespace App\Tools;

interface ToolInterface
{
    /**
     * Mengembalikan spesifikasi JSON Schema fungsi yang dipahami OpenAI API.
     *
     * @return array{type: string, function: array{name: string, description: string, parameters: array}}
     */
    public function getDefinition(): array;

    /**
     * Mengeksekusi logika komputasi PHP asli saat dipanggil oleh model AI.
     *
     * @param array<string, mixed> $args Argumen terurai dari payload tool_calls
     * @return mixed Hasil evaluasi fungsi yang siap di-serialize ke JSON
     */
    public function execute(array $args): mixed;
}

Implementasi Lengkap Class CalculatorTool di PHP

Berikut adalah implementasi konkrit class CalculatorTool yang mendukung 6 jenis operasi aritmatika dengan proteksi validasi pembagian/modulo nol secara anggun (*graceful error handling*):

<?php

namespace App\Tools;

class CalculatorTool implements ToolInterface
{
    public function getDefinition(): array
    {
        return [
            'type'     => 'function',
            'function' => [
                'name'        => 'calculate',
                'description' => 'Melakukan operasi matematika presisi: penjumlahan, pengurangan, perkalian, pembagian, perpangkatan, dan modulo. Gunakan tool ini untuk setiap kalkulasi numerik agar hasil 100% akurat.',
                'parameters'  => [
                    'type'       => 'object',
                    'properties' => [
                        'operation' => [
                            'type'        => 'string',
                            'enum'        => ['add', 'subtract', 'multiply', 'divide', 'power', 'modulo'],
                            'description' => 'Jenis operasi: add (+), subtract (-), multiply (*), divide (/), power (^), modulo (%)',
                        ],
                        'a' => [
                            'type'        => 'number',
                            'description' => 'Operand pertama (angka kiri)',
                        ],
                        'b' => [
                            'type'        => 'number',
                            'description' => 'Operand kedua (angka kanan)',
                        ],
                    ],
                    'required' => ['operation', 'a', 'b'],
                ],
            ],
        ];
    }

    public function execute(array $args): mixed
    {
        // 1. Validasi & normalisasi tipe data input
        $operation = $args['operation'] ?? '';
        $a         = (float) ($args['a'] ?? 0);
        $b         = (float) ($args['b'] ?? 0);

        // 2. Evaluasi aritmatika deterministik
        return match ($operation) {
            'add'      => ['status' => 'success', 'result' => $a + $b, 'expression' => "$a + $b = " . ($a + $b)],
            'subtract' => ['status' => 'success', 'result' => $a - $b, 'expression' => "$a - $b = " . ($a - $b)],
            'multiply' => ['status' => 'success', 'result' => $a * $b, 'expression' => "$a × $b = " . ($a * $b)],
            'divide'   => $b !== 0.0
                ? ['status' => 'success', 'result' => $a / $b, 'expression' => "$a ÷ $b = " . ($a / $b)]
                : ['status' => 'error', 'message' => 'Pembagian dengan nol (division by zero) tidak diperbolehkan.'],
            'power'    => ['status' => 'success', 'result' => $a ** $b, 'expression' => "$a ^ $b = " . ($a ** $b)],
            'modulo'   => $b !== 0.0
                ? ['status' => 'success', 'result' => fmod($a, $b), 'expression' => "$a % $b = " . fmod($a, $b)]
                : ['status' => 'error', 'message' => 'Modulo dengan nol tidak diperbolehkan.'],
            default    => ['status' => 'error', 'message' => "Operasi matematika '{$operation}' tidak dikenali."],
        };
    }
}
Raw JSON Schema: Definisi OpenAI Function Calling Calculator
Ready to Copy

Salin skema JSON mentah berikut untuk didaftarkan langsung ke parameter tools pada payload OpenAI Chat Completions API atau System Prompt agent Anda:

{
  "type": "function",
  "function": {
    "name": "calculate",
    "description": "Melakukan operasi matematika presisi: penjumlahan, pengurangan, perkalian, pembagian, perpangkatan, dan modulo. Gunakan tool ini untuk setiap kalkulasi numerik agar hasil 100% akurat.",
    "parameters": {
      "type": "object",
      "properties": {
        "operation": {
          "type": "string",
          "enum": ["add", "subtract", "multiply", "divide", "power", "modulo"],
          "description": "Jenis operasi aritmatika yang akan dieksekusi: add (+), subtract (-), multiply (*), divide (/), power (^), modulo (%)"
        },
        "a": {
          "type": "number",
          "description": "Operand pertama (angka kiri)"
        },
        "b": {
          "type": "number",
          "description": "Operand kedua (angka kanan)"
        }
      },
      "required": ["operation", "a", "b"],
      "additionalProperties": false
    },
    "strict": true
  }
}

Schema Takeaway: Penggunaan "strict": true dan "additionalProperties": false menjamin model AI menghasilkan payload argumen yang patuh 100% pada tipe data skema (*Structured Outputs*).

Mengintegrasikan Tool Kalkulator ke dalam Loop AI Agent

Berikut adalah skrip eksekusi run-agent-calculator.php yang mendemonstrasikan bagaimana agent secara cerdas mendeteksi kebutuhan kalkulasi, memanggil CalculatorTool, dan menyusun jawaban komprehensif:

<?php
// run-agent-calculator.php

require_once __DIR__ . '/vendor/autoload.php';

use App\OpenAIClient;
use App\Agent\Agent;
use App\Tools\CalculatorTool;

$client = new OpenAIClient(getenv('OPENAI_API_KEY'));
$agent  = new Agent($client, maxIterations: 5);

// Langkah 1: Daftarkan CalculatorTool ke Agent
$agent->registerTool(new CalculatorTool());

// Langkah 2: Berikan prompt yang membutuhkan kalkulasi presisi
$task = 'Hitung berapa 15% dari 2.450.000 kemudian tambahkan hasilnya dengan 350.000.';

echo "Task Pengguna: {$task}\n\n";
$result = $agent->run($task);

echo "=== JAWABAN FINAL AI AGENT ===\n";
echo $result . "\n";

Pengujian Otomatis CalculatorTool Menggunakan PHPUnit

Dalam standar rekayasa perangkat lunak enterprise (E-E-A-T), setiap tool yang berinteraksi dengan AI Agent wajib diuji secara terisolasi via Automated Unit Testing. Hal ini memastikan tool tidak pernah menghasilkan kalkulasi salah atau memicu fatal exception tak terduga:

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\Tools\CalculatorTool;

class CalculatorToolTest extends TestCase
{
    private CalculatorTool $calculator;

    protected function setUp(): void
    {
        parent::setUp();
        $this->calculator = new CalculatorTool();
    }

    public function test_get_definition_returns_valid_openai_schema(): void
    {
        $schema = $this->calculator->getDefinition();

        $this->assertSame('function', $schema['type']);
        $this->assertSame('calculate', $schema['function']['name']);
        $this->assertContains('operation', $schema['function']['parameters']['required']);
        $this->assertContains('a', $schema['function']['parameters']['required']);
        $this->assertContains('b', $schema['function']['parameters']['required']);
    }

    public function test_addition_calculation_success(): void
    {
        $result = $this->calculator->execute([
            'operation' => 'add',
            'a'         => 367500,
            'b'         => 350000,
        ]);

        $this->assertSame('success', $result['status']);
        $this->assertSame(717500.0, (float) $result['result']);
    }

    public function test_division_by_zero_returns_graceful_error_payload(): void
    {
        $result = $this->calculator->execute([
            'operation' => 'divide',
            'a'         => 5000,
            'b'         => 0,
        ]);

        $this->assertSame('error', $result['status']);
        $this->assertStringContainsString('tidak diperbolehkan', $result['message']);
    }
}

Menjalankan Test Suite via CLI:

./vendor/bin/phpunit tests/Unit/CalculatorToolTest.php --testdox

Best Practices Pengembangan Tool AI Agent PHP

1. Deskripsi Fungsi yang Kaya Semantik: LLM memilih tool murni berdasarkan description. Jelaskan secara eksplisit kapan fungsi harus digunakan dan format angka yang diharapkan.

2. Validasi & Type Casting Ketat: Selalu konversi tipe data (seperti (float) atau (int)) dan validasi batasan nilai argumen sebelum eksekusi.

3. Payload Error Terstruktur: Hindari mematikan script via die() atau melempar fatal exception tak tertangkap. Kembalikan array berisi status: error dan message agar AI dapat melakukan refleksi.

4. Prinsip Single Responsibility: Desain satu class tool untuk satu kapabilitas spesifik guna mencegah ambiguitas pemilihan fungsi pada AI.

FAQ: Pertanyaan Umum Seputar Pembuatan Tool AI Agent PHP

1. Bagaimana cara membuat tool pertama untuk AI Agent PHP?

Ringkasan Jawaban:Buat class PHP yang mengimplementasikan ToolInterface, definisikan skema JSON parameter pada method getDefinition(), dan tulis logika komputasi lokal pada method execute().

Setelah class dibuat, cukup daftarkan instance objek tersebut ke agent menggunakan $agent->registerTool(new CalculatorTool()).

2. Mengapa AI Agent PHP membutuhkan tool kalkulator eksternal?

Ringkasan Jawaban:Large Language Model (LLM) adalah model probabilistik prediksi kata yang rawan mengalami halusinasi aritmatika pada angka besar atau persentase bertingkat.

Dengan mengeksekusi perhitungan pada runtime PHP asli, akurasi perhitungan matematis dijamin 100% presisi dan deterministik.

3. Apa fungsi array required pada definisi JSON Schema tool?

Ringkasan Jawaban:Array required memberitahu model AI argumen mana saja yang wajib diisi sebelum permintaan pemanggilan fungsi (tool_calls) diizinkan.

Jika pengguna belum memberikan parameter yang wajib, model AI akan meminta klarifikasi terlebih dahulu kepada pengguna alih-alih memanggil fungsi dengan data kosong.

4. Bagaimana jika tool PHP mengalami error saat dieksekusi?

Ringkasan Jawaban:Kembalikan payload JSON berupa array dengan status: error dan pesan penjelasan masalah agar model AI dapat membaca kendala tersebut dan melakukan perbaikan mandiri (Self-Correction).

Jangan biarkan script PHP mengeluarkan fatal error atau melempar eksepsi mentah yang dapat menghentikan loop eksekusi otonom agent.

RA

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.