文档
Pi
Pi——Earendil 的终端编程智能体,不是 Inflection 聊天机器人,也不是硬币——通过 models.json 中的一个代码块配置自定义提供商:填写 baseUrl、api、key 和所需模型 ID。配置四个字段后,即可通过一个密钥调用 Claude 和 GPT。
在 ~/.pi/agent/models.json 中添加自定义提供商配置块 — baseUrl、api 和模型 ID — 让 Earendil 的 Pi 终端编程代理通过一个密钥使用 Claude 与 GPT。
{
"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 时也应照此设置。--api-key,然后使用已保存的 auth.json 凭据、来自 models.json 的 apiKey,最后使用提供商的环境变量”。因此,/login 保存的旧密钥会优先于文件中的密钥,这通常是刚编辑完配置块却仍以其他凭据进行身份验证的原因。该页面还补充说,自定义模型“可以从 models.json 加载,但在 Pi 能解析凭据之前,仍无法在 /model 中使用”——模型未出现在选择器中,说明是凭据问题,而不是语法问题。api 值——则在下方所示的同一日期依据 Pi v0.99.2 的源代码整理。Kunavo 尚未使用 Pi 向自己的端点发起请求——未运行会话、未测试流式对话轮次、未进行工具往返,也未核实请求最终使用了哪个模型。已发布的配置页面是配置参考,不是兼容性测试,本文的任何内容都不应被视为此类测试。下方的 curl 是你可以在十秒内自行确认的部分;客户端的行为则需要你自行与 Pi 方面处理。sk-kn- 开头),并充值 $10 起——调用费用从该余额中扣除,失败的调用不会收费。随后,控制台会打开 Pi 设置页面。分步操作
- 在
/app/keys创建密钥并复制——它只会显示一次。 - 将其设置为环境变量
KUNAVO_API_KEY。Pi 会在apiKey字段中解析"$NAME"或"${NAME}",也可以解析字面值或开头为!command的值。如果变量名后面还有字面文本,请使用带大括号的形式。 - 创建或编辑
~/.pi/agent/models.json,并粘贴上方的代码块。非内置提供商必须设置baseUrl,且在提供商级别或模型级别提供api值——Pi 的源代码要求这些值,否则不会加载模型;其他设置均为可选。打开/model即可重新加载文件。 - 运行
pi,执行/model,然后选择一个你已声明的 ID。如果列表中没有它,请检查 JSON 前面的密钥——参见上方的解析顺序说明。 - 给它一个需要读取和编辑真实文件的任务。Pi 几乎所有操作都依赖工具调用,因此首次运行时接触文件系统,比打个招呼能让你了解得更多——而且这次运行可以暴露流式传输或工具架构不匹配的问题;这正是 Kunavo 尚未替你测试过的问题类型。
已于 2026年10月1日 对照 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 的美元,格式为输入 / 输出。
| 模型 ID | Kunavo 输入 / 输出 | 它在 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 |
另一种方式: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 就启用这些设置。”
compat.supportsEagerToolInputStreaming— 适用于会拒绝按工具即时流式传输输入的后端。compat.supportsStrictTools— 端点是否接受严格的 JSON 架构工具定义;自定义模型不会继承内置 Anthropic 模型声明的设置。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 命令验证端点和密钥,并在试用时保留一条可用的路由。