世界を動かす技術を、日本語で。

HNに表示: 私のLLM CLIツールは、Pythonコードやプラグインからツールを実行できるようになりました

概要

LLM 0.26 が2025年5月27日にリリース。 最大の新機能は ツールサポート の追加。 CLIツール やPythonライブラリから、各種LLMモデルにPython関数ベースのツールを利用可能に。 プラグイン によるツール追加や、コマンドラインからのアドホックな関数提供も対応。 OpenAI、Anthropic、Gemini、Ollamaなど主要モデルやローカルモデルにも幅広く対応。


LLM 0.26の新機能:ツールサポートの全貌

  • LLM 0.26 は、OpenAI、Anthropic、Gemini、Ollamaなどのモデルに Python関数として表現できる任意のツール を利用可能に
  • CLIツールPythonライブラリ の両方でツール機能をサポート
  • ツールプラグイン の導入により、モデルごとに機能拡張が可能
  • ツールは 非同期(async)同期(sync) の両方で動作
  • コマンドライン からツールを指定:--tool-Tオプションでツール名を指定し実行
  • Python関数 をコマンドラインで直接渡せる--functionsオプションも追加
  • Python API でもツール利用が可能:
    • 例:llm.get_model("gpt-4.1").chain("show me the locals", tools=[locals]).text()
  • ツールデバッグ 用の--tdオプションでツール呼び出しの詳細を確認可能

ツールの導入・利用方法

  • 最新のLLMのインストール(Homebrew未対応の場合はpip, pipx, uv推奨)
    • uv tool install llm または uv tool upgrade llm
  • OpenAIキーの設定
    • llm keys set openai
  • ツールの実行例:
    • llm --tool llm_version "What version?" --td
    • llm --tool llm_time "What time is it?" --td -m o4-mini
  • モデル切替llm models default gpt-4.1-mini-mオプションで指定可能
  • Anthropic Claude Sonnet 4やGemini 2.5 Flash など他社モデルやOllamaローカルモデル(Qwen3:4b等)にも対応

プラグインによる高度なツール活用

  • llm-tools-simpleeval :Python式の計算や簡易評価をサンドボックス実行
    • 例:llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
  • llm-tools-quickjs :QuickJS JavaScriptインタプリタをサンドボックスで提供
  • llm-tools-sqlite :ローカルSQLite DBへの読み取り専用SQLクエリ実行
  • llm-tools-datasette :リモートDatasetteインスタンスへのSQLクエリ
    • 例:llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
  • ツールボックス 形式のプラグインも対応、複数ツールや設定引数の受け渡しが可能

コマンドラインからのアドホックツール提供

  • --functionsオプションで Pythonコードブロック を直接CLIに渡し、モデルに関数として提供可能
    • 例:ブログ検索機能の追加
      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'
      
  • システムプロンプト でツール利用を促進(例:-s 'use Simon search'

Python APIでのツール利用

  • CLIツールと同等のツール機能 をPythonライブラリでもサポート
  • 例:文字列内の特定文字数カウント
    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 でツール呼び出しの詳細を表示
  • model.chain() は、ツール呼び出し→実行→結果反映を自動で繰り返す
  • asyncio 対応、複数ツールの並列実行も可能
  • ツールボックス形式 (例:tools=[Datasette("https://datasette.io/content")])もサポート

なぜ実装に時間がかかったのか

  • ReAcT論文 (2022年10月発表)でツール利用のパターンを初めて知り、シンプルな実装を作成
  • ツール利用は LLMの能力拡張 に極めて有効と判明
  • モデルに ツール呼び出し用構文 (JSON, XML, tool_name(arguments)等)を出力させ、結果を再入力する仕組み
  • 主要モデルベンダー (OpenAI, Anthropic, Google, Mistral, Meta等)もAPIでツール利用(関数呼び出し)を標準実装
  • ローカルモデル (Ollama, llama.cpp等)もツールサポートを強化
  • LLMに ツールサポート を追加することは必然だったと結論

まとめと今後の展望

  • LLM 0.26ツール利用機能 が大幅に強化
  • CLI、Python API、プラグイン、アドホック関数 など多彩なツール連携が可能
  • モデルや用途に応じた柔軟な拡張性 を実現
  • 今後はさらなるツールプラグインや、ツール利用の最適化 が期待

Hackerたちの意見

このリリース、ありがとう!君のライブラリは、既存のクライアントの制限なしにLLMの可能性を引き出すための重要な要素だと思う。0.26 alphaをリリースしてから、MCPサーバーとやり取りするプラグインを作ろうとしてるんだけど、ちょっと難しすぎる。今のところ、接続してツールを動的に取得して使うことはできたけど、パラメータを渡すことがまだできてないんだ。

今朝、MCPでちょっと実験してみたんだけど、プラグインのデモをすぐに出せるか試してみたんだ。ちょっと難しいね!公式のmcp Pythonライブラリは、asyncioを実行してサーバーに接続し、利用可能なツールを調べることを強く求めてくる。

llmをアップデートするたびに、geminiやollamaのプラグインを全部再インストールしなきゃいけないんだ。Geminiのキーはまだ保存されてるし、ollamaモデルのエイリアスも残ってるのに、なんでインストールしたプラグインが消えちゃうのか分からない。

ごめんね!たぶんHomebrew経由でアップデートしてるんだよね?それだと仮想環境が消えちゃうから、プラグインが全部なくなっちゃうんだ。解決策として、インストールしたプラグインを全部書いた'plugins.txt'ファイルをどこかに作って、なくなったプラグインを再インストールするってアイデアがあるよ。その問題についてはここにあるよ: https://github.com/simonw/llm/issues/575

自分もこれに直面してたけど、uv tool upgrade llmの代わりにllm install -U llmでアップグレードを始めたら解決したよ(後者は元の投稿でsimonwが推奨してるやつね)。

いいね、サイモン!みんなが同じツールセットに集まってるっていう君の観察にちょっと関係してるかな? https://x.com/simonw/status/1927378768873550310

実は完全に偶然なんだ!これを数週間ずっと出そうとしてたんだよ。

GPT-4.1は、特に構造化された出力やツール呼び出しに強いモデルだね。私は日常の雑務にLLMを使って2年になるけど、コストパフォーマンスが良くて使いやすいから、これが一番のお気に入りなんだ。

正直、GPT-4.1 miniにはめっちゃ感心してる。APIで遊んでたらデフォルトになっちゃったんだけど、信じられないくらい安いし、投げるほとんどのことにちゃんと対応できるんだよね。コードを書くときはo4-miniに切り替えるけど、それ以外は4.1-miniが大体いい仕事してくれる。今日の面白い例を挙げると、llm -f https://raw.githubusercontent.com/BenjaminAster/CSS-Minecraft/refs/heads/main/main.css \ -s 'このCSSで使われているトリックを全部説明して' ってやって、あのすごいCSS MinecraftデモからCSSをGPT-4.1 miniに流し込んで説明を求めたんだ。コードは明確に書かれてるけど、全然コメントがない: https://github.com/BenjaminAster/CSS-Minecraft/blob/main/mai... GPT-4.1 miniの説明は本当に素晴らしいよ: https://gist.github.com/simonw/cafd612b3982e3ad463788dd50287... 「このCSSは現代のCSS機能を駆使して、3DインタラクティブなボクセルスタイルのUIを作成し、JavaScriptを最小限に抑えるか排除しています」と正しく指摘して、俺が気づかなかったトリックもいくつか説明してくれた。入力トークンは3,813、出力トークンは1,291使ってて - https://www.llm-prices.com/#it=3813&ot=1291&ic=0.4&oc=1.6 - それで0.3591セント(約3分の1セント)だよ。

これ、足元をすくわれるリスクが大きくなるね。ドキュメント[1]ではプロンプトインジェクションについて警告してるけど、もっとありそうなのは自己造成の危害だと思う。例えば、取引を自動化するためにツールに自分の証券口座へのアクセスを与えると、プロンプトインジェクションがなくても、ボットがバカな取引をするのを防ぐものは何もないからね。[1] https://llm.datasette.io/en/stable/tools.html

これって皮肉?自分の取引口座や銀行口座にLLMのアクセスを与えちゃダメだよ。

「これは足元をすくうリスクを大いに広げる。」 そうだね、ほんとにそう。ツールをLLMに接続し始めると、特にそのツールコールが認証されていて、あなたの代わりにアクションを取れる場合、いろんなことが間違ってしまう可能性があるからね。今、MCPの世界はこれをスピードランしてるよ。昨日のGitHub MCPの話を見てみて: https://news.ycombinator.com/item?id=44097390 ドキュメントには大きな警告を入れて、初期のツールプラグインが何かを壊すことがないように気をつけてる - だからQuickJSサンドボックスとSQLiteプラグインは読み取り専用なんだ。でも、探求するには危険な領域だよね。(でも、すごく楽しくて魅力的だけど。)

もしLLMを自分の証券口座に接続したら、誰かがバカなことをしてるけど、ボットじゃないよ。

どんな道具でも悪用されることがあるよね。

みんな、ツールコールでうまくいったことある?カレンダーにアクセスできるシンプルなアシスタントを作ったんだけど、ほとんどのモデルがカレンダーイベントを追加するためにツールを呼び出すのに失敗するんだ。GPT-4.1も、ツールを呼び出してないのにイベントを追加したって俺をガスライトしようとしてくるし!全体的に、ツールの使い方はめっちゃ当たり外れがあって、俺が何か間違ってるんじゃないかって思ってる(OpenAI Agents SDKを使ってるんだけど)。

ツールコールで素晴らしいパフォーマンスを引き出す鍵は、すごく詳細なシステムプロンプトを持つことだと思う。例がたくさんあるやつね。Anthropicの「web_search」ツール用のシステムプロンプトは、なんと6,000トークン以上もあるんだ! https://simonwillison.net/2025/May/25/claude-4-system-prompt...

このツールのために書いたストリーミングMarkdownレンダラーも注目に値するよ: https://github.com/day50-dev/Streamdown もっと詳しい背景はここ: https://github.com/simonw/llm/issues/12 (それから、SimonのLLMの上に作ったtmuxツールがある https://github.com/day50-dev/llmehelp もチェックしてみて。毎日使ってる。本当に。欠かせない存在になってるよ。)

わお、そのライブラリめっちゃいい感じだね!ツールによるコンテンツの表示をプラグインが引き継げるフックが欲しいな。さっきイシューを提出した: https://github.com/simonw/llm/issues/1112 これについてフィードバックもらえたら嬉しい。いくつかデザインオプションを含めたけど、まだ100%正しい感じがしないんだよね。

すごい!ストリーミングLLMの出力をすぐに表示するために、いくつかの言語でストリーミングMarkdownレンダラーを書いたことがあるんだ。他にも同じことしてる人がいて嬉しい! :)

面白いね、これをチェックしてみるよ。自分はllmとbatをシンタックスハイライト付きで使ってるんだ。

わあ、これずっと欲しかったんだ!ありがとう!

これ、めっちゃいいしタイミングも完璧だね。最近Warp(ターミナル)で遊んでるんだけど、彼らのターミナルベースの「エージェント」(例えばツールループ)のアイデアは好きなんだけど、「信じて、いいプロンプトとLLMの呼び出しを作るから」っていうCursorっぽいモデルはあんまり好きじゃないんだよね(しかもそれにお金取るし)。だから、シェルの使い方があまり得意じゃない自分には、シンプルなCLIベースのターミナルエージェントが欲しかったんだ。これが大きな足元をすくうことになるのは分かってるけど、ターミナルツールとLLMの組み合わせが軽量な解決策になると思う。LLMが他の「エージェント」のように、各ツール呼び出しの許可を得る方法ってあるのかな?(「LLMがrm -rf ./*を呼び出したいです。Yを押して確認してください…」みたいな)これがあれば、ターミナルでLLMが暴れ回るのを防げるし、ある程度の保護もできると思う。

それって、codex CLIがデフォルトで動く方法じゃない?つまり、—full-autoを渡さずに。

Simon、このツールを本当にありがとう!今は毎日使ってるよ。charmbraceletのMods[0]がanthropicモデルをサポートしてないからね。ツール呼び出しができるようになったら、さらに便利になると思う。ただ、パフォーマンス向上に対するニーズはあるのかな?すべてのマシン(M1 32GB/M2 21GB/ryzen 7700 64GB)でヘルプを表示するのですら、かなり遅いんだよね。0: https://github.com/charmbracelet/mods

プラグインは何個インストールしてる?過去に、高価なインポート(torchみたいな)を持つプラグインが全体を遅くする問題を見たことがあるんだ。https://github.com/simonw/llm/issues/949 一番悪い奴らを特定して、レイジーインポートに移行するよう促したいな。

いい仕事だね、Simon!毎日君のツールを使ってるよ。ローカル(ollama)とリモートのモデル切り替えが簡単で、すごく使いやすい。