把 OpenHands 的模型 Provider 配到 TaoToken,cpolar 远程访问照样通
2026/9/16 2:37:03 网站建设 项目流程

OpenHands 在本地跑起来后,默认只监听 localhost:3000,下班回家或者出差时就打不开那一屏熟悉的编程界面;而它第一次启动时弹出的 Provider 选择窗口,又默认把国外线上模型服务放在最前面,对国内开发者的网络和支付方式都不太友好。前者适合交给 cpolar 做内网穿透,后者可以换成 TaoToken 这个统一 API 兼容通道来兜底。我这次把 OpenHands 的模型 Provider 指到 TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end),在模型广场选一个支持 OpenAI 兼容调用的模型,再配合 cpolar 把 3000 端口映射到公网。配置完成后,我在外地用手机打开 cpolar 生成的地址,进入 OpenHands 发了一条写 bash 脚本的请求,模型正常返回内容,Token 也正常被记录——两件事互不干扰,远程访问一样通。

1. OpenHands 部署好后,先卡在 Provider 选择这一步

1.1 docker 拉取 runtime 镜像,再把 0.39 容器跑起来

OpenHands 的部署本质上是两个 Docker 镜像:一个是运行时沙箱,一个是主应用。先拉取 runtime,再启动 openhands 容器。版本号 0.39 是一个稳定版本,如果你拿到更新的版本,保持 docker pull 与 docker run 两个命令里的版本号一致即可。

docker pull \ docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik docker run -it --rm --pull=always \ -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik \ -e LOG_ALL_EVENTS=true \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/.openhands-state:/.openhands-state \ -p 3000:3000 \ --add-host host.docker.internal:host-gateway \ --name openhands-app \ docker.all-hands.dev/all-hands-ai/openhands:0.39

命令里值得注意的几个点:-p 3000:3000把容器的 3000 端口映射到本机,后面 cpolar 也是指向这个端口;~/.openhands-state保存会话状态,AI 生成的文件和对话历史都在里面,不要随便删除;--add-host让容器内部能通过host.docker.internal访问宿主机资源。执行完稍等几十秒,浏览器访问localhost:3000,OpenHands 界面就出来了。

1.2 首次弹出的窗口:Provider、模型、API Key

第一次进入页面时,OpenHands 会弹出一个配置窗口,要求选择大模型提供商、具体模型并输入 API Key。真正用过一圈的人会发现,推荐列表里排在前面的是国外线上服务,注册需要海外手机号,充值需要外币卡,请求时网络也经常超时。不是工具不好,而是「官方推荐」没有照顾到国内开发者的实际条件。

这个窗口并不要求你立刻选定终身:Provider 可以换,模型也能随时改。问题在于,如果你选择本地部署模型,就要求电脑有足够显存和内存;如果你选择兼容第三方 API 的方式,就需要一个国内可以访问、支持 OpenAI 格式的地址。这个通道恰好满足这三点:它提供 OpenAI 兼容接口,Base URL 固定,注册拿 Key 的流程也只需要在网页里点几下。

2. 在 TaoToken 创建 Key,再回 OpenHands 填对 Provider

2.1 去控制台创建 API Key

打开 TaoToken,完成注册登录后,进入控制台的 API Keys 页面,创建一个新的 Key,名字可以写成openhands-home方便自己辨认。创建后把 Key 复制下来,粘贴到临时记事本里。注意:在 OpenHands 的浏览器界面里配置时,Key 直接填进去,不需要写进 docker 命令,也不会出现在 cpolar 的隧道配置里。

为什么先强调这一点?因为整条链路里存在两个不同的东西:OpenHands 向模型发请求时用的是 TaoToken 的 Key;cpolar 只是把你的 localhost:3000 反向代理出去,它转发的是浏览器页面流量,和模型调用没有任何关系。很多人在这一步搞混,以为 cpolar 隧道里也要填 API Key,其实不用。

2.2 OpenHands 里选兼容 Provider,开始填写配置

回到 OpenHands 的 Provider 选择窗口。这里不要选推荐列表里默认勾选的那一项,而是找支持自定义 Base URL 的 OpenAI 兼容类型。不同版本叫法略有差异,可能是CustomOpenAI-compatible或者LiteLLM,本质是一样的:把模型请求指向你指定的地址。参数填写如下:

配置项填写内容
Provider 类型OpenAI 兼容 / Custom LLM
Base URLhttps://taotoken.net/api
API KeyYOUR_API_KEY
模型 ID以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当前列表为准

提示:Base URL 末尾不要加/v1,OpenAI 旧版格式会习惯性补上/v1/chat/completions,但 TaoToken 的地址就是 https://taotoken.net/api,填错后会出现连接 404 或接口路径不对。API Key 从步骤 2.1 创建,模型 ID 不要靠猜,去模型广场复制当时可用的模型标识。

填完点击 Save,配置窗口关闭,回到 OpenHands 主页。此时 Provider 配置已经生效,接下来就可以直接验证了。

3. 用 hello.sh 验证 TaoToken 通道,OpenHands 生成流程不变

3.1 发第一条生成 bash 脚本的请求

在 OpenHands 主页开启一个新对话,输入:编写一个 bash 脚本 hello.sh,执行后输出 hello world

发送后,界面会提示正在启动沙箱环境,稍微等待一下。左侧是对话窗口,右侧依次是 changes、vscode、terminal、browser 几个面板。此时 OpenHands 会开始生成 hello.sh,并把文件写入到 vscode 对应的项目目录中。和直接用命令行请求不同,这个过程是可视化、分步骤的:模型先生成脚本,然后尝试在沙箱里运行它,再返回运行结果。

3.2 报错不用管,AI 会自己修,最后 chmod 加权限

第一次输出时很可能看到红色的报错信息。这是 OpenHands 的正常工作方式:它写出代码、尝试执行、发现环境或语法问题、再自我修正。只要 Provider 配置正确,模型调用没断,这个过程就会持续推进。稍等片刻,vscode 面板里出现hello.sh,OpenHands 会提示你在终端执行两条命令:

chmod +x hello.sh ./hello.sh

在 OpenHands 自带的 terminal 面板里跑一下,hello world就打印出来了。这证明两件事:OpenHands 能正常调用模型,说明第 2 章配的 Base URL、Key、模型 ID 全部生效;生成的代码能在沙箱里运行,说明 docker runtime 没问题。

继续让 OpenHands 修改脚本,让它接受一个名字作为第一个参数,默认值仍然是world。修改完成后,执行./hello.sh gezi,输出变为hello gezi。到这一步,TaoToken 配 OpenHands 的完整链路已经验证通过。

提示:如果你在终端运行脚本时提示权限不足,不要回到模型的配置里去调参数,先执行chmod +x hello.sh再试。权限问题是 Linux 文件系统级别的,和模型调用无关。

4. cpolar 隧道:把 localhost:3000 暴露成公网地址

4.1 安装 cpolar,登录 localhost:9200 管理台

这一章和模型配置没有关系,但缺少它,OpenHands 就只能停留在本机。去 cpolar 官网免费注册一个账号,下载 Windows 版本(macOS/Linux 也有一键安装包),一路默认安装完成。安装好后,浏览器打开localhost:9200,用刚才注册的 cpolar 账号登录,进入 web 管理界面。Windows 版安装时如果遇到 9200 端口起不来的情况,检查一下系统防火墙是否拦截了 cpolar 的本地服务。

cpolar 的用法可以这样理解:它把本机的 3000 端口映射到一个公网地址,访问公网地址,就等于访问你电脑上的 localhost:3000。它负责的只是「页面通道」,不碰 OpenHands 内部的模型调用。

4.2 创建 openhands 隧道,先用一个随机域名

在 cpolar web UI 左侧找到「隧道管理」——「创建隧道」,填写:

配置项填写内容
隧道名称openhands
协议http
本地地址3000
域名类型随机域名
地区China Top

点击创建后,到「在线隧道列表」里能看到系统分配的公网地址。任意选择一个,在手机或其他电脑的浏览器打开,就能看到 OpenHands 的登录页面。此时你已经实现了「异地访问本地 OpenHands」,但默认的随机地址会在 24 小时内变化,适合临时演示。

5. 固定二级子域名,换掉 24 小时失效的随机地址

5.1 在 cpolar 预留一个二级子域名

要让地址长期稳定,需要改成固定二级子域名。在 cpolar 左侧菜单找到「预留」,选择「保留二级子域名」,地区保持 China Top,子域名名称填写openhands,备注随意,点击保留。保留成功后,页面会给出一个类似openhands.xxxxx.cpolar.top的地址,复制备用。

这里说明一下为什么必须走「预留」而不是直接在隧道里填子域名:随机域名是临时分配的公网路径,cpolar 服务端会在 24 小时后更换对应的公网映射,所以你在异地保存的书签会失效;二级子域名相当于在服务端把你的隧道 ID 绑定到固定域名上,cpolar 再为这个域名续期和解析,你只需要关注本地隧道是否在线。

另外,固定二级子域名需要 cpolar 套餐升级到基础版或以上。具体每个套餐包含的资源、带宽不同,以 cpolar 官网当时的列表为准。如果只是短期测试,随机域名已经够用;如果打算长期把 OpenHands 当远程开发入口,固定地址更省心。

5.2 把保留的二级子域名更新到 openhands 隧道

回到「隧道管理」——「隧道列表」,找到openhands这条隧道,点击右侧的「编辑」。把「域名类型」从随机域名改成「二级子域名」,Sub Domain 一栏填入上一步保留的子域名名称,地区保持 China Top,点击更新。更新完成后回到「在线隧道列表」,原来的随机地址已经替换成固定的二级子域名地址。此时再打开一次该地址,如果能看到 OpenHands 页面,就说明域名解析和隧道转发都已经生效。

6. 异地打开公网地址,再核对一次 TaoToken 用量

6.1 在另一台设备验证:发请求,返回成功

配置完成后,不要急着关电脑。拿起手机,切换到 4G/5G 网络(不要连同一个 Wi-Fi),在浏览器输入 cpolar 固定地址。页面加载后进入 OpenHands,发一条新请求,例如让它写一个统计日志文件行数的 bash 命令。

如果模型正常返回脚本,说明三个条件同时满足:OpenHands 容器还在运行,cpolar 隧道没有断,模型通道配置有效。这三者互不依赖,但也缺一不可:cpolar 断了页面打不开,模型通道断了页面能开但模型不回复。

6.2 排障对照:Provider 连不上时的三个检查点

如果异地访问时页面能打开、但 OpenHands 回复报错,优先排查下面三项。

第一,Base URL 是否写成了官网地址或者多加了/v1。工具里只能填 https://taotoken.net/api,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 是注册、创建 Key、看模型广场和用量用的,不要把两者混在一起。

第二,API Key 是否粘贴完整。复制时容易带回车或多余空格,建议回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的 API Keys 页面重新复制一次,再粘回 OpenHands 的 Provider 表单。

第三,模型 ID 是否对得上。模型广场展示的是当前可用的模型标识,不同时期可能有增减,以页面上看到的为准,不要凭记忆填一个不存在的编号。

这三项排查完,绝大多数 Provider 报错都能解决。真正的网络链路问题,会表现在 cpolar 公网地址无法打开,而不是模型回复失败——这两个方向要分清楚,才能快速定位。

验证完成后,你可以在 模型对话 里用同一把 Key 再发一条消息,对比一下 OpenHands 里的返回是否正常;如果你接下来打算把 OpenHands 作为日常编程入口,可以考虑先开一个 Coding Plan 覆盖长期用量,Key 不够用或需要细分权限时,随时到 控制台 API Keys 新建。每一次模型调用都会在控制台的用量记录里留下对应 Token 消耗,打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 即可核对。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询