- ell adalah antarmuka baris perintah untuk LLM yang ditulis dengan Bash, memungkinkan pengguna mengajukan pertanyaan ke LLM dari terminal sambil menyertakan konteks terminal
- Mendukung input pipe, input file, dan standar input sehingga bisa digunakan bersama alur alat Unix yang sudah ada, dan dalam mode interaktif pengguna bisa mengobrol sambil mempertahankan konteks
- Melalui template, alat ini mendukung pemanggilan fungsi dan fitur khusus tiap penyedia LLM, serta menyertakan fitur penghapusan informasi sensitif
- Untuk penggunaan diperlukan bash 4.1 atau lebih baru, coreutils atau utilitas OS X, jq, dan curl; jika memakai record mode, tambahan perl dan perintah
script dari util-linux juga diperlukan
- Disediakan contoh konfigurasi untuk Google
gemini-1.5-flash dan OpenAI gpt-4o-mini, dan proyek ini menonjolkan implementasinya yang hampir sepenuhnya Bash sehingga ringan dan mudah dipasang, diperluas, serta dimodifikasi
Fitur yang disediakan ell
- ell adalah antarmuka baris perintah untuk LLM yang ditulis dengan Bash
- Anda bisa mengajukan pertanyaan ke LLM dari terminal, dan alat ini dirancang agar mudah dipakai bersama pipe
- Anda bisa mengirim konteks terminal ke LLM lalu mengajukan pertanyaan
- Anda bisa mengobrol dengan LLM di dalam terminal
- Mendukung pemanggilan fungsi dan fitur tambahan melalui template
- Menyertakan fitur penghapusan informasi sensitif, dengan referensi terkait di #14
Persyaratan dan instalasi
- Untuk penggunaan dasar, diperlukan alat berikut
- bash 4.1 atau lebih baru
- coreutils atau utilitas OS X
- jq untuk parsing JSON
- curl untuk permintaan HTTPS
- Jika tidak menggunakan record mode, alat berikut tidak wajib
- perl untuk PCRE
- perintah
script dari util-linux untuk merekam input dan output terminal
- Instalasi dilakukan dengan me-clone repositori ke
~/.ellrc.d lalu menambahkan path tersebut ke PATH
git clone --depth 1 https://github.com/simonmysun/ell.git ~/.ellrc.d
echo 'export PATH="${HOME}/.ellrc.d:${PATH}"' >> ~/.bashrc
Cara konfigurasi
- Dokumentasi konfigurasi ada di Configuration
- Contoh penggunaan Google
gemini-1.5-flash mengatur nilai berikut di ~/.ellrc
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/
- Contoh penggunaan OpenAI
gpt-4o-mini memakai konfigurasi berikut
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
Contoh penggunaan
- Pertanyaan sederhana dikirim sebagai argumen perintah
ell "What is the capital of France?"
- Anda bisa menentukan model dan memakai file sebagai input
ell -m gpt-4o -f user_prompt.txt
- Standar input juga didukung
cat somecode.py | ell -f -
- Anda bisa menambahkan prompt tambahan secara langsung tanpa memasukkannya ke template
(cat somecode.py; echo "Explain this code") | ell -f -
- record mode merekam input dan output terminal untuk dipakai sebagai konteks pertanyaan berikutnya
ell -r
# do random stuff
ell What does the error code mean?
ell How to fix it?
- Mode interaktif dijalankan dengan
-i, dan dalam mode interaktif record mode otomatis diaktifkan untuk chat berbasis konteks
ell -i
- Anda bisa memulai record mode dan mode interaktif sekaligus sambil menentukan template
ell -r -i -t ctf-gemini
ell -r -i -t ctf-openai
Template, styling, dan plugin
- Dokumentasi penulisan template ada di Templates
- Di ell, fitur untuk menggunakan dukungan plugin dari penyedia LLM diimplementasikan melalui template
- Dokumentasi styling ada di Styling
- Dokumentasi plugin ada di Plugins
- Plugin yang dimaksud di sini adalah skrip yang bisa dipanggil oleh ell dan dapat digunakan untuk memperluas fungsinya
- Plugin yang didukung oleh penyedia LLM tidak termasuk dalam kategori ini; untuk fitur tersebut, silakan lihat dokumentasi template
Nama dan pilihan implementasi
- Nama
ell adalah gabungan dari shell dan LLM
shellm juga sempat dipertimbangkan, tetapi dikesampingkan karena bisa disalahartikan sebagai she llm
ell diperkenalkan sebagai nama yang singkat, mudah diketik, mudah diingat, dan tidak berbenturan dengan perangkat lunak aktif
- Alasan ditulis dengan Bash adalah karena Bash merupakan shell yang paling umum di sistem mirip Unix, dan untuk tujuan ini tidak diperlukan bahasa yang lebih kompleks
- Sebagai pembeda dari proyek serupa, proyek ini menekankan bahwa ia ditulis hampir sepenuhnya dalam Bash sehingga ringan dan mudah dipasang, serta mudah diperluas dan dimodifikasi
- Ramah terhadap pipe sehingga dirancang untuk dipakai bersama alat lain
Dokumen terkait dan lisensi
- Risiko yang perlu dipertimbangkan dirangkum di Risks Consideration
- Kontribusi dapat diberikan melalui issue atau pull request
- Lisensinya adalah MIT License, dan rincian lengkapnya ada di file LICENSE
1 komentar
Komentar Hacker News
Saya penasaran apakah ell sebagai tool bisa menerima pipe input standar
Di tool https://llm.datasette.io/, saya sering memakainya seperti
cat somecode.py | llm -m claude-3.5-sonnet "Explain this code", dan juga seperticat somecode.py | llm -m claude-3.5-sonnet --system "Explain this code"dengan memisahkan instruksi ke system promptKalau bisa mem-pipe konten ke LLM seperti ini, ada pemanfaatan menarik, misalnya mengambil isi halaman web lalu membuatnya menjawab pertanyaan: https://simonwillison.net/2024/Jun/17/cli-language-models/#f...
llm, ulasan Claude 3 Opus, dan 3.5 Sonnet yang jauh lebih murah, saya mulai memakai LLM setiap hariFitur pipe benar-benar sering dipakai, dan saya menggunakannya untuk memperkirakan waktu baca artikel web seperti
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.'Jumlah katanya lebih sering salah dari yang dikira, tetapi umumnya orde besarnya benar sehingga cukup
Salah satu shell script yang paling sering saya pakai belakangan ini bernama
q, berisillm -s "Answer in as few words as possible. Use a brief style with short replies." -m claude-3.5-sonnet "$*", sehingga dari terminal mana pun saya bisa mengajukan pertanyaan bodoh tanpa merasa diawasiBisa bertanya singkat seperti
q How do I run Docker with a different entrypoint to that in the container?, atau pertanyaan panjang lewat here-document untuk menanyakan apa yang dilakukan kode Perl, dan saya suka karena konteksnya tetap tertinggal di terminalcat somecode.py | ell -f -Kalau ingin menambahkan satu prompt lagi secara spontan tanpa memasukkannya ke template, bisa seperti
(cat somecode.py; echo "Explain this code") | ell -f -Seharusnya saya memasukkan ini ke README, dan kalau saya lebih dulu melihat
llmserta tulisan terkaitnya, motivasi saya membuat ell mungkin akan jauh berkurangllm. Saya sudah membaca dokumentasi plugin, tetapi tetap tidak berhasil mengetahuinyaAda juga proyek yang mencoba melakukan hal serupa dengan shell. Saya tidak terlalu tahu mana yang lebih baik
demo
source code
Awalnya saya mengira strukturnya membaca dari tempat seperti
.bash_historyuntuk mendapatkan input pengguna, tetapi setelah dicek ternyata output terminal tidak bisa dimanfaatkan sebagai konteksMeski begitu, saya suka mereka memakai awk untuk memproses respons, dan sepertinya ell juga bisa memakai awk untuk mengurangi dependensi pada
jqdanperlSaya berencana menambahkannya ke bagian proyek terkait di README
Saya pernah membuat tool serupa yang tidak lagi dipelihara: https://github.com/llimllib/gpt-bash-cli/
Sebagai saran, sebaiknya percakapan disimpan di database SQLite, yang datanya lebih mudah dikelola pengguna dibanding file teks, dan gunakan direktori XDG alih-alih
~/.ellrcdSelain itu, karena saya tidak ingin memberi akses API key ke semua program yang dijalankan, saya lebih memilih penyimpanan rahasia sistem daripada environment variable
Sulit berasumsi semua orang punya SQLite, tetapi sepertinya bisa dibuat opsional sebagai plugin
Direktori XDG dan penyimpanan rahasia sistem terlihat jauh lebih baik daripada cara sekarang, jadi saya ingin mempelajari penggunaannya dan mencoba mengintegrasikannya
Script dan program arbitrer harus bisa membaca rahasia seperti API key saat runtime dengan kerepotan seminimal mungkin, dan tidak boleh disimpan sebagai plaintext di disk
Sepertinya tadi merekomendasikan
keyring, tetapi saya penasaran apakah itu “cara GNU/Linux”, atau apakah menyimpannya di filesystem terenkripsi, baik berbasis FUSE maupun bukan, juga memungkinkan[1]: https://github.com/llimllib/gpt-bash-cli/blob/841682affe2d0e...
Kunci LLM tidak sebegitu kritis, dan program yang dijalankan di sistem sendiri memang harus dipercaya
Saya tidak memakai Poetry karena meminta akses keyring; ada bug yang sudah terbuka bertahun-tahun, dan sebenarnya akses itu juga tidak diperlukan
Secara pribadi, file teks jauh lebih baik
Saya membuat alat serupa, https://autocomplete.sh
https://github.com/closedloop-technologies/autocomplete-sh
Saya ingin rasanya seperti autocomplete berbasis Tab di terminal yang langsung berfungsi begitu saja
Cukup sulit membuat respons LLM menjadi rapi sesuai format yang diharapkan
bash_completion, tetapi begitu berhasil, saya bisa membungkus semuanya, dari OpenAI, grok, Claude, hingga model lokal seperti OllamaAgar lebih pintar, saya juga memasukkan riwayat terbaru yang sudah dibersihkan dari kata sandi, variabel lingkungan yang disetel, dan output
--helpdari perintah terkait ke dalam jendela konteksBelakangan mulai mempromosikannya di sekitar Boston dan sepertinya orang-orang menyukainya
Saya juga sempat memikirkan autocomplete, tetapi ide saya lebih mirip Copilot, dan pengalaman pengguna skrip ini tampak lebih baik
Bagian memasukkan riwayat ke konteks akan sangat membantu jika menambahkan mode riwayat seperti ell
Pembersihan kata sandi adalah ide bagus, jadi saya berencana menambahkannya sebagai plugin
Integrasinya dengan shell sangat baik, dan pilihan menulisnya langsung dalam bash memang berani, tetapi efektif untuk menjaga portabilitas
Saya penasaran apakah ini juga berjalan di shell Fish, dan bagaimana cara memperbarui atau menghapusnya
Terlihat bagus. Karena saya bekerja di banyak mesin, alat ringan seperti yang ditulis dalam shell selalu menarik
Saya penasaran, bisa jelaskan kenapa perintah seperti
: "${ELL_LOG_LEVEL:=2}";diawali dengan titik dua? Saya pikir titik dua hanya berguna sebagai perintah tanpa operasi[1]: https://github.com/simonmysun/ell/blob/main/ell.sh#L19C1-L19...
:pada dasarnya membuat bash tidak melakukan apa pun dengan hasil dari baris tersebutJadi
: "${ELL_LOG_LEVEL:=2}";menginisialisasiELL_LOG_LEVELke 2 hanya jika belum disetel, tanpa outputSaya mempelajarinya di sini: https://stackoverflow.com/a/28085062/2485717
Pendekatan yang hanya memakai bash murni dan tool Unix menarik
Saya membuat Plandex[1] dengan tujuan serupa: sama-sama tanpa dependensi, berbasis terminal, dan mendukung input pipe sebagai konteks, tetapi mengambil jalur yang sama sekali berbeda dengan menulisnya dalam Go dan mengompilasinya menjadi binary statis
Plandex lebih tingkat tinggi dan berfokus pada coding, sedangkan ell terlihat seperti alat LLM yang sangat ringan dan serbaguna, dan sangat mengingatkan saya pada
llm[2] milik Simon WillisonFitur perekamannya juga mengingatkan pada savvy[3]
1 - https://github.com/plandex-ai/plandex
2 - https://github.com/simonw/llm
3 - https://github.com/getsavvyinc/savvy-cli
Saya tidak tahu tool
llmmilik Simon Willison, tetapi memang rasanya ia pasti pernah membuat software seperti itullmmendukung fitur untuk memanipulasi LLM lebih mendalam, sementara ell kekurangan fitur seperti itu, tetapi sebagai gantinya mencoba memakai hanya antarmuka yang paling umum dan mendasar sambil menjaga peningkatan pengalaman pengguna seperti paging atau syntax highlighting tetap seringan mungkinSaya sebaiknya menyebutkannya di README agar pengguna yang membutuhkan manipulasi LLM lebih banyak diarahkan ke
simonw/llmLink “Risks” di README rusak
Yang saya inginkan adalah
ell -rotomatis aktif, dan alias bernamafixyang mengusulkan perbaikan termasuk perubahan fileMisalnya jika ada typo di
main.cc, lalu menjalankangcc main.ccdan setelah itu menjalankanfix, akan bagus jika ell mengusulkan perbaikan dalam bentuk diff terhadap file, menerapkan perubahan setelah disetujui, lalu menawarkan untuk menjalankangcclagi dan menjalankannya jika disetujuiell -rbisa ditambahkan ke.bashrc, tetapi saya tidak yakin apakah itu akan bentrok dengan konfigurasi pengguna yang sudah ada atau menimbulkan masalah lainSelain konfirmasi patch, sepertinya bisa dilakukan dengan template dan plugin, tetapi penerapan perubahan sebenarnya sulit, baik secara teknis maupun dari sisi desain antarmuka pengguna
Saya akan mencari tahu sejauh mana yang memungkinkan
ell -rotomatis, cukup tambahkan saja ke.bashrcSaya berencana mencobanya, dan secara pribadi saya memakai aichat[0] untuk keperluan ini
Menarik ketika mengatakan bahwa hal seperti ini tidak membutuhkan bahasa yang lebih kompleks daripada bash, tetapi fakta bahwa
jq/curl/perldiperlukan justru terasa seperti mengatakan sebaliknya[0] https://github.com/sigoden/aichat
Ide awalnya adalah menangani semuanya dengan Bash, tetapi karena alasan-alasan yang saya tulis, itu tidak memungkinkan
Dengan awk,
jqdanperlmungkin bisa dihilangkan, tetapi akan banyak mengorbankan kesederhanaan dan keterbacaan kodeSaya menganggap implementasi syntax highlighter sebagai batas bawah yang masih bisa saya paksakan, dan saya tidak ingin membuat sesuatu yang lebih kompleks dari itu dengan Bash
Fitur seperti itu tidak akan didukung, atau hanya akan didukung melalui plugin eksternal
Di Linux, saya membuat skrip bash kecil yang mengunduh binary terbaru dan mengekstraknya ke
/home/me/binMenarik, tetapi di video demo terlihat kesalahan LLM yang khas
Dijelaskan bahwa memakai
1<>bisa menimpa file yang sudah ada, lalu agar menghindarinya disarankan append dengan opsi-a, kemudian diberikan contohbash ls 1<> output.txt; tetapi contoh itu tidak sesuai dengan penjelasan dan keliruSejauh yang saya tahu, perilaku yang paling mendekati adalah
ls >> output.txtDalam konteks ini saya tidak begitu yakin apakah ada pemanggilan
1<> output.txtyang bermakna; mungkin saja caranya mengikatnya ke file descriptor kustom seperti 3 lalu memakaitee --appendSebenarnya saat direkam sebelumnya hasilnya tidak seburuk ini, dan ketika merekam ulang dengan skrip yang sama juga tidak banyak yang diubah
Video yang pertama kali direkam untuk versi sebelumnya ada di sini: https://github.com/simonmysun/ell/blob/d4fc5468157fa6adc8f9f...
Sayangnya, LLM tidak stabil
Sebagai referensi, berikut tautan video yang berisi kesalahan tersebut:
https://github.com/user-attachments/assets/1355ad08-6fbf-4c0...
https://github.com/simonmysun/ell/blob/553d38f60ad104893b2a3...
Saya sangat menyukai mods dari Charmbracelet
Saya sudah memakainya selama beberapa bulan; berfungsi dengan baik, sangat bisa dikustomisasi, dan output-nya rapi
https://github.com/charmbracelet/mods
Penggunaan interaktif ell bergantung pada
scriptuntuk merekam output terminalPengelolaan percakapan lampau bisa saja didukung lewat plugin yang memiliki efek samping, tetapi perlu dipikirkan apakah itu selaras dengan ide dan filosofi ell
Saya sudah mencari proyek serupa, tetapi tidak menemukan alat praktis yang kuat seperti yang dibagikan para pengguna HN ini