title: 用 Rust 写了一个行式 coding agent date: 2026-09-26 用了一年多 Claude Code ,从 本地配合 DeepSeek 跑生信流程 ,到 在曙光服务器上公共部署 ,越用越觉得这类工具没必要那么复杂。模型 API 说白了就是一个 HTTP 请求加一个 SSE 流,工具无非是读写文件和跑命令,交互界面就是个终端,连 TUI 都不用做,普通的行式会话就够。抱着这个想法,最近用 Rust 写了一个自己的 agent ,就叫 llm ,一个静态链接的二进制文件,没有任何运行时依赖,扔到机器上就能跑。和之前 vibe coding 博客框架 是同一个思路,核心只做必须做的事,其余的全部留出扩展的缝,这样出问题也知道去哪修。 安装 Linux 和 macOS 下面一行命令,下载预编译二进制,校验 sha256 之后装进 ~/.local/bin ,全程不需要 root curl -fsSL https://jiaoyuan.org/llm/install.sh | sh PATH 里没有这个目录的话安装脚本会顺手加上。重复执行同一条命令就是更新器,版本有变化会打印 updating 0.2.1 -> 0.2.2 ,没变化就不动, LLM_VERSION 可以固定某个 release , LLM_REPO 可以从 fork 装, LLM_FORCE=1 强制重装。Windows 下面从 PowerShell 做同样的事 irm https://jiaoyuan.org/llm/install.ps1 | iex Linux 用的是静态 musl 构建,同一个二进制在任何发行版上都能跑,目前提供 x86_64 和 aarch64 的 Linux ,x86_64 和 aarch64 的 macOS ,还有 x86_64 的 Windows 。之前在曙光服务器上部署 Claude Code 的时候,CentOS 7 的 glibc 老得连 conda 都得搬出来兜底,现在这个 musl 二进制 scp 过去 chmod +x 直接就能用,省心多了。 想从源码编译也很简单,装好 Rust 工具链以后 git clone https://github.com/imjiaoyuan/llm cd llm cargo build --release 二进制在 target/release/llm 。所有状态都放在 ~/.llm 下面,设置 LLM_USER_PATH 可以把整个目录挪走,测试的时候特别有用。 登录和模型配置 第一次用进去敲 /login ,选一个 provider ,粘贴 API key ,输入是隐藏的,然后从 provider 的实时模型列表里挑一个默认模型,就完事了。目录里内置了 38 个 provider 的接入配置,Anthropic 、OpenAI 、DeepSeek 、Google 、Groq 、Mistral 、xAI 、OpenRouter 这些都有,Ollama 、LM Studio 、llama.cpp 、vLLM 一类的本地运行时也在。esc 随时取消,不会写入任何东西。 我日常挂的是 DeepSeek 。喜欢手动编辑配置的话,向 ~/.llm/config.json 里写一个块就行 { "providers": { "deepseek": { "kind": "openai-compat", "base_url": "https://api.deepseek.com", "api_key": "${DEEPSEEK_API_KEY}", "models": ["deepseek-chat", "deepseek-reasoner"] } } } kind 只有两种, openai-compat 和 anthropic 。 api_key 可以直接写 key ,也可以写 ${环境变量名} ,请求的时候才去环境里读,key 不用落在配置文件里。同一个 provider 挂两个账号就 /login 两次,第二个会建议叫 NAME-2 ,之后模型用 provider/model 的完整 id 去挑,两边都提供的裸模型名会被当作歧义拒绝,而不是按顺序瞎猜一个。 模型在会话里用 /model 换,列表是实时拉的,你保存过的固定在最上面, /thinking 单独调思考深度。 -m 和环境变量 LLM_MODEL 可以按次覆盖。 基本用法 最短就三种 llm # 交互式会话 llm "fix the failing test" # 跑一个任务然后退出 cat error.log | llm "what broke?" # 提示词从管道来 管道输出是纯文本,没有颜色没有控制字符,直接重定向到文件或者接别的命令都行。 交互会话里该有的细节都有。任务跑着的时候随便打字,敲进去的内容会排队,在下一个工具调用的边界送达,相当于边跑边补充指示,一轮结束还没消费掉的自动变成你的下一条消息。ctrl+c 或者 esc 中断当前任务。 !cmd 直接跑 shell 命令,tab 补全命令名和路径。ctrl+v 把剪贴板里的图片直接贴成附件,剪贴板里没有图片的话会告诉你它装的到底是什么。粘贴超过 10 行或者 1000 字符会折叠成一个原子 token ,提交的时候才展开,不会把输入框撑爆。 界面本身有一个刻意的决定,llm 不是 TUI 。codex 那类工具的交互是整屏接管的 alternate screen ,排版确实漂亮,代价是终端被它接管,输出不进 scrollback ,翻页搜索复制全是它自己实现的一套键位,退出之后屏幕恢复原样,刚才聊了什么全靠会话恢复找回来。llm 是普通的行式会话,回答逐行追加在终端的正常缓冲区里,回看历史用终端自己的滚动,搜索复制是终端原生功能,和你在 shell 里的肌肉记忆完全一致。渲染也是 write-once 的,回答区每个字节只写一次,不擦除不重绘,所以 kitty 、tmux 、纯 ssh 甚至串口控制台下面行为都一样。这类界面正经的名字是 REPL ,read-eval-print loop ,读一句执行一句打印一句再等下一句,psql 、sqlite3 、python 的交互模式都是这个形态,llm 的会话就是一个 chat REPL 。 附件也可以从命令行给 llm -a shot.png "what is wrong here?" llm -a https://example.com/page "summarise this" llm -a - "what is this?" 图片、PDF 、wav/mp3 和纯文本按原生内容块发送,模型不接受的格式在请求出机器之前就会被拒绝,不会浪费一次调用。长对话只保留最新的图片附件,旧的折叠成短文本说明,不一直占上下文。 跑单次任务的时候有几个常用 flag llm -m deepseek/deepseek-chat "..." # 这次用哪个模型 llm --thinking high "..." # off | minimal | low | medium |


  • 情报分类:服务器与云资源
  • 分类依据:内容涉及服务器、云资源或网络线路
  • 信息来源:服务器 / V2EX
  • 发布时间:2026/9/26 22:12:27