<p>Yüklenmiş dosyaları doğrudan geçebilirsiniz. SDK, bunları sağlayıcıya doğru formatta göndermeyi yönetir. Daha büyük dosyalarla uğraşıyorsanız, yüklemeleri yönetirken <a href="https://dev.to/blog/handling-large-file-uploads-in-laravel-without-crashing-your-server">büyük dosya yüklemeleri yönetme hakkındaki kılavuzuma</a> göz atabilirsiniz.</p>

<p>Ayrıca birden fazla dosya ekleyebilirsiniz:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>$result = (new DocumentAnalyzer)->prompt(
'Compare these two documents and highlight the differences.',
attachments: [
    $request->file('document_v1'),
    $request->file('document_v2'),
],

);

<p>Gerçekten bu kadar. Hiçbir base64 kodlama, AI sağlayıcı tarafında çok parçalı form yönetimi yok. Sadece dosyaları geçin.</p>

<h2>
    <a name="step-4-stream-the-response" href="#step-4-stream-the-response"></a>
    4. Adım: Yanıtı Akıtın
</h2>

<p>AI yanıtları hakkında bir gerçek var. Kullanıcılar 5-10 saniye boyunca yüklenme simgesine bakmaktan hoşlanmaz. ChatGPT tarzı bir deneyim beklerler; metin kademeli olarak görünür olmalıdır. Taylor, bu yayında özellikle buna vurgu yaptı. Akış, önceliklerden biri çünkü kullanıcılar artık bunu bekliyor.</p>

<p> <code>-&gt;prompt()</code> metodunu <code>-&gt;stream()</code> ile değiştirin:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>use App\Ai\Agents\DocumentAnalyzer;

Route::post(‘/analyze’, function (Request $request) {
return (new DocumentAnalyzer)->stream(
‘Analyze this document.’,
attachments: [$request->file(‘document’)],
)->then(function ($response) {
// Bu akış tamamlandığında çalışır
// Veritabanına kaydet, bildirim gönder, ne varsa
logger(‘Analysis complete’, [
‘summary’ => $response->summary,
]);
});
});

<p><code>-&gt;stream()</code> metodu bir SSE (sunucu-tarafından gönderilen olaylar) yanıtı döndürür. Ön uçta, stack’inize bağlı olarak bunu kullanabilirsiniz:</p>

<ul>
    <li><strong>Livewire</strong>: <code>wire:stream</code> direktifini kullanın</li>
    <li><strong>Vue/React ile Inertia</strong>: <code>useStream</code> kancasını kullanın</li>
    <li><strong>Vanilla JS</strong>: Standart <code>EventSource</code> API'si</li>
</ul>

<p><code>-&gt;then()</code> geri çağırması oldukça kullanışlıdır. Tüm parçalar akıtıldıktan sonra çalışır. Sonucu veritabanınıza kaydetmek veya bildirim göndermek için mükemmel bir yerdir. Şema kullanıyorsanız, yapılandırılmış çıktı özelliklerine de erişiminiz olur.</p>

<p>Şunu itiraf etmeliyim ki, ön uçta SSE’i ayarlamak geçmişte sinir bozucuydu. Yeniden bağlanma, parçaları ayrıştırma, tarayıcı uyumluluğu ile uğraşma. SDK, arka uç kısmını tamamen soyutlamaktadır. Ön uç hala kurulumunuza bağlı olarak biraz çalışmaya ihtiyaç duysa da, kendi akış uç noktanızı oluşturmak kadar acı verici değil.</p>

<h2>
    <a name="step-5-write-tests" href="#step-5-write-tests"></a>
    5. Adım: Test Yazın
</h2>

<p>Bu bölüm çoğu eğitimin atlattığı kısmı. Atlama.</p>

<p>AI özelliklerini test etmek gerçekten zordu. Yanıtlar deterministik değil. Modelin iki kez aynı metni döndüreceğini garanti edemezsiniz. Taylor, SDK için bunu öncelikli hale getirdi çünkü topluluğun AI entegrasyonları ile ilgili testleri genellikle göz ardı ettiğini hissetti.</p>

<p>Çözüm temiz:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><?php 

use App\Ai\Agents\DocumentAnalyzer;
use App\Ai\Schemas\AnalysisResult;

test(‘it analyzes a document and returns structured output’, function () {
DocumentAnalyzer::fake(new AnalysisResult(
summary: ‘The document covers Q4 sales performance.’,
topics: [‘revenue’, ‘growth’],
sentiment: 8,
actionItems: [‘Review pricing’],
));

$response = $this->postJson('/analyze', [
    'document' => UploadedFile::fake()->create('report.pdf', 100),
]);

$response->assertOk();
$response->assertJsonFragment([
    'summary' => 'The document covers Q4 sales performance.',
]);

});

<p><code>DocumentAnalyzer::fake()</code> ajan çağrısını keser ve ona verdiğiniz her şeyi döndürür. Hiçbir API çağrısı yok. Gevşek test yok. CI çalışmaları sırasında OpenAI kredilerinizi yakmadan.</p>

<p>Belirli bir yanıt olmadan da sahteleyebilirsiniz, sadece ajanın çağrıldığını doğrulamak istiyorsanız:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>DocumentAnalyzer::fake();

<p>Bu, eskiden yaptıklarımdan çok daha iyi. StudyLab’da, test suite’imde <code>MockOpenAiClient</code> sınıfımda 200’den fazla yanıt düzeneği vardı. Tüm bunlar şimdi <code>Agent::fake()</code> ile tek bir satır.</p>

<h2>
    <a name="bonus-queue-it-for-background-processing" href="#bonus-queue-it-for-background-processing"></a>
    Bonus: Arka Plan İşlemesi için Kuyruklayın
</h2>

<p>Her analiz gerçek zamanlı olarak gerçekleşmek zorunda değil. Belki de belgelerin bir partisini gece işliyorsanız. Veya yükelemekte olduğunuz dosya çok büyük ve kullanıcıyı bekletmek istemiyorsunuz.</p>

<p>SDK doğrudan Laravel’in kuyruk sistemine entegre eder:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>(new DocumentAnalyzer)->queue(
'Analyze this quarterly report in detail.',
attachments: [$storedFilePath],

)->then(function ($response) use ($document) {
$document->update([
‘summary’ => $response->summary,
‘topics’ => $response->topics,
‘analyzed_at’ => now(),
]);

$document->user->notify(new AnalysisComplete($document));

})->catch(function (Throwable $e) use ($document) {
logger()->error(“Analysis failed for document {$document->id}”, [
‘error’ => $e->getMessage(),
]);
});

<p><code>-&gt;queue()</code> metodu bir arka plan işi gönderir. Kullanıcı hemen bir yanıt alır ("Belgelerinizi işliyoruz") ve analiz arka planda gerçekleşir. İş tamamlandığında <code>-&gt;then()</code> geri çağırması çalışır. Bir şey ters giderse, <code>-&gt;catch()</code> bunu yönetir.</p>

<p>Ağırlıklı AI iş yükleri çalıştırıyorsanız, <a href="https://dev.to/blog/laravel-queue-jobs-processing-10000-tasks-without-breaking">kuyruk işleri olmadan 10.000 görev işleme</a> konusundaki yazım altyapı kısmını kapsamaktadır.</p>

<p>Bir şey daha var: sağlayıcı yedekliliği. Üretimde AI özellikleri kullanıyorsanız ve çalışma süresi önemliyse, birden fazla sağlayıcıyla:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>$result = (new DocumentAnalyzer)->prompt(
'Analyze this document.',
provider: ['openai', 'anthropic'],

);

<p>OpenAI kapandığında veya oran sınırlaması uygulandığında otomatik olarak Anthropic’a geçer. Özel bir tekrar mantığına ihtiyaç yok.</p>

<h2>
    <a name="whats-next" href="#whats-next"></a>
    Sırada Ne Var?
</h2>

<p>Temel iş akışını inceledik: ajanlar, yapılandırılmış çıktı, ekler, akış, test etme ve kuyruklama. Ancak SDK’daki daha çok şey var. <code>RemembersConversations</code> ile konuşma belleği, anlamsal arama için vektör depoları, <code>FileSearch</code> ve <code>WebSearch</code> gibi yerleşik araçlar, görüntü oluşturma, metinden konuşmaya, transkripsiyona kadar.</p>

<p>Yayında, Josh aslında Claude Code kullanarak sıfırdan bir sesli asistan inşa etti. Sesli girişi transkripte etti, yerel markdown dosyalarını bağlam olarak sorguladı ve ElevenLabs metinden konuşmaya dönüştürmesiyle yanıt verdi. Tüm bunları SDK kullanarak yaptı. Yaklaşık 30 dakika sürdü, AI çoğu kodlama işini üstlendi.</p>

<p>SDK hala erken aşamada (v0.x), bu yüzden özelliklerin hızlıca gelecek olmasını bekleyin. Ajan orkestrasyonu (ajanların diğer ajanlara çağrı yapması) şimdilik desteklenmiyor ama yol haritasında bulunuyor. <a href="https://laravel.com/docs/12.x/ai-sdk" target="_blank" rel="noopener noreferrer">Resmi belgelere</a> ve <a href="https://github.com/laravel/ai" target="_blank" rel="noopener noreferrer">GitHub reposuna</a> güncellemeler için göz atmayı unutmayın.</p>

<h2>
    <a name="faq" href="#faq"></a>
    SSS
</h2>

<h3>
    <a name="can-i-use-this-with-anthropic-or-gemini-instead-of-openai" href="#can-i-use-this-with-anthropic-or-gemini-instead-of-openai"></a>
    Anthropic veya Gemini ile bunun yerine OpenAI kullanabilir miyim?
</h3>

<p>Evet. SDK’nın amaçlarından biri sağlayıcı soyutlamasıdır. Sağlayıcıyı <code>.env</code> dosyanızda değiştirebilir veya doğrudan yanıt alırken geçirebilirsiniz. Ajan kodunuz aynı kalır.</p>

<h3>
    <a name="is-the-laravel-ai-sdk-free" href="#is-the-laravel-ai-sdk-free"></a>
    Laravel AI SDK ücretsiz mi?
</h3>

<p>SDK kendisi ücretsizdir ve MIT lisanslıdır. AI sağlayıcılarının API maliyetlerini (OpenAI, Anthropic vb.) ödeyeceksiniz. Ücretsiz denemek istiyorsanız, yerel bir model ile Ollama kullanabilirsiniz.</p>

<h3>
    <a name="how-does-this-compare-to-prism-php" href="#how-does-this-compare-to-prism-php"></a>
    Bu Prism PHP ile nasıl karşılaştırılır?
</h3>

<p>SDK aslında alt yapıda Prism üzerinde inşa edilmiştir. Taylor, ilişkiyi "sorgu oluşturucu ve Eloquent" gibi tanımladı. Prism, size daha düşük seviyeli API çağrılarını sunar. SDK, ajanlar, yapılandırılmış çıktı, konuşma belleği, test yardımları ve daha sıkı Laravel entegrasyonu ekler.</p>

<h3>
    <a name="can-agents-call-other-agents" href="#can-agents-call-other-agents"></a>
    Ajanlar diğer ajanları çağırabilir mi?
</h3>

<p>Henüz değil. Ajan orkestrasyonu (bir ana ajanın alt ajana devretmesi) mevcut sürümde yok. Tartışıldı ve gelecekteki bir sürümde muhtemelen gelecek.</p>

<h3>
    <a name="does-it-work-with-ollama-for-local-development" href="#does-it-work-with-ollama-for-local-development"></a>
    Yerel geliştirme için Ollama ile çalışıyor mu?
</h3>

<p>Evet. Ollama desteklenen bir sağlayıcıdır. Kurun, bir model indirin ve yapılandırmanızı ona yönlendirin. API kredilerini harcamadan geliştirmek için mükemmel.</p>

<h2>
    <a name="wrapping-up" href="#wrapping-up"></a>
    Sonuç
</h2>

<p>Yaklaşık 30 dakikada <code>composer require</code> ile başlayıp çalışır bir belge analizörü oluşturduk; yapılandırılmış çıktı, dosya lampası, akış ve test kapsamı dahil. Ek olarak arka plan işlemesi ve sağlayıcı yedekliliği bonusu.</p>

<p>Laravel AI SDK, AI'yi uygulamanızın temel bir özelliği haline getiriyor, HTTP çağrıları ve string ayrıştırma ile eklenmiş bir şey değil. Laravel’de AI ile ilgili herhangi bir şey inşa ediyorsanız, artık bu bir başlangıç noktası.</p>

<p>AI destekli bir ürün yapıyorsanız ve hızlı bir şekilde yola çıkmanız gerekiyorsa, fikirden çalışır MVP'ye geçmenize yardımcı oluyorum. <a href="https://hafiz.dev/#contact" target="_blank" rel="noopener noreferrer">Konuşalım</a>.</p>

Kaynak: Orijinal Makale

Bu Makaleyi Paylaş