文档

文档

Pi

Pi——Earendil 的终端编程智能体,不是 Inflection 聊天机器人,也不是硬币——通过 models.json 中的一个代码块配置自定义提供商:填写 baseUrl、api、key 和所需模型 ID。配置四个字段后,即可通过一个密钥调用 Claude 和 GPT。

在 ~/.pi/agent/models.json 中添加自定义提供商配置块 — baseUrl、api 和模型 ID — 让 Earendil 的 Pi 终端编程代理通过一个密钥使用 Claude 与 GPT。

~/.pi/agent/models.json
{
  "providers": {
    "kunavo": {
      "baseUrl": "https://api.kunavo.com/v1",
      "api": "openai-completions",
      "apiKey": "$KUNAVO_API_KEY",
      "models": [
        {
          "id": "claude-sonnet-5",
          "name": "Claude Sonnet 5",
          "reasoning": true,
          "input": ["text", "image"],
          "contextWindow": 1000000,
          "maxTokens": 128000
        },
        {
          "id": "claude-haiku-4-5",
          "name": "Claude Haiku 4.5",
          "input": ["text", "image"],
          "contextWindow": 200000,
          "maxTokens": 64000
        }
      ]
    }
  }
}
在 openai-completions 提供商中保留 /v1。 Pi 的模型页面上的兼容端点示例将该值与 http://localhost:11434/v1 配对;在文档于 9 月 22 日重写之前,其中的 OpenRouter、Vercel AI Gateway 和 llama.cpp 示例也使用相同的版本路径。没有任何句子明确说明这一规则,因此可以从示例中确认。基础 URL 缺少该后缀时会出现 404,而非身份验证错误。
自定义模型的 cost 默认值全为零——该默认值存在于 Pi 的源代码 (v0.99.2) 中,文档已不再明确说明——因此,你刚添加的提供商会在页脚和 /session 中显示 $0,除非你自行填写费率。下面两个不易察觉的默认值影响更大:contextWindow 会回退到 128000,maxTokens 会回退到 16384,因此留空的模型会被压缩并截断,远低于其实际可接受的长度。上方的代码块会根据目录设置这两个值;你从下方表格添加任何 ID 时也应照此设置。
Pi 按自身顺序查找密钥。Pi 的模型页面说明,配置多个来源时,它会“首先使用运行时 --api-key,然后使用已保存的 auth.json 凭据、来自 models.json 的 apiKey,最后使用提供商的环境变量”。因此,/login 保存的旧密钥会优先于文件中的密钥,这通常是刚编辑完配置块却仍以其他凭据进行身份验证的原因。该页面还补充说,自定义模型“可以从 models.json 加载,但在 Pi 能解析凭据之前,仍无法在 /model 中使用”——模型未出现在选择器中,说明是凭据问题,而不是语法问题。
此代码块是于下方所示日期根据 Pi 自己的文档整理的;文档在 9 月 22 日不再说明的内容——字段名称、自定义模型默认值和 api 值——则在下方所示的同一日期依据 Pi v0.99.2 的源代码整理。Kunavo 尚未使用 Pi 向自己的端点发起请求——未运行会话、未测试流式对话轮次、未进行工具往返,也未核实请求最终使用了哪个模型。已发布的配置页面是配置参考,不是兼容性测试,本文的任何内容都不应被视为此类测试。下方的 curl 是你可以在十秒内自行确认的部分;客户端的行为则需要你自行与 Pi 方面处理。
还没有密钥?创建 Kunavo 账户,创建一个密钥(以 sk-kn- 开头),并充值 $10 起——调用费用从该余额中扣除,失败的调用不会收费。随后,控制台会打开 Pi 设置页面。

分步操作

  1. 在 /app/keys 创建密钥并复制——它只会显示一次。
  2. 将其设置为环境变量 KUNAVO_API_KEY。Pi 会在 apiKey 字段中解析 "$NAME" 或 "${NAME}",也可以解析字面值或开头为 !command 的值。如果变量名后面还有字面文本,请使用带大括号的形式。
  3. 创建或编辑 ~/.pi/agent/models.json,并粘贴上方的代码块。非内置提供商必须设置 baseUrl,且在提供商级别或模型级别提供 api 值——Pi 的源代码要求这些值,否则不会加载模型;其他设置均为可选。打开 /model 即可重新加载文件。
  4. 运行 pi,执行 /model,然后选择一个你已声明的 ID。如果列表中没有它,请检查 JSON 前面的密钥——参见上方的解析顺序说明。
  5. 给它一个需要读取和编辑真实文件的任务。Pi 几乎所有操作都依赖工具调用,因此首次运行时接触文件系统,比打个招呼能让你了解得更多——而且这次运行可以暴露流式传输或工具架构不匹配的问题;这正是 Kunavo 尚未替你测试过的问题类型。

已于 2026年10月1日 对照 Pi 的选择模型文档 检查。第三方设置会发生变化;如果这里的字段名称不再与你看到的内容一致,应以该页面为准,而不是本页。

这是简要版本。完整教程——包括模型选择、真实会话成本和失败模式——见 Pi 实际运行的成本,按路由划分。

调试客户端前先验证

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

# 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 输入 / 输出它在 Pi 中的位置
claude-sonnet-5$1.40 / $7.00作为文件编辑会话默认工作模型
claude-opus-5$3.50 / $17.50规划一个出错代价高昂的变更
claude-haiku-4-5$0.70 / $3.50低成本调用——分诊、摘要,以及全天运行的循环
gpt-5-6-sol$2.00 / $12.00来自另一个系列的第二意见,使用相同的密钥和 baseUrl
计费方式是从预付余额中按 token 扣费,无月费——参见 计费。对于重复上下文——这正是编辑器或聊天客户端发送内容的大部分——提示缓存对账单的影响大于模型选择。

另一种方式:anthropic-messages

在 2026 年 9 月 22 日文档更新之前,Pi 为自定义提供商的 api 记录了四个值——openai-completions、openai-responses、anthropic-messages 和 google-generative-ai。更新后的模型页面没有列出任何值:一个示例中显示 openai-completions,并将该情况描述为“兼容 OpenAI、Anthropic 或 Google 的端点”。Pi v0.99.2 的源代码将该字段定义为自由字符串,并将其分发给与之匹配的十种内置实现之一——前四种加上 openai-codex-responses、azure-openai-responses、google-vertex、mistral-conversations、bedrock-converse-stream 和 pi-messages。自定义提供商曾有文档说明的只有前四种,此处未测试其余六种中的任何一种;本页没有任何内容表明其中任何一种可用于第三方端点。

anthropic-messages 是有文档记录的四种取值之一,而 Kunavo 除了兼容 OpenAI 的接口,也支持 Anthropic Messages 接口。因此,这条路由可以用配置表达。本页不会在供你粘贴的配置块中为它填写 base URL:Pi 的文档从未明确规定此 api 的 base URL 字段应填写什么值。在 9 月 22 日之前,文档以两种方式展示它——一个示例中是 https://proxy.example.com/v1,另一个示例中是不带路径后缀的 https://proxy.example.com;当天的文档更新删除了两者,没有做出选择。如果你选择这条路由,可以先试一种;如果首次调用返回的是 404 而不是 401,就需要修改那一行。

在 Pi 的该 API 的 compat 架构中,有三个字段值得你在使用前了解(源代码版本为 v0.99.2)。文档对这三个字段有一条规则,值得先引用:“兼容性设置应描述端点请求或响应行为中已验证的差异。不要仅因为端点宣称兼容 OpenAI 或 Anthropic 就启用这些设置。”

  1. compat.supportsEagerToolInputStreaming — 适用于会拒绝按工具即时流式传输输入的后端。
  2. compat.supportsStrictTools — 端点是否接受严格的 JSON 架构工具定义;自定义模型不会继承内置 Anthropic 模型声明的设置。
  3. compat.supportsMidConvoEffort — 在对话中途更改推理强度。此端点是否符合条件,需要在运行时确认;Kunavo 尚未通过实际运行作出判断。

本页顶部的 openai-completions 配置块避开了这三个问题。这就是建议从这里开始的真实原因,并非声称它性能更好。

常见问题

如何让 Pi 编码代理使用自定义 API 提供商?

在 ~/.pi/agent/models.json 中添加一个提供商配置块。Pi 的模型页面说明,当“端点使用 Pi 已支持的 API”时,应使用 models.json;其架构(源代码版本 v0.99.2)规定提供商级别可设置 baseUrl、apiKey、api、headers、authHeader、models 和 modelOverrides。非内置提供商必须设置 baseUrl,并在提供商级别或模型级别设置 api 值。架构将 api 定义为自由字符串,而不是列表:在 2026 年 9 月 22 日文档更新之前,Pi 为自定义提供商记录了四种取值——openai-completions、openai-responses、anthropic-messages 和 google-generative-ai;v0.99.2 的源代码会将该字段分发给十种内置实现中与之匹配的一种,其余六种从未记录为此用途,且在此未经过测试。对于兼容 OpenAI 的端点,更新后的文档仍展示 openai-completions 作为取值。models 中的每个条目至少需要一个 id,该值会原样传递给端点,因此相同的配置结构适用于网关、本地 Ollama 或 vLLM 服务器,以及其他兼容主机。

Pi 编码代理从哪里获取 API 密钥?

来源有四种,Pi 的模型页面列出了优先顺序:首先是运行时参数 --api-key,其次是已存储的 auth.json 凭据,然后是 models.json 中的 apiKey,最后是提供商的环境变量。因此,之前通过 /login 保存的密钥优先于你刚在 models.json 中编辑的密钥。apiKey 字段支持环境变量插值——“$NAME”或“${NAME}”——也可填入字面值,或使用以“!”开头的 shell 命令输出,因此无需将密钥放在文件中。文档说明,如果没有可用凭据,自定义模型会从 models.json 加载,但在 /model 中仍不可用。

Pi 的 baseUrl 末尾需要加 /v1 吗?

对于 openai-completions 提供商,需要。Pi 的文档从未用一句话明确说明这条规则,但其兼容端点示例将 http://localhost:11434/v1 用作 Ollama 地址;在 2026 年 9 月 22 日文档更新之前,OpenRouter、Vercel AI Gateway 和 llama.cpp 示例也使用了相同的版本路径。因此,兼容 OpenAI 的端点应使用 /v1 根路径,例如 https://api.kunavo.com/v1。anthropic-messages 的情况确实没有定论:旧版文档既展示了带 /v1 的形式,也展示了不带 /v1 的形式;更新时删除了这两个示例,却没有作出选择。

为什么我的 Pi 自定义提供商在页脚显示 $0?

因为 Pi 默认将自定义模型的 cost 对象设为全零(源代码版本 v0.99.2),而页脚显示的是目录中记录的价格,不是端点实际收取的费用。服务并非免费;只有在你根据提供商自己的价目表填写每百万输入、输出、cacheRead 和 cacheWrite 费率以及任何分级费率后,这个数字才有依据。编辑文件时,也要留意两个相邻字段的默认值:contextWindow 默认回退为 128000,maxTokens 默认回退为 16384,因此窗口更大的模型会较早被压缩,回复也会被截短,除非你明确设置这两个字段。

Kunavo 测试过 Pi 编码代理吗?

没有。本页配置是在所示日期根据 Pi 自身的文档整理的;对于 9 月 22 日文档更新时删去的细节,则在同一日期查阅了 Pi 已发布的源代码。但我们没有使用此客户端,通过该端点运行过会话、流式对话轮次、工具往返或模型路由检查——本节中的每个客户端也都是如此。请将配置块视为 Pi 架构所接受配置的参考,用上面的 curl 命令验证端点和密钥,并在试用时保留一条可用的路由。