文档

文档

Crush

Crush 是 Charm 的终端编码代理,并非同名的 Rust shell。它的配置采用 Bash,因此要将它指向另一个端点,只需添加一个提供商,设置类型、基础 URL 和密钥。

Crush 的配置是 Bash — 在 crushrc 中添加一行 `provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1"`,即可让 Charm 的终端代理使用 Claude 与 GPT。

~/.config/crush/crushrc
# A crushrc is Bash, not a settings file. Everything here is executed.
provider add kunavo \
  --type openai-compat \
  --base-url "https://api.kunavo.com/v1" \
  --api-key "${KUNAVO_API_KEY:?set KUNAVO_API_KEY}"

model add kunavo/claude-sonnet-5 \
  --name "Claude Sonnet 5" \
  --context-window 1000000 \
  --default-max-tokens 32000 \
  --price-input 1.4 \
  --price-output 7

model add kunavo/claude-haiku-4-5 \
  --name "Claude Haiku 4.5" \
  --context-window 200000 \
  --default-max-tokens 16000 \
  --price-input 0.7 \
  --price-output 3.5

model large kunavo/claude-sonnet-5
model small kunavo/claude-haiku-4-5
基础 URL 保留 /v1 后缀。Crush 自己记录的 OpenAI 兼容示例使用 --base-url "https://api.deepseek.com/v1",Anthropic 兼容示例也以相同后缀结尾——因此这是客户端的约定,而非猜测。省略该后缀会导致 404,而不是身份验证错误。
使用 --type openai-compat,而不是 openai。README 明确区分:openai 用于通过 OpenAI 代理或路由请求,openai-compat 用于提供 OpenAI 兼容 API 的非 OpenAI 提供商。Kunavo 属于第二种情况。
crushrc 是包含 Crush 内置功能的 Bash;Crush 自己提醒它属于受信任代码,会在完整的 shell 中运行。这也是它的优势:--api-key "$(op read ...)" 可让密钥不必写入文件。旧版 crush.json 仍可加载,但 README 将其标记为已弃用,因此请使用 crushrc 进行配置。
Kunavo 尚未对 Crush 进行运行时测试——本页中的这个客户端以及其他客户端均未测试。本文核对的是 Crush 自己记录的配置与 Kunavo 发布的端点;配置指南不等于测试结果。将它用于日常工作前,请先运行一项范围明确的任务。
还没有密钥?创建 Kunavo 账户,创建一个密钥(以 sk-kn- 开头),并充值 $10 起——调用费用从该余额中扣除,失败的调用不会收费。随后,控制台会打开 Crush 设置页面。

分步操作

  1. 在 /app/keys 创建密钥并复制——它只显示一次。将其导出为 KUNAVO_API_KEY,或者直接在配置中从密码管理器读取。
  2. 将上面的配置块放入 ~/.config/crush/crushrc。Crush 会依次读取 ./.crushrc、./crushrc,然后读取全局配置,因此项目可以覆盖机器级设置——克隆下来的仓库也可以自带配置文件。
  3. 启动 crush,然后按 ctrl+l 打开模型选择器。上面的 model large 和 model small 行已经固定了两个槽位,因此模型选择器用于切换,而非初始设置。
  4. 如果不想手动注册 id:当 openai-compat 提供商的模型列表为空或传入 --discover-models true 时,就会运行自动发现。Kunavo 会响应 GET /v1/models,因此列表会自动填充;发生冲突时,你自己设置的 model add 字段优先。
  5. 先运行一项范围明确的任务,然后查看账户在 /app/billing 记录的费用。终端显示的数字只是根据你填写的 --price-* 数值进行的计算;账本记录的才是实际账单。

已于 2026年9月21日 对照 Crush 的自定义提供商章节 检查。第三方设置会发生变化;如果这里的字段名称不再与你看到的内容一致,应以该页面为准,而不是本页。

这是简要版本。完整教程——包括模型选择、真实会话成本和失败模式——见 Crush 与 OpenCode。

调试客户端前先验证

一个请求即可确定故障来自端点、密钥还是配置文件。如果返回 JSON,则相同的基础 URL 和密钥可以在 Crush 中使用。

# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
  -H "Authorization: Bearer sk-kn-..."

字段中应填写哪个模型 ID

每个文本模型都可通过模型 ID 访问——实时列表见 GET /v1/models,包含价格的目录见模型页面。费率单位为每 1M token 的美元,格式为输入 / 输出。

模型 IDKunavo 输入 / 输出它在 Crush 中的位置
claude-sonnet-5$1.40 / $7.00日常编码和编辑使用的 model large 槽位
claude-haiku-4-5$0.70 / $3.50Crush 会频繁调用 model small 槽位,用于生成标题和摘要
claude-opus-5$3.50 / $17.50当错误计划代价高昂时,切换到 model large 进行重构
gpt-5-6-terra$0.70 / $4.20使用同一密钥获取另一模型系列的第二种意见,只需再添加一个模型
计费方式是从预付余额中按 token 扣费,无月费——参见 计费。对于重复上下文——这正是编辑器或聊天客户端发送内容的大部分——提示缓存对账单的影响大于模型选择。

常见问题

如何在 Crush CLI 中添加自定义 API 提供商?

将其写入 crushrc,这是包含 Crush 内置功能的 Bash 脚本。一行命令即可注册端点——provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1" --api-key "$KUNAVO_API_KEY"——每个 id 再使用一条 model add 命令,注册你要调用的模型,并填写 Crush 用于屏幕估算的显示名称、上下文窗口和每百万 token 价格。Crush 会依次读取 ./.crushrc、./crushrc 和 ~/.config/crush/crushrc,因此同一个配置块既可用于项目,也可用于整台机器。

Crush 的基础 URL 末尾需要加 /v1 吗?

需要。Crush 自己的自定义提供商示例对两种类型都写有该后缀:OpenAI 兼容情况下使用 https://api.deepseek.com/v1,Anthropic 兼容情况下使用 https://api.anthropic.com/v1。Kunavo 密钥对应的值是 https://api.kunavo.com/v1。这与 Claude Code 相反;Claude Code 的 ANTHROPIC_BASE_URL 使用不带路径的源站地址,因为该客户端会自行追加路径——同一个网关,两种写法;遗漏 /v1 会返回 404,而不是 401。

应该使用 --type openai 还是 --type openai-compat?

任何第三方网关都应使用 openai-compat。Crush 的 README 规定,openai 用于通过 OpenAI 本身代理或路由请求;对于提供 OpenAI 兼容 API 的非 OpenAI 提供商,则应使用 openai-compat。类型还会决定线格式之外的行为:当 openai-compat 提供商的模型列表为空时,会自动发现模型。Crush 还支持用于 Anthropic 兼容端点的 --type anthropic,该类型需要使用 --extra-header anthropic-version 2023-06-01。

crush.json 仍然是存放此配置的正确位置吗?

不是。crush.json 是原始格式;Crush 自己的文档现在将其标记为已弃用,并说明不会再为其添加新功能;当前格式是 crushrc。请注意,两者都会被执行,而非解析——crushrc 会在完整的 shell 中运行,crush.json 中的任何 $(...) 都会在加载时展开——因此文档会警告,不要在尚未阅读其配置的目录中启动 Crush;这也解释了为何可以直接在配置中从密码管理器获取密钥。

为什么 Crush 显示的费用与实际扣费不同?

因为这两个数字的来源不同、含义也不同。对于手动注册的提供商,屏幕上的估算值是根据你在 model add 中输入的 --price-input 和 --price-output 数值计算的;对于内置提供商,估算值来自 Crush 的外部提供商目录 Catwalk。两者都不会读取你的账户。--price-* 标志中的数值写错会导致显示错误,但不会影响实际扣费。请通过 /app/billing 中的账本核对实际费用。

Crush 能否通过自定义提供商使用 Claude 或 GPT 模型?

可以,Crush 没有任何限制。引导设置会推荐使用官方提供商 Charm Hyper,但自定义提供商也是文档明确支持的一等途径,没有套餐限制;模型 ID 会在端点处解析,而不是在客户端中解析。因此,在 openai-compat 提供商中使用 Claude ID 正是预期的组合:类型指的是传输协议,而不是供应商。