Laravel ile AI Görev Yönetimi ve Bütçe Kontrolü
İlk AI çağrınız için bütçe kontrolü olmadan başlamak sorun olmayabilir; ancak sonra işler hızlandığında, bütçelerinizi aşma riski doğar. Özellikle bir istemci tüm trafiğin on katını gönderdiğinde, bunun farkına varmak bir ayı bitirdikten sonra mümkün olabilir. Bu riski yönetmek için laravel-ai-tasks paketi, bütçe aşımını durdurmak amacıyla iki ayrı kontrol mekanizması sunar.
İki Kontrol, Tek Amaç
Sadece ilk çağrıyı kontrol etmek, gerçek maliyeti bilmeden yeterli değildir. Örneğin, bir istemci bütçesinin 2 dolar altında olabilir; fakat gönderilen istek 5 dolar tutabilir. Burada ilk kontrol sadece bir bütçe uyarısı olacaktır.
Bu nedenle paket, iki aşamalı kontrol uygular:
| Kontrol | Ne Zaman | Kullanım |
|---|---|---|
| Pre-flight | Sağlayıcı çağrısından önce | Aylık harcama |
| Post-call | Gerçek maliyet |
Her iki kontrol de BudgetExceededException fırlatır. Her yol altında çalışır: AI::send(), AI::stream(), ve kuyruklu işler.
İstemci Başına Sınırlandırma Yapılandırması
// config/ai-tasks.php
'budgets' => [
'default' => ['monthly_usd' => 100.0],
'tenant-abc' => ['monthly_usd' => 50.0],
],
Bir istemci için bir giriş yoksa, varsayılan sınıra geri döner. Belirtilmiş bir varsayılan yoksa, o zaman limit yoktur; bütçeleme opsiyoneldir.
Örnek Durum: Destek Talepleri Yönetimi
Gerçek trafik başladığında bütçeler önem kazanır. Genellikle her gelen destek talebi öncelikle üç AI çağrısından geçer: özetleme, anahtar kelime çıkarımı ve kategori sınıflandırması. Üç farklı görev sınıfı aynı yapıya sahiptir:
class SummarizeTextTask extends AiTask
{
public function __construct(
private readonly string $text,
private readonly int $maxWords = 50,
) {}
public function toPayload(): AiPayload
{
return new AiPayload(
modality: 'text',
messages: [new UserMessage($this->text)],
systemPrompt: "Summarize in at most {$this->maxWords} words. Only the summary.",
options: ['temperature' => 0.2],
);
}
public function postprocess(AiResponse $resp): array|AiResponse
{
return ['ok' => $resp->ok, 'summary' => trim($resp->content ?? ''), 'usage' => $resp->usage];
}
}
Gerçek bir talep üzerinde yapılan üç çağrının örneği şu şekildedir:
| Görev | Sonuç |
|---|---|
| SummarizeTextTask | “Order #48213 for a wireless keyboard hasn’t arrived; tracking hasn’t updated. Considering a refund for a client demo.” — 100 in / 24 out tokens, cost 2.94e-5 |
| ExtractKeywordsTask | [“wireless keyboard”, “order 48213”, “tracking page”, “support chat”, “refund”] |
| ClassifyContentTask | {“category”: “business”, “confidence”: 0.9} |
Her bir talep başına maliyet $0.0002 gibi görünse de, ayda 10.000 talep ile bu yaklaşık $2’ye dönüşmektedir. Bütçe kontrolleri, bu görünmeyen maliyetleri yakalayabilmek için kritik öneme sahiptir.
Harcama Kontrolü Yapmadan Sorgu Yazmadan Kontrol Etme
Her çağrı, ai_runs tablosunda kaydedilir, böylece şu komutla harcamanızı kontrol edebilirsiniz:
php artisan ai:budget default
Bu komut, ay içindeki harcamanızı gösterir.
Neden Bu Önemli?
Bütçe kontrolü genellikle beklenmeyen faturadan sonra eklenir ve bu noktada tekrar kodu düzeltmek gerekir. Oysa burada yapısal olarak her dağıtımda aynı iki kontrol uygulanır, her çalıştırma bir müşteriye atanır ve durumu kontrol etmek sadece tek bir komut haline gelir.
İlgili kaynaklar:
- GitHub: fomvasss/laravel-ai-tasks
- Packagist: packagist.org/packages/fomvasss/laravel-ai-tasks
Kaynak: Orijinal Makale


