aichat 是一个终端里的 AI 对话客户端,Rust 写的单文件 exe,12793856 字节。它自己不跑模型,只负责按配置把请求发到各家接口:OpenAI、Claude、Gemini、Ollama、任何兼容 OpenAI 协议的本地服务都行。

实测把它接到本地起的 koboldcpp 服务上,一次问答 0.51 秒。整个过程里最值得记下来的是一个坑:模型名写错了它不报错,照样给你答案。

12 MB 的 exe,一份 yaml 管所有模型

model: local:qwen

clients:
  - type: openai-compatible
    name: local
    api_base: http://127.0.0.1:5001/v1
    api_key: dummy-key-not-used
    models:
      - name: qwen
        max_input_tokens: 2048

配置文件放在 AICHAT_CONFIG_DIR 指向的目录里,文件名 config.yaml,上面这份 13 行。上面这份把本地 5001 端口上的 koboldcpp 定义成一个叫 local 的 client,模型名 qwen,调用时写 -m local:qwen。

一个 client 可以挂多个模型,多个 client 写在同一个 clients 列表里。切换模型就是改 -m 后面的名字,不用换工具。

接本地服务,一次问答 0.46 秒

指标数值说明
exe 体积12793856 字节单文件,无运行时依赖
本地服务就绪9.05 秒koboldcpp 加载模型的时间
一次问答(含启动)0.51 秒非流式,一次回答完
--version / --list-models0.14 秒纯启动开销
一次回答的单词数29 个0.51 秒那次
配置文件行数13 行一个 client 一个模型
服务没起时的失败耗时2.17 秒退出码 1

0.51 秒里包含了 aichat 自己的进程启动、读配置、发请求、等模型回答完整。光启动就要 0.14 秒(--version 的耗时),所以真正花在模型上的不到 0.4 秒。模型那侧的首 token 延迟大概 0.1 秒,剩下的时间在生成和进程初始化上。

它默认是流式输出,逐字往外打。-S 关掉流式,等全部生成完一次性输出,脚本里取结果用这个。上面那个 0.51 秒是加了 -S 测的,回答一共 29 个单词。

模型名写错,它照样回答

aichat -m local:nope -S "hi"
Hello! How can I assist you today?

配置里只有 qwen 这一个模型,传 local:nope 却正常返回了答案,退出码还是 0。它把不认识的名字回落到了该 client 的默认模型上,没有任何提示。

这个行为在脚本里很危险:本来想验证「模型是否可用」,结果永远通过。要判断模型名对不对,只能先跑 --list-models 拿全部可用名字,自己比对:

aichat --list-models
local:qwen

输出只有一行,就是配置里定义的那一个,耗时 0.14 秒。配置写错、模型名拼错,在这个列表里直接就能看出来。

服务没起,报错给了四层原因

aichat -m dead:qwen -S "hi"
Error: Failed to call chat-completions api
Caused by:
    0: error sending request for url (http://127.0.0.1:5999/v1/chat/completions)
    1: client error (Connect)
    2: tcp connect error
    3: 由于目标计算机积极拒绝,无法连接。 (os error 10061)

退出码 1,耗时 2.17 秒。这个错误链写得比大多数工具清楚:第一层说哪个接口失败了,中间两层说是连接阶段的问题,最后一层直接给系统错误码 10061。

2.17 秒这个时间说明它没有重试太多次,脚本里可以放心让它失败。

它还带角色和会话

-r 可以选角色(role),角色就是一段预设的 system prompt,存在配置目录下的 roles 里。--list-roles 能看到全部。

会话是自动保存的,同一个终端里连续对话会带上上下文,一次问答 0.51 秒里已经包含了这部分开销。要开新会话用 . 开头的命令,离开终端再回来还能接着上次的聊。

这几个功能都不复杂,但组合起来就是一个能日常用的终端 AI 入口:配置一次,之后 aichat "问题" 就能用,不用记各家 API 的调用格式。

适合谁用

手上有多个模型账号、或者同时用云端 API 和本地模型的人,配置一次就能用同一个命令切来切去。反过来,只用一家、只用网页版的人没必要装它。

还有一点要清楚:它是纯客户端,对话记录、API Key 都在本地配置文件里,不经过任何中转。这一点对介意数据出机器的人是刚需,但也意味着配置文件和 key 要自己管好。