Pleasantries 实战
所以我写了个小工具叫 Pleasantries,一个 Python pre-hook 脚本,专门用来拦截这类纯问候式的输入,让它们在到达模型之前就被丢掉。
它是怎么工作的
核心逻辑很简单:hook 截获你打出去的 prompt,先做归一化(转小写、去标点、合并空白字符),然后用 regex fullmatch 判断整段内容是不是一个无实质任务的客套话。如果是,直接拦截;如果 prompt 里虽然出现了 "hello" 这类词但后面跟着真正的任务,比如 "hello world program in python",就放行。

# 核心匹配逻辑示意
import re
PLEASANTRIES = re.compile(
r'^(hi|hello|hey|ok|okay|thanks|thank you|thanks so much|thx)$',
re.IGNORECASE
)
def should_block(prompt: str) -> bool:
normalized = ' '.join(prompt.lower().split())
return bool(PLEASANTRIES.fullmatch(normalized))
不同 CLI 的拦截方式不一样。Claude Code、Kiro、Copilot Chat 这些走 stderr + exit code 2;Codex 和 Gemini 走 JSON 输出加 exit code 0;Cursor 也有自己的处理路径。Pleasantries 内部对每个工具都做了适配。
支持哪些 CLI
目前覆盖了 15 个主流 AI coding CLI:Claude Code、Codex CLI、Gemini CLI、Cursor、Copilot Chat、Copilot CLI、Qwen Code、Junie CLI、Factory Droid、Kimi Code、grok-cli、Kun、Open Interpreter、Kiro 和 Devin CLI。
还没接入的工具包括 CodeBuddy、Aider、Kilo Code、Trae、OpenClaw 等等,它们目前没有可用的 hook 机制。
部署步骤
一、安装。克隆仓库后跑安装脚本:
git clone https://github.com/QAInsights/pleasantries.git
cd pleasantries
python install.py安装脚本会自动把 block_pleasantries.py 复制到 ~/.pleasantries/,扫描你机器上已安装的 CLI,让你勾选要挂钩的工具,然后把 hook 合并进对应配置,重复安装会跳过已存在的条目。
二、手动配置示例。如果你不想走自动安装,下面是 Claude Code 的 ~/.claude/settings.json 写法:
{
"hooks": {
"PreToolUse": [
{
"matcher": ".*",
"hooks": [
{
"type": "command",
"command": "python ~/.pleasantries/block_pleasantries.py",
"timeout": 5000
}
]
}
]
}
}三、验证是否生效。装好后在 Claude Code 里分别输入 "hi"、"thank you" 和 "fix the login bug",前两个应该被拦截不发给模型,第三个正常通过。
效果怎么样
我用了大概两周,最直观的感受是交互节奏变快了。以前每次打完 "hi" 都要等模型回应才能继续敲任务,现在这部分等待完全消失了。另外 token 消耗确实有下降,虽然单次省的不多,但累积起来一周能省下小几千 token,对于按量付费的 Codex 和 Gemini CLI 来说不是小数目。
唯一需要注意的坑是:如果你习惯在 prompt 开头写 "hey, can you" 然后再描述任务,Pleasantries 不会拦截它,因为 fullmatch 要求整段都是客套话才会触发。但如果你只是单独打了 "hey" 后回车,那就会被挡住。
这个项目本身不依赖任何外部库,install.py 一键搞定,对想给自己的 CLI 流水线做精简的开发者来说值得一试。

TAGS: Pleasantries, local models, context window, quantized model