私のLLM CLIツールが、Pythonコードやプラグインからツールを実行できるように
(simonwillison.net)- LLM 0.26ではさまざまなツール実行機能が追加され、OpenAI、Anthropic、Gemini、Ollamaなど複数のLLMモデルが、Python関数やプラグインとして実装されたツールを利用できるようになった
- コマンドラインやPython APIからツールを直接インストールしたり関数として渡したりでき、拡張性と柔軟性が大幅に向上した
- ツールプラグインにより、数式計算、JavaScript実行、SQLクエリ、外部サービス連携など多様な機能をモデルに容易に追加できる
- 主要なLLMベンダーおよびローカルモデル全般でツール呼び出しパターンが一般化しており、LLM 0.26も標準化された方法でこれを統合している
- 今後の計画と発展の方向性として、MCP標準のサポート、プラグイン開発エコシステムの拡大、ツール実行ログの改善などが議論されている
LLM 0.26: ターミナルから大規模言語モデルでツール実行をサポート
2025年5月27日時点でLLM 0.26がリリースされた。このバージョンは、LLMプロジェクト開始以来で最大規模の変更となっており、ツール(tool)サポートが追加された。これにより、OpenAI、Anthropic、Gemini、Ollamaなど多様なLLMモデルを、LLMのCLIツールおよびPythonライブラリと連携させ、Python関数で表現できるあらゆるツールにアクセスできるようになった。
主な機能と変更点
- プラグインからのツール導入と読み込み:
--tool/-Tオプションにより、インストール済みプラグイン経由でツールを登録して利用できる - コマンドラインからのPythonコード受け渡し:
--functionsオプションでPython関数コードを直接渡し、ツールとして活用できる - Python APIでもツールをサポート:
.chainメソッドにtools=[関数名]を渡すことで簡単にツールを接続できる - 同期・非同期コンテキストをサポート: sync/asyncのどちらの状況でもツール呼び出しが可能
ツール利用例
利用準備
-
最新のLLMをインストール、またはアップグレードする
-
OpenAIなどのAPIキーを登録する:
llm keys set openai # APIキーを入力 -
最初のツール実行例:
llm --tool llm_version "What version?" --td- llm_versionは標準で提供されるシンプルなデモツール
--tdはツールデバッグ出力オプションで、ツール呼び出しの流れや応答内容を確認できる
-
モデルを変更する:
llm models default gpt-4.1-mini- オプションによりさまざまなモデルを利用できる(
-m o4-miniなど)
- オプションによりさまざまなモデルを利用できる(
-
内蔵の時刻ツールを呼び出す:
llm --tool llm_time "What time is it?" --td -m o4-mini- 時刻とタイムゾーン情報を詳細に出力する
多様なモデルとプラグインをサポート
- Anthropic Claude 4、Google Gemini 2.5 Flash、Ollama Qwen3:4bなど、複数のLLMモデル環境で同じツールインターフェースが動作する
- 例示コマンド:
llm install llm-anthropic -U llm keys set anthropic llm --tool llm_version "What version?" --td -m claude-4-sonnet
数学演算とコード実行
- 数学が苦手なLLMの限界をPythonツールで補える
- llm-tools-simpleevalプラグインにより、安全な算術演算をサポート
llm install llm-tools-simpleeval llm -T simpleeval llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --tdsqrt()が使えない場合は** 0.5で代替するなど、コード実行の柔軟性を確保できる
ツールプラグインの紹介
- [llm-tools-quickjs]: QuickJS JavaScriptサンドボックスインタープリターツール
例:
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
- ツールボックス形式のプラグインで、URLなどの引数を通じて設定できる
- 列名の指定が誤っていた場合でも、ツールエラーを検知して再試行 → スキーマ確認 → 正しいクエリ生成、という流れでLLMの適応力を示している
Pythonコードで直接ツールを定義
- コマンドラインで
--functionsオプションを使い、任意のPython関数を渡してその場でツール化できる - 例:
llm --functions ' import httpx def search_blog(q): "Search Simon Willison blog" return httpx.get("https://simonwillison.net/search/", params={"q": q}).content ' --td 'Three features of sqlite-utils' -s 'use Simon search'- シンプルなWeb検索ツールを実装できる
- System promptを通じて、モデルにツール利用の方向性を与えることが重要
Pythonライブラリへの統合活用
- LLMはCLIとPython APIの両方をサポートしている
.chain()メソッドにより、ツール呼び出し要求の検出 → 実行 → 結果の反映までの一連の処理を自動化できる- 例:
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) - 非同期関数(
async def)もサポートされ、並行実行が可能 - ツールボックス型プラグインも
tools=[Datasette(...)]の形でそのまま接続できる
ツールパラダイムの発展過程
- ツール呼び出しパターンは2022年のReAcT論文などで紹介されて以降、主要なLLMベンダーやローカルモデルすべてに導入されてきた
- APIごとに「Function calling」や「ツール利用」など名称は異なるが、共通した形へと収束している
- Ollama、llama.cppなどでもすでにツールサポートが追加され、機能拡張が進んでいる
開発・運用の舞台裏
- LLMでは長らくツール連携の必要性を認識していたが、複数モデル間での抽象化レイヤー設計は難しかった
- ベンダー間でツールパターンの標準化が進んだことで、LLM 0.26で統合実装が可能になった
- PyCon US 2025のワークショップで、実務活用例としてデモが行われた
「エージェント」との関係
- 「エージェント」という用語には依然として議論があるが、現在のLLMエコシステムでは「tool in the loop」形式として標準化が進んでいる
- LLM 0.26はエージェント開発にも適した実装となっている
- 今後はプラグイン作成向けテンプレート、改善イシュー、高度なプラグインのドキュメント整備などが活発に進められる見込み
Model Context Protocol(MCP)対応予定
- MCPは、LLMがツールへアクセスするための新しい標準プロトコルとして急速に存在感を高めている
- 直近8日間のうちに、OpenAI、Anthropic、Mistralなど大手ベンダーのAPIにも急速に導入されつつある
- 今後はLLMをMCPクライアントにし、多様なMCPサーバーへ容易に接続できるようにする計画
コミュニティと拡張
- LLMプロジェクトでは、プラグインやツール開発の議論、エコシステム拡大のためにDiscordコミュニティを運営している
- オープンソースエコシステムにおけるツールベースのLLM活用可能性は、事実上無限であることが強調されている
このようにLLM 0.26は、主要なLLMモデルすべてと連携できる汎用的かつ拡張可能なツール連携プラットフォームへと進化している。ツールを通じて言語モデルの活用範囲を大きく広げられる点で、開発者やIT実務者にとって非常に意義のあるツールだ。
1件のコメント
Hacker News のコメント
このツールのために自作したストリーミング Markdown レンダラーがある
詳細は Streamdown を参照
参考になるものがもう1つ ここ にあり
llmehelp という tmux ツールも自作したが、これは Simon の llm の上に載っている
今では毎日使う必須ツールになっている
このライブラリは本当にすばらしく見える
プラグインが表示部分を直接制御できるフックがあればいいのにと思った
その件についての issue を ここ に上げた
いくつか設計案も含めたが、まだ 100% これだという確信はない
ぜひフィードバックがほしい
もう1つ書き忘れていたものがある
今度は llm ベースで作った ZSH プラグインだ
zle を使って英語を一発でシェルコマンドに変換するのに使っている
その名も Zummoner
自分の生活を完全に変えたツールだ
例えば今日自分で作ったコマンドはこれ
実際にこのコメント群のどれかで使ったコマンドはこれ
元の入力は
おなじみの
ctrl-x xの組み合わせでバッファを openrouter に送り、1秒以内に正しい構文で返ってくるすごい
自分もストリーミング LLM 出力を素早く表示するために、いくつかの言語でストリーミング Markdown レンダラーを作ったことがある
自分だけかと思っていたので、仲間がいてうれしい
面白そう、ぜひ試してみたい
自分は llm を bat と組み合わせてシンタックスハイライト付きで使っている
こういう機能を本当に求めていた
ありがとう
こういう種類のツールは footgun(自分で危険を招く)リスクがかなり高くなる
ドキュメントには prompt injection(プロンプト注入)への注意書きがあるが、実際には自分のミスによる被害のほうがもっと多そうだ
例えばツールに証券口座へのアクセス権を与えれば、取引の自動化ができてしまう
プロンプト注入がなくても、ボットが愚かな取引をしても止める手段がない
参考ドキュメント
こういう事故のリスクは本当に大きい
LLM にツールを接続すると、認証済みの呼び出しで自分の代わりに何かを実行できるケースが多く、予想外のことが起きうる
最近の GitHub MCP の事例などでもそれが見られる 関連記事
ドキュメントにも大きく危険警告を表示してあり、実際に損害を与えうる初期ツールプラグインは公開していない
そのため、自分の QuickJS サンドボックスや SQLite プラグインは読み取り専用にしてある
それでもこの分野全体はとても面白く、不思議な広がりを持っている
もし llm を証券口座に接続する人がいるなら、それはボットが愚かなのではなく、人間のほうが愚かなのに近い
どんなツールにも誤用のリスクはある
llm を使っている人には Gtk-llm-chat を勧めたい
ものすごい労力をかけて作られている
llm コマンドラインツールとのデスクトップ統合、トレイアイコン、きれいなチャットウィンドウを提供してくれる
3大デスクトップ OS 向けパッケージで最近 3.0.0 がリリースされた
普通のチャット以外にどう使っているのか気になる
これは本当に最高のタイミングだ
最近ターミナル(Warp)でいろいろ試しているが、agent 導入のアイデア自体は気に入っている一方で、Cursor のような「うちのプロンプト/LLM 呼び出しに任せてください(しかも課金あり)」方式には少し抵抗がある
だから、自分の不足しているシェル力を補うためのシンプルな CLI ベースのターミナルエージェントがほしかった
こういうツールに footgun リスクが大きいことは十分わかっている
でもターミナルツール + llm の組み合わせは本当に軽量で理想的な組み合わせに思えるので期待している
他のいくつかの「エージェント」製品のように、llm が
rm -rf ./*のようなツール呼び出しをしようとした時に「Y を押して承認」のように毎回許可を求める仕組みをサポートしているのか気になるそれができれば、LLM が自分のターミナルを勝手に操作するのを防げて、ある程度の安全策になるはずだ
--full-autoフラグなしで実行すると、毎回承認を求める形になる自分は LLM CLI のタブ補完用 zsh/omz プラグインを熱心に保守しているが、新機能のリリース速度が速すぎて追いつくのが大変だ
幸い、次のコマンドで 90% くらいまでは自動で実装してくれる
自分のプラグインリポジトリは ここ
できるだけ多くのオプションをカバーしたくて、構造がやや複雑になっている
フィードバックをもらえたら本当にありがたい
未来の世代は、昔の自分たちがどうやって何かを作っていたのか不思議に思うだろう
自分たちがアセンブリプログラマの仕事ぶりを想像できないのと同じ感覚だ
GPT-4.1 は構造化出力からツール呼び出しまで本当に強力なモデルだ
この2年間、自分の日常的な反復作業はほとんど LLM が処理してきた
安価で性能も良いモデルの組み合わせなので、いつもこれをデフォルトモデルにしている
API でいろいろ触ってみた結果、とんでもなく安いのに本当にたいていのことをうまくこなす
コーディングの時は o4-mini、それ以外は 4.1-mini でたいてい十分だ
今日、遊びで使った例 コメントが1つもない見事な CSS Minecraft デモコードを GPT-4.1 mini に解説させた
関連デモの ソース
GPT-4.1 mini の回答は本当にすばらしかった
「この CSS は最先端の CSS 技法により、最小限の JavaScript で 3D インタラクティブなボクセルスタイル UI を実現している」など、難しいトリックまで正確に指摘していた
説明全文
入力トークン 3,813、出力トークン 1,291
計算結果 は約 0.3591 セントで、1 セントの 3 分の 1 程度のコストにすぎない
Simon のツールは本当にすごい
毎日使っている
パイプでの組み合わせやモデルの簡単な切り替え(ollama などのローカル・リモート両対応)のおかげで作業がとても楽になる
本当にすばらしい内容だ
自分の知る限り llama.cpp もツールをサポートしているが、llm でどう統合すればいいのかまだ見つけられていない
extra-openai-models.yaml に何か追加すれば解決できるのか気になっている
...試してみたら、2つ目の方法で動いた そして別ウィンドウで まとめは ここ にある
今回のリリースには本当に感謝している
このライブラリは、既存クライアントの限界や制約を超えて LLM の可能性を完全に開く中核コンポーネントだと思う
0.26 alpha のリリース以来、MCP サーバーとやり取りするプラグインを作ろうとしていたが、少し難しく感じている
ひとまず接続してツールを動的に取得・利用できるところまでは作れたが、まだパラメータの受け渡しまでは解決できていない
できるだけシンプルなプラグインデモを試したが、簡単ではなかった
公式の mcp Python ライブラリは asyncio の実行、サーバー接続、利用可能ツールのイントロスペクションなどを要求する形になっている
長年待ち望んでいた機能だ
mcp や openapi ベースの実装になると予想していたが、今の方式のほうがずっとシンプルで柔軟かもしれない
プラグインとして実装するのもそれほど難しくなさそうだと思う