匿名入口
OpenCode Zen 和 Kilo 两个默认开启、无需账号的免费入口:它们提供什么、怎样关闭、怎样加密钥扩大目录,以及协议上的处理和注意事项。
Hoshimi 第一次启动、还没有任何配置时,opencode(OpenCode Zen)和 kilo(Kilo AI)两个渠道就已经可用:它们带一个不含凭据的占位账号,直接向上游的免费模型发请求。在 渠道 页面上,这两个渠道显示 无需账户。
模型能否调用取决于上游当前的模型、额度和服务状态,也可能因网络出口所在地区而不同。本页描述的是适配器的实现方式,不是对上游可用性的承诺。
概览
| 渠道 | 上游 | 匿名目录 | 加账号后 |
|---|---|---|---|
opencode | https://opencode.ai/inference | 实时目录中的免费切片(ID 含 free,以及 big-pickle、space-bunny-free、union-alpha) | API 密钥账号使用其鉴权目录 |
kilo | https://api.kilo.ai/api/gateway | 实时目录中标记 isFree: true 的聊天模型 | API 密钥或设备码登录,目录扩大到该账号可见的全部聊天模型 |
查看当前可用的 ID:
hoshimi models --provider opencode
hoshimi models --provider kilo
curl http://127.0.0.1:10600/v1/models调用时可以加渠道前缀,例如 opencode/big-pickle、kilo/kilo-auto/free。
关闭匿名入口
匿名入口只能通过 enabled: false 关闭(没有账号也会自动启用):
hoshimi config set providers.kilo.enabled false
hoshimi config set providers.opencode.enabled false或在 config.json 中写入:
{
"providers": {
"opencode": {"enabled": false},
"kilo": {"enabled": false}
}
}在 渠道 页面中关闭渠道开关也是同样的效果。重新开启时把 enabled 改回 true 或删除这一项。
OpenCode Zen(opencode)
匿名使用
未关闭时,opencode 使用一个占位账号(opencode-public)。网关读取上游 /v1/models,只保留免费切片:ID 中以 free 作为独立片段的模型(如 mimo-v2.6-flash-free),以及固定视为免费的 big-pickle、space-bunny-free、union-alpha。新出现的免费 ID 保留上游原样拼写。
实时目录优先。刷新失败时保留上一次成功的目录;只有冷启动且目录不可达时,才使用内置的历史回退列表。
用 API 密钥扩大目录
在 渠道 › OpenCode Zen 中点 添加账号,鉴权方式选 API 密钥;或写入 config.json:
{
"providers": {
"opencode": {
"accounts": [
{"id": "opencode-key", "api_key": "<OpenCode API key>", "project_id": "<optional project id>"}
]
}
}
}- 有账号后,渠道只使用你配置的账号,匿名占位账号不再加入。账号中没有
api_key时,该账号按匿名方式发送请求。 - 第一个账号带密钥时,目录不再只保留免费切片,可用范围仍受密钥权限限制。
project_id作为x-opencode-project头发送,默认global。- OpenCode Go 套餐是另一个渠道
opencode-go,见本地与兼容端点。
协议处理
匿名通道参考外部项目 dsh-our-free-model 的 src/upstream.js(快照 f0b979f)实现 v2 协议。这个快照标明移植基线,不表示刚刚对上游做过实测。
- 请求发往
/inference/v1下的端点,携带User-Agent: opencode/latest/2.0.26/cli和x-opencode-client: cli,不发送旧的x-opencode-request。 x-opencode-session、x-opencode-session-id、x-session-affinity、x-session-id四个头取同一个会话 ID。会话 ID 按账号和对话稳定生成(降序编码),来源依次是请求体中的session_id、conversation_id、user,没有时取第一条用户消息。两个开场白相同的独立对话,请各自发送不同的session_id。- 端点按模型选择:
muse-spark-*走/v1/responses,union-alpha走/v1/messages,其余走/v1/chat/completions。 - 匿名请求会声明参考实现中的
read和shell两个工具定义(上游会比对工具描述)。调用方自己的同名但定义不同的工具会改名(如read_client)后发送,历史记录和强制选择中一致改名,响应中再还原。 - 这两个注入的工具调用方并不能执行。模型只调用了调用方没有提供的工具时,网关回答它
unsupported call: <name>并在同一会话中再问一次,最多两轮;模型仍坚持调用时返回 502 错误。调用方看到的只有文本和自己工具的调用。 - 调用方设置
tool_choice: "none"时,上游请求中省略该字段,由网关保证不把任何工具调用交给调用方。 - 带 API 密钥的账号不做以上工具处理,调用方的工具按原样发送。
思考级别
以下 ID 使用参考实现中声明的思考菜单;其余 ID 按共享的能力表处理(见模型行为)。
| 模型 | 级别 | 默认 | 可关闭思考 |
|---|---|---|---|
deepseek-v4.1-flash-free | disabled、low、high、max | high | 是 |
glm-5.3-flash-free | low、high、max | high | 否 |
nemotron-3.5-super-vl-free | disabled、minimal、low、medium、high、xhigh | high | 是 |
space-bunny-free | low、medium、high、xhigh、max | high | 否 |
级别通过 reasoning_effort 字段发送。
地区与探测
目录只列出 ID,无法说明当前网络出口能否使用某个模型;muse-spark 系列被标记为与地区相关。opencode 参与默认的可用性探测,可以在 模型 页面或通过 POST /api/v1/probe 实际请求一次来确认,见模型行为。
Kilo(kilo)
匿名使用
未关闭时,kilo 使用占位账号(kilo-public),不带任何凭据请求 Kilo 网关。目录只保留上游标记 isFree: true 的聊天模型(排除嵌入、图像、音频等),付费 ID 不带密钥只会返回 401。冷启动且目录不可达时使用内置的历史回退列表(如 kilo-auto/free、openrouter/free)。
免费池的提示词可能被记录
匿名免费池没有任何凭据保护,免费模型背后的上游可能记录提示词。不要通过它发送敏感内容。
用密钥或设备码登录
有两种方式添加 Kilo 账号:
hoshimi login kilo终端打印验证链接和验证码(网页界面中点 登录,对话框显示 验证码),在浏览器中确认后账号写入 config.json。Kilo 返回的是长期有效的密钥,不是可续期的 OAuth 令牌,因此不会定时续期。
也可以在 添加账号 中直接填 API 密钥,或写入 config.json:
{
"providers": {
"kilo": {
"accounts": [{"id": "kilo-key", "api_key": "<Kilo API key>"}],
"options": {"free_only": true}
}
}
}- 账号接受
api_key、access_token或token中的任一个。 - 有带凭据的账号时,目录包含该账号可见的全部聊天模型;设置
options.free_only: true仍只保留免费模型。 - 和
opencode一样,有账号后匿名占位账号不再加入;没有凭据的账号按匿名方式请求。
请求处理与思考级别
- 请求使用 OpenAI Chat Completions;
max_completion_tokens改写为max_tokens,developer消息改为system,工具定义去掉strict,并移除store和reasoning_effort。 - 思考级别来自目录行中声明的能力,通过
reasoning: {"effort": ...}发送,关闭思考时发送reasoning: {"enabled": false}。 stepfun/、liquid/、thinkingmachines/前缀的模型要求必须思考,kilo-auto/free和openrouter/free接受参数但仍会思考,它们的菜单中没有关闭选项。
Kilo 不参与默认的可用性探测:匿名目录本身就是免费池的结论。
验证范围
tests/core/test_opencode_lane.py、tests/core/test_pi_free_parity.py 和协议测试覆盖的是本地回归,不能替代从某个网络出口实际请求成功。模型是否可用、地区限制和额度,以上游当前的响应或一次显式探测为准。