文档

文档

Junie CLI

Junie CLI 通过 JSON 文件配置自定义端点,而不是通过设置界面。只需在 $JUNIE_HOME/models/kunavo.json 中写入九行配置,再运行 junie --model custom:kunavo,即可通过一个密钥调用 Claude 和 GPT——同时将辅助请求指向低成本端点。

Junie CLI 在 $JUNIE_HOME/models/ 中通过 JSON 配置文件接收自定义端点,其中 baseUrl 是完整端点 URL,fasterModel 决定辅助流量的去向。

$JUNIE_HOME/models/kunavo.json — 或 .junie/models/kunavo.json
{
  "id": "claude-sonnet-5",
  "baseUrl": "https://api.kunavo.com/v1/chat/completions",
  "displayName": "Kunavo",
  "providerName": "Kunavo",
  "apiType": "OpenAICompletion",
  "apiKey": "${KUNAVO_API_KEY}",
  "fasterModel": {
    "id": "claude-haiku-4-5"
  }
}
baseUrl 就是完整的端点,包含路径。 JetBrains 对此说明得很明确:“baseUrl 将用作完整的端点 URL——Junie 不会向其追加路径”,并要求“将其设置为所选 apiType 的完整端点”。因此,此字段既不是源站地址,也不是大多数客户端需要的 /v1 根路径,而应填写 https://api.kunavo.com/v1/chat/completions。如果只填写到 https://api.kunavo.com/v1,这是原本正确的配置最容易出现 404 的原因。
缺少环境变量会导致整个配置文件失效,而不是仅让请求失败。 apiKey 和 extraHeaders 的值可以引用 $${VAR_NAME},JetBrains 对失败情况有明确说明:“如果被引用的环境变量未设置,配置文件将无法加载,Junie 会报告错误并指出缺少的变量。”启动 Junie 前,请先导出 KUNAVO_API_KEY——配置文件会在加载时读取,而非首次请求时读取,因此,如果 shell 中未保留该导出变量,配置文件会从 /model 中消失,而不是导致 401。
fasterModel 用于指定 Junie 将未经你要求而发送的任务交给哪个模型处理。 JetBrains 将其描述为“用于摘要上下文或分类任务等内部辅助任务的模型”,并指出,如果未明确设置 primaryModel 或 fasterModel,“它们会继承顶层属性”。因此,如果配置文件中没有 fasterModel 块,日常辅助任务就会按主模型的费率计费。上方的一行覆盖设置就是完整解决方案;这也是为什么它放在最简配置中,而不是放在附录里。
此配置文件根据 JetBrains 发布的架构整理,读取日期见下方。Kunavo 尚未使用 Junie CLI 请求其端点——没有进行会话、流式交互、工具往返,也没有指定并认可任何客户端构建版本。发布配置指南不等同于测试,本文内容不应被理解为测试结果。下面的 curl 是你可以在十秒内自行确认的部分;Junie 基于此配置的具体行为,则取决于你与 JetBrains。
还没有密钥?创建 Kunavo 账户,创建一个密钥(以 sk-kn- 开头),并充值 $10 起——调用费用从该余额中扣除,失败的调用不会收费。随后,控制台会打开 Junie CLI 设置页面。

分步操作

  1. 在 /app/keys 创建密钥并复制——它只会显示一次。在启动 Junie 的 shell 中将其导出为 KUNAVO_API_KEY,也可以在文件中直接填写密钥;JetBrains 指出,“不含任何 $${...} 引用的值会按原样使用”。
  2. 将上面的 JSON 保存为你账户的 $JUNIE_HOME/models/kunavo.json,或保存为可与仓库共享的 .junie/models/kunavo.json。去掉 .json 的文件名就是配置文件 ID,因此下方的选择器会显示 custom:kunavo。
  3. 将 id 设为你实际需要的模型 ID。它被描述为“API 端点所需的模型标识符”,因此可直接填写下表中的 Kunavo slug;ID 由端点解析,而不是由 Junie 解析。
  4. 启动 Junie 并选择配置:junie --model custom:kunavo,或在交互式会话中使用 /model 命令。自定义模型会“显示在内置服务商之后的模型选择列表中”。
  5. 给它一个需要编辑文件的任务,而不是只发问候语。Junie 是代理式客户端,几乎所有操作都依赖工具调用,因此首次运行时让它读写内容,比只收到一条回复能提供更多信息。

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

这是简要版本。完整教程——包括模型选择、真实会话成本和失败模式——见 Junie CLI 与 Claude Code——端点边界对比。

调试客户端前先验证

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

# 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 输入 / 输出它在 Junie CLI 中的位置
claude-sonnet-5$1.40 / $7.00用于常规工作的 primaryModel——也就是编辑文件的任务
claude-opus-5$3.50 / $17.50按会话固定的计划模型,避免关键规划出错造成高昂代价
claude-haiku-4-5$0.70 / $3.50用于总结上下文、分类任务的 fasterModel 角色
gpt-5-6-sol$2.00 / $12.00来自另一模型系列的第二意见——使用另一配置文件,但共用同一密钥
计费方式是从预付余额中按 token 扣费,无月费——参见 计费。对于重复上下文——这正是编辑器或聊天客户端发送内容的大部分——提示缓存对账单的影响大于模型选择。

Kunavo 支持的另外两种 apiType

apiType 指的是请求格式,而不是供应商;Junie 接受四种值:OpenAICompletion、OpenAIResponses、Google 和 Anthropic。Kunavo 提供三种路由,因此其余三种值中有两种在此有对应的 baseUrl。由于 Junie 不会追加路径,更改格式时必须同时修改 URL:

  1. "apiType": "OpenAICompletion" 搭配 https://api.kunavo.com/v1/chat/completions——即上方的配置文件,也是本页推荐的选项,因为这是三种路由中使用最广泛的一种。
  2. "apiType": "Anthropic" 搭配 https://api.kunavo.com/v1/messages——Kunavo 会在该路径上响应 Messages 格式。
  3. "apiType": "OpenAIResponses" 搭配 https://api.kunavo.com/v1/responses。

对于给定模型,哪种 Junie 驱动方式最好,这正是需要通过运行时测试来回答、无法仅凭阅读文档回答的问题,因此除了首行所述之外,本页不对它们进行排序。请选择一种方式,确保 URL 与 apiType 相匹配;如果设置了密钥的配置返回 401,请明确填写凭证,而不要猜测 Junie 使用的请求头:JetBrains 仅以否定方式说明了 apiKey:“如果省略,请求将不带 Authorization 请求头发送”,但从未说明设置该值时使用什么方案。extraHeaders 被描述为“每个请求都要包含的额外 HTTP 请求头”,并使用相同的 $${VAR} 引用,因此 "extraHeaders": {"Authorization": "Bearer $${KUNAVO_API_KEY}"} 是无歧义的格式。

常见问题

如何向 Junie CLI 添加自定义 Provider?

Junie CLI 从 JSON 配置文件读取自定义 Provider,而不是通过设置界面添加。对于你的账户,将文件放在 $JUNIE_HOME/models/;对于项目,则放在项目内的 .junie/models/。去掉 .json 扩展名后的文件名就是配置文件 ID。必填键为 id、baseUrl 和 apiType;apiKey、displayName、providerName、extraHeaders、extraBody、temperature、maxContextLength、primaryModel 和 fasterModel 均为可选。之后使用 `junie --model custom:<id>` 或 /model 命令选择它——自定义模型会显示在内置 Provider 之后的列表中。

Junie CLI 的 baseUrl 需要 /v1 还是完整路径?

需要填写完整路径。JetBrains 指出,baseUrl 会用作完整端点 URL,Junie 不会追加路径,并要求你将其设置为所选 apiType 对应的完整端点。对于连接 Kunavo 的 OpenAICompletion 配置文件,地址应为 https://api.kunavo.com/v1/chat/completions——而不是源站,也不是 Kilo Code 等客户端需要的 /v1 根路径。JetBrains 自家文档中的两个示例配置文件也都包含完整路径,原因相同。

为什么 Junie 提示配置文件因缺少环境变量而无法加载?

因为 apiKey 和 extraHeaders 的值支持 ${VAR_NAME} 引用;JetBrains 说明,如果引用的环境变量未设置,配置文件就会加载失败,Junie 会报错并指出缺失的变量。变量会在配置文件加载时解析,因此你会看到配置文件从模型列表中消失,而不是请求失败。请在启动 Junie 之前导出该变量,或将引用替换成字面值。

Junie CLI 能否通过 Kunavo 这样的网关使用自己的 BYOK 密钥?

BYOK 页面和自定义配置文件是两种不同的接入方式。JetBrains 的 BYOK 页面介绍了如何通过 /account 或欢迎页面上的“Use your own API key”连接指定的 Provider——OpenAI、Anthropic、Google、xAI、OpenRouter 或 GitHub Copilot;页面还说明,所有用量均由 Provider 计费,无需订阅 JetBrains AI。Kunavo 等不在列表中的端点,应作为自定义 LLM 配置文件接入,也就是本页介绍的 JSON 文件。自带密钥是 Junie CLI 的功能:JetBrains 的插件文档指出,Junie 插件不支持此功能。

为什么 Junie 调用了我没有选择的模型?

Junie 将配置文件分为两个角色;文档说明,fasterModel 用于内部辅助任务,例如总结上下文或分类任务。如果没有定义该区块,JetBrains 说明这些角色会继承顶层属性——因此辅助请求会使用主模型,并按其费率计费。如本页配置文件所示,将 fasterModel.id 设为较便宜的 ID 即可调整;两个角色都会继承顶层的 baseUrl、apiType 和 apiKey,因此只需更改 ID。

Kunavo 测试过 Junie CLI 吗?

没有。2026 年 9 月 21 日检查的是 JetBrains 自己的 Custom LLMs 文档——字段名称、顺序、接受的 apiType 值以及完整端点规则均引自该文档。Kunavo 尚未安装 Junie CLI、指定构建版本或通过它发送请求,因此不对客户端中的流式交互、工具往返或模型路由作出任何声明。你可以单独确认的只有端点和密钥是否可用,本页中的 curl 命令即可完成检查。