3 puan yazan GN⁺ 2025-05-28 | 1 yorum | WhatsApp'ta paylaş
  • 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
    • llm-tools-simpleeval: Matematik gibi basit ifadeler için destek
    • llm-tools-quickjs: Sandbox’lanmış QuickJS JavaScript yorumlayıcısına erişim sağlar; çağrılar arasında ortam korunduğu için değişkenler ve fonksiyonlar yeniden kullanılabilir
    • llm-tools-sqlite: Yerel SQLite veritabanlarına salt okunur SQL sorgu erişimi sağlar
    • llm-tools-datasette: Uzak Datasette instance’larında SQL sorguları çalıştırır

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

 
GN⁺ 2025-05-28
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 llm aracı üzerine yaptığı tmux aracını içeren https://github.com/day50-dev/llmehelp deposunu da her gün kullanıyorum

    • llm üzerine yaptıklarımdan birini daha atlamışım; zle kullanan bir ZSH eklentisi ile İngilizceyi tek tuşla kabuk komutuna çeviriyor: https://github.com/day50-dev/Zummoner
      Bugün de bunu $ git find out if abcdefg is a descendent of hijklmnop gibi bir şey için kullandım; başka bir yorumdaki for i in $(seq 1 6); do printf "%${i}sh${i}\n\n-----\n" | tr " " "#"; done | pv -bqL 30 komutu da aslında çok daha doğal dile yakın bir girdiydi
      ctrl-x x tuşuna basınca tampon OpenRouter'a gönderiliyor ve bir saniyeden kısa sürede doğru sözdizimiyle değiştiriliyor
    • Kütüphane gerçekten çok iyi görünüyor; eklentilerin aracın içerik gösterme biçimini devralabileceği bir hook olsa güzel olurdu
      Bunun 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
    • Akan LLM çıktısını hızlı gösterebilmek için farklı dillerde kendi akışkan Markdown rendererlarımı yazmıştım; bunu yapan tek kişi olmadığımı görmek sevindirici
    • İlginç görünüyor, bakacağım; şu anda llm ile batin syntax highlighting özelliğini birlikte kullanıyorum
  • Bu, 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

    • Evet, gerçekten de risk büyük ölçüde artıyor
      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şidir
    • Sandboxing belirleyici olacak
      macOS'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ı
    • Bence kendini ayağından vurma tartışması asıl noktayı kaçırıyor
      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 be gibi bir prompttan rm -rf / çalıştırma ihtimali var ama çok düşük
      Ama LLM'in nasıl karar verdiğini bilmeden ona hisse senedi alım satımı yaptırmak benim açımdan fazla riskli
    • Her araç kötüye kullanılabilir
  • 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 llm birleşimi hafif bir çözüm gibi görünüyor
    Kendini 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

    • Terminal'in neden sağda solda reklam yaptığını ve pek çok projeye sponsor olduğunu merak ediyordum; artık tamamen ücretsiz olmadığını öğrendim
    • Sanırım --full-auto verilmediğinde codex CLI zaten varsayılan olarak böyle çalışıyor
  • llm kullananlar için Gtk-llm-chat de bakmaya değer
    llm komut satırı aracıyla ve masaüstüyle bütünleşiyor; sistem tepsisi simgesi ve hoş bir sohbet penceresi sunuyor
    Kı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

    • Genel sohbet dışında ne için kullanıldığını merak ediyorum
  • 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

    • Bu sabah MCP ile hızlı bir eklenti demosu yapabilir miyim diye denedim; oldukça zahmetliydi
      Resmî mcp Python 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ıyor
  • llm CLI’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 oluyor
    Yine 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üyor
    Depo 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

    • Bunun bilimkurgu değil de doğrudan bugünün kod yazma biçimi olması biraz şaşırtıcı
      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

    • Bu kimlik bilgisi yaklaşımı bugün bile LLM’in araç desteğiyle mümkün
      “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 creds1 gibi bir sembol verip sonraki isteklerde creds1 ile çağrı yapmasını söyleyebilir
  • Bu 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

    • Bu makaleyi görmemiştim ama gerçekten çok ilginç
      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 oldu

  • Simon’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