介绍我用 Go 编写的 CLI AI 聊天工具 Paw,通过环境变量快速上手,利用 Shell 管道分析日志与 Git diff,并支持提示词复用、结果保存和会话续聊

在终端里看日志、查报错、翻 Git diff 的时候,我经常想顺手问一句 AI:这段输出是什么意思,问题可能出在哪里,这次改动该怎么概括

这些内容已经在终端里了,如果能直接接上一条命令,就能少一次复制、切窗口和粘贴

所以我做了个叫 Paw 的 CLI AI 聊天工具,用 Go 编写,可以直接在终端提问,也可以接收其他命令的输出

最简单的用法是这样:

paw "用一个例子解释什么是反向代理"

我更想推荐的是这样的用法:

git diff --staged | paw "用中文总结这些改动,并给出一条简洁的提交信息"

左边负责准备材料,右边用一句话说明需求,回答会默认以流式方式输出到终端

我希望 Paw 用起来足够直接:先把第一个问题问出去,再按需要添加配置

以下示例使用 Bash,先准备好 Git 和 mise,然后从源码构建:

git clone https://cnb.cool/pw.sh.cn/paw
cd paw
mise trust
mise install
mise run build
export PATH="$PWD/bin:$PATH"

仓库通过 mise 固定了 Go 版本,构建产物位于 bin 目录,最后一行让当前终端可以直接使用 paw 命令

第一次体验可以直接设置环境变量:

export OPENAI_API_KEY="你的 API Key"
export OPENAI_BASE_URL="https://your-endpoint.example/v1"
export OPENAI_CHAT_MODEL_ID="你的模型 ID"

paw "你好,帮我想三个适合周末动手做的小项目"

把示例里的地址、密钥和模型 ID 换成自己的即可,地址填写服务商提供的 OpenAI 兼容 API 根地址,例如 https://api.openai.com/v1,不要填到 /chat/completions

这种方式适合先试一下,或者临时接入一个兼容接口:在默认 YAML 配置文件不存在时,Paw 会读取这些环境变量,使用临时配置发起请求,也不会在本地保存会话记录

如果已经创建过 YAML 配置,Paw 会优先使用配置文件里的设置

能在终端里提问只是开始,管道才是我觉得它最顺手的地方

比如在 Go 项目里遇到测试报错,可以把输出直接交给模型分析:

go test ./... 2>&1 | paw "分析测试失败的原因,指出关键报错,并给出排查步骤"

这里的 2>&1 很有用:普通的 | 只会传递标准输出,而不少报错出现在标准错误里,把两者合并后,模型才能看到这两路输出

同样的方式也适用于日志、目录列表和其他命令输出,只要能输出文本,就可以把它接到 Paw 前面

对于已经保存在文件里的内容,直接用输入重定向即可:

paw "整理这段日志里的异常,按可能的关联分组" < error.log

Paw 会把命令行中的要求放在前面,再拼上输入的文本,一起作为一条消息发送给模型,输入里的换行和缩进会保留,方便处理日志堆栈、代码片段和多行文本

如果同一种分析要重复做,还可以把提示词单独存成文件,例如在 review-prompt.txt 中写好关注点和输出格式:

git diff --staged | paw --prompt-file review-prompt.txt "重点检查错误处理"

这时,一次性的要求、提示词文件和管道内容会依次组合起来,平时只需要更换输入材料

输入可以接管道,输出也可以继续交给 Shell 处理,比如把分析结果保存成 Markdown:

git diff --staged | paw "整理一份中文变更说明" > changes.md

聊天回答写到标准输出,日志和会话标识写到标准错误,所以保存回答时不会混进这些运行信息,即使开启了终端 Markdown 渲染,重定向到文件或管道时也会保留原始文本。

想一边看结果一边保存,可以接上熟悉的 tee:

paw "提炼这份文档的重点" < README.md | tee summary.md

有一个使用细节需要说清楚:Paw 会等管道输入结束后,再把收集到的内容一次性发送出去,因此分析日志时适合用 tail -n 200 app.log 这类会结束的命令,持续运行的 tail -f 会让它一直等待输入结束。

目前,标准输入以及拼接后的整条消息都有 8 MiB 的大小上限,超过上限会报错;模型能接收多少上下文还取决于所选模型,处理大日志时先筛选相关片段会更实用。

快速问完就退出,适合日常的小任务,想围绕同一个问题继续聊,也可以启用会话保存。

先生成配置模板:

paw config init

按照命令提示编辑生成的 YAML,设置服务商、模型和密钥来源,如果使用兼容接口,就选择 openaicompat 并填写 base_url,YAML 中的地址会按原样使用。

YAML 配置默认开启会话保存,之后正常提问,成功完成的对话就会保存下来:

paw "帮我梳理一个个人博客的功能清单"
paw sessions

从列表中找到对应会话,再执行 paw resume <会话 ID 或唯一前缀>,就能进入交互式续聊,接着补充需求。

目前 Paw 接入了 OpenAI、Anthropic、Gemini 和 OpenAI 兼容接口,也支持用多个 profile 保存不同的模型配置,日常切换时指定 --profile 即可。

这些配置可以等用到时再慢慢加,我最希望保留下来的体验,还是随手输入一句 paw "问题",或者在已有命令后面接上 | paw "要求"。

让终端里已有的文本,顺着管道变成一次 AI 对话

项目地址:CNB · GitHub