1 poin oleh GN⁺ 2024-08-04 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2024-08-04
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 seperti cat somecode.py | llm -m claude-3.5-sonnet --system "Explain this code" dengan memisahkan instruksi ke system prompt
    Kalau 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...

    • Saya sudah lama skeptis terhadap LLM, tetapi setelah mengenal tool command-line llm, ulasan Claude 3 Opus, dan 3.5 Sonnet yang jauh lebih murah, saya mulai memakai LLM setiap hari
      Fitur 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, berisi llm -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 diawasi
      Bisa 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 terminal
    • Bisa. Misalnya gunakan cat 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 llm serta tulisan terkaitnya, motivasi saya membuat ell mungkin akan jauh berkurang
    • Saya tidak tahu cara mengatur model claude-3.5-sonnet agar bisa dipakai secara lokal di llm. Saya sudah membaca dokumentasi plugin, tetapi tetap tidak berhasil mengetahuinya
  • Ada juga proyek yang mencoba melakukan hal serupa dengan shell. Saya tidak terlalu tahu mana yang lebih baik
    demo
    source code

    • Terlihat jauh lebih mencolok
      Awalnya saya mengira strukturnya membaca dari tempat seperti .bash_history untuk mendapatkan input pengguna, tetapi setelah dicek ternyata output terminal tidak bisa dimanfaatkan sebagai konteks
      Meski begitu, saya suka mereka memakai awk untuk memproses respons, dan sepertinya ell juga bisa memakai awk untuk mengurangi dependensi pada jq dan perl
      Saya berencana menambahkannya ke bagian proyek terkait di README
    • Indah dan fiturnya banyak, tapi saya penasaran kenapa bintang GitHub-nya begitu sedikit
  • 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 ~/.ellrcd
    Selain itu, karena saya tidak ingin memberi akses API key ke semua program yang dijalankan, saya lebih memilih penyimpanan rahasia sistem daripada environment variable

    • Dukungan gambarnya keren
      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
    • Saya penasaran apa cara yang direkomendasikan untuk menyimpan rahasia di mesin pengembangan Linux
      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...
    • Justru saya berharap keyring tidak dipakai. Merepotkan dan di beberapa sistem tidak ada
      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
    • Saya tidak punya SQLite dan tidak tahu cara memakainya
      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 Ollama
    Agar lebih pintar, saya juga memasukkan riwayat terbaru yang sudah dibersihkan dari kata sandi, variabel lingkungan yang disetel, dan output --help dari perintah terkait ke dalam jendela konteks
    Belakangan mulai mempromosikannya di sekitar Boston dan sepertinya orang-orang menyukainya

    • Video demonya sangat bagus: https://youtu.be/IAgkjerCvz8
    • Terlihat sangat berguna
      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
    • Saya melihat autocomplete-sh berjalan di pertemuan AI Tinkerers di Cambridge, MA, dan itu mengesankan
      Integrasinya dengan shell sangat baik, dan pilihan menulisnya langsung dalam bash memang berani, tetapi efektif untuk menjaga portabilitas
    • Terlihat menarik
      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 tersebut
      Jadi : "${ELL_LOG_LEVEL:=2}"; menginisialisasi ELL_LOG_LEVEL ke 2 hanya jika belum disetel, tanpa output
    • Titik dua dimasukkan untuk memastikan hasilnya tidak dieksekusi
      Saya 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 Willison
    Fitur 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

    • Plandex juga bagus, dan saya belum pernah memikirkan alur kerja seperti itu
      Saya tidak tahu tool llm milik Simon Willison, tetapi memang rasanya ia pasti pernah membuat software seperti itu
      llm mendukung 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 mungkin
      Saya sebaiknya menyebutkannya di README agar pengguna yang membutuhkan manipulasi LLM lebih banyak diarahkan ke simonw/llm
  • Link “Risks” di README rusak
    Yang saya inginkan adalah ell -r otomatis aktif, dan alias bernama fix yang mengusulkan perbaikan termasuk perubahan file
    Misalnya jika ada typo di main.cc, lalu menjalankan gcc main.cc dan setelah itu menjalankan fix, akan bagus jika ell mengusulkan perbaikan dalam bentuk diff terhadap file, menerapkan perubahan setelah disetujui, lalu menawarkan untuk menjalankan gcc lagi dan menjalankannya jika disetujui

    • Link “Risks” sudah diperbaiki
      ell -r bisa ditambahkan ke .bashrc, tetapi saya tidak yakin apakah itu akan bentrok dengan konfigurasi pengguna yang sudah ada atau menimbulkan masalah lain
      Selain 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
    • Untuk menjalankan ell -r otomatis, cukup tambahkan saja ke .bashrc
  • Saya 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/perl diperlukan justru terasa seperti mengatakan sebaliknya
    [0] https://github.com/sigoden/aichat

    • Benar. Karena itu saya menuliskannya sebagai batasan
      Ide awalnya adalah menangani semuanya dengan Bash, tetapi karena alasan-alasan yang saya tulis, itu tidak memungkinkan
      Dengan awk, jq dan perl mungkin bisa dihilangkan, tetapi akan banyak mengorbankan kesederhanaan dan keterbacaan kode
      Saya 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
    • Satu suara lagi untuk aichat. Sangat bagus
      Di Linux, saya membuat skrip bash kecil yang mengunduh binary terbaru dan mengekstraknya ke /home/me/bin
  • Menarik, 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 contoh bash ls 1<> output.txt; tetapi contoh itu tidak sesuai dengan penjelasan dan keliru
    Sejauh yang saya tahu, perilaku yang paling mendekati adalah ls >> output.txt
    Dalam konteks ini saya tidak begitu yakin apakah ada pemanggilan 1<> output.txt yang bermakna; mungkin saja caranya mengikatnya ke file descriptor kustom seperti 3 lalu memakai tee --append

  • 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

    • mods cocok untuk percakapan, tetapi sebaliknya ell sendiri stateless dari sisi input pengguna dan konten yang dihasilkan
      Penggunaan interaktif ell bergantung pada script untuk merekam output terminal
      Pengelolaan 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