· kaynak dev.to (home feed)
Ollama, listede bulunmayan fonksiyonlara yapılan tool call'ları sessizce atıyor ve boş yanıtlar dönüyor
dev.to'da yayımlanan bir rapor, Ollama 0.40.8'in, fonksiyon adı isteğin tools listesinde bulunmayan tool call'ları sessizce attığını ve hatasız boş yanıtlar döndürdüğünü gösteriyor — üzerinde agent geliştiren herkes için bir tuzak.

dev.to'da yayımlanan bir rapor, Ollama'daki sessiz bir hata modunu belgeliyor: model, isteğin tools listesinde adı bulunmayan bir fonksiyona tool call yaptığında Ollama bu çağrıyı atıyor ve boş bir yanıt döndürüyor. Hata verilmiyor, hiçbir şey loglanmıyor ve token sayısı, çağıranın hiç almadığı bir çıktının üretildiğini gösteriyor.
Belirti
Testte Ollama 0.40.8 kullanıldı; GitHub sürümünden alındı ve atılabilir bir LXC container içinde CPU'da çalıştı, model olarak Ollama kütüphanesinden qwen3:0.6b seçildi. System prompt, modele her sipariş sorusu için lookup_order çağırmasını ve asla hafızasından yanıt vermemesini söylerken, tools listesinde yalnızca get_time vardı. Sekiz çalışmanın tamamında (seed 0'dan 7'ye, temperature 0.7) her yanıt boş geldi: boş bir content string'i, tool_calls alanı yok ve eval_count 25. lookup_order'ın tools listesine eklenmesi sonucu tersine çevirdi — o zaman sekiz yanıtın tamamında çağrı yer aldı. OpenAI uyumlu endpoint aynı şekilde davrandı; finish_reason "stop", content boş ve tool_calls null döndü.
Model çağrıyı üretti
Modelin gerçekte ne ürettiğini görmek için aynı konuşma, modelin şablonunu izleyerek elle yazılmış bir prompt ile /api/generate'a raw modda gönderildi. Çıktı, etiketleriyle sarılmış, lookup_order'ı order_id 48213 ile çağıran eksiksiz ve iyi biçimlendirilmiş bir çağrıydı — ve tam 25 token'dı; her boş yanıtın eval_count değeriyle eşleşiyordu. Model işini yaptı; çağrı Ollama'nın içinde kayboldu.
Parser ne yapıyor
dev.to analizine göre Ollama'nın logu, bu modelin tool call'larının, özel bir parser'ı olmayan modelleri kapsayan — qwen3 kütüphane girişi dahil — genel, şablon tabanlı parser tarafından işlendiğini gösteriyor. v0.40.8'deki tools/tools.go dosyasında parser, çıktı akışında şablonun tool-call etiketini gözetler ve etiket göründüğünde ardından gelen her şeyi buffer'a alır. Sonra buffer'ın başını, isteğin tools listesindeki bir adla eşleştirmeye çalışır. Listede olmayan bir ad hiçbir şeyle eşleşmez, hiçbir call objesi oluşturulmaz ve buffer'daki metin — tool call'un tamamı — ne çağrı olarak yayımlanır ne de düz content olarak aktarılır; böylece yanıt boş kalır. Bu mekanizma her gözlemi açıklıyor: etiket ve çağrı üretildi, token'lar sayıldı ama dışarı hiçbir şey çıkmadı.
Neden fark edilmiyor
Boş bir yanıt modelin suçu gibi görünür. Küçük modeller ara sıra hiçbir şey üretmediği için istemciler token üretilip üretilmediğini kontrol etmek yerine yeniden denemeye ya da boş bir yanıt göstermeye eğilimlidir — yalnızca eval_count bir çıktının var olduğunu ortaya koyar. Listede olmayan bir fonksiyonu çağırmak uç bir örnek gibi görünse de rapor, bunu üreten birkaç sıradan agent desenini listeliyor: isteğe bağlı yüklenen tool'lar, bir tool'un başka bir tool'un açıklamasında ya da system prompt'ta adının geçmesi, bağlam tasarrufu için istek başına kırpılan tools listesi veya modelin konuşmanın önceki bölümlerindeki bir tool'u hatırlaması. Orijinal rapor, listede olmayan tool'un isteğe bağlı sunulduğu bir uygulamadan geldi; gerçek isteklerinin 32 tekrarından 28'i boş döndü. Sunucu tarafı da hiçbir ipucu vermiyor: uyarı yok, olağan dışı bir done_reason yok, atılan bir çağrıya dair bir log satırı yok.
Çözümler
22 Ekim itibarıyla yukarı akış issue'su olan ollama/ollama#19187 hiç yanıt almamış ve bir düzeltme gelmemişti. Pratik önlem, modelin adını anma ihtimali olan her tool'u, uygulaması henüz var olmasa bile, listelemektir. Raportör, boş parametre şemalı girişlerin çağrıların çoğunu (32'de 30) kurtarmaya yettiğini buldu; kontrollü testte ise yalnızca lookup_order'ı listelemek, sekiz yanıtın tamamının çağrıyı döndürmesini sağladı. Tool'ları tembelce yükleyen uygulamalar için önerilen desen, adları baştan bildirmek ve çağrı geldiğinde uygulamayı yüklemektir. Rapor ayrıca sıfırdan büyük bir eval_count ile birlikte gelen her boş yanıtı atılmış bir çağrı saymayı öneriyor — loglayın ve tam tool listesiyle yeniden deneyin. Yazıya eşlik eden bir probe script'i, bu kontrolü yerel bir sunucuya karşı çalıştırmanızı sağlıyor.
Neden önemli
Agent'ları Ollama'ya bağlayan herkes bununla hiç hata görmeden karşılaşabilir: hata hem istemciye hem sunucuya görünmezdir ve suçu model üstlenir. Daha geniş ders her yapılandırılmış çıktı katmanı için geçerlidir — model, beklenen listede olmayan iyi biçimlendirilmiş bir şey yayımladığında ne olacağını sorun ve parser'ın bunun için tanımlı bir yolu olduğunu doğrulayın; çünkü sessizce atmak en kötü sonuçtur: aşağı akıştaki hiçbir şey bunu anlayamaz. İkinci bir alışkanlık, üretilenle döndürüleni karşılaştırmaktır; boş bir yanıtın yanındaki eval_count buradaki teşhisin tamamıdır ve her yanıtta gelir. Yazı ayrıca llama-server'ın Responses API'sindeki ilişkili bir boşluğa dikkat çekiyor; o da tersini yapıp kesik bir tool call'u tamamlanmış olarak raporluyor.
- #ollama
- #llm
- #tool-calling
- #ai-agents
- #local-models
İlgili yazılar
- Açık kaynaklı Omnara, kendi kendine barındırılan yönetilen agent'larını OpenAI ve Anthropic API'lerine karşı konumlandırıyor
- Meta, Muse asistanı 10 milyon kullanıcıyı aşarken yapay zekâ yatırımı için oy hakkı olmayan hisse çıkaracak
- Recursive, büyük ölçüde yapay zekâyla geliştirilen, ücretsiz ve laptoplarda çalışan Flint kodlama modelini duyurdu