3 poin oleh GN⁺ 2025-05-28 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2025-05-28
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 llm milik Simon

    • Ada satu lagi yang terlewat yang saya buat di atas llm: plugin ZSH yang memakai zle untuk mengubah bahasa Inggris menjadi perintah shell dengan sekali tekan tombol: https://github.com/day50-dev/Zummoner
      Hari ini pun saya memakainya seperti $ git find out if abcdefg is a descendent of hijklmnop, dan for i in $(seq 1 6); do printf "%${i}sh${i}\n\n-----\n" | tr " " "#"; done | pv -bqL 30 di komentar lain awalnya juga berupa input yang jauh lebih mendekati bahasa alami
      Saat menekan ctrl-x x, buffer dikirim ke OpenRouter dan diganti dengan sintaks yang benar dalam kurang dari 1 detik
    • Library-nya terlihat sangat bagus, dan akan menyenangkan kalau ada hook yang memungkinkan plugin mengambil alih cara konten alat ditampilkan
      Saya 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
    • Saya pernah membuat sendiri renderer Markdown streaming dalam beberapa bahasa untuk menampilkan output LLM streaming dengan cepat, jadi senang mengetahui bukan hanya saya yang melakukannya
    • Menarik, saya akan mengeceknya; saat ini saya memakai llm bersama syntax highlighting dari bat
  • Ini 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

    • Benar, risikonya memang benar-benar meningkat
      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
    • Kalau Anda menghubungkan llm ke akun sekuritas, yang bodoh bukan botnya, melainkan orang yang menghubungkannya
    • Sandboxing akan menjadi kuncinya
      Di 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
    • Menurut saya diskusi soal menembak kaki sendiri melewatkan inti persoalan
      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 menjalankan rm -rf / memang ada, tetapi sangat kecil
      Namun menyerahkan trading saham kepada LLM tanpa tahu bagaimana ia mengambil keputusan terlalu berisiko menurut standar saya
    • Alat apa pun bisa disalahgunakan
  • 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 llm terlihat seperti solusi yang ringan
    Saya 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, “llm akan memanggil rm -rf ./*. Tekan Y untuk mengonfirmasi,” sehingga bisa sedikit mencegah LLM mengamuk di terminal

    • Saya sempat penasaran kenapa terminal itu beriklan di mana-mana dan mensponsori banyak proyek; sekarang saya tahu bahwa ternyata tidak sepenuhnya gratis
    • Sepertinya itu cara kerja default codex CLI saat tidak diberi --full-auto, bukan?
  • Jika Anda memakai llm, Gtk-llm-chat juga layak dilihat
    Ini terintegrasi dengan alat command-line llm dan desktop, serta menyediakan ikon tray dan jendela chat yang enak dilihat
    Baru-baru ini merilis 3.0.0 dan menyediakan paket untuk tiga sistem operasi desktop utama

    • Saya penasaran, selain chat biasa, dipakai untuk apa?
  • 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

    • Pagi ini saya bereksperimen apakah bisa membuat demo plugin cepat dengan MCP, dan ternyata cukup rumit
      Library Python resmi mcp sangat mengasumsikan alur menjalankan asyncio, terhubung ke server, lalu memeriksa alat yang tersedia
  • Saya mengelola plugin zsh/omz untuk pelengkapan tab CLI llm hampir sepenuhnya dengan vibe coding, tetapi laju rilis fitur baru begitu cepat sehingga sulit diikuti
    Meski 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

    • Agak mengejutkan bahwa ini bukan fiksi ilmiah, melainkan sekadar cara coding saat ini
      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

    • Pendekatan kredensial itu sudah mungkin dilakukan sekarang dengan dukungan tool pada LLM
      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 creds1 dan memberi tahu agar permintaan berikutnya dipanggil dengan creds1
  • Saya 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

    • Saya belum melihat paper ini, tetapi sangat menarik
      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 blog

  • Saya menggunakan tool Simon setiap hari
    Berkat pipe dan kemudahan beralih antara Ollama lokal dan model jarak jauh, pekerjaan menjadi sangat nyaman