SEJATIDIMEDIA Logo
Tersedia Sesi Konsultasi Gratis
SejatiDimedia Logo

Menggunakan Prism PHP untuk Abstraksi Provider AI

Artikel ini mengenalkan Prism PHP, package yang memberikan satu interface konsisten untuk banyak provider AI, alih-alih menulis kode custom per provider. Dibahas cara instalasi, penggunaan dasar, menulis ulang service class chatbot dari Part 3 pakai message chain milik Prism, membuat provider bisa dikonfigurasi lewat .env, fitur bawaan yang berguna seperti retry dan pelacakan usage, sampai kapan sebenarnya perlu pakai Prism dibanding manggil API langsung.

Timur Dian Radha Sejati

Timur Dian Radha Sejati

Founder SejatiDimedia•15 September 2026•5 menit baca
Silabus Seri Rekayasa

Laravel & AI Integration

Menghubungkan Laravel dengan model AI sekarang makin gampang, tapi bikin fiturnya stabil dan hemat resource itu cerita lain. Seri ini fokus ngebahas arsitektur praktis integrasi AI di Laravel: mulai dari manajemen queue untuk task berat, implementasi RAG sederhana, parsing structured output, sampai tips ngamanin API cost biar nggak boncos

Lihat Silabus Lengkap
Menggunakan Prism PHP untuk Abstraksi Provider AI

Di dua artikel sebelumnya, kita bikin sendiri class

PLAINTEXT Snippetplaintext
1
AiService
1 baris•9 chars
UTF-8•Spaces: 4
yang langsung komunikasi ke API OpenAI, lalu ditambahkan method terpisah untuk Claude. Itu jalan, tapi kamu mungkin sudah sadar ada masalahnya: setiap provider punya format request sendiri, header sendiri, dan struktur response sendiri. Kalau nanti mau tambah Gemini, Mistral, atau Groq, kamu harus bikin lagi method custom untuk masing-masing.

Ini persis masalah yang diselesaikan Prism PHP. Prism kasih satu interface yang konsisten untuk komunikasi dengan berbagai provider AI, jadi ganti provider cukup ubah satu baris kode, bukan tulis ulang semuanya.

Apa Itu Prism PHP

Prism adalah package Laravel open source yang dibuat khusus untuk kerja dengan LLM. Daripada manggil API mentah masing-masing provider sendiri, kamu tulis kode sekali pakai syntax fluent milik Prism, dan Prism yang urus detail spesifik tiap provider di belakang layar.

Saat ini Prism mendukung provider seperti OpenAI, Anthropic, Gemini, Mistral, Groq, DeepSeek, Ollama, xAI, dan beberapa lainnya, lengkap dengan fitur streaming, tool calling, dan structured output.

Langkah 1: Install Prism

Jalankan ini di project Laravel kamu:

Terminalbash
1
composer require prism-php/prism
1 baris•32 chars
UTF-8•Spaces: 4

Lalu publish file config-nya:

Terminalbash
1
php artisan vendor:publish --provider="Prism\Prism\PrismServiceProvider"
1 baris•72 chars
UTF-8•Spaces: 4

Ini akan bikin file

PLAINTEXT Snippetplaintext
1
config/prism.php
1 baris•16 chars
UTF-8•Spaces: 4
, tempat API key untuk masing-masing provider dikonfigurasi. Buka file itu dan pastikan key-nya diambil dari
PLAINTEXT Snippetplaintext
1
.env
1 baris•4 chars
UTF-8•Spaces: 4
, mirip seperti yang kita lakukan di Part 2:

ENV Snippetenv
1
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
2
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxx
2 baris•76 chars
UTF-8•Spaces: 4

Langkah 2: Penggunaan Dasar

Ini contoh paling sederhana, generate respons teks pakai Claude dari Anthropic:

script.phpphp
1
use Prism\Prism\Facades\Prism;
2
use Prism\Prism\Enums\Provider;
3
 
4
$response = Prism::text()
5
->using(Provider::Anthropic, 'claude-3-5-sonnet-20241022')
6
->withPrompt('Jelaskan apa itu dependency injection dengan bahasa sederhana.')
7
->asText();
8
 
9
echo $response->text;
9 baris•274 chars
UTF-8•Spaces: 4

Mau pakai OpenAI sebagai gantinya? Tinggal ubah satu baris:

script.phpphp
1
$response = Prism::text()
2
->using(Provider::OpenAI, 'gpt-4o-mini')
3
->withPrompt('Jelaskan apa itu dependency injection dengan bahasa sederhana.')
4
->asText();
4 baris•169 chars
UTF-8•Spaces: 4

Perhatikan, sisa kodenya tetap sama persis. Inilah inti dari pakai Prism: kode aplikasimu nggak perlu tahu atau peduli provider mana yang sebenarnya menjawab request itu.

Langkah 3: Bangun Ulang Chatbot Kita Pakai Prism

Mari tulis ulang

PLAINTEXT Snippetplaintext
1
AiService
1 baris•9 chars
UTF-8•Spaces: 4
dari Part 3 pakai Prism, gantikan pemanggilan HTTP manual. Prism sudah punya dukungan bawaan untuk message chain, yang pas banget buat riwayat percakapan chatbot kita.

AiService.phpphp
1
<?php
2
3
namespace App\Services;
4
5
use Prism\Prism\Facades\Prism;
6
use Prism\Prism\Enums\Provider;
7
use Prism\Prism\ValueObjects\Messages\UserMessage;
8
use Prism\Prism\ValueObjects\Messages\AssistantMessage;
9
use Prism\Prism\Exceptions\PrismException;
10
use Illuminate\Support\Facades\Log;
11
12
class AiService
13
{
14
public function chat(array $history): ?string
15
{
16
$messages = array_map(function ($message) {
17
return $message['role'] === 'user'
18
? new UserMessage($message['content'])
19
: new AssistantMessage($message['content']);
20
}, $history);
21
22
try {
23
$response = Prism::text()
24
->using(Provider::OpenAI, 'gpt-4o-mini')
25
->withMessages($messages)
26
->asText();
27
28
return $response->text;
29
} catch (PrismException $e) {
30
Log::error('Prism AI request failed', ['error' => $e->getMessage()]);
31
32
return null;
33
}
34
}
35
}
35 baris•973 chars
UTF-8•Spaces: 4

Controller dan view dari Part 3 tidak perlu diubah sama sekali. Ini keuntungan dari menaruh logika AI di balik service class sejak awal: providernya bisa ganti di belakang layar tanpa menyentuh bagian lain dari aplikasimu.

Langkah 4: Ganti Provider Lewat Config, Bukan Kode

Untuk project beneran, lebih baik bikin provider dan model-nya bisa dikonfigurasi, bukan hardcode, supaya kamu bisa ganti provider lewat

PLAINTEXT Snippetplaintext
1
.env
1 baris•4 chars
UTF-8•Spaces: 4
tanpa menyentuh kode:

ENV Snippetenv
1
AI_PROVIDER=openai
2
AI_MODEL=gpt-4o-mini
2 baris•39 chars
UTF-8•Spaces: 4
script.phpphp
1
use Prism\Prism\Enums\Provider;
2
 
3
$provider = match (config('services.ai.provider')) {
4
'anthropic' => Provider::Anthropic,
5
'openai' => Provider::OpenAI,
6
default => Provider::OpenAI,
7
};
8
 
9
$response = Prism::text()
10
->using($provider, config('services.ai.model'))
11
->withMessages($messages)
12
->asText();
12 baris•320 chars
UTF-8•Spaces: 4

Sekarang ganti dari OpenAI ke Claude di production cukup dengan ubah config dan deploy, bukan ubah kode.

Fitur Tambahan yang Kamu Dapat Gratis dari Prism

Beberapa fitur yang perlu kamu tahu karena akan kita pakai di artikel-artikel berikutnya:

  • PLAINTEXT Snippetplaintext
    1
    withSystemPrompt()
    1 baris•18 chars
    UTF-8•Spaces: 4
    , untuk mengatur perilaku atau persona AI terpisah dari isi percakapan.
  • PLAINTEXT Snippetplaintext
    1
    withClientOptions(['timeout' => 30])
    1 baris•36 chars
    UTF-8•Spaces: 4
    , untuk set timeout dengan cara yang sama seperti yang kita lakukan manual di Part 2.
  • PLAINTEXT Snippetplaintext
    1
    withClientRetry(3, 100)
    1 baris•23 chars
    UTF-8•Spaces: 4
    , untuk otomatis retry kalau request-nya gagal.
  • Data usage response, lewat
    PLAINTEXT Snippetplaintext
    1
    $response->usage->promptTokens
    1 baris•30 chars
    UTF-8•Spaces: 4
    dan
    PLAINTEXT Snippetplaintext
    1
    $response->usage->completionTokens
    1 baris•34 chars
    UTF-8•Spaces: 4
    , berguna untuk melacak biaya.

Apakah Selalu Harus Pakai Prism?

Belum tentu. Kalau kamu memang cuma akan pakai satu provider terus dan nggak butuh fleksibilitas multi-provider, manggil API langsung pakai HTTP client Laravel (seperti yang kita lakukan di Part 2) sudah cukup dan dependency-nya lebih sedikit.

Prism jadi berguna kalau:

  • Kamu mau kasih user pilihan provider atau model AI-nya sendiri
  • Kamu butuh fallback gampang kalau satu provider lagi down
  • Kamu bikin fitur tool calling atau structured output (yang ditangani Prism dengan baik)
  • Kamu memang malas maintain kode khusus provider untuk setiap integrasi

Selanjutnya

Sekarang ganti provider sudah gampang, kita bisa fokus ke fitur yang lebih advanced. Di artikel selanjutnya, kita akan bangun sistem RAG (Retrieval Augmented Generation) sederhana, supaya AI-nya bisa jawab pertanyaan berdasarkan dokumen atau data milikmu sendiri, bukan cuma dari training umumnya.


Ini adalah Part 4 dari series "Laravel + AI Integration".

Topik Terkait:LaravelArchitecture
Timur Dian Radha Sejati

Timur Dian Radha Sejati

Penulis & Lead Engineer

Software engineer dan konsultan sistem di SejatiDimedia. Berfokus pada perancangan arsitektur berkinerja tinggi, refactoring backend skala enterprise, hingga pengembangan aplikasi mobile, web modern dan integrasi AI.

Punya Masalah Arsitektur atau Ingin Membangun Sistem yang Benar?

Kami siap membantu mengaudit kode, me-refactor arsitektur yang lemot, atau membangun aplikasi bisnis Anda dengan standar enterprise sejak awal.

EKSPLORASI LANJUTAN

Artikel Rekayasa Terkait

Lihat Semua
Streaming Respons AI di Laravel (SSE)
Backend, AI
5 menit baca

Streaming Respons AI di Laravel (SSE)

Sekarang, chatbot kita nunggu AI-nya selesai generate seluruh respons dulu baru ditampilkan di layar. Untuk jawaban pendek ini nggak masalah, tapi untuk respons yang panjang, user cuma bengong lihat loading kosong selama beberapa detik. Itu bukan pengalaman yang enak, dan ini salah satu alasan kenapa tool seperti ChatGPT nampilin teks muncul kata demi kata, bukan langsung semuanya sekaligus. Efek kata-demi-kata itu disebut streaming. Di artikel ini, kita akan implementasikan itu di Laravel pakai Server-Sent Events (SSE), yang setup-nya lebih sederhana dibanding WebSocket dan sudah cukup untuk kebanyakan use case chatbot.

Baca Artikel
Membangun Sistem RAG Sederhana dengan Laravel + Vector Database
Backend, AI
6 menit baca

Membangun Sistem RAG Sederhana dengan Laravel + Vector Database

Sejauh ini chatbot kita cuma bisa jawab berdasarkan apa yang sudah diketahui model AI-nya dari training. Coba tanya soal dokumentasi internal perusahaanmu, harga spesifik produkmu, atau catatan rapat minggu lalu, AI-nya nggak akan bisa jawab, karena memang nggak pernah dilatih dengan data itu. Di sinilah RAG berperan, singkatan dari Retrieval Augmented Generation. Daripada cuma mengandalkan data training model, kita ambil dulu potongan-potongan relevan dari dokumen kita sendiri, lalu kasih itu ke AI sebagai konteks sebelum kita ajukan pertanyaan. Di artikel ini, kita akan bangun versi sederhana dari ini pakai Laravel dan PostgreSQL dengan extension pgvector.

Baca Artikel
Membangun Chatbot Sederhana dengan Laravel + LLM API
Backend, AI
5 menit baca

Membangun Chatbot Sederhana dengan Laravel + LLM API

Artikel ini mengembangkan service AI dasar dari Part 2 menjadi chatbot yang bisa mengingat riwayat percakapan. Dibahas kenapa API LLM itu stateless, cara update service class agar menerima seluruh riwayat pesan, membuat chat controller dan view Blade sederhana dengan penyimpanan di session, sampai catatan praktis soal batasan session dan cara menangani batas token saat percakapan makin panjang.

Baca Artikel