|

OpenBot 接不上 API易?3 个环境变量,AI 同事自己开电脑

OpenBot 接不上 API易?3 个环境变量,AI 同事自己开电脑

作者注:OpenBot 没有“选模型”的界面,模型写在 .env 和租户包的 model.yaml 里。本文讲清怎样改三行环境变量加一行 yaml 接上 API易,先只放行 3 个电脑工具,再用一次“开网页 + 读文件 + 看审计”完成验收。

你把 CopilotKit 的 OpenBot 克隆下来,打开 .env.example,又在前端页面里来回找,始终没找到“选择模型供应商”的下拉框。你手上没有 OpenAI 官方卡,只想用 API易 按量计费去驱动 claude-opus-5-5,结果连模型配在哪都不知道。

先说结论:OpenBot 没有“选模型”的开关。模型写在 .env 和租户包的 model.yaml 里。接 API易 不需要改代码,改三行环境变量,再改一行 yaml 就够了。改完以后先只放行 3 个电脑工具,验收通过再按需放开。

这不是“一键跑通”的教程。OpenBot 本身是模板,跑起来需要 Docker、Bun 1.4+、一个 CopilotKit Intelligence 项目,外加一把模型 key。这些前置条件本文都会写清楚。另外,GitHub 上有两个叫 OpenBot 的项目,本文讲的是 CopilotKit 这个。

核心价值:读完本文,你能自己改对三处配置,用 3 个工具起步,跑一次可验收的“开网页 + 读文件 + 看审计”。遇到 400、401、模型不存在、工具不被调用、启动被拒这几类常见故障,也有一张排错表可以对照。

openbot-apiyi-env-config-guide-image-0


OpenBot 的模型不在界面里配

OpenBot 是模板,不是产品

CopilotKit/OpenBot 是 MIT 许可的开源仓库,2026-08-17 创建。到 2026-11-02,仓库有 9,561 个 star,最新正式 Release 是 v0.2.0(2026-10-12),README 顶部仍标着 Beta。它的口号是让每个 AI 同事(仓库里叫 Bot)拥有一台自己的电脑,包括真实浏览器、自己的登录态、自己的文件,以及被授予的那几个工具。

README 里写得很直白:这是“A template, not a product”。它没有托管版可以注册,也不作为依赖包发布。正确用法是把仓库克隆下来,把 examples/ 下的示例租户包换成你自己的同事、频道和技能,然后自己运行。所以“模型在哪选”这个问题,答案在配置文件里,不在界面上。

OpenBot 跑起来的四个前置

下面这张表列出了接模型之前必须先备好的东西。缺任何一项,后面的配置都无从验证。

前置项 具体要求 说明
Docker 跑 PostgreSQL(含 pgvector)和自带 Bot scripts/start.sh 会拉起 Docker 服务并跑迁移
Bun 1.4 及以上 安装依赖用 bun install
CopilotKit Intelligence 一个项目加 license,有免费计划 本地评估环境是 macOS + Docker Desktop,本地 licence 有效期 30 天,可用 npx copilotkit@latest local renew 续期
模型 key 一把 OpenAI 兼容端点的 key 本文用 API易 令牌,base_url 为 https://api.apiyi.com/v1

Intelligence 这一项最容易被低估。.env.example 的注释写明,缺少 Intelligence 的 URL、gateway URL 或 key 时,服务端会直接拒绝启动,原文是“There is no degraded mode.”。原因是持久线程和记忆都由它持有,没有它,每次对话都会丢失上下文。所以 OpenBot 不能被描述成“完全离线”的方案。

OPENAI_BASE_URL 改的是整个部署

README 的说法是“no model ships in the box”:模型不随包发布,凭据由管理员提供,加密后落库,不进日志。决定模型的是部署级环境变量。其中最关键的是 OPENAI_BASE_URL,官方定义它可以是任何说同一套 API 的端点,包括多供应商网关、代理,或者你自己硬件上跑的模型。.env.example 的注释写得更具体:任何支持 /v1/chat/completions 的端点都可以。

这个变量作用于整个部署,而不是单个 Bot。API server 给内置 agent 用的客户端、自己构造客户端的 agent-bot、BOT_PROVIDER=openai 的 agent-langgraph,三处都读它。官方认为这样做的好处是,同一个部署不会出现一半请求指向新地址、一半还留在旧地址的情况。

openbot-apiyi-env-config-guide-image-1


三处改动接上 API易:OpenBot 环境变量逐项配置

OpenBot 与 API易 的对接点

API易 提供 OpenAI 兼容接口,base_url 填 https://api.apiyi.com/v1,请求走 /v1/chat/completions,正好满足 OpenBot 对 OPENAI_BASE_URL 的要求。还有一点要注意:OpenBot 对模型名做原样传输(verbatim),API易 的 /v1/models 返回的是裸名 claude-opus-5-5,所以不要照着官方网关示例加 openai/ 前缀。官方示例里的 openai/gpt-5.6-terra 只适用于给模型名加了命名空间的端点。

先看一张总表,再按步骤操作。

改哪里 改成什么 为什么
.env 的 OPENAI_API_KEY 你在 API易 控制台创建的 sk-... 令牌 内置 agent 和两个自带 Bot 默认都用这把 key
.env 的 OPENAI_BASE_URL https://api.apiyi.com/v1 把整个部署的模型请求指向 API易 的兼容端点
.env 的 BOT_MODEL claude-opus-5-5 指定正在启动的 Bot 用哪个模型,不填则取 provider spec 文件里的行
examples/<你的包>/model.yaml 的 default_model claude-opus-5-5 示例包当前是 gpt-5.6-terra,不改会出现模型不存在
.env 的 BOT_RESPONSES_API 保持 false Claude 在 API易 的 Responses 端点上会返回 400

第一步:准备一把专用令牌

  1. 在 API易 令牌页 api.apiyi.com/token 新建一把 key,给它设置余额上限和有效期,用途写明“OpenBot 本机评估”。
  2. 本机先用 curl 发一次 GET https://api.apiyi.com/v1/models,请求头为 Authorization: Bearer sk-...。

验收标准:返回 HTTP 200,列表里能找到 claude-opus-5-5。我们在 2026-11-02 实测这一步,拿到 259 个模型,claude-opus-5-5 和 claude-opus-5-5-thinking 都在其中。

单独开一把令牌,是为了把“这台机器专用”和“生产用”分开。模板阶段 Bot 会反复试错,有余额上限兜底,心里更踏实。

第二步:改 .env 三行

按官方快速开始,先执行 cp .env.example .env 和 bun install。接着依次运行 npx --yes copilotkit@latest login、npx --yes copilotkit@latest project select、bun scripts/setup-learning.ts,把 runtime key 和 Learning container 写进 .env。然后改下面三行:

  1. OPENAI_API_KEY=sk-你的API易令牌
  2. OPENAI_BASE_URL=https://api.apiyi.com/v1
  3. BOT_MODEL=claude-opus-5-5

另外检查四项:BOT_PROVIDER 保持默认的 openai;BOT_RESPONSES_API 保持 false;KEY_ENCRYPTION_KEY 用 openssl rand -base64 32 生成;AGENT_BOT_MODEL 只给概念验证用的 agent-bot 使用,默认是 gpt-5.5,和 BOT_MODEL 互不影响。如果你也要启动 agent-bot,请到 /v1/models 里确认这个名字存在,或者把它也改成你要用的型号。

验收标准:grep OPENAI_ .env 输出的 key 和地址正确,地址末尾带 /v1,没有多余的斜杠或空格。如果容器内访问同一端点需要走不同路由,再用 OPENAI_CONTAINER_BASE_URL 覆盖。不过 API易 是公网地址,通常用不到这个变量。

第三步:改租户包 model.yaml 一行

打开 examples/fintech/model.yaml,或者你复制出来的租户包。当前内容是 model.provider: openai、model.credential_secret_ref: openai-api-key、model.default_model: gpt-5.6-terra。

  1. 把 default_model 改为 claude-opus-5-5。
  2. provider 保持 openai。官方规定这里只接受 openai 或 anthropic,走 API易 的 OpenAI 兼容端点就选 openai。
  3. credential_secret_ref 不要改成明文 key,它引用的是已存储的凭据。

验收标准:执行 bash scripts/start.sh 后,健康检查逐个通过,打开 http://localhost:3010 能看到 General Assistant 和 Knowledge 两个默认同事。

这里有一个坑必须提前说明。服务端启动时,本来会去问一次 OpenAI 或 Anthropic“这把 key 能不能调用 default_model”,不能调用就打印 model-unavailable 或 model-credential-rejected。但只要设置了 OPENAI_BASE_URL,这一步检查就会被跳过。所以接 API易 时,模型名写错不会在启动阶段报错,要等第一条消息发出才会暴露。启动成功只说明服务起来了,不代表模型配置正确。

openbot-apiyi-env-config-guide-image-2

关于版本:v0.2.0 与 main 分支的差别

这一点必须写清楚。main 分支 CHANGELOG 的 Unreleased 段里有一条变更:内置 Bot 的 openai/... 模型如果走的是“既不是 OpenAI、也不是 Azure”的 OPENAI_BASE_URL,会改为调用该端点的 /chat/completions,不再走 Responses API。官方给的理由是大多数 OpenAI 兼容端点只提供 Chat Completions。同一改动还新增了 COPILOTKIT_OPENAI_API=responses|chat,用于强制二选一。

这条变更还没有进入 v0.2.0 这个正式 tag。如果你检出的是 v0.2.0,内置 Bot 走第三方 base URL 时可能仍会去调 Responses。结合我们下面的实测,这很可能是 400 报错的来源。处理办法有两种:一是基于 main 分支评估,并清楚它仍在变动;二是等这条变更正式发版后再接入。

🚀 快速开始:在动 OpenBot 之前,建议先用 API易 apiyi.com 的令牌单独调通一次 /v1/chat/completions,带上一个函数定义,确认 finish_reason 返回 tool_calls。接口这一侧确认没问题,后面排错时就只需要看 OpenBot 的配置。


先只放行 3 个工具:OpenBot 起步限权

为什么 OpenBot 不该一开始就全开

官方对工具数量的判断原文是:“A model picks the right tool reliably out of about ten, and unreliably out of thirty.” 也就是说,在十个左右的工具里模型能稳定选对,到了三十个就不可靠了。OpenBot 源码注册了十三个电脑类工具,再加上 MCP 目录里的工具,第一天就很容易超过这条线。

超过十二个工具的 Bot,每次运行只会拿到与当前消息匹配的 skill 所需的工具。但官方特别说明,这只是收窄可见范围,“It is not a boundary, and it never substitutes for one”。真正的边界有三样:按 Bot 在 Admin 里给的授予(grant)、AGENT_COMPUTER_POLICY 动作策略,以及审计行。还要注意,出厂启动默认是 deny: [] 加 allow: ["true"],等于全部放行。

起步阶段的 3 个工具清单

工具名 作用 起步阶段
computer_navigate 浏览器打开网址 ✅ 放行
computer_snapshot 获取页面快照 ✅ 放行
computer_read_file 读取工作区文件 ✅ 放行
computer_click / computer_type / computer_key 点击、输入、按键 ⏸ 验收后按需放开
computer_write_file 写文件 ⏸ 验收后按需放开
computer_run_command 执行 shell 命令 ⛔ 明确拒绝

computer_run_command 必须单独挡住。在 Compose 下开启 COMPUTER_SEPARATE_WORKSPACES 后,每个 Bot 会在自己的文件夹里起 shell,但官方承认“Commands can still read other folders”。要做到真正隔离,需要 computers.mode: sandbox。起步阶段没有必要承担这个风险。

写 AGENT_COMPUTER_POLICY

策略是一段 JSON,规则用 CEL 表达式,可以读取 tool.name、page.host、file.path 等字段。起步可以这样写:

  1. 在 .env 里写一行:AGENT_COMPUTER_POLICY={"mode":"enforce","deny":["tool.name == 'computer_run_command'"],"allow":["tool.name in ['computer_navigate','computer_snapshot','computer_read_file']"]}
  2. 在 Admin 里给 General Assistant 授予这三个工具,不要多给。
  3. 重启服务。如果 JSON 格式错误,服务端会直接启动失败,这反而方便你发现问题。

这里有两条求值规则需要了解。第一,deny 先于 allow,所以即使以后 allow 写得宽了,shell 依然被挡住。第二,引擎是 fail closed 的:策略缺失或为空时什么都不允许;deny 写坏了按拒绝处理;allow 写坏了不算放行。原则就一句话:先关小,再按需放开。验收通过后,再逐个加入点击、输入或写文件,每次加完都去看审计。

openbot-apiyi-env-config-guide-image-3


OpenBot 接 API易 的验收与排错

一次可验收动作:开网页、读文件、看审计

按官方架构,一次工具调用的顺序是:解析目标,按当前策略评估,写一条审计行,然后才真正调用电脑;如果转发出去的动作失败,会再写第二条审计行。电脑本身不做策略判断,边界在 server 的 gateway。所以验收要同时覆盖“能做”和“被记录”两件事:

  1. 在 /workspace 放一个 notes.md,随便写两行内容。
  2. 对 General Assistant 说:打开某个公开网页,告诉我标题,再读 /workspace/notes.md 的内容。
  3. 再对它说:运行 ls /。这条应该被拒绝,并且回复中能说出是哪条规则拦下的。
  4. 打开 Audit 页面,能看到 navigate、snapshot、read_file 的放行记录和 run_command 的拒绝记录。如需导出,可调用 GET /api/admin/audit-events?format=csv,单次最多 5,000 行。

模型这一侧的可用性,我们只在 API易 侧做过实测。2026-11-02,用 claude-opus-5-5 调用 /v1/chat/completions 并带上一个 read_file 函数定义,返回 HTTP 200,耗时 4.06 秒,finish_reason 为 tool_calls,参数是 {"path":"/workspace/notes.md"},用量为 prompt 393 tokens、completion 55 tokens。加上 stream: true 后,同样返回 200,SSE 分块里能看到函数名和参数的增量输出,最后以 data: [DONE] 结束。这说明 API易 的 chat 端点能把 Claude 的工具调用按 OpenAI 格式返回,这正是“模型只决定调哪个函数、不负责执行”的 Agent 所需要的。

排错表:五类常见失败

现象 最可能原因 处理办法
400 field messages is required 请求走到了 Responses 端点。我们实测 claude-opus-5-5 打 API易 的 /v1/responses 会返回这个错误 确认 BOT_RESPONSES_API=false;如果用的是 v0.2.0,内置 Bot 可能仍在调 Responses,可改用 main 分支并设置 COPILOTKIT_OPENAI_API=chat(仍属 Unreleased)
401 key 填错、过期,或令牌余额上限已用完 回到 API易 令牌页检查有效期和余额,用 curl 重新测试 /v1/models
模型不存在 default_model 还是 gpt-5.6-terra,或者名字前加了 openai/ 两处都写裸名 claude-opus-5-5;由于启动检查被跳过,要发消息才能验证
工具没被调用 型号不支持工具调用、grant 没给,或策略把工具挡住了 官方原话是没有工具调用的 Bot 无法驱动电脑;先查审计里有没有拒绝记录
启动被拒 缺少 Intelligence 配置、策略 JSON 写错,或在 provider spec 里新增了供应商却没同步 PROVIDER_IDS 补齐 Intelligence 三项;校验 JSON;接 API易 不需要新增供应商,保持 openai 即可

💡 排错建议:遇到报错时,先把同一个请求直接发给 API易 apiyi.com 的 /v1/chat/completions。如果直连成功、OpenBot 里失败,问题出在 OpenBot 的配置或版本;如果直连也失败,再检查令牌和型号。这样可以先把问题范围缩小一半。

OpenBot 跑 Claude 的成本参考

API易 采用按量计费,没有固定月费。claude-opus-5-5 在 2026-11-02 查到的价格如下,claude-opus-5-5-thinking 价格相同:

计费项 单价(每百万 tokens)
输入 $4
输出 $20
缓存读 $0.2

型号与价格以平台型号列表为准。拿我们那次带工具的实测请求来算,393 个输入 token 加 55 个输出 token,单次费用很小。但 Bot 一旦开始多轮浏览和读文件,上下文会快速增长,建议配合令牌余额上限一起使用。


常见问题

Q1:OpenBot 接 API易 需要改源码吗?

不需要。改 `.env` 里的 `OPENAI_API_KEY`、`OPENAI_BASE_URL`、`BOT_MODEL` 三行,再把租户包 `model.yaml` 的 `default_model` 改掉即可。只有新增一个全新的供应商类型时才需要改 provider spec 和 `PROVIDER_IDS`,而 API易 走的是 OpenAI 兼容接口,不属于这种情况。

Q2:为什么不用 openai/claude-opus-5-5 这种带前缀的写法?

OpenBot 对模型名原样传输,应该使用端点自己发布的写法。API易 apiyi.com 的 `/v1/models` 列出的是裸名 `claude-opus-5-5`,加上前缀反而找不到模型。

Q3:能不能打开 BOT_RESPONSES_API 来用 Responses API?

接 Claude 时不要打开。我们实测 `claude-opus-5-5` 打 API易 的 `/v1/responses` 会返回 400 `field messages is required`,换成 `gpt-5.4-mini` 则返回 200。官方也要求,只有端点真正实现了 Responses API 时才能打开这个开关。

Q4:你们把 OpenBot 整套跑通了吗?

没有。我们只验证了 API易 这一端:模型列表、带工具的 chat 调用、流式输出,以及 Responses 端点的报错。OpenBot 整套(Docker 加 Intelligence 项目)没有在写稿机器上跑过,文中涉及 OpenBot 内部行为的部分都依据官方仓库和文档。

Q5:按量计费的 key 怎么避免被 Bot 用超?

在 API易 apiyi.com 的令牌页给这把 key 设置余额上限和有效期,和生产用的 key 分开管理。再配合本文的 3 工具策略,Bot 能做的事情和能花的钱都有上限。


总结

OpenBot 接 API易 核心要点 Key Takeaways

  • 模型不在界面里:写在 .env 三行和租户包 model.yaml 一行。
  • base_url 作用于全部署:OPENAI_BASE_URL 一改,三类 Bot 一起切换。
  • 启动成功不代表模型正确:接网关后检查被跳过,发第一条消息才能验证。
  • 版本要看清:改调 /chat/completions 仍在 main 分支 Unreleased 中,尚未进入 v0.2.0。
  • 起步只放 3 个工具:deny 先于 allow,shell 单独拒绝,先关小再放开。
  • 用 API易 按量起步:专用令牌加余额上限,claude-opus-5-5 用裸名。

OpenBot 让人找不到模型配置,是因为它根本不在界面里。把这三处改对:.env 三行、model.yaml 一行、Responses 保持关闭,再用一份只放行 3 个工具的策略起步,整条链路就清晰了。验收时只看三件事:网页能打开、文件能读取、拒绝的动作在审计里有记录。

推荐先用 API易 apiyi.com 的专用令牌把 chat 加工具调用单独测通,再接入 OpenBot。这样即使出问题,也能很快判断是哪一侧的原因。


📚 参考资料

  1. CopilotKit/OpenBot 仓库:README、Requirements 与 Quick start
  2. 链接: github.com/CopilotKit/OpenBot
  3. 说明:模板定位、前置条件、v0.2.0 Release 信息

  4. OpenBot 配置文档:模型环境变量、model.yaml、启动校验

  5. 链接: github.com/CopilotKit/OpenBot/blob/main/docs/configuration.md
  6. 说明:OPENAI_BASE_URL、BOT_MODEL、BOT_RESPONSES_API 的原始定义

  7. OpenBot 架构文档:gateway、策略与审计

  8. 链接: github.com/CopilotKit/OpenBot/blob/main/docs/architecture.md
  9. 说明:工具调用顺序、审计导出接口

  10. API易 文档中心:OpenAI 兼容模式、函数调用、型号列表

  11. 链接: docs.apiyi.com
  12. 说明:base_url 写法、tools 格式、claude-opus-5-5 价格

作者: APIYI 技术团队
技术交流: 欢迎在 API易 官网 apiyi.com 联系我们,更多接入资料可访问 docs.apiyi.com 文档中心

延伸阅读

类似文章