- LLM 0.26, CLI ve Python kütüphanesinde OpenAI, Anthropic, Gemini ve Ollama yerel modellerine Python fonksiyonlarıyla oluşturulan araçları bağlamayı mümkün kılan büyük bir sürüm
- Araçlar eklenti olarak kurulup
--tool/-T name_of_tool ile çağrılabiliyor; ayrıca --functions ile geçici Python fonksiyonları komut satırından doğrudan geçirilerek kullanılabiliyor
- Yerleşik
llm_version, llm_time araçlarının yanı sıra simpleeval, QuickJS, SQLite ve Datasette eklentileri sunuluyor; model, başarısız bir çağrıdan sonra şema sorgulama ya da farklı bir ifade kullanma yoluyla yeniden deneyebiliyor
- Python API’sindeki yeni
model.chain(), araç çağrısı isteklerini algılayıp çalıştırıyor ve sonuçları tekrar modele iletiyor; hem senkron fonksiyonları hem de asyncio araçlarını destekliyor
- Birden fazla tedarikçinin araç kullanımı ve fonksiyon çağırma yöntemleri yakınsadıkça bu uygulama mümkün hale geldi; sıradaki işler eklenti genişletme, daha fazla model eklentisi desteği ve Model Context Protocol istemci desteği
LLM 0.26’da araç çalıştırma desteği
- LLM 0.26, projenin başlangıcından bu yana en büyük özellik olarak araç desteğini ekledi
- LLM CLI ve Python kütüphanesi üzerinden OpenAI, Anthropic, Gemini ve Ollama yerel modellerine Python fonksiyonları olarak ifade edilebilen araçlara erişim izni verilebiliyor
- Yeni araç eklentileri kurularak kullanılmakta olan modele yeni yetenekler eklenebiliyor
- Temel kullanım biçimi dört başlıkta toplanıyor
- Eklenti aracı kurulup
--tool/-T name_of_tool ile yükleniyor
--functions seçeneğiyle Python fonksiyon kodu doğrudan komut satırına veriliyor
- Python API’de de
tools=[locals] gibi yöntemlerle araçlar geçirilebiliyor
- Araçlar hem asenkron hem de senkron bağlamlarda çalışıyor
CLI’da araç çalıştırma
- En güncel LLM
uv tool install llm ile kurulabilir; mevcut kurulumlar uv tool upgrade llm ile yükseltilebilir
- OpenAI kullanım örneğinde API anahtarı
llm keys set openai ile ayarlandıktan sonra şöyle çalıştırılıyor
llm --tool llm_version "What version?" --td
llm_version, LLM’e dahil edilmiş basit bir demo aracıdır; --tool llm_version bu aracı modele açar
--tool birden çok kez belirtilebilir; kısa seçenek olan -T de kullanılabilir
--td, --tools-debug kısaltmasıdır ve araç çağrısı ile yanıt bilgilerini çıktılayarak iç işleyişin görülmesini sağlar
- Varsayılan model genellikle
gpt-4o-minidir; örnekte llm models default gpt-4.1-mini ile varsayılan değer gpt-4.1-mini olarak değiştiriliyor
-m seçeneğiyle farklı bir model belirtilebilir; o4-mini ile yerleşik llm_time aracının birlikte çalıştırıldığı bir örnek de var
llm --tool llm_time "What time is it?" --td -m o4-mini
llm_time aracının yanıtında utc_time, utc_time_iso, local_timezone, local_time, timezone_offset, is_dst gibi alanlar yer alıyor
Birden fazla model ve eklentide davranış
- Araçları destekleyen model eklentilerinde de aynı komut kalıbı kullanılabiliyor
- Anthropic Claude Sonnet 4 örneği şu akışı kullanıyor
llm install llm-anthropic -U
llm keys set anthropic
llm --tool llm_version "What version?" --td -m claude-4-sonnet
- Google Gemini 2.5 Flash örneği şu akışı kullanıyor
llm install llm-gemini -U
llm keys set gemini
llm --tool llm_version "What version?" --td -m gemini-2.5-flash-preview-05-20
- Ollama ile çalıştırılan
qwen3:4b de basit bir aracı çalıştırabiliyor
qwen3:4b, 2,6 GB boyutunda küçük bir modeldir
ollama pull qwen3:4b
llm install 'llm-ollama>=0.11a0'
llm --tool llm_version "What version?" --td -m qwen3:4b
Matematik, JavaScript, SQLite ve Datasette araç eklentileri
- Büyük sayı çarpımı gibi LLM’lerin zayıf kaldığı işler, araç çağrısıyla tamamlanabiliyor
- llm-tools-simpleeval, Daniel Fairhead’in simpleeval kütüphanesini dışa açıyor
- simpleeval, “Simple Safe Sandboxed Extensible Expression Evaluator for Python” kütüphanesidir
- Basit Python ifadelerini çalıştırmak için yeterince sağlam bir sandbox sağlar
- Hesaplama örneği şöyle çalıştırılıyor
llm install llm-tools-simpleeval
llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
- Örnek çalıştırmada model önce
1234 * 4346 / 32414 hesaplayarak 165.45208860368976 değerini elde ediyor; sqrt(...) tanımlı olmadığı için başarısız olduktan sonra ** 0.5 biçimine çevirip 12.862818066181678 sonucunu alıyor
- Yayımlanmış dört araç eklentisi var
Datasette araç kutusu ve hatadan sonra yeniden deneme
- Datasette eklentisi, içinde birden fazla araç bulunan bir araç kutusu biçiminde çalışır
- Araç kutusu, constructor ile yapılandırılabilen bir eklentidir
- Kullanım örneği şöyle
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
Datasette("https://datasette.io/content"), eklentiye kullanılacak Datasette instance URL’sini iletir
- Bu örnek, Datasette web sitesini çalıştıran content database üzerinde çalışır
- Model üç çağrı yapar
- İlkinde
SELECT name, stars FROM repos ORDER BY stars DESC LIMIT 1 sorgusunu tahmin eder ancak stars sütunu olmadığı için başarısız olur
- Hatayı aldıktan sonra
Datasette_schema() aracıyla veritabanı şemasını sorgular
- Şemaya dayanarak doğru sorguyu kurar ve çalıştırır
- Nihai yanıta göre en çok yıldıza sahip depo
datasette olup 10.020 stars değerine sahiptir
--functions ile geçici araç oluşturma
--functions seçeneği, eklentilere kıyasla daha az yapılandırılmış bir geçici araç kullanım biçimi sunar
- Komut satırına doğrudan Python kod bloğu verildiğinde, içinde tanımlanan fonksiyonlar modelin kullanabileceği araçlara dönüşür
- Blog arama aracı örneği,
httpx ile arama sayfasını çağırıp HTML’i olduğu gibi modele döndürerek şöyle çalışır
llm --functions '
import httpx
def search_blog(q):
"Search Simon Willison blog"
return httpx.get("https://simonwillison.net/search/", params={"q": q}).content
' --td 'Three features of sqlite-utils' -s 'use Simon search'
- Uygulama arama sayfası HTML’ini olduğu gibi geri döndürme şeklindedir ama çalışır
- GPT-4.1 ailesinin 1 milyon token işleyebildiği için kaba HTML’i de kaldırabileceği düşünülüyor
- Sistem prompt’una
use Simon search eklenmelidir; böylece model kendi başına yanıt vermek yerine sağlanan arama aracını kullanır
- Daha iyi bir arama aracı için daha ayrıntılı yönergeler ve arama sonuçlarının ilgili snippet’ları gerekir
- Örnek sonuçta
sqlite-utils özellikleri olarak CLI ve Python kütüphanesi birleşimi, alter=True ile otomatik sütun ekleme ve eklenti desteği çıkıyor
Python API’de araç desteği
- LLM hem bir CLI aracı hem de bir Python kütüphanesidir; 0.26 ile Python API’ye de araç desteği eklendi
- Örnek, “strawberry” içindeki
r harflerinin sayısını bir fonksiyon aracıyla çözüyor
import llm
def count_char_in_text(char: str, text: str) -> int:
"How many times does char appear in text?"
return text.count(char)
model = llm.get_model("gpt-4.1-mini")
chain_response = model.chain(
"Rs in strawberry?",
tools=[count_char_in_text],
after_call=print
)
for chunk in chain_response:
print(chunk, end="", flush=True)
after_call=print, önceki --td seçeneğinde olduğu gibi araç çağrısını görmenin bir yoludur
- Yeni
model.chain() metodu model.prompt() ile benzerdir; ancak dönen araç çağrısı isteklerini algılar, çalıştırır ve sonuçla birlikte modeli tekrar çağırır
model.chain(), nihai yanıtı vermeden önce birden fazla yanıt çalıştırabilir
chain_response üzerinde dolaşıldığında, birden fazla yanıta yayılan token’lar akış halinde çıktı olarak verilebilir
- Örnek sonuçta
count_char_in_text aracı char='r', text='strawberry' ile çağrılıyor ve 3 sonucuna dayanarak strawberry içinde 3 adet r olduğu yanıtlanıyor
- Python kütüphanesi
asyncio da destekler; araçlar async def fonksiyonları olabilir
- Model birden fazla asenkron aracı tek seferde isterse kütüphane bunları
asyncio.gather() ile eşzamanlı çalıştırır
- Araç kutuları da desteklenir;
tools=[Datasette("https://datasette.io/content")] değerini chain() metoduna geçirmek, CLI’daki --tool 'Datasette(...)' ile aynı etkiyi sağlar
Uygulama arka planı ve araç kullanım kalıbı
- Araç kullanımı kalıbı, ilk kez Ekim 2022’de yayımlanan ReAcT paper makalesinde görüldüğünden beri takip edilen bir yöntem
- Temel kalıp basit
- Modele kullanabileceği araçlar olduğu söylenir
- Model JSON, XML veya
tool_name(arguments) gibi özel bir söz dizimiyle araç eylemi ister ve durur
- Kod bu çıktıyı parse edip istenen aracı çalıştırır
- Çalıştırma sonucunu içeren yeni bir prompt modele gönderilir
- Bu yöntem bugün neredeyse tüm modellerde çalışır
- Birçok model araç kullanımı için ayrıca eğitilmiştir; Berkeley Function-Calling Leaderboard gibi liderlik tabloları da vardır
- OpenAI, Anthropic, Google, Mistral ve Meta API’lerine araç kullanımı veya fonksiyon çağırma özellikleri eklemiştir
- Yerel modeller tarafında Ollama geçen yıl araç desteği ekledi; llama.cpp sunucusunda da bu destek bulunuyor
- LLM, önce Şubat 2025’te şema desteğini yayımladı ve bunu araç desteğine giden bir adım olarak gördü
- Birden fazla modelde çalışan bir soyutlama katmanı tasarlamak zorluktu; tedarikçilerin yöntemleri artık belirgin biçimde yakınsadığı için uygulama mümkün hale geldi
- PyCon US’teki Building software on top of Large Language Models atölyesi alfa uygulamayı tamamlamaya vesile oldu; tutorial’ın tools section bölümü de sunuluyor
Ajanlar ve sonraki planlar
- “agents” terimine hâlâ mesafeli yaklaşılsa da LLM dünyasında konu tools in a loop biçimine yakınsıyor; LLM 0.26 da bu forma yakın
- Bir ajan oluşturmak istiyorsanız LLM 0.26 iyi bir başlangıç noktası olabilir
- Sıradaki işler LLM tools v2 milestone altında 13 issue olarak özetlenmiş durumda
- Bunlar ağırlıklı olarak araç çalıştırma günlüklerinin daha iyi gösterilmesi ve bu sürümü engellemeyen küçük issue’lar
- Ek issue’lar tools label altında bulunuyor
- En heyecan verici alan eklenti olasılıkları
- llm-plugin-tools cookiecutter şablonunu doğrudan kullanıyor
- Bununla ilgili bir tutorial hazırlama planı var
- Daha fazla model eklentisine araç desteği ekleme işi de devam ediyor
- Model Context Protocol desteği de planlar arasında
- MCP, modellerin araçlara erişmesi için hızla standart bir yöntem haline geliyor
- İki hafta önce büyük tedarikçilerin API’lerinde doğrudan desteklenmiyordu; ancak son 8 gün içinde OpenAI, Anthropic ve Mistral’a eklendi
- Hedef, LLM’in bir MCP istemcisi olarak çalışıp insanların yazdığı MCP sunucularını LLM için ek araç kaynağı olarak kolayca kullanılabilir hale getirmesi
1 yorum
Hacker News görüşleri
Bu araç için yazdığı akışkan Markdown rendereri de bakmaya değer: https://github.com/day50-dev/Streamdown
Arka planı https://github.com/simonw/llm/issues/12 içinde var; ayrıca Simon'un
llmaracı üzerine yaptığı tmux aracını içeren https://github.com/day50-dev/llmehelp deposunu da her gün kullanıyorumllmüzerine yaptıklarımdan birini daha atlamışım;zlekullanan bir ZSH eklentisi ile İngilizceyi tek tuşla kabuk komutuna çeviriyor: https://github.com/day50-dev/ZummonerBugün de bunu
$ git find out if abcdefg is a descendent of hijklmnopgibi bir şey için kullandım; başka bir yorumdakifor i in $(seq 1 6); do printf "%${i}sh${i}\n\n-----\n" | tr " " "#"; done | pv -bqL 30komutu da aslında çok daha doğal dile yakın bir girdiydictrl-x xtuşuna basınca tampon OpenRouter'a gönderiliyor ve bir saniyeden kısa sürede doğru sözdizimiyle değiştiriliyorBunun için bir issue açtım: https://github.com/simonw/llm/issues/1112
Birkaç tasarım seçeneği ekledim ama henüz tam oturmuş gibi gelmiyor; geri bildirim almak isterim
llmilebatin syntax highlighting özelliğini birlikte kullanıyorumBu, kendini ayağından vurma riskini ciddi biçimde artırıyor
Doküman https://llm.datasette.io/en/stable/tools.html prompt injection konusunda uyarıyor ama bence daha olası senaryo kişinin zararı kendine vermesi
Örneğin borsa hesabına erişimi olan bir araca alım satımı otomatikleştirme yetkisi verirseniz, prompt injection olmasa bile botun aptalca işlemler yapmasını engelleyecek bir mekanizma yok
LLM'e araç bağlamaya başladığınız anda, özellikle bu araç çağrıları kimlik doğrulamalıysa ve sizin yerinize eylem de gerçekleştirebiliyorsa, işlerin ters gitmesi için fazla yol açılmış oluyor
MCP tarafı bunu şu anda çok hızlı yaşıyor; dünkü GitHub MCP olayı da buna örnek: https://news.ycombinator.com/item?id=44097390
Dokümana büyük uyarılar ekledim ve ilk araç eklentilerinde zarar veremeyecek olanları yayımlamaya dikkat ettim. Bu yüzden QuickJS sandbox ve SQLite eklentisi de salt okunur
llmyi borsa hesabına bağlarsanız aptal olan bot değil, onu bağlayan kişidirmacOS'ta çok zor değil ama şu an kullanımı kolay iyi araçlar eksik. Claude Code, kullanıcı deneyimini iyileştirmek için Seatbelt'i yavaş yavaş kullanmaya başladı
Kişi kendine zarar verebilir ve muhtemelen verir de, ama olasılıkları değerlendirmemek de risklidir. Sıradan kullanıcılar kendini ayağından vurma ihtimalini küçümserken, teknik kişiler de yeni olasılıkları öğrenmemenin riskini küçümseme eğiliminde
Bir yıl önce de LLM'in dizüstü bilgisayarımda yerel komutlar çalıştırmasına izin vermiştim; bunu belli ölçüde riskli buluyorum ama zararlı bir şey olmadı.
find out where I am and what weather it is going to begibi bir prompttanrm -rf /çalıştırma ihtimali var ama çok düşükAma LLM'in nasıl karar verdiğini bilmeden ona hisse senedi alım satımı yaptırmak benim açımdan fazla riskli
Warp terminalindeki terminal tabanlı ajan fikrini seviyorum ama Cursor'daki gibi “iyi promptları ve LLM çağrılarını biz sizin yerinize hallederiz, siz bize güvenip ödeme yapın” modelini pek sevmiyorum
Bu yüzden kabuk becerilerimdeki eksikleri kapatacak basit bir CLI tabanlı terminal ajanı arıyordum; terminal araçları ile
llmbirleşimi hafif bir çözüm gibi görünüyorKendini ayağından vurma riskinin büyük olduğunun farkındayım; bu yüzden diğer ajanlarda olduğu gibi her araç çağrısı için izin isteme seçeneği var mı diye merak ediyorum. Mesela “
llm,rm -rf ./*komutunu çağırmak istiyor. Onaylamak için Y tuşuna basın” gibi bir şey, LLM'in terminalde kontrolden çıkmasını bir ölçüde engelleyebilir--full-autoverilmediğinde codex CLI zaten varsayılan olarak böyle çalışıyorllmkullananlar için Gtk-llm-chat de bakmaya değerllmkomut satırı aracıyla ve masaüstüyle bütünleşiyor; sistem tepsisi simgesi ve hoş bir sohbet penceresi sunuyorKısa süre önce 3.0.0 sürümünü yayımladı ve üç büyük masaüstü işletim sistemi için paket sağlıyor
Bu sürümün, mevcut istemcilerin sınırlamaları olmadan LLM'in potansiyelini açığa çıkaran temel bir bileşen olduğunu düşünüyorum
0.26 alfa çıktıktan sonra MCP sunucularıyla etkileşen bir eklenti yapmaya çalıştım ama epey zordu. Şimdiye kadar bağlanıp araçları dinamik olarak getirip kullanma kısmını başardım ama parametre geçirmeyi henüz yapamadım
Resmî
mcpPython kütüphanesi,asyncioçalıştırıp sunucuya bağlanma ve sonra kullanılabilir araçları inceleme akışını güçlü biçimde varsayıyorllmCLI’nin sekme tamamlaması için zsh/omz eklentisini neredeyse tamamen vibe coding ile sürdürüyorum, ama yeni özelliklerin çıkış hızı o kadar yüksek ki yetişmek zor oluyorYine de
llm -f README.md -f llm.plugin.zsh -f completions/_llm -f [https://simonwillison.net/2025/May/27/llm-tools/](<https://simonwillison.net/2025/May/27/llm-tools/>) "implement tab completions for the new tool plugins feature"gibi bir şeyle işin %90’ı çözülüyorDepo https://github.com/eliyastein/llm-zsh-plugin ve olabildiğince çok seçenek ile bayrak eklemeye çalıştığım için biraz dağınık oldu; geri bildirim almak isterim
Gelecek nesiller, bizim nasıl iş çıkardığımızı; bizim assembly programcılarına bakıp “Bunu nasıl yapmışlar?” diye düşünmemiz gibi merak edecek
Claude Code’un araçları nasıl tanıyıp kullandığını merak ediyordum
LLM’e araçları ve kullanım biçimlerini öğretebilir, bir çalıştırma sarmalayıcısının da bunu yönetmesini sağlayabilirsiniz; ama Claude Code’un, sarmalayıcının kullandığı araç çağırma API’si konusunda çok belirgin beklentileri var gibi görünüyor ve bunun sonradan eğitim ya da ince ayarla güçlü biçimde pekiştirildiğini düşündüm
Bu yüzden Claude kullanan üçüncü taraf araç çağırma çerçevelerinin, Anthropic’in kendi çerçevesine göre dezavantajlı olup olmadığını merak ediyorum
Ayrı olarak, GitHub MCP “saldırısı” yazısında söylendiği gibi LLM’ler kimlik bilgilerinin tüm yetkilerini kullanmaya kandırılabiliyor. GitHub gibi ayrıntılı yetkilendirme bilgilerine sahibiz, bizim şirkette de durum böyle; bu yüzden sarmalayıcının LLM’e vermesi için ince taneli kimlik bilgileri üreten bir protokolü birilerinin denemesini isterim
Uygulamalara daha güçlü kimlik bilgileri verildiği, alt LLM’in ise belirli işler ya da kaynaklar için “izin talebi” yapacak şekilde eğitildiği bir yapı hayal ediyorum. Kullanıcı izin verirse, çerçeve hizmetten kapsamı sınırlı kimlik bilgileri alır ve bunları araç çağrılarında kullanır
“Ek kimlik bilgisi iste” aracını görünür kılarsınız; çağrıldığında kullanıcıya soran epey gelişmiş bir araç yapılandırması gerekir
Araç kimlik bilgilerini saklamalı ve gerçek token’ları asla LLM’e vermemeli; bunun yerine
creds1gibi bir sembol verip sonraki isteklerdecreds1ile çağrı yapmasını söyleyebilirBu makaleyi görüp görmediğinizi merak ediyorum. Göründüğü kadar önemliyse, bu metriğin tüm sistem kartlarında yer alması gerekmez mi diye düşündüm
128K token ve üstü bağlam desteği sunduğunu iddia eden popüler 12 LLM’i değerlendirmişler; kısa bağlamlarda iyi performans gösterirken bağlam uzadıkça performansın ciddi biçimde düştüğünü söylüyorlar. 32K’de 10 model, kısa uzunluk temel çizgisinin %50’sinin altına inmiş; istisnai derecede iyi olan GPT-4o bile %99,3’ten %69,7’ye düşmüş
https://arxiv.org/abs/2502.05167
Son zamanlarda needle in a haystack test sonuçlarında Gemini 2.5 Pro ile Gemini 2.5 Flash’ın diğer modellerin epey önünde olduğunu biliyorum; o modellerle de denemek iyi olurdu
Geçen hafta 0.26a0 ile özel veriye dayalı, müşteriye yönelik bir chatbot demosu yaptım
Elle yazmam gereken temel parçalar sistem prompt’u, dış veriyi getiren bir araç ve hesaplama yapan bir araçtı; bu kütüphane sayesinde çekirdek işlevleri oluşturmak çok kolay oldu
Demoda emeğin büyük kısmı tesisat işlerine gitti. Konuşmanın korunması, bağlantı sorunları yüzünden tarayıcı yenilense bile doğal biçimde güncellenmesi ve yeni sohbet oturumları başlatabilen şık bir web arayüzü yapılması gerekiyordu
after_call=printözelliğini bilmiyordum; blog yazısını okuyunca öğrenmiş oldum ve iyi olduSimon’un araçlarını her gün kullanıyorum
Pipe ve yerel Ollama ile uzak modeller arasında kolay geçiş sayesinde çalışmak çok rahat