LLM:用一条命令统一所有大语言模型的 CLI 工具

发布时间:2026/7/8 2:09:49
LLM:用一条命令统一所有大语言模型的 CLI 工具 深度解析 simonw/llm 项目——12.2k Star、63 个版本迭代、50 插件生态如何成为终端 AI 工具的事实标准。项目概览LLM 是由 Django 联合创始人、知名开源开发者 Simon Willison 创建的命令行工具和 Python 库用于统一访问 OpenAI、Anthropic Claude、Google Gemini、Meta Llama 等数十种大语言模型。它不仅支持远程 API 调用还支持通过插件在本地运行模型。关键数据指标数值GitHub Stars12,200最新版本0.312026-04-24累计发布版本63官方社区插件50支持模型数量100含插件代码语言Python 99.8%许可证Apache 2.0核心设计理念Unix 哲学在 AI 时代的回归LLM 的设计根植于 Unix 哲学——做一件事并做好。它将与语言模型交互这个行为抽象为一条可以在终端执行的命令llmTen fun names for a pet pelican这行代码的背后是一个精心设计的统一抽象层。用户无需关心底层是 GPT-4o 还是 Claude 4 Opus无需记忆不同的 API 签名和认证方式只需要知道模型的名称。微内核 插件架构LLM 采用了类似操作系统微内核的设计——核心只负责命令行解析、密钥管理、SQLite 日志和插件加载所有模型的具体实现都通过插件完成┌─────────────────────────────────────┐ │ LLM Core │ │ ┌──────────┐ ┌──────────────────┐ │ │ │ CLI 解析 │ │ 密钥管理 │ │ │ └──────────┘ └──────────────────┘ │ │ ┌──────────┐ ┌──────────────────┐ │ │ │SQLite 日志│ │ 插件加载器 │ │ │ └──────────┘ └──────────────────┘ │ └─────────────┬───────────────────────┘ │ ┌─────────┼─────────┐ ▼ ▼ ▼ ┌────────┐┌────────┐┌────────┐ │llm- ││llm- ││llm- │ │openai ││anthropic││ollama │ └────────┘└────────┘└────────┘这种架构带来了三个关键优势核心精简基础安装只包含 OpenAI 模型支持不引入不必要的依赖按需扩展需要 Claudellm install llm-anthropic。需要本地模型llm install llm-ollama社区驱动任何人都可以编写插件来支持新的模型提供商安装与快速上手安装支持多种安装方式覆盖不同用户偏好# pippipinstallllm# HomebrewmacOS/Linuxbrewinstallllm# pipx隔离环境安装pipxinstallllm# uvRust 实现的快速包管理器uv toolinstallllm30 秒上手# 1. 设置 OpenAI API Keyllm keyssetopenai# 粘贴你的 API Key# 2. 执行一个提示词默认使用 gpt-4o-minillmTen fun names for a pet pelican# 3. 从图像中提取文本llmextract text-ascanned-document.jpg# 4. 用系统提示分析代码catmyfile.py|llm-sExplain this code# 5. 启动交互式聊天llm chat-mgpt-4.1接入其他模型# Google Geminillminstallllm-gemini llm keyssetgemini llm-mgemini-2.0-flashTell me fun facts about Mountain View# Anthropic Claudellminstallllm-anthropic llm keyssetanthropic llm-mclaude-4-opusImpress me with wild facts about turnips# 本地模型Ollamallminstallllm-ollama ollama pull llama3.2:latest llm-mllama3.2:latestWhat is the capital of France?核心功能深度解析1. 提示词执行与管道LLM 最基础的能力是在命令行执行提示词但它远不止于此。它天然适配 Unix 管道# 将文件内容作为提示词输入catREADME.md|llm-sSummarize this in 3 bullet points# 提取代码块llm-xPython function to reverse a string# -x 参数自动提取响应中第一个 fenced code block# 继续上一次对话llm-cNow do it in JavaScript# 使用模糊搜索指定模型不需要记完整 IDllm-qgpt-q4oyour prompt-x--extract和--xl--extract-last参数是 LLM 的一个巧妙设计——在终端场景下你往往只关心代码本身而非模型的解释文字这两个参数直接提取响应中的代码块省去了手动复制。2. 模板系统可复用的提示词模板允许你保存和复用提示词配置包括系统提示、模型选择、参数和工具# 创建一个模板llm-sTranslate to French-mgpt-4.1-mini--savetranslate-fr# 使用模板llm-ttranslate-frHello, how are you?# 模板支持变量llm-sTranslate to$language--savetranslate llm-ttranslate-planguage SpanishHello模板以 YAML 文件存储结构清晰system:Translate to{$language}model:gpt-4.1-minioptions:temperature:0.3更强大的是模板可以绑定工具和 Schema下文详述这意味着你可以创建一键执行的复杂工作流。GitHub 模板共享通过llm-templates-github插件你可以直接使用他人在 GitHub 上分享的模板llminstallllm-templates-github llm-tgh:simonw/pelican-svg-mo3-mini3. Fragments长上下文组装器Fragments 是 0.24 版本引入的关键特性解决了长上下文场景下的提示词组装问题。它允许你从多个来源URL、文件路径、数据库记录组装一个长提示词并且这些内容会在 SQLite 中去重存储# 从 URL 加载内容作为上下文llm-fhttps://llm.datasette.io/robots.txtexplain this file# 组合多个来源llm-fpaper.pdf-fnotes.mdCompare these documents# 在聊天中使用llm chat-fcodebase/Ask questions about this codeFragments 的真正威力在于插件生态。通过register_fragment_loaders()插件钩子社区已经构建了丰富的片段加载器插件用途示例llm-video-frames视频转帧序列llm -f video-frames:video.mp4llm-fragments-github加载整个 GitHub 仓库llm -f github:simonw/files-to-promptllm-hacker-news导入 HN 对话llm -f hn:43615912llm-fragments-pypi加载 PyPI 包信息llm -f pypi:ruffllm-fragments-pdfPDF 转 Markdownllm -f pdf:paper.pdf4. Schemas结构化数据提取0.23 版本引入的 Schema 功能是 LLM 最具实用价值的特性之一。它让大语言模型输出符合 JSON Schema 的结构化数据而不是自由文本# 使用简洁的 Schema DSLllm--schemaname, age int, bioDescribe a nice dog# 从新闻中提取人物llm--schemaname, title, organization, roleExtract people from this article\-fnews-article.txt# 生成数组llm--schemaname, age int, bio--schema-multiDescribe 3 nice dogs在 Python API 中Schema 可以使用 Pydantic 模型importllmfrompydanticimportBaseModelclassDog(BaseModel):name:strage:intmodelllm.get_model(gpt-4o-mini)responsemodel.prompt(Describe a nice dog,schemaDog)# 输出{name: Buddy, age: 3}这把 LLM 从聊天工具提升为数据处理管道——你可以用它从非结构化文本中批量提取结构化数据然后存入数据库、生成报表或触发下游工作流。5. Tools让模型调用外部工具0.26 版本引入的 Tool 支持是 LLM 的一次重大进化。模型现在可以调用 Python 函数来完成它自身无法完成的任务命令行使用# 内联定义工具llm--functions def multiply(x: int, y: int) - int: Multiply two numbers. return x * y what is 34234 * 213345# 使用插件注册的工具llm-Tsimple_evalWhat is 2^20?Python API——更强大的用法importllmdefmultiply(x:int,y:int)-int:Multiply two numbers.returnx*y modelllm.get_model(gpt-4.1-mini)# chain() 方法自动处理多轮工具调用responsemodel.chain(What is 34234 * 213345?,tools[multiply],)print(response.text())Toolbox 类——有状态的工具集合importllmclassMemory(llm.Toolbox):_memoryNonedef_get_memory(self):ifself._memoryisNone:self._memory{}returnself._memorydefset(self,key:str,value:str):Set something as a keyself._get_memory()[key]valuedefget(self,key:str):Get something from a keyreturnself._get_memory().get(key)ormodelllm.get_model(gpt-4.1-mini)memoryMemory()conversationmodel.conversation(tools[memory])# 模型可以在多轮对话中使用 Memory 工具print(conversation.chain(Set name to Simon).text())print(conversation.chain(What is my name?).text())工具调试钩子——对开发者至关重要的功能defbefore_call(tool,tool_call):print(fAbout to call{tool.name}with{tool_call.arguments})defafter_call(tool,tool_call,tool_result):print(f{tool.name}returned{tool_result.output})responsemodel.chain(Complex question requiring tools,tools[multiply,search],before_callbefore_call,after_callafter_call,)社区已构建了丰富的工具插件插件功能llm-tools-simpleeval数学表达式计算llm-tools-quickjs沙箱化 JavaScript 执行llm-tools-sqlite只读 SQL 查询llm-tools-datasette查询远程 Datasettellm-tools-exa网络搜索llm-tools-rag嵌入集合检索6. Embeddings向量嵌入与语义搜索LLM 不仅是语言模型的客户端还是一个完整的嵌入管理工具# 生成单个嵌入llm embed-mtext-embedding-3-small-cHello world# 批量嵌入文件内容llm embed-multi docs-mtext-embedding-3-small\--filesdocs/*.md--store# 语义相似度搜索llm similar docs-cmachine learningPython API 同等强大importllm modelllm.get_embedding_model(text-embedding-3-small)# 生成嵌入向量vectormodel.embed(Hello world)# 使用 Collection 进行批量管理collectionllm.Collection(docs,model)collection.embed(doc1,Content of document 1)collection.embed(doc2,Content of document 2)# 语义搜索resultscollection.similar(machine learning)嵌入数据存储在 SQLite 中配合llm-sentence-transformers、llm-clip、llm-embed-jina等插件可以在本地构建完整的语义搜索系统。7. SQLite 日志完整的对话审计LLM 默认将所有提示词和响应记录到本地 SQLite 数据库这是一个被低估但极为重要的设计决策# 查看最近的日志llm logs# 按模型过滤llm logs-mgpt-4o# 搜索日志llm logs-qpelican# 查看特定对话llm logs--cidCONVERSATION_ID# 导出 Schema 收集的结构化数据llm logs--data--data-key name# 查看 Token 使用量llm logs-u这个设计带来了几个重要的好处可审计性每次 AI 调用都有记录方便回顾和追溯可分析性可以统计不同模型的使用频率和 Token 消耗可复现性对话历史完整保存可以随时回溯与 Datasette 集成通过 Datasette 可以在浏览器中可视化浏览所有日志8. 多模态支持从 0.17 版本开始LLM 支持图片、音频、视频等多模态输入# 图片URL 或文件llm-mgpt-4odescribe this image\-ahttps://example.com/photo.jpg llm-mgpt-4o-miniextract text-ascanned-document.jpg# 多个附件llm-mgpt-4ocompare these images-aimg1.jpg-aimg2.jpg# PDFllm-mgpt-4osummarize this document-areport.pdfPython API 同样支持modelllm.get_model(gpt-4o)responsemodel.prompt(Describe these images,attachments[llm.Attachment(pathpelican.jpg),llm.Attachment(urlhttps://example.com/photo.jpg),])插件系统详解插件钩子Plugin HooksLLM 的插件系统提供了六个核心钩子覆盖了所有扩展场景钩子用途引入版本register_commands(cli)添加新的 CLI 命令早期register_models(register)注册新的语言模型早期register_embedding_models(register)注册嵌入模型早期register_tools(register)注册工具函数0.26register_template_loaders(register)注册模板加载器0.24register_fragment_loaders(register)注册片段加载器0.24插件生态全景本地模型插件插件运行框架平台llm-ggufllama.cpp跨平台llm-mlxApple MLXmacOSllm-ollamaOllama跨平台llm-llamafilellamafile跨平台llm-gpt4allGPT4All跨平台远程 API 插件覆盖了几乎所有主流模型提供商Mistral、Gemini、Anthropic、Cohere、Perplexity、Groq、Fireworks、Together AI、DeepSeek、OpenRouter、Bedrock、xAI Grok 等。如果某个 API 提供商兼容 OpenAI 接口格式甚至不需要安装插件——只需在extra-openai-models.yaml中配置即可。编写自己的插件LLM 的插件开发体验经过了精心打磨。以一个 Markov 链模型插件为例fromllmimportModel,registerclassMarkovModel(Model):model_idmarkovdefexecute(self,prompt,stream,response,conversation):# 实现 execute 方法textbuild_markov_chain(prompt.prompt)yieldtextdefregister_models(register):register(MarkovModel())安装和测试llminstall-e.llm-mmarkovsome input textPython API超越 CLI 的编程接口LLM 不仅是 CLI 工具还是一个完整的 Python 库。这意味着你可以将其集成到任何 Python 应用中基础用法importllm# 获取模型modelllm.get_model(gpt-4o-mini)# 执行提示词懒加载直到调用 .text() 才真正执行responsemodel.prompt(Five surprising names for a pet pelican)print(response.text())# 流式输出responsemodel.prompt(A poem about coding)forchunkinresponse:print(chunk,end,flushTrue)异步支持importllm modelllm.get_async_model(gpt-4o)# 异步执行print(awaitmodel.prompt(Hello).text())# 异步流式输出asyncforchunkinmodel.prompt(Tell me a story):print(chunk,end,flushTrue)对话管理importllm modelllm.get_model(gpt-4.1-mini)conversationmodel.conversation()response1conversation.prompt(My name is Alice)print(response1.text())response2conversation.prompt(What is my name?)# 模型知道你叫 Aliceprint(response2.text())Token 追踪与回调importllm modelllm.get_model(gpt-4o-mini)responsemodel.prompt(A poem about a hippo)# 注册完成回调可以用于追踪 Token 使用量response.on_done(lambdar:print(r.usage()))print(response.text())# 输出# Usage(input20, output494, details{})版本演进与关键里程碑LLM 的版本迭代非常活跃每个版本都引入了实质性功能版本日期核心特性0.312026-04-24GPT-5.5 支持文本详细度控制0.302026-03-31插件钩子增强文档改进0.292026-03-17GPT-5.4 系列模型0.282025-12-12GPT-5.1/5.2Python 3.10 要求0.272025-08-11GPT-5 系列支持模板可绑定工具0.262025-05-27Tool 支持——里程碑版本0.252025-05-04Fragment loader 支持附件gpt-4.1/o3/o4-mini0.242025-04-07Fragments 与模板加载器——长上下文支持0.232025-02-28Schema 支持——结构化数据提取0.222025-02-16KeyModel/AsyncKeyModelllm-mlx 插件0.202025-01-22o1 模型-x代码块提取0.192024-12-01Token 使用量追踪与日志0.182024-11-17异步模型支持0.172024-10-29多模态附件——图片/音频/视频0.162024-09-12OpenAI 模型使用内部 key 机制0.152024-07-18gpt-4o-mini 成为默认模型0.142024-05-13GPT-4o 支持从演进路线可以看出LLM 的功能拓展遵循了一条清晰的路径基础调用 → 模型覆盖 → 数据持久化 → 多模态 → 异步 → 结构化输出 → 工具调用 → 长上下文。每一步都建立在之前的基础上形成了有机的功能体系。设计亮点与工程思考1. SQLite 作为一等公民LLM 对 SQLite 的使用是一个值得学习的工程决策。SQLite 不需要服务器进程数据就在用户本地的logs.db文件中。这意味着零运维成本——不需要安装和配置数据库便携性——整个对话历史就是一个文件可查询——用 SQL 查询你的 AI 使用记录与 Datasette 天然集成——在浏览器中浏览和分析2. 懒加载的响应设计Python API 中的Response对象采用懒加载设计——调用model.prompt()不会立即执行请求只有在调用response.text()时才真正触发。这个设计让流式输出和回调注册变得自然responsemodel.prompt(A poem)response.on_done(lambdar:save_to_db(r))# 注册回调print(response.text())# 执行请求 流式输出 触发回调3. API Key 的多层管理LLM 提供了三种 API Key 管理方式覆盖不同安全需求llm keys set openai——加密存储到keys.json文件权限 600环境变量OPENAI_API_KEY——CI/CD 和容器化场景key参数——Python API 编程场景4. OpenAI 兼容模型的零插件接入很多模型提供商如 DeepSeek、vLLM、LocalAI提供 OpenAI 兼容的 API。LLM 允许通过extra-openai-models.yaml配置这些模型无需编写任何代码-model_id:deepseek-chatmodel_name:deepseek-chatapi_base:https://api.deepseek.com/v1api_key_name:deepseekcan_stream:truevision:truesupports_schema:true5. 对 Prompt Injection 的坦诚与许多 AI 工具不同LLM 在文档中明确警告了 Tool 使用场景下的 Prompt Injection 风险。这种坦诚的态度对于建立用户信任至关重要。实战场景场景一代码审查管道# 在 CI/CD 中自动审查代码变更gitdiffmain|llm-sReview this code change. Focus on: 1. Security vulnerabilities 2. Performance issues 3. Code style problems Output as bullet points.-mgpt-4.1-mini场景二文档批量提取结构化数据importllm,json,glob modelllm.get_model(gpt-4.1-mini)forfileinglob.glob(contracts/*.txt):withopen(file)asf:contentf.read()responsemodel.prompt(fExtract contract details from:\n{content},schemallm.schema_dsl(party_a, party_b, value float, start_date, end_date, contract_type))datajson.loads(response.text())print(json.dumps(data,indent2))场景三构建语义搜索系统# 1. 批量嵌入文档llm embed-multi knowledge-base-mtext-embedding-3-small\--filesdocs/*.md--store# 2. 语义搜索llm similar knowledge-base-chow to configure authentication# 3. 结合 RAG 工具llminstallllm-tools-rag llm-TragWhat does the documentation say about API keys?场景四带工具的智能助手importllmdefcalculate(expression:str)-str:Evaluate a mathematical expression safely.importasttry:resulteval(compile(ast.parse(expression,modeeval),,eval))returnstr(result)exceptExceptionase:returnfError:{e}defsearch_docs(query:str)-str:Search the documentation for relevant information.# 自定义搜索逻辑returnsearch_internal_docs(query)modelllm.get_model(gpt-4.1)conversationmodel.conversation(tools[calculate,search_docs])whileTrue:user_inputinput( )ifuser_input.lower()in(exit,quit):breakresponseconversation.chain(user_input)print(response.text())与同类工具对比特性simonw/llmLangChainOllama CLIOpenAI CLI定位通用 CLI Python 库应用开发框架本地模型运行OpenAI 专属多模型支持100含插件通过集成仅本地模型仅 OpenAI插件系统成熟6 个钩子无库级别扩展Modelfile无对话日志SQLite 内置需自行实现无无结构化输出Schema DSL Pydantic需 OutputParser无JSON Mode工具调用内置Agent 框架无Function Calling嵌入管理内置需 VectorStore无无本地模型通过插件通过集成核心功能无学习曲线低高低低LLM 的独特定位在于它不是开发框架而是开发者工具。你不需要学习复杂的 Agent 抽象、Chain 组装或者 Memory 管理——一条命令就能完成大部分工作需要编程时也有简洁的 Python API。局限与权衡同步模型的阻塞问题虽然 0.18 版本引入了异步支持但并非所有插件都实现了AsyncModel在异步上下文中使用同步模型仍会阻塞事件循环Token 计费追踪粒度有限虽然有response.usage()和 SQLite 日志但缺少按项目、按标签维度的成本聚合能力没有内置的 Agent 编排LLM 提供了model.chain()和Toolbox但没有 LangChain 那样的 Agent 编排框架如 ReAct、Plan-and-ExecuteWindows 体验弱于 Unix管道、文件路径、终端交互在 Windows 上偶尔会遇到兼容性问题Schema 支持依赖模型能力结构化输出需要模型本身支持并非所有模型都能可靠地遵循 Schema总结simonw/llm 是一个在 AI 工具生态中占据独特位置的项目。它不是另一个 LangChain也不是另一个 Ollama——它是连接终端和大语言模型之间最直接的那座桥梁。三个层面的价值工具层面一条命令访问任何模型管道友好的输入输出SQLite 完整审计平台层面成熟的插件系统、模板共享、Schema/Tool/Fragment 三大扩展机制哲学层面Unix 哲学在 AI 时代的实践——简单、可组合、可编程如果你是经常在终端工作的开发者如果你厌倦了在不同 AI 网页之间切换如果你想用脚本自动化 AI 工作流——LLM 值得一试。pipinstallllmllm keyssetopenaillmWhy should developers use CLI tools for AI?参考链接项目仓库https://github.com/simonw/llm官方文档https://llm.datasette.io/插件目录https://llm.datasette.io/en/stable/plugins/directory.html作者博客https://simonwillison.net/tags/llm/演示视频https://www.youtube.com/watch?vQUXQNi6jQ30