10 分钟用 TaoToken 跑通 OpenHands 的 CodeAct Agent
告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. OpenHands 的 CodeAct Agent 到底在做什么OpenHands 是开源社区里比较活跃的编码 Agent 运行时它把「模型输出」和「真实执行环境」绑在一起模型不是只吐代码片段而是通过一套动作空间去读写文件、跑命令、看报错、再改。CodeAct 是它自带的 Agent 策略之一核心思路是让模型用可执行的代码块表达动作而不是用 JSON 描述动作。这个差别在补测试这种任务上很明显——模型可以直接写pytest命令、直接cat文件、直接看 traceback然后决定下一步。我这次要跑的场景很具体拿一个小型 Python 仓库让 CodeAct Agent 给它补测试并执行。仓库不大两三个模块函数逻辑清晰但没有测试文件。任务目标是让 Agent 自己读源码、生成test_*.py、运行pytest、根据失败结果迭代直到测试通过。整个过程要在 OpenHands 的沙箱里完成模型侧走统一 API 通道。这里 TaoToken 出现的位置是「默认供应商」这一步。OpenHands 启动时需要指定 LLM 端点我把https://taotoken.net/api填进去模型选 GLM 5.3 FlashKey 从 TaoToken 控制台创建。这样 OpenHands 的 CodeAct Agent 就有了一个稳定的模型出口不用在多个供应商配置之间来回切。需要先说清楚一件事OpenHands 是执行方TaoToken 是模型通道GLM 5.3 Flash 是被调用的模型。三者角色不要混。下面所有配置和日志都是围绕「怎么让 CodeAct Agent 在这个通道上跑起来」展开的。2. 把 OpenHands 的默认供应商改成 TaoTokenOpenHands 的安装方式有两种Docker 镜像和 CLI。我两种都试了Docker 更适合快速验证CLI 更适合改配置。先说 Docker 这条路径。官方镜像启动命令大致是这样关键是把 LLM 相关的环境变量传进去docker run -it --rm \ --pullalways \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:0.20-nikolaik \ -e LOG_ALL_EVENTStrue \ -e LLM_API_KEYYOUR_API_KEY \ -e LLM_BASE_URLhttps://taotoken.net/api \ -e LLM_MODELglm-5.3-flash \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 3000:3000 \ --add-host host.docker.internal:host-gateway \ --name openhands-app \ docker.all-hands.dev/all-hands-ai/openhands:0.20几个点要盯住。LLM_BASE_URL写https://taotoken.net/api末尾不要加/v1OpenHands 内部会自己拼路径。LLM_MODEL这里我写的是glm-5.3-flash但模型 ID 一定要以模型广场为准不同时间广场上的命名可能有调整填之前先去 TaoToken 的模型列表确认一遍。LLM_API_KEY就是YOUR_API_KEY从控制台创建。如果你用 CLI 方式安装后配置写在~/.openhands/config.toml或者通过环境变量注入。CLI 的好处是改完不用重启容器直接重跑会话就行。我后来固定用 CLI因为要反复调 prompt 和模型参数。配置里 LLM 段落长这样[llm] model glm-5.3-flash base_url https://taotoken.net/api api_key YOUR_API_KEY注意这里没有ANTHROPIC_*前缀OpenHands 用的是自己的 LLM 抽象层不要把它和 Claude Code 的配置混在一起。Claude Code 那套是ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN/ANTHROPIC_MODELCodex 是~/.codex/config.toml三者的配置字段互不通用。我见过有人把 Claude Code 的 env 直接贴到 OpenHands 里结果 401排查半天发现是字段名不对。启动之后OpenHands 会在 3000 端口起一个 Web UI也可以纯 CLI 交互。我这次用 CLI因为要看完整的 CodeAct 动作流。3. CodeAct 会话日志补测试并执行的全过程任务仓库我选了一个自己写的小工具库两个文件calc.py里有add、sub、mul、div四个函数utils.py里有一个normalize函数。没有测试。目标就是让 Agent 补上test_calc.py和test_utils.py然后跑pytest。启动会话后CodeAct Agent 的第一轮动作是浏览仓库结构。日志片段大致如下我做了截断保留关键动作[Agent] Action: execute_bash Command: ls -la find . -name *.py | head -20 Observation: total 16 drwxr-xr-x 3 root root 4096 . -rw-r--r-- 1 root root 312 calc.py -rw-r--r-- 1 root root 198 utils.py [Agent] Action: execute_bash Command: cat calc.py Observation: def add(a, b): return a b def sub(a, b): return a - b def mul(a, b): return a * b def div(a, b): if b 0: raise ValueError(division by zero) return a / b第一轮它没有急着写测试而是先把源码读完。这是 CodeAct 比较稳的地方——它用 bash 动作获取真实文件内容而不是靠模型记忆猜函数签名。第二轮开始生成测试文件[Agent] Action: create_file Path: test_calc.py Content: import pytest from calc import add, sub, mul, div def test_add(): assert add(1, 2) 3 assert add(-1, 1) 0 def test_sub(): assert sub(5, 3) 2 def test_mul(): assert mul(2, 3) 6 def test_div(): assert div(6, 2) 3 def test_div_by_zero(): with pytest.raises(ValueError): div(1, 0)然后它继续生成test_utils.py接着执行[Agent] Action: execute_bash Command: python -m pytest -v Observation: test session starts collected 6 items test_calc.py::test_add PASSED test_calc.py::test_sub PASSED test_calc.py::test_mul PASSED test_calc.py::test_div PASSED test_calc.py::test_div_by_zero PASSED test_utils.py::test_normalize PASSED 6 passed in 0.42s 6 个测试全过。Agent 在观察到6 passed之后输出了一条总结动作然后会话结束。整个流程从启动到结束我这边计时大约 7 分钟其中模型调用占了大部分时间沙箱执行本身很快。这里有个细节值得说CodeAct 的「动作」是模型生成的代码块OpenHands 解析后丢进沙箱执行再把 observation 回传给模型。所以模型的质量直接决定动作是否有效。GLM 5.3 Flash 在这个任务上没有出现「生成无效 bash」或者「路径写错」的情况第一轮就定位到了两个源文件第二轮测试文件一次成型。4. 用量统计与这次运行的 Token 账跑完之后我在 TaoToken 控制台看了这次会话的用量。OpenHands 的 CodeAct 每一轮都会把历史 observation 拼进上下文所以 Token 消耗是累积的。这次任务一共 4 轮模型调用轮次动作类型输入 Token输出 Token累计1浏览仓库约 1.2k约 1801.38k2读源码约 1.8k约 2203.4k3生成测试约 2.6k约 6406.64k4执行并总结约 3.4k约 31010.35k总计大约 10.35k Token其中输入占大头因为每轮都要把之前的 bash 输出和文件内容重新送进去。这是 CodeAct 这类 Agent 的典型特征上下文随动作累积Token 消耗不是线性的而是每轮都在涨。这个数字是我这次运行的实测只代表这一个仓库、这一个任务、这一次会话。不同仓库大小、不同测试覆盖要求Token 量会差很多。如果你要拿它做容量规划建议按「输入 Token ≈ 轮次 × 平均 observation 长度」去估而不是按固定值乘。控制台的用量页面能看到每次调用的时间戳和模型 ID对账比较方便。我习惯跑完一个 Agent 任务就去 TaoToken 看一眼这次调用有没有入账确认模型 ID 和实际使用一致。5. 跑通过程里踩到的三个配置坑第一个坑是 Base URL 末尾的/v1。OpenHands 的 LLM 客户端在拼请求路径时如果 base_url 已经带了/v1会变成/v1/v1/chat/completions直接 404。我一开始就是复制了别处的配置多带了一段报错信息只显示 404不显示具体路径排查了一会儿才定位到。正确写法就是https://taotoken.net/api干净结尾。第二个坑是模型 ID。OpenHands 的LLM_MODEL字段对命名比较敏感写错一个字符就会在启动时报「model not found」。我建议先去模型广场复制准确的 ID再填进配置。不要凭记忆写也不要用别家平台的模型名去套。模型 ID 以模型广场为准这句话在配置阶段特别重要。第三个坑是 Docker 网络。如果你用 Docker 跑 OpenHands容器内部访问外部 API 需要网络通。我这边没有遇到额外问题但如果你在受限网络环境里要确认容器能出网。另外--add-host host.docker.internal:host-gateway这行是为了让容器能访问宿主机服务如果你不需要本地回连可以去掉。这三个坑都不涉及模型能力纯粹是配置层面的。配好之后CodeAct Agent 的行为是稳定的。6. 用同一把 Key 复现这次 CodeAct 任务如果你想复现这次任务步骤不复杂。先去 TaoToken 控制台创建一把 Key然后在 OpenHands 的配置里把base_url指向https://taotoken.net/api模型选 GLM 5.3 Flash模型 ID 以广场为准。仓库你可以用我上面描述的那个结构也可以换成自己的小项目。复现的时候建议把LOG_ALL_EVENTStrue打开这样能看到完整的动作流和 observation。跑完之后对比两件事一是测试是否全部通过二是控制台的用量是否和会话轮次对得上。如果测试没通过先看 Agent 的最后一轮 observation 是什么通常是某个 import 路径或者断言写错了让 Agent 再迭代一轮就行。这次运行不含任何公榜排行分数所有数字都是本地一次会话的实测。CodeAct 的价值在于它把「模型输出」和「真实执行」接在一起而 TaoToken 在这个链路里提供的是稳定的模型出口。两者配合起来补测试这种任务可以在十分钟内跑完一轮。跑完这次会话后可以打开 模型对话 确认 GLM 5.3 Flash 的模型 ID 与广场一致如果打算长期跑 Agent 任务可以看 Coding PlanKey 在 控制台 创建Claude Code 接入的三件套配置对照 接入文档。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度
上一篇/下一篇内容由系统自动关联
返回资讯列表 →