- 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
Hacker News yorumları
ellaracının standart giriş pipe alıp alamadığını merak ediyorumhttps://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ıpcat 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...
llmkomut 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ımPipe ö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ıyorumKelime 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çinellm -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 sorabiliyorumq 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 gidiyorcat somecode.py | ell -f -şeklinde kullanabilirsinBunu şablona koymadan anlık olarak bir prompt daha eklemek istersen
(cat somecode.py; echo "Explain this code") | ell -f -da olurBunu README’ye koymalıydım; ayrıca
llmve ilgili yazıları daha önce görmüş olsaydım,elli yapma motivasyonum muhtemelen çok daha az olurdullmiçinde claude-3.5-sonnet modelini yerelde kullanmak için nasıl yapılandırmak gerektiğini bilmiyorum. Eklenti belgelerini okumama rağmen çıkaramadımShell’de benzer bir şey yapmaya çalışan başka bir proje de var. Hangisinin daha iyi olduğundan emin değilim
demo
source code
İlk başta kullanıcı girdisini
.bash_historygibi bir yerden okuyan bir yapısı olduğunu sandım ama bakınca terminal çıktısını bağlam olarak kullanamadığını gördümYine de yanıt işleme için awk kullanmasını beğendim;
elldejqveperlbağımlılığını azaltmak için awk kullanabilir gibi görünüyorBunu README’deki ilgili projeler bölümüne eklemeyi planlıyorum
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
~/.ellrcdyerine XDG dizinlerini kullanmak daha iyi olabilirAyrı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
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
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...
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
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 sarmalayabildimDaha 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 ekledimSon zamanlarda Boston tarafında tanıtmaya başladım ve insanlar beğeniyor gibi 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
Kabukla çok iyi entegre olmuş ve doğrudan bash ile yazma tercihi cesur ama taşınabilirliği korumada etkili
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ğlarBu yüzden
: "${ELL_LOG_LEVEL:=2}";, çıktı üretmeden ve yalnızca henüz ayarlanmamışsaELL_LOG_LEVELdeğişkenini 2 olarak başlatırBunu 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ıyorKayı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
Simon Willison’ın
llmaracını bilmiyordum ama böyle bir yazılım yapmış olmasına şaşırmadımllm, 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ışıyorDaha fazla LLM kontrolüne ihtiyaç duyan kullanıcıları
simonw/llmaracına yönlendirmeyi README’de belirtmeliyimREADME’deki “Risks” bağlantısı bozuk
Benim isteğim,
ell -rseçeneğinin otomatik olarak açılması vefixadlı bir takma adın dosya değişikliklerini de içerecek şekilde düzeltme önermesiÖrneğin
main.cciçinde bir yazım hatası varsa vegcc main.cckomutunu çalıştırdıktan sonrafixç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ındangccyi yeniden çalıştırmayı önermesi; onay verilirse bunu da yapması harika olurduell -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ğilimYama 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 -rseçeneğini otomatik çalıştırmak için.bashrcye eklemeniz yeterliBunu 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/perlgerektirmesi sanki tersini söylüyor gibi geliyor[0] https://github.com/sigoden/aichat
İlk fikir her şeyi Bash ile yapmak idi, ama yazdığım nedenlerden dolayı bu mümkün olmadı
awk kullanırsam
jqveperli kaldırabilirim, ama bu kodun sadeliği ve okunabilirliği açısından büyük bir bedel olurSö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
Linux’ta en güncel binary’yi indirip
/home/me/biniç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-aseçeneğiyle append yapılması gerektiği söyleniyor; ardındanbash 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.txtBu bağlamda
1<> output.txtiç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ındantee --appendkullanmak olabilirAslında daha önce kaydettiğimde bu kadar kötü değildi ve betiği aynı tutarak yeniden kaydederken de çok fazla değişiklik yapmadım
Önceki sürüm için ilk kaydettiğim video burada: https://github.com/simonmysun/ell/blob/d4fc5468157fa6adc8f9f...
Ne yazık ki LLM'ler kararlı değil
Bu arada, hatanın bulunduğu videonun bağlantıları şunlar:
https://github.com/user-attachments/assets/1355ad08-6fbf-4c0...
https://github.com/simonmysun/ell/blob/553d38f60ad104893b2a3...
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
ell'in etkileşimli kullanımı, terminal çıktısını kaydetmek için
scriptkullanımına dayanıyorYan 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