1 puan yazan GN⁺ 2024-08-04 | 1 yorum | WhatsApp'ta paylaş
  • ell, Bash ile yazılmış bir LLM komut satırı arayüzüdür; terminalden LLM’e soru sormayı ve terminal bağlamını birlikte iletmeyi sağlar
  • Pipe girdisi, dosya girdisi ve standart girdiyi destekleyerek mevcut Unix araç akışlarıyla birlikte kullanılabilir; etkileşimli modda ise bağlamı koruyarak sohbet edilebilir
  • Şablonlar aracılığıyla fonksiyon çağırma ve LLM sağlayıcılarına özgü özellikleri destekler; hassas bilgileri silme özelliği de içerir
  • Kullanım için bash 4.1 veya üzeri, coreutils ya da OS X yardımcı araçları, jq ve curl gerekir; record mode kullanılacaksa ek olarak perl ve util-linux’in script komutu gerekir
  • Google gemini-1.5-flash ve OpenAI gpt-4o-mini yapılandırma örnekleri sunulur; neredeyse tamamen Bash ile uygulanmış olması sayesinde hafif, kurulumu, genişletmesi ve değiştirmesi kolay olduğu vurgulanır

ell’in sunduğu özellikler

  • ell, Bash ile yazılmış bir LLM komut satırı arayüzüdür
  • Terminalden LLM’e soru sormayı sağlar ve pipe’larla kolay kullanılacak şekilde tasarlanmıştır
  • Terminalin bağlamını LLM’e ilettikten sonra soru sorabilirsiniz
  • Terminal içinde LLM ile sohbet edebilirsiniz
  • Şablonlar aracılığıyla fonksiyon çağırma ve ek özellikleri destekler
  • Hassas bilgi silme özelliği içerir; ilgili başlık olarak #14 bağlantısı verilmiştir

Gereksinimler ve kurulum

  • Temel kullanım için şu araçlar gerekir
    • bash 4.1 veya üzeri
    • coreutils ya da OS X yardımcı araçları
    • JSON ayrıştırma için jq
    • HTTPS istekleri için curl
  • record mode kullanılmıyorsa şu araçlar zorunlu değildir
    • PCRE için perl
    • Terminal girdi ve çıktısını kaydetmek için util-linux’in script komutu
  • Kurulum, depoyu ~/.ellrc.d içine clone edip bu yolu PATH’e ekleme şeklindedir
git clone --depth 1 https://github.com/simonmysun/ell.git ~/.ellrc.d
echo 'export PATH="${HOME}/.ellrc.d:${PATH}"' >> ~/.bashrc

Yapılandırma yöntemi

  • Yapılandırma belgesi Configuration sayfasındadır
  • Google gemini-1.5-flash kullanım örneğinde ~/.ellrc içinde şu değerler ayarlanır
ELL_API_STYLE=gemini
ELL_LLM_MODEL=gemini-1.5-flash
ELL_TEMPLATE=default-gemini
ELL_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ELL_API_URL=https://generativelanguage.googleapis.com/v1beta/models/
  • OpenAI gpt-4o-mini kullanım örneğinde şu yapılandırma kullanılır
ELL_API_STYLE=openai
ELL_LLM_MODEL=gpt-4o-mini
ELL_TEMPLATE=default-openai
ELL_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ELL_API_URL=https://api.openai.com/v1/chat/completions

Kullanım örnekleri

  • Basit bir soru komut argümanı olarak verilir
ell "What is the capital of France?"
  • Model belirlenip dosya girdi olarak kullanılabilir
ell -m gpt-4o -f user_prompt.txt
  • Standart girdi de desteklenir
cat somecode.py | ell -f -
  • Şablona koymadan, anlık olarak ek bir prompt eklenebilir
(cat somecode.py; echo "Explain this code") | ell -f -
  • record mode, terminal girdi ve çıktısını kaydederek sonraki sorularda bağlam olarak kullanır
ell -r

# do random stuff
ell What does the error code mean?
ell How to fix it?
  • Etkileşimli mod -i ile çalıştırılır; etkileşimli modda bağlam tabanlı sohbet için record mode otomatik olarak etkinleştirilir
ell -i
  • Şablon belirtilerek record mode ve etkileşimli mod birlikte başlatılabilir
ell -r -i -t ctf-gemini
ell -r -i -t ctf-openai

Şablonlar, stillendirme ve eklentiler

  • Şablon yazma belgesi Templates sayfasındadır
  • ell’de LLM sağlayıcısının eklenti desteğini kullanan özellikler şablonlarla uygulanır
  • Stillendirme belgesi Styling sayfasındadır
  • Eklenti belgesi Plugins sayfasındadır
  • Burada sözü edilen Plugin, ell’in çağırabileceği script’i ifade eder ve ell’in işlevlerini genişletmek için kullanılabilir
    • LLM sağlayıcısının desteklediği eklentiler bu kapsama girmez; bu işlev için şablon belgesine bakılmalıdır

İsim ve uygulama tercihleri

  • ell adı shell ve LLM birleşiminden gelir
  • shellm de düşünülmüş, ancak she llm olarak yanlış anlaşılabileceği için elenmiştir
  • ell, kısa, yazması kolay, hatırlaması kolay ve etkin bir yazılımla çakışmayan bir ad olarak tanıtılır
  • Bash ile yazılmasının nedeni, Bash’in Unix benzeri sistemlerde en yaygın shell olması ve bu kullanım için daha karmaşık bir dile ihtiyaç duyulmamasıdır
  • Benzer projelerden farkı olarak neredeyse tamamen saf Bash ile yazıldığı için hafif ve kurulumu kolay olduğu, genişletme ve değiştirmenin kolay olduğu belirtilir
  • Pipe dostu olduğu için başka araçlarla birlikte kullanılacak şekilde tasarlanmıştır

İlgili belgeler ve lisans

  • Dikkate alınması gereken riskler Risks Consideration belgesinde derlenmiştir
  • Katkılar issue veya pull request olarak kabul edilebilir
  • Lisans MIT License olup ayrıntılar LICENSE dosyasındadır

1 yorum

 
GN⁺ 2024-08-04
Hacker News yorumları
  • ell aracının standart giriş pipe alıp alamadığını merak ediyorum
    https://llm.datasette.io/ aracında cat somecode.py | llm -m claude-3.5-sonnet "Explain this code" gibi kullanımları sık yapıyorum; ayrıca yönergeyi sistem prompt’undan ayırıp cat somecode.py | llm -m claude-3.5-sonnet --system "Explain this code" şeklinde de kullanıyorum
    İçeriği bu şekilde LLM’e pipe edebilmek, web sayfalarını kazıyıp soruları yanıtlatmak gibi eğlenceli kullanımları mümkün kılıyor: https://simonwillison.net/2024/Jun/17/cli-language-models/#f...

    • Uzun süre LLM şüphecisiydim ama llm komut satırı aracını, Claude 3 Opus incelemesini ve çok daha ucuz olan 3.5 Sonnet’i öğrendikten sonra LLM’leri her gün kullanmaya başladım
      Pipe özelliğini gerçekten çok sık kullanıyorum; örneğin curl | llm -m claude-3.5-sonnet -s 'How long does the main content of this article take to read? First count words, then convert using a slow and fast common reading speed.' ile web yazılarının okuma süresini tahmin etmekte kullanıyorum
      Kelime sayısı beklediğimden daha sık yanlış çıkıyor ama genelde basamak sayısı doğru oluyor, o da yeterli
      Son zamanlarda en çok kullandığım shell scriptlerden biri q; içine llm -s "Answer in as few words as possible. Use a brief style with short replies." -m claude-3.5-sonnet "$*" koydum, böylece herhangi bir terminalden saçma soruları çekinmeden sorabiliyorum
      q How do I run Docker with a different entrypoint to that in the container? gibi kısa sorular da sorabiliyorum, here-document kullanarak Perl kodunun ne yaptığını sorduğum uzun sorular da; bağlamın terminalde kalması hoşuma gidiyor
    • Evet, mümkün. Mesela cat somecode.py | ell -f - şeklinde kullanabilirsin
      Bunu şablona koymadan anlık olarak bir prompt daha eklemek istersen (cat somecode.py; echo "Explain this code") | ell -f - da olur
      Bunu README’ye koymalıydım; ayrıca llm ve ilgili yazıları daha önce görmüş olsaydım, elli yapma motivasyonum muhtemelen çok daha az olurdu
    • llm içinde claude-3.5-sonnet modelini yerelde kullanmak için nasıl yapılandırmak gerektiğini bilmiyorum. Eklenti belgelerini okumama rağmen çıkaramadım
  • Shell’de benzer bir şey yapmaya çalışan başka bir proje de var. Hangisinin daha iyi olduğundan emin değilim
    demo
    source code

    • Çok daha gösterişli görünüyor
      İlk başta kullanıcı girdisini .bash_history gibi bir yerden okuyan bir yapısı olduğunu sandım ama bakınca terminal çıktısını bağlam olarak kullanamadığını gördüm
      Yine de yanıt işleme için awk kullanmasını beğendim; ell de jq ve perl bağımlılığını azaltmak için awk kullanabilir gibi görünüyor
      Bunu README’deki ilgili projeler bölümüne eklemeyi planlıyorum
    • Güzel ve çok özellikli ama neden GitHub yıldızı bu kadar az, merak ediyorum
  • Artık bakımını yapmadığım benzer bir araç yazmıştım: https://github.com/llimllib/gpt-bash-cli/
    Bir öneri olarak, konuşmaları metin dosyaları yerine kullanıcıların veriyi daha kolay işleyebileceği bir SQLite veritabanında saklamak ve ~/.ellrcd yerine XDG dizinlerini kullanmak daha iyi olabilir
    Ayrıca çalıştırdığım her programa API anahtarı erişimi vermek istemediğim için ortam değişkenleri yerine sistem gizli depo çözümlerini tercih ediyorum

    • Görsel desteği harika
      Herkesin SQLite kurulu olduğunu varsaymak zor ama bunu eklentiyle isteğe bağlı hâle getirmek mümkün görünüyor
      XDG dizinleri ve sistem gizli depo çözümleri şu anki yöntemden çok daha iyi görünüyor; nasıl kullanılacağını öğrenip entegre etmeyi düşünüyorum
    • Linux geliştirme makinesinde gizli değer saklama için önerilen yöntemin ne olduğunu merak ediyorum
      Rastgele scriptler ve programlar, API anahtarları gibi gizli değerleri çalışma anında mümkün olduğunca az uğraşla okuyabilmeli ve bunlar diskte düz metin olarak tutulmamalı
      Sanırım keyring önerilmişti; bunun “GNU/Linux usulü” mü olduğunu, yoksa FUSE tabanlı olsun ya da olmasın şifreli bir dosya sisteminde saklamanın da uygun olup olmadığını merak ediyorum
      [1]: https://github.com/llimllib/gpt-bash-cli/blob/841682affe2d0e...
    • Hatta keyring kullanmamanı tercih ederim. Uğraştırıcı ve bazı sistemlerde yok
      LLM anahtarları o kadar kritik değil; kendi sisteminde çalıştırdığın programlara zaten güveniyor olmalısın
      Poetry benden keyring erişimi istediği için onu kullanmıyorum; yıllardır açık duran bir hata var ve aslında bu erişime ihtiyacı da yok
    • SQLite bende yok ve nasıl kullanılacağını da bilmiyorum
      Ben şahsen metin dosyalarını çok daha iyi buluyorum
  • Benzer bir araç olarak https://autocomplete.sh aracını geliştirdim
    https://github.com/closedloop-technologies/autocomplete-sh
    Terminalde sekme tabanlı otomatik tamamlamanın sanki doğal olarak çalıştığı hissini istedim
    LLM yanıtlarını bash_completionın beklediği biçime uslu uslu uydurmak epey zordu, ama bir kez çalışınca OpenAI, grok, Claude ve Ollama gibi yerel modeller dahil hepsini sarmalayabildim
    Daha akıllı hale getirmek için parolaları ayıklanmış yakın geçmişi, ayarlanmış ortam değişkenlerini ve ilgili komutların --help çıktısını da bağlam penceresine ekledim
    Son zamanlarda Boston tarafında tanıtmaya başladım ve insanlar beğeniyor gibi görünüyor

    • Demo videosu çok iyi: https://youtu.be/IAgkjerCvz8
    • Çok kullanışlı görünüyor
      Otomatik tamamlamayı ben de düşünmüştüm, ama benim fikrim Copilot’a daha yakındı ve bu betiğin kullanıcı deneyimi daha iyi görünüyor
      Geçmişi bağlama ekleme kısmı, ell gibi bir geçmiş modu eklersen gerçekten çok yardımcı olur
      Parola temizleme iyi bir fikir, bunu eklenti olarak eklemeyi planlıyorum
    • Cambridge, MA’deki AI Tinkerers buluşmasında autocomplete-sh’nin çalıştığını gördüm ve etkilendim
      Kabukla çok iyi entegre olmuş ve doğrudan bash ile yazma tercihi cesur ama taşınabilirliği korumada etkili
    • İlgi çekici görünüyor
      Fish shell üzerinde de çalışıp çalışmadığını ve güncelleme ya da kaldırmanın nasıl yapıldığını merak ediyorum
  • Güzel görünüyor. Birden fazla makinede çalıştığım için, kabukla yazılmış böyle hafif araçlar her zaman ilgimi çekiyor
    Merak ettim, : "${ELL_LOG_LEVEL:=2}"; gibi bir komutun neden iki noktayla başladığını açıklayabilir misiniz? İki noktanın sadece no-op komutu olarak faydalı olduğunu sanıyordum
    [1]: https://github.com/simonmysun/ell/blob/main/ell.sh#L19C1-L19...

    • : temelde bash’in o satırın sonucunda hiçbir şey yapmamasını sağlar
      Bu yüzden : "${ELL_LOG_LEVEL:=2}";, çıktı üretmeden ve yalnızca henüz ayarlanmamışsa ELL_LOG_LEVEL değişkenini 2 olarak başlatır
    • Sonucun çalıştırılmamasını garanti etmek için iki noktayı ekledim
      Bunu burada öğrendim: https://stackoverflow.com/a/28085062/2485717
  • Saf bash ve Unix araçlarıyla yetinen yaklaşım ilgi çekici
    Benzer hedeflere sahip Plandex[1] adlı aracı yaptım; bağımlılıksız, terminal tabanlı ve bağlam olarak pipe girdisini desteklemesi ortak, ama Go ile yazıp statik binary olarak derleyerek tamamen farklı bir yol seçtim
    Plandex daha üst seviye ve kodlamaya odaklıyken, ell çok hafif ve genel amaçlı bir LLM aracı gibi görünüyor; ayrıca Simon Willison’ın llm[2] aracını da epey hatırlatıyor
    Kayıt özelliği de savvy[3]’yi akla getiriyor
    1 - https://github.com/plandex-ai/plandex
    2 - https://github.com/simonw/llm
    3 - https://github.com/getsavvyinc/savvy-cli

    • Plandex de güzel, böyle bir iş akışı aklıma gelmemişti
      Simon Willison’ın llm aracını bilmiyordum ama böyle bir yazılım yapmış olmasına şaşırmadım
      llm, LLM’leri daha derinlemesine kurcalamaya yönelik özellikleri destekliyor; ell ise bu tür özelliklerden yoksun olmasına rağmen en yaygın ve temel arayüzlerle yetinip sayfalama ya da sözdizimi vurgulama gibi kullanıcı deneyimi iyileştirmelerini olabildiğince hafif tutmaya çalışıyor
      Daha fazla LLM kontrolüne ihtiyaç duyan kullanıcıları simonw/llm aracına yönlendirmeyi README’de belirtmeliyim
  • README’deki “Risks” bağlantısı bozuk
    Benim isteğim, ell -r seçeneğinin otomatik olarak açılması ve fix adlı bir takma adın dosya değişikliklerini de içerecek şekilde düzeltme önermesi
    Örneğin main.cc içinde bir yazım hatası varsa ve gcc main.cc komutunu çalıştırdıktan sonra fix çalıştırılırsa, ell’in dosya için bir diff ile düzeltme önermesi, onaylanırsa değişikliği uygulaması ve ardından gccyi yeniden çalıştırmayı önermesi; onay verilirse bunu da yapması harika olurdu

    • “Risks” bağlantısını düzelttim
      ell -r, .bashrcye eklenebilir ama bunun kullanıcının mevcut ayarlarıyla çakışıp çakışmayacağından ya da başka sorunlar çıkarıp çıkarmayacağından emin değilim
      Yama onayı kısmı hariç, şablonlar ve eklentilerle mümkün görünüyor; ama gerçek değişiklikleri uygulamak hem teknik olarak hem de kullanıcı arayüzü tasarımı açısından zor
      Nelerin mümkün olduğuna bakmayı düşünüyorum
    • ell -r seçeneğini otomatik çalıştırmak için .bashrcye eklemeniz yeterli
  • Bunu deneyeceğim; ben şahsen bu amaç için aichat[0] kullanıyorum
    Bunun için bash’ten daha karmaşık bir dile gerek olmadığını söylemek ilginç, ama jq/curl/perl gerektirmesi sanki tersini söylüyor gibi geliyor
    [0] https://github.com/sigoden/aichat

    • Evet. Bu yüzden bunları sınırlamalar olarak yazdım
      İlk fikir her şeyi Bash ile yapmak idi, ama yazdığım nedenlerden dolayı bu mümkün olmadı
      awk kullanırsam jq ve perli kaldırabilirim, ama bu kodun sadeliği ve okunabilirliği açısından büyük bir bedel olur
      Sözdizimi vurgulayıcıyı uygulamak benim için ısrar edebileceğim alt sınır; Bash ile bundan daha karmaşık bir şey yazmak istemiyorum
      Bu tür özellikler ya hiç desteklenmeyecek ya da yalnızca harici eklentilerle desteklenecek
    • aichat için bir oy daha. Çok iyi
      Linux’ta en güncel binary’yi indirip /home/me/bin içine açan küçük bir bash betiği hazırladım
  • İlginç, ancak demo videosunda tipik bir LLM hatası görünüyor
    1<> kullanılırsa mevcut bir dosyanın üzerine yazılabileceği açıklanıyor ve bundan kaçınmak için -a seçeneğiyle append yapılması gerektiği söyleniyor; ardından bash ls 1<> output.txt örneği veriliyor, ama örnek açıklamayla uyuşmuyor ve yanlış
    Bildiğim kadarıyla buna en yakın davranış ls >> output.txt
    Bu bağlamda 1<> output.txt için anlamlı bir kullanım olup olmadığından emin değilim; belki 3 gibi özel bir dosya tanımlayıcısına bağlayıp ardından tee --append kullanmak olabilir

  • Charmbracelet'ın mods aracını çok seviyorum
    Aylardır kullanıyorum; iyi çalışıyor, oldukça özelleştirilebilir ve çıktısı da temiz
    https://github.com/charmbracelet/mods

    • mods sohbet için çok uygun, ama buna karşılık ell'in kendisi kullanıcı girdisi ve üretilen içerik açısından durumsuz
      ell'in etkileşimli kullanımı, terminal çıktısını kaydetmek için script kullanımına dayanıyor
      Yan etkileri olan eklentilerle geçmiş sohbet yönetimi desteklenebilir, ancak bunun ell'in fikrine ve felsefesine uyup uymadığı ayrıca düşünülmeli
      Benzer projeleri aradım ama HN kullanıcılarının paylaştığı bu tür güçlü, pratik araçları bulamadım