AIChat — 终端里的多模型 LLM 客户端
已复核AIChat 是一个装在终端里的“万能 LLM 遥控器”。日常类比:以前你家电视、空调、机顶盒各有一个遥控器,桌上摆三个;后来出来一个学习型遥控器,按一下就能切。AIChat 之于 LLM 就是这个学习型遥控器——OpenAI、Claude、Gemini、本地 Ollama,全用同一条命令调。
实际操作长这样:
aichat 一行 awk 怎么按列求和 # 一次性问答aichat # 进 REPL 交互aichat -r coder 这段 Rust 怎么改更短 # 用预设角色aichat --rag notes 我去年记的 HM 是什么 # 对一个目录做检索问答aichat --serve # 起本地 OpenAI 兼容服务它是 Rust 写的单 binary,固定 v0.30.0 的一等能力还包括 -a agents、--macro 宏、-f 直接喂文件/目录/URL——不止是聊天客户端,更像一个终端 LLM 工作台。
不理解 AIChat 这类工具,下面这些事说不清:
- 为什么很多人桌面上没装一堆 GPT 客户端,只在终端 alias 一个
ai——上下文都在 shell 里,开窗口反而绕远 - 为什么“今天用 Claude,明天换 Gemini”对老用户不痛——client 全登记在一份 yaml 里,
-m换个名字就完事 - 为什么一个单机 CLI 能给 IDE 插件当后端——
--serve暴露 OpenAI 兼容接口,把多家真实模型统一成一个本地网关 - 为什么“贴一段日志让 LLM 解释”在终端一步完成——它直接接管标准输入:
tail -n 50 a.log | aichat 解释这段错
固定 v0.30.0 的能力可以拆成四层:
-
统一客户端:注册表原生支持 8 种 client 类型(openai、openai-compatible、claude、gemini、cohere、azure-openai、vertexai、bedrock),另内置 18 个 OpenAI 兼容预设 provider(groq、deepseek、openrouter、mistral 等)。Ollama 就走
openai-compatibleclient。切模型只是aichat -m <client>:<model>。 -
Roles 与 Sessions:role 把 system prompt 命名保存——存储形态是
roles/<name>.md单文件(不是 yaml 列表);session(-s)把多轮对话存盘、跨终端恢复,另有--empty-session/--save-session控制生命周期。 -
Agents / RAG / Macros(重度层):
-a启动带工具与变量的 agent;--rag对目录建混合检索索引(依赖hnsw_rs向量近邻 +bm25关键词);--macro把一串交互固化成宏。function calling 依赖外部仓库sigoden/llm-functions提供工具集。 -
Server 模式:
--serve [地址]同时暴露/v1/chat/completions、/v1/embeddings、/v1/rerank三个 API 和两个内嵌 Web 页面——LLM Playground(/playground)与多模型对比的 Arena(/arena)。
四层叠加:底下“统一客户端”足够多数用户用;上面三层是给重度用户的省力工具。
案例 1:alias 进 zshrc,把它当 Unix 工具用
Section titled “案例 1:alias 进 zshrc,把它当 Unix 工具用”alias ai=aichatecho "select * from users where id=1" | ai 这条 SQL 在 PostgreSQL 慢可能因为什么ai -f ./src/main.rs -f https://example.com/spec.md 对照规范审查这个文件逐部分:stdin 不是终端时自动读入管道内容;-f 可以混合本地文件、目录与 URL 一起作为上下文。把 LLM 当 grep / awk 一样接管道,是终端用户最大的爽点。
案例 2:Role 替你保存 prompt 工程成果
Section titled “案例 2:Role 替你保存 prompt 工程成果”aichat -r coder 这段 diff 有什么问题 < diff.patchrole 存在配置目录的 roles/coder.md——一个 Markdown 文件承载一个角色的 system prompt(可带元数据)。调好的 prompt 不再躺在剪贴板里,而是有名字、能进 git 的文件。
案例 3:Server 模式当本地 LLM 网关
Section titled “案例 3:Server 模式当本地 LLM 网关”aichat --serve 127.0.0.1:8000之后 OpenAI SDK、curl、IDE 插件都能直连 http://127.0.0.1:8000/v1/chat/completions,背后路由到 yaml 里配的任何真实模型;/playground 给你一个网页调试台,/arena?num=2 可以让两个模型对同一问题竞答。等于一个个人版模型网关。
案例 4:RAG 把笔记目录变成可问答知识库
Section titled “案例 4:RAG 把笔记目录变成可问答知识库”aichat --rag mynotes第一次会引导添加文档来源并建索引;之后同名进入即恢复。检索是向量(hnsw)+ 关键词(bm25)双路混合;文档变更后用 --rebuild-rag 同步。个人笔记规模够用,工业级向量库不是它的目标。
-
Sessions / Roles 是明文存盘:配置目录下的对话与角色文件可能含敏感上下文,别 commit 进公开 git,也别放共享盘。
-
RAG 名字打错就新建索引:
--rag notes和--rag note是两份独立索引,目录大时第二次会重做 embedding。建前先确认名字,改了文档记得--rebuild-rag。 -
Function calling 不开箱:需要单独 clone 配置
sigoden/llm-functions工具仓,aichat 本体只带调用协议。新人常以为“装完就能用工具”。 -
Alt+E 集成依赖终端键位透传:官方 shell 集成把 zsh 的
\ee(Alt+E)绑成“把当前命令行交给 aichat 改写”。部分终端/多路复用器默认不透传 Alt 组合键,需要按各自文档开启(如 tmux 的xterm-keys)。 -
多模型计费各家自理:AIChat 不做用量聚合,花了多少钱要回各厂商控制台看;要统一看板得在前面加专职网关。
-
release 与主分支有距离:绑定的 v0.30.0 之后主分支仍在演进;对照网上教程时先核对版本,旗标语义以
aichat --help为准。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 主要在终端工作的开发者——上下文已经在 shell 里
- 想“一份配置打通所有模型”的人——同时用云 API + 本地 Ollama
- 想把 prompt 沉淀成可复用命令的人(roles/*.md + sessions)
- 想要一个轻量本地网关 + Playground/Arena 调试台的人(
--serve)
不适用:
- 主要工作流在网页/Notion——GUI 客户端体验更顺
- 团队共享 key 与用量看板——单机工具不做聚合,用专职网关
- 大规模 RAG(几十万文档)——内置索引面向个人笔记级
- 要长链全自动 agent——
-aagents 偏工具调用编排,复杂多 agent 系统看专门框架
固定版本边界
Section titled “固定版本边界”- 本文绑定
sigoden/aichat@430416d9...,即 release tagv0.30.0,Cargo.toml版本一致;tag 之后主分支仍有提交,本文不描述其变化。 - client 注册表:8 种原生类型 + 18 个 OpenAI 兼容预设 provider;Ollama 经
openai-compatible接入(config.example.yaml有示例)。 --serve端点:/v1/chat/completions、/v1/embeddings、/v1/rerank、/playground、/arena。- roles 存储为
roles/<name>.md单文件;RAG 依赖hnsw_rs 0.3.0+bm25 2.0.1;function calling 依赖外部sigoden/llm-functions。 - 本文未安装运行 aichat、未调用任何模型 API、未测启动时间或检索质量,状态保持
UNVERIFIED。
- CLI 工具的杀手锏是管道——能接管 stdin/stdout 的 LLM 工具,比 GUI 多一个数量级的组合空间
- 配置即接口——把“切模型/切 prompt/切上下文”压成 yaml 字段与命名文件,认知负担最低
- “个人网关”是被低估的形态——
--serve让一个单机 CLI 变成本地统一模型入口,Playground/Arena 顺手解决调试 - 工具集外置是聪明的边界——function calling 的工具仓独立成 repo,CLI 本体只承诺协议,两边可以各自演进
- 固定 v0.30.0 里,自定义 role 存成什么形态?
aichat --serve除了 chat completions 还暴露哪些能力?- 想让 aichat 连本地 Ollama,应该配哪种 client 类型?
检查点:
- 配置目录下
roles/<name>.md单文件,一个文件一个角色;不是集中式 roles.yaml。 /v1/embeddings、/v1/rerank两个 API,加/playground与/arena两个内嵌 Web 页面。openai-compatible(指向 Ollama 的 OpenAI 兼容端点);示例见仓库config.example.yaml。
- 官方 README:sigoden/aichat —— 本文绑定提交
430416d914896c3534c04b84c0226910c64e3e66 - 函数调用扩展仓库:sigoden/llm-functions
- 配置示例:repo 里
config.example.yaml看一遍就懂所有可配置项 - ollama —— AIChat 最常搭配的本地后端
- shell-gpt —— 同领域对照:shell 命令助理路线
- ollama —— 本地模型后端,AIChat 经 openai-compatible client 连它
- shell-gpt —— 同领域竞品;shell-gpt 偏 shell 助理,AIChat 偏通用 LLM 工作台
- litellm-proxy —— 团队/服务端网关,AIChat 的
--serve是单机版同类 - oclif —— Node 阵营 CLI 框架;AIChat 是 Rust 阵营的对照(clap 直写)