- LLM 0.26 adalah rilis besar yang memungkinkan tool yang dibuat sebagai fungsi Python dihubungkan ke model lokal OpenAI, Anthropic, Gemini, dan Ollama dari CLI maupun library Python
- Tool dapat dipasang sebagai plugin lalu dipanggil dengan
--tool/-T name_of_tool, atau fungsi Python ad-hoc bisa langsung diberikan dari baris perintah lewat --functions
- Selain tool bawaan
llm_version dan llm_time, tersedia plugin simpleeval, QuickJS, SQLite, dan Datasette, dan model dapat mencoba lagi setelah panggilan gagal dengan memeriksa skema atau memakai ekspresi lain
model.chain() baru di Python API mendeteksi permintaan pemanggilan tool, menjalankannya, lalu mengirimkan hasilnya kembali ke model, serta mendukung fungsi sinkron maupun tool asyncio
- Implementasi ini dimungkinkan karena pola penggunaan tool dan function calling dari berbagai vendor mulai konvergen, dan tugas berikutnya adalah memperluas plugin, menambah dukungan untuk lebih banyak plugin model, serta dukungan klien Model Context Protocol
Dukungan eksekusi tool di LLM 0.26
- LLM 0.26 menambahkan dukungan tool, fitur terbesar sejak proyek ini dimulai
- Dari LLM CLI dan library Python, kini bisa memberi model lokal OpenAI, Anthropic, Gemini, dan Ollama akses ke tool yang dapat direpresentasikan sebagai fungsi Python
- Dengan memasang plugin tool baru, Anda bisa menambahkan kemampuan baru ke model yang sedang digunakan
- Ada empat cara penggunaan utama
- Pasang plugin tool lalu muat dengan
--tool/-T name_of_tool
- Berikan kode fungsi Python langsung di baris perintah lewat opsi
--functions
- Di Python API, tool juga bisa diberikan dengan cara seperti
tools=[locals]
- Tool bekerja di konteks asinkron maupun sinkron
Menjalankan tool dari CLI
- LLM terbaru dapat dipasang dengan
uv tool install llm, dan instalasi yang sudah ada dapat di-upgrade dengan uv tool upgrade llm
- Contoh penggunaan OpenAI dimulai dengan mengatur API key lewat
llm keys set openai, lalu dijalankan seperti berikut
llm --tool llm_version "What version?" --td
llm_version adalah tool demo sederhana yang disertakan di LLM, dan --tool llm_version mengekspos tool tersebut ke model
--tool dapat ditentukan beberapa kali, dan opsi singkat -T juga bisa digunakan
--td adalah singkatan dari --tools-debug, yang menampilkan informasi pemanggilan dan respons tool agar Anda bisa melihat cara kerjanya di balik layar
- Model default biasanya
gpt-4o-mini, dan pada contoh ini default diubah ke gpt-4.1-mini dengan llm models default gpt-4.1-mini
- Model lain bisa dipilih dengan opsi
-m, dan ada juga contoh menjalankan o4-mini bersama tool bawaan llm_time
llm --tool llm_time "What time is it?" --td -m o4-mini
- Respons dari tool
llm_time mencakup field seperti utc_time, utc_time_iso, local_timezone, local_time, timezone_offset, dan is_dst
Perilaku di berbagai model dan plugin
- Pola perintah yang sama juga bisa dipakai pada plugin model yang mendukung tool
- Contoh Anthropic Claude Sonnet 4 menggunakan alur berikut
llm install llm-anthropic -U
llm keys set anthropic
llm --tool llm_version "What version?" --td -m claude-4-sonnet
- Contoh Google Gemini 2.5 Flash menggunakan alur berikut
llm install llm-gemini -U
llm keys set gemini
llm --tool llm_version "What version?" --td -m gemini-2.5-flash-preview-05-20
qwen3:4b yang dijalankan lewat Ollama juga bisa menjalankan tool sederhana
qwen3:4b adalah model kecil berukuran 2.6GB
ollama pull qwen3:4b
llm install 'llm-ollama>=0.11a0'
llm --tool llm_version "What version?" --td -m qwen3:4b
Plugin tool untuk matematika, JavaScript, SQLite, dan Datasette
- Tugas seperti perkalian bilangan besar, yang lemah jika dikerjakan langsung oleh LLM, bisa ditangani lewat pemanggilan tool
- llm-tools-simpleeval mengekspos library simpleeval buatan Daniel Fairhead
- simpleeval adalah library “Simple Safe Sandboxed Extensible Expression Evaluator for Python”
- Library ini menyediakan sandbox yang cukup tangguh untuk menjalankan ekspresi Python sederhana
- Contoh perhitungannya dijalankan seperti berikut
llm install llm-tools-simpleeval
llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
- Dalam contoh eksekusi, model mula-mula menghitung
1234 * 4346 / 32414 dan memperoleh 165.45208860368976, lalu gagal karena sqrt(...) tidak terdefinisi, kemudian mengubahnya menjadi ** 0.5 dan mendapatkan 12.862818066181678
- Saat ini ada empat plugin tool yang telah dipublikasikan
- llm-tools-simpleeval: mendukung ekspresi sederhana seperti matematika
- llm-tools-quickjs: menyediakan akses ke interpreter JavaScript QuickJS yang disandbox, dengan environment yang dipertahankan antar-pemanggilan sehingga variabel dan fungsi bisa dipakai ulang
- llm-tools-sqlite: menyediakan akses query SQL read-only ke database SQLite lokal
- llm-tools-datasette: menjalankan query SQL ke instance Datasette jarak jauh
Toolbox Datasette dan retry setelah error
- Plugin Datasette bekerja dalam bentuk toolbox yang berisi beberapa tool di dalamnya
- Toolbox adalah plugin yang dapat dikonfigurasi lewat konstruktor
- Contoh penggunaannya adalah sebagai berikut
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
Datasette("https://datasette.io/content") meneruskan URL instance Datasette yang akan dipakai ke plugin
- Contoh ini menargetkan content database yang menjalankan situs web Datasette
- Model melakukan tiga kali pemanggilan
- Awalnya menebak
SELECT name, stars FROM repos ORDER BY stars DESC LIMIT 1, tetapi gagal karena kolom stars tidak ada
- Setelah menerima error, model memanggil tool
Datasette_schema() untuk memeriksa skema database
- Berdasarkan skema tersebut, model menyusun dan menjalankan query yang benar
- Menurut respons akhirnya, repositori dengan bintang terbanyak adalah
datasette dengan 10,020 stars
Membuat tool ad-hoc dengan --functions
- Opsi
--functions menyediakan cara memakai tool ad-hoc yang kurang terstruktur dibanding plugin
- Jika blok kode Python diberikan langsung di baris perintah, fungsi-fungsi yang didefinisikan di dalamnya menjadi tool yang bisa dipakai model
- Contoh tool pencarian blog berikut memanggil halaman pencarian lewat
httpx dan mengembalikan HTML mentah ke model
llm --functions '\nimport httpx\n\ndef search_blog(q):\n "Search Simon Willison blog"\n return httpx.get("https://simonwillison.net/search/", params={"q": q}).content\n' --td 'Three features of sqlite-utils' -s 'use Simon search'
- Implementasinya memang hanya mengembalikan HTML halaman pencarian apa adanya, tetapi tetap berfungsi
- Karena keluarga GPT-4.1 dapat menangani 1 juta token, HTML mentah semacam itu dianggap masih bisa ditoleransi
- Prompt sistem perlu ditambah
use Simon search agar model tidak menjawab sendiri dan benar-benar menggunakan tool pencarian yang disediakan
- Tool pencarian yang lebih baik akan memerlukan instruksi yang lebih detail serta cuplikan hasil pencarian yang relevan
- Dalam hasil contoh, fitur
sqlite-utils yang muncul meliputi gabungan CLI dan library Python, penambahan kolom otomatis lewat alter=True, serta dukungan plugin
Dukungan tool di Python API
- LLM adalah tool CLI sekaligus library Python, dan pada versi 0.26 dukungan tool juga ditambahkan ke Python API
- Contohnya menyelesaikan masalah menghitung jumlah
r di dalam “strawberry” dengan tool fungsi
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 adalah cara untuk memeriksa pemanggilan tool, mirip seperti opsi --td sebelumnya
- Metode baru
model.chain() mirip dengan model.prompt(), tetapi ia mendeteksi permintaan pemanggilan tool yang dikembalikan, menjalankannya, lalu memanggil model lagi dengan hasil tersebut
model.chain() dapat menjalankan beberapa respons sebelum memberikan jawaban akhir
- Dengan mengiterasi
chain_response, token yang dikembalikan di berbagai respons bisa ditampilkan sebagai streaming output
- Dalam hasil contoh, tool
count_char_in_text dipanggil dengan char='r' dan text='strawberry', lalu berdasarkan hasil 3 model menjawab bahwa ada 3 huruf r di strawberry
- Library Python juga mendukung
asyncio, sehingga tool bisa berupa fungsi async def
- Jika model meminta beberapa tool asinkron sekaligus, library akan menjalankannya secara paralel dengan
asyncio.gather()
- Toolbox juga didukung, jadi meneruskan
tools=[Datasette("https://datasette.io/content")] ke chain() akan memberi efek yang sama seperti --tool 'Datasette(...)' di CLI
Latar belakang implementasi dan pola penggunaan tool
- Pola penggunaan tool ini telah diikuti sejak pertama kali melihat paper ReAcT yang dipublikasikan pada Oktober 2022
- Pola dasarnya sederhana
- Beri tahu model bahwa ada tool yang bisa digunakan
- Model meminta aksi tool dengan sintaks khusus seperti JSON, XML, atau
tool_name(arguments), lalu berhenti
- Kode mem-parse output tersebut dan menjalankan tool yang diminta
- Hasil eksekusi dikirim kembali ke model dalam prompt baru
- Pola ini sekarang bekerja di hampir semua model
- Banyak model memang dilatih khusus untuk penggunaan tool, dan bahkan ada leaderboard seperti Berkeley Function-Calling Leaderboard
- OpenAI, Anthropic, Google, Mistral, dan Meta semuanya menyertakan fitur penggunaan tool atau function calling di API mereka
- Di sisi model lokal, Ollama menambahkan dukungan tool tahun lalu, dan server llama.cpp juga sudah menyertakannya
- Pada Februari 2025, LLM lebih dulu merilis dukungan skema, yang dijadikan langkah menuju dukungan tool
- Tantangannya adalah merancang lapisan abstraksi yang bekerja lintas banyak model, dan implementasi ini baru memungkinkan sekarang karena pendekatan antar-vendor sudah semakin jelas konvergen
- Workshop PyCon US Building software on top of Large Language Models menjadi pendorong untuk merampungkan implementasi alfa, dan tersedia juga bagian tools dalam tutorialnya
Agent dan rencana berikutnya
- Istilah “agents” masih terasa kurang nyaman, tetapi di dunia LLM konsepnya semakin mengerucut menjadi tools in a loop, dan LLM 0.26 juga dekat dengan bentuk tersebut
- Jika ingin membangun agent, LLM 0.26 bisa menjadi titik awal yang baik
- Pekerjaan berikutnya dirangkum dalam 13 issue di LLM tools v2 milestone
- Sebagian besar terkait peningkatan tampilan log eksekusi tool dan issue kecil lain yang tidak menghalangi rilis kali ini
- Issue tambahan ada di label tools
- Area yang paling menjanjikan adalah kemungkinan plugin
- Template cookiecutter llm-plugin-tools sudah digunakan secara internal
- Ada rencana membuat tutorial terkait hal ini
- Masih ada pekerjaan untuk menambahkan dukungan tool ke lebih banyak plugin model
- Dokumentasi plugin tingkat lanjut kini menambahkan detail dukungan tool
- Commit yang menambahkan dukungan tool untuk Gemini adalah contoh pekerjaan yang diperlukan
- Dukungan Model Context Protocol juga masuk dalam rencana
- MCP sedang cepat naik sebagai cara standar bagi model untuk mengakses tool
- Dua minggu lalu dukungan langsung belum tersedia di API vendor besar, tetapi dalam 8 hari terakhir sudah ditambahkan ke OpenAI, Anthropic, dan Mistral
- Tujuannya adalah agar LLM dapat bertindak sebagai klien MCP sehingga server MCP buatan orang lain bisa dengan mudah dipakai sebagai sumber tool tambahan untuk LLM
1 komentar
Komentar Hacker News
Renderer Markdown streaming yang dibuat untuk alat ini juga layak dilihat: https://github.com/day50-dev/Streamdown
Latar belakangnya ada di https://github.com/simonw/llm/issues/12, dan saya juga memakai setiap hari https://github.com/day50-dev/llmehelp, yang berisi alat tmux yang dibuat di atas
llmmilik Simonllm: plugin ZSH yang memakaizleuntuk mengubah bahasa Inggris menjadi perintah shell dengan sekali tekan tombol: https://github.com/day50-dev/ZummonerHari ini pun saya memakainya seperti
$ git find out if abcdefg is a descendent of hijklmnop, danfor i in $(seq 1 6); do printf "%${i}sh${i}\n\n-----\n" | tr " " "#"; done | pv -bqL 30di komentar lain awalnya juga berupa input yang jauh lebih mendekati bahasa alamiSaat menekan
ctrl-x x, buffer dikirim ke OpenRouter dan diganti dengan sintaks yang benar dalam kurang dari 1 detikSaya sudah membuka issue: https://github.com/simonw/llm/issues/1112
Saya memasukkan beberapa opsi desain, tetapi rasanya belum sepenuhnya pas, jadi saya ingin mendapatkan masukan
llmbersama syntax highlighting daribatIni sangat meningkatkan risiko menembak kaki sendiri
Dokumentasi https://llm.datasette.io/en/stable/tools.html memperingatkan soal prompt injection, tetapi menurut saya skenario yang lebih masuk akal adalah kerusakan yang kita lakukan sendiri
Misalnya, jika Anda memberi alat akses ke akun sekuritas untuk mengotomatiskan trading, bahkan tanpa prompt injection pun tidak ada mekanisme yang mencegah bot melakukan transaksi bodoh
Begitu mulai memasang alat ke LLM, terutama jika panggilan alat itu terautentikasi dan bahkan bisa bertindak atas nama Anda, ada terlalu banyak jalur yang bisa membuat keadaan menjadi kacau
Dunia MCP sedang mengalami ini dengan kecepatan sangat tinggi sekarang, dan kasus GitHub MCP kemarin juga salah satu contohnya: https://news.ycombinator.com/item?id=44097390
Saya menaruh peringatan besar di dokumentasi, dan berhati-hati agar plugin alat awal yang dirilis hanya yang tidak bisa menimbulkan kerusakan. Karena itu, plugin sandbox QuickJS dan SQLite juga hanya baca
llmke akun sekuritas, yang bodoh bukan botnya, melainkan orang yang menghubungkannyaDi macOS ini tidak terlalu sulit, tetapi saat ini masih kurang alat yang bagus dan mudah dipakai. Claude Code mulai sedikit demi sedikit memakai Seatbelt untuk memperbaiki pengalaman pengguna
Kita bisa merugikan diri sendiri dan mungkin saja itu terjadi, tetapi tidak menilai kemungkinannya juga berbahaya. Orang awam cenderung meremehkan kemungkinan menembak kaki sendiri, sedangkan teknisi cenderung meremehkan risiko tidak mempelajari kemungkinan baru
Setahun lalu pun saya sudah membiarkan LLM menjalankan perintah lokal di laptop saya, dan meski saya menganggapnya cukup berisiko, tidak ada hal berbahaya yang terjadi. Pada prompt seperti
find out where I am and what weather it is going to be, kemungkinan ia menjalankanrm -rf /memang ada, tetapi sangat kecilNamun menyerahkan trading saham kepada LLM tanpa tahu bagaimana ia mengambil keputusan terlalu berisiko menurut standar saya
Saya suka ide agen berbasis terminal di terminal Warp, tetapi kurang suka model seperti Cursor yang seolah berkata “percayakan prompt yang bagus dan panggilan LLM kepada kami, lalu bayar”
Jadi saya sedang mencari agen terminal berbasis CLI yang sederhana untuk menutupi kekurangan kemampuan shell saya, dan kombinasi alat terminal dengan
llmterlihat seperti solusi yang ringanSaya sangat sadar akan risiko besar menembak kaki sendiri, jadi saya penasaran apakah mungkin memakai cara seperti agen lain yang meminta izin pada setiap panggilan alat. Misalnya, “
llmakan memanggilrm -rf ./*. Tekan Y untuk mengonfirmasi,” sehingga bisa sedikit mencegah LLM mengamuk di terminal--full-auto, bukan?Jika Anda memakai
llm, Gtk-llm-chat juga layak dilihatIni terintegrasi dengan alat command-line
llmdan desktop, serta menyediakan ikon tray dan jendela chat yang enak dilihatBaru-baru ini merilis 3.0.0 dan menyediakan paket untuk tiga sistem operasi desktop utama
Menurut saya rilis ini adalah komponen kunci untuk membuka potensi LLM tanpa batasan klien yang ada
Setelah 0.26 alpha keluar, saya mencoba membuat plugin yang berinteraksi dengan server MCP, tetapi ternyata cukup sulit. Sejauh ini saya sudah berhasil menghubungkan, mengambil daftar alat secara dinamis, dan menggunakannya, tetapi belum bisa meneruskan parameter
Library Python resmi
mcpsangat mengasumsikan alur menjalankanasyncio, terhubung ke server, lalu memeriksa alat yang tersediaSaya mengelola plugin zsh/omz untuk pelengkapan tab CLI
llmhampir sepenuhnya dengan vibe coding, tetapi laju rilis fitur baru begitu cepat sehingga sulit diikutiMeski begitu, perintah seperti
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"sudah menyelesaikan sekitar 90%Repositorinya ada di https://github.com/eliyastein/llm-zsh-plugin, dan karena saya mencoba memasukkan sebanyak mungkin opsi dan flag, hasilnya agak berantakan, jadi saya ingin mendapat masukan
Generasi mendatang akan penasaran bagaimana kita menyelesaikan pekerjaan, sama seperti kita melihat programmer assembly dan berpikir, “bagaimana mereka bisa bekerja?”
Saya penasaran bagaimana Claude Code mengetahui dan menggunakan tool
Kita bisa memberi tahu LLM tentang tool dan cara menggunakannya, dan wrapper eksekusi bisa mengelolanya, tetapi saya melihat Claude Code punya ekspektasi yang sangat spesifik terhadap API pemanggilan tool yang digunakan wrapper, dan kemungkinan itu sangat diperkuat lewat post-training atau fine-tuning
Jadi saya penasaran apakah framework pemanggilan tool pihak ketiga yang menggunakan Claude berada pada posisi kurang menguntungkan dibanding framework milik Anthropic sendiri
Secara terpisah, seperti yang disebutkan dalam tulisan tentang “serangan” GitHub MCP, LLM bisa ditipu untuk menggunakan seluruh hak akses kredensial. Karena ada kredensial autentikasi yang granular seperti di GitHub, dan perusahaan kami juga memilikinya, akan menarik jika seseorang mencoba protokol untuk membuat kredensial terperinci yang diteruskan wrapper ke LLM
Saya membayangkan struktur di mana aplikasi diberi kredensial yang lebih kuat, sementara LLM bawahan dilatih untuk “meminta izin” atas tugas atau resource tertentu. Jika pengguna mengizinkan, framework akan mengambil kredensial dengan cakupan terbatas dari layanan dan menggunakannya untuk pemanggilan tool
Diperlukan konfigurasi tool yang cukup canggih: mengekspos tool “minta kredensial tambahan” dan, saat dipanggil, menanyakannya kepada pengguna
Tool harus menyimpan kredensial dan tidak pernah meneruskan token sebenarnya ke LLM; sebagai gantinya, ia bisa meneruskan simbol seperti
creds1dan memberi tahu agar permintaan berikutnya dipanggil dengancreds1Saya penasaran apakah Anda sudah melihat paper ini. Jika memang sepenting kelihatannya, bukankah metrik ini seharusnya masuk ke semua system card?
Mereka mengevaluasi 12 LLM populer yang mengklaim mendukung konteks 128K token atau lebih, dan menemukan bahwa meski bekerja baik pada konteks pendek, performanya turun tajam saat panjang konteks bertambah. Pada 32K, 10 model turun ke bawah 50% dari baseline panjang pendek, dan bahkan GPT-4o, yang performanya sangat baik sebagai pengecualian, turun dari 99,3% menjadi 69,7%
https://arxiv.org/abs/2502.05167
Sejauh yang saya tahu, dalam needle in a haystack test belakangan ini Gemini 2.5 Pro dan Gemini 2.5 Flash jauh mengungguli model lain, jadi akan menarik jika pengujian ini juga dijalankan pada model-model tersebut
Pekan lalu saya membuat demo chatbot pelanggan berbasis data proprietary dengan 0.26a0
Elemen inti yang harus saya tulis sendiri adalah system prompt, tool untuk mengambil data eksternal, dan tool untuk melakukan perhitungan, dan berkat library ini fitur intinya bisa dibuat dengan sangat mudah
Sebagian besar upaya dalam demo masuk ke pekerjaan plumbing: membuat UI web yang bagus, dengan percakapan yang tetap dipertahankan, tetap diperbarui secara alami meski browser di-refresh karena masalah koneksi, dan memungkinkan memulai sesi chat baru
Saya tidak tahu tentang
after_call=print, jadi senang mengetahuinya setelah membaca posting blogSaya menggunakan tool Simon setiap hari
Berkat pipe dan kemudahan beralih antara Ollama lokal dan model jarak jauh, pekerjaan menjadi sangat nyaman