Simon Willison的LLM工具支持调用外部工具和插件。529点热度,开发者可轻松扩展CLI与LLM的能力集成。
LLM 0.26 发布了自项目启动以来最大的新功能:工具支持。你现在可以使用 LLM CLI 工具和 Python 库,为来自 OpenAI、Anthropic、Gemini 的 LLM 以及来自 Ollama 的本地模型授予访问任何可表示为 Python 函数的工具的权限。
LLM 现在还拥有工具插件,所以你可以安装一个插件,为无论你当前使用的是哪个模型都添加新功能。
这里有很多内容要讲,但这些是要点:
LLM 现在可以运行工具了!你可以从插件安装工具,并使用 --tool/-T name_of_tool 按名称加载它们。
你也可以通过命令行使用 --functions 选项传入 Python 函数代码。
Python API 也支持工具:llm.get_model("gpt-4.1").chain("show me the locals", tools=[locals]).text()
工具在异步和同步上下文中都能工作。
本文涵盖的内容如下:
更多来自插件的有趣工具
使用 --functions 的临时命令行工具
LLM Python API 中的工具
这为什么花了我这么长时间?
LLM 工具的下一步是什么?
首先,安装最新的 LLM。它可能还不在 Homebrew 上,所以我建议使用 pip、pipx 或 uv:
uv tool install llm
如果你已经有了,请升级它。
uv tool upgrade llm
工具可以与其他供应商配合使用,但让我们暂时坚持使用 OpenAI。给 LLM 一个 OpenAI API 密钥
llm keys set openai
# Paste key here
现在让我们运行我们的第一个工具:
llm --tool llm_version "What version?" --td
llm_version 是一个非常简单的演示工具,随 LLM 一起提供。运行 --tool llm_version 会向模型公开该工具——你可以指定多次来启用多个工具,它有一个更短的 -T 版本来节省输入。
--td 选项代表 --tools-debug——它会导致 LLM 输出有关工具调用及其响应的信息,以便你可以看看幕后发生了什么。
这使用的是默认的 LLM 模型,通常是 gpt-4o-mini。我通过运行以下命令将其切换为 gpt-4.1-mini(更好但成本略高):
llm models default gpt-4.1-mini
你可以使用 -m 选项尝试其他模型。以下是如何使用 o4-mini 运行 llm_time 内置工具的类似演示:
llm --tool llm_time "What time is it?" --td -m o4-mini
Tool call: llm_time({})
{
"utc_time": "2025-05-27 19:15:55 UTC",
"utc_time_iso": "2025-05-27T19:15:55.288632+00:00",
"local_timezone": "PDT",
"local_time": "2025-05-27 12:15:55",
"timezone_offset": "UTC-7:00",
"is_dst": true
}
当前时间是 2025 年 5 月 27 日 PDT 下午 12:15(UTC−7:00),对应 UTC 晚上 7:15。
来自支持工具的插件的模型也能工作。Anthropic 的 Claude Sonnet 4:
llm install llm-anthropic -U
llm keys set anthropic
# Paste Anthropic key here
llm --tool llm_version "What version?" --td -m claude-4-sonnet
或者 Google 的 Gemini 2.5 Flash:
llm install llm-gemini -U
llm keys set gemini
# Paste Gemini key here
llm --tool llm_version "What version?" --td -m gemini-2.5-flash-preview-05-20
你甚至可以用 Qwen3:4b,一个我用 Ollama 运行的小型(2.6GB)模型来运行简单工具:
ollama pull qwen3:4b
llm install 'llm-ollama>=0.11a0'
llm --tool llm_version "What version?" --td -m qwen3:4b
Qwen 3 调用工具,思考一下,然后打印出一个响应:
到目前为止这个演示相当薄弱。让我们做一些有趣得多的事情。
LLM 在数学方面臭名昭著地表现很差。这对许多人来说深感惊讶:据说我们构建过的最复杂的计算机系统甚至不能将两个大数字相乘?
我们可以用工具来解决这个问题。
llm-tools-simpleeval 插件暴露了 Daniel Fairhead 的 simpleeval "Simple Safe Sandboxed Extensible Expression Evaluator for Python" 库。这为执行简单的 Python 表达式提供了足够健壮的沙箱。
以下是如何运行计算的方法:
llm install llm-tools-simpleeval
llm -T simpleeval
llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
我得到了这个——它首先尝试了 sqrt(),然后当这不起作用时改为使用 ** 0.5:
Tool call: simple_eval({'expression': '1234 * 4346 / 32414'})
165.45208860368976
Tool call: simple_eval({'expression': 'sqrt(1234 * 4346 / 32414)'})
Error: Function 'sqrt' not defined, for expression 'sqrt(1234 * 4346 / 32414)'.
Tool call: simple_eval({'expression': '(1234 * 4346 / 32414) ** 0.5'})
12.862818066181678
The result of (1234 * 4346 / 32414) is approximately
165.45, and the square root of this value is approximately 12.86.
我已经发布了四个工具插件:
llm-tools-simpleeval——如上所示,为数学之类的东西提供简单表达式支持。
llm-tools-quickjs——提供对沙箱化 QuickJS JavaScript 解释器的访问,允许 LLM 运行 JavaScript 代码。环境在调用之间保持,所以模型可以设置变量、构建函数并稍后重用它们。
llm-tools-sqlite——对本地 SQLite 数据库的只读 SQL 查询访问。
llm-tools-datasette——对远程 Datasette 实例运行 SQL 查询!
让我们现在尝试那个 Datasette 的:
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
这里的语法略有不同:Datasette 插件是我所说的"工具箱"——一个在其内部有多个工具的插件,可以用构造函数配置。
将 --tool 指定为 Datasette("https://datasette.io/content") 为插件提供了应该使用的 Datasette 实例的 URL——在这种情况下是为 Datasette 网站提供动力的内容数据库。
这是输出,为简洁起见架构部分被截断了:
这个问题触发了三个调用。模型首先猜测查询!它尝试了 SELECT name, stars FROM repos ORDER BY stars DESC LIMIT 1,但失败了,因为 stars 列不存在。
工具调用返回了一个错误,所以模型又尝试了——这次调用 Datasette_schema() 工具来获取数据库的架构。
基于该架构,它组装然后执行了正确的查询,并输出了其对结果的解释:
拥有最多星标的仓库是"datasette",有 10,020 个星标。
到达这一点对我来说是真正的 Penny Arcade Minecraft 时刻。这里的可能性是无限的。如果你能为它写一个 Python 函数,你就可以从一个 LLM 触发它。
我期待着人们构建更多插件,但 LLM CLI 工具也有一个更多的非结构化和更多的临时方式来使用工具:--functions 选项。
这受到了我之前为 sqlite-utils 添加的类似功能的启发。
你可以使用 --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'
这是一个如此糟糕的实现!我实际上只是访问我的搜索页面并直接将 HTML 转储回模型。
虽然它完全有效——这有帮助,因为 GPT-4.1 系列现在都能处理百万个令牌,所以粗糙的 HTML 对它们不再是问题。
(我不得不添加"use Simon search"作为系统提示,因为没有它模型会尝试自己回答问题,而不是使用我提供的搜索工具。工具的系统提示显然是一个大话题,Anthropic 自己的网络搜索工具有 6,471 个令牌的说明!)
这是我刚才得到的输出:
sqlite-utils 的三个功能是:
它是用于操作 SQLite 数据库的组合 CLI 工具和 Python 库。
它可以自动向数据库表添加列,如果你尝试插入不完全适合的数据(使用 alter=True 选项)。
它支持插件,允许通过第三方或自定义插件扩展其功能。
一个更好的搜索工具会有更详细的说明,并会返回结果的相关片段,而不仅仅是每个结果的标题和第一段。仅仅用四行 Python 代码就能做到这一点相当不错!
LLM 同时是一个 CLI 工具和一个 Python 库(类似于我的另一个项目 sqlite-utils)。LLM Python 库在 LLM 0.26 中也获得了工具支持。
这是一个简单的例子,解决了 LLM 中之前最难的问题之一:计算"strawberry"中 Rs 的数量:
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 参数是一种查看工具调用的方式,是之前 --td 选项的 Python 等价物。
model.chain() 方法是新的:它类似于 model.prompt(),但知道如何发现返回的工具调用请求、执行它们,然后用结果再次提示模型。model.chain() 可能在到达最终答案的过程中执行数十个响应。
你可以迭代 chain_response 来输出那些从模型返回的令牌,甚至跨越多个响应。
Tool(name='count_char_in_text', description='How many times does char appear in text?', input_schema={'properties': {'char': {'type': 'string'}, 'text': {'type': 'string'}}, 'required': ['char', 'text'], 'type': 'object'}, implementation=<function count_char_in_text at 0x109dd4f40>, plugin=None) ToolCall(name='count_char_in_text', arguments={'char': 'r', 'text': 'strawberry'}, tool_call_id='call_DGXcM8b2B26KsbdMyC1uhGUu') ToolResult(name='count_char_in_text', output='3', tool_call_id='call_DGXcM8b2B26KsbdMyC1uhGUu', instance=None, exception=None)
There are 3 letter "r"s in the word "strawberry".
LLM 的 Python 库也支持 asyncio,工具可以是如这里所述的 async def 函数。如果模型一次请求多个异步工具,库将使用 asyncio.gather() 并发运行它们。
工具的 Toolbox 形式也得到支持:你可以将 tools=[Datasette("https://datasette.io/content")] 传递给那个 chain() 方法,以实现与之前的 --tool 'Datasette(...) 选项相同的效果。
我已经追踪 llm-tool-use 一段时间了。我首先在 ReAcT 论文中看到描述的技巧,首次发布于 2022 年 10 月(ChatGPT 初始版本发布前一个月)。我用几十行 Python 代码构建了一个简单的实现。这显然是一个非常巧妙的模式!
在过去的几年里,很明显工具使用是扩展语言模型能力的最有效的单一方式。这是一个如此简单的技巧:你告诉模型它可以使用一些工具,并让它输出特殊语法(JSON 或 XML 或 tool_name(arguments),无关紧要)请求一个工具动作,然后停止。
你的代码解析该输出,运行请求的工具,然后用结果开始一个新的提示来给模型。
这几乎与每个模型都能工作。大多数模型都专门为工具使用而训练,有像伯克利函数调用排行榜这样的排行榜致力于跟踪哪些模型在工具使用中表现最好。
所有大型模型供应商——OpenAI、Anthropic、Google、Mistral、Meta——都有这个版本内置在他们的 API 中,要么称为工具使用要么称为函数调用。这都是相同的底层模式。
你可以在本地运行的模型在这方面也变得不错。Ollama 在去年添加了工具支持,它也内置在 llama.cpp 服务器中。
很久以前就很清楚 LLM 绝对需要增长对工具的支持。我在二月发布了 LLM schema 支持作为朝这个方向的垫脚石。我很高兴最后把它完成了。
与 LLM 一样,挑战总是设计一个可以在尽可能多的不同模型中工作的抽象层。一年前我没有感到模型工具支持足够成熟来解决这个问题。今天在供应商之间有一个非常明确的共识关于这应该如何工作,这最终给了我实现它的信心。
我还在两周前的 PyCon US 上展示了一个关于在大型语言模型上构建软件的讲座,这正是我最终让这在 alpha 中工作所需的激励!这是该教程中的工具部分。
我仍然不喜欢使用"agents"这个术语。我担心开发者会认为工具在循环中,普通人会认为虚拟 AI 助手由 Scarlett Johansson 配音,学者会对温度计感到不满。但在 LLM 世界中,我们似乎正在汇聚到"工具在循环中",这绝对是这个。
所以是的,如果你想构建"agents",那么 LLM 0.26 是一个很好的方法。
我已经有一个包含 13 个问题的 LLM 工具 v2 里程碑,主要围绕改进工具执行日志的显示方式,但还有相当多我认为不应该阻止这个版本的小问题。工具标签中还有更多东西。
我最兴奋的是插件的潜力。
编写工具插件真的很有趣。我有一个 llm-plugin-tools cookiecutter 模板,我一直在用它来做我自己的,我计划很快为此整理一个教程。
还有很多工作需要完成,为更多模型插件添加工具支持。我将这方面的细节添加到高级插件文档中。这个为 Gemini 添加工具支持的提交是一个有用的说明。
而且是的,Model Context Protocol 支持显然也在议程上。MCP 正在以坦白说令人困惑的速度出现作为模型访问工具的标准方式。两周前它没有被任何主要供应商的 API 直接支持。仅在过去的八天中,它就被 OpenAI、Anthropic 和 Mistral 添加了!今天它的感觉就像是一个更少的移动目标。
我想 LLM 能够充当一个 MCP 客户端,所以人们正在编写的任何 MCP 服务器都可以轻松地作为 LLM 的额外工具来源访问。
如果你有兴趣进一步讨论 LLM 的下一步,来我们的 Discord 与我们聊天。
OpenAI 对 Hugging Face 的意外网络攻击是真实发生的科幻小说 - 2026 年 7 月 22 日
与 Claude Code 团队的 Cat 和 Thariq 进行炉边谈话 - 2026 年 7 月 21 日
Kimi K3,以及我们仍然可以从鹈鹕基准学到的东西 - 2026 年 7 月 16 日
这是 Simon Willison 的《大型语言模型现在可以在终端运行工具了,使用 LLM 0.26》,发布于 2025 年 5 月 27 日。
LLM 新版本系列的一部分
使用 LLM schemas 从非结构化内容进行结构化数据提取 - 2025 年 2 月 28 日,下午 5:07
LLM 0.24 中使用片段和模板插件的长上下文支持 - 2025 年 4 月 7 日,下午 5:45
将视频作为 JPEG 帧序列提供给视觉 LLM,在 CLI 上(也是 LLM 0.25) - 2025 年 5 月 5 日,下午 5:38
大型语言模型现在可以在终端运行工具了,使用 LLM 0.26 - 2025 年 5 月 27 日,晚上 8:35
LLM 0.27,带注释的发布说明:GPT-5 和改进的工具调用 - 2025 年 8 月 11 日,晚上 11:57
LLM 0.32a0 是一个主要向后兼容的重构 - 2026 年 4 月 29 日,晚上 7:01
下一篇:与 News Nation 的 Natasha Zouves 谈论 AI 和就业
上一篇:Claude 4 系统提示的亮点
赞助我每月 $10,获得本月最重要 LLM 发展的精选电子邮件摘要。
花钱让我发送给你更少的内容!