OpenHands 实战:TaoToken 跑通一个 FastAPI 仓库的依赖升级与修复
告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 先把目标说清楚让 Agent 自己升级依赖并修好代码OpenHands 是一个开源的软件工程 Agent 框架它能像人一样在终端里执行命令、读写文件、跑测试然后根据报错自己决定下一步做什么。这次我拿它跑一个真实任务把一个 FastAPI 仓库的requirements.txt升到最新版本并且把升级后暴露出来的 breaking change 全部修掉最后让测试通过。这个任务适合谁适合已经用过 OpenHands 或类似 Agent 工具、想把它接到一个稳定模型供应商上跑长链路任务的开发者。整个流程里模型负责推理和决策OpenHands 负责执行TaoToken 负责提供模型调用入口。三者分工明确你只需要把环境变量配对剩下的交给 Agent 循环。我试过用默认配置直接跑结果卡在依赖解析那一步反复重试Token 消耗很快。后来把模型换成 DeepSeek V4.1 Flash 并走 TaoToken 的 API 入口整个任务在 11 轮 Agent 动作内完成总消耗约 4.7 万 Token。下面把完整过程拆开讲。2. 环境准备与 OpenHands 启动2.1 基础环境你需要一台能跑 Docker 的机器OpenHands 默认用容器隔离工作区。Python 3.11 以上Node 18 以上用于前端。我本地是 Ubuntu 22.048 核 16G跑这个任务够用。先拉 OpenHands 的代码git clone https://github.com/All-Hands-AI/OpenHands.git cd OpenHands然后按官方文档装依赖。如果你用 Docker 方式启动直接docker pull docker.all-hands.dev/all-hands-ai/runtime:latest2.2 准备目标仓库我准备了一个精简的 FastAPI 项目结构如下fastapi-demo/ ├── app/ │ ├── main.py │ ├── models.py │ └── routes.py ├── tests/ │ └── test_api.py ├── requirements.txt └── README.mdrequirements.txt里锁的是旧版本fastapi0.95.0 uvicorn0.21.0 pydantic1.10.7 httpx0.23.3 pytest7.2.0任务就是把这些升到当前最新然后修掉pydantic从 v1 到 v2 的 breaking change以及httpx接口变动带来的测试失败。2.3 启动 OpenHands用 Docker 启动最省事docker run -it --rm \ --pullalways \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latest \ -e LOG_ALL_EVENTStrue \ -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:latest启动后浏览器打开http://localhost:3000你会看到 OpenHands 的 Web 界面。先别急着建任务把模型配置填好再动手。3. TaoToken 接入与 OpenHands 配置3.1 拿 Key打开 TaoToken 官网 注册账号进控制台后到 API Keys 页面 建一把新 Key。复制出来后面填到环境变量里。3.2 环境变量片段OpenHands 读取LLM_*系列环境变量来初始化模型。下面这份可以直接用把sk-开头的部分换成你自己的 Key# TaoToken 接入配置 export LLM_API_KEYsk-your-taotoken-key export LLM_BASE_URLhttps://taotoken.net/api export LLM_MODELdeepseek-v4.1-flash # OpenHands 运行参数 export SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latest export LOG_ALL_EVENTStrue export WORKSPACE_BASE$(pwd)/workspace export MAX_ITERATIONS30 export LLM_NUM_RETRIES3 export LLM_TIMEOUT120注意LLM_BASE_URL填的是https://taotoken.net/api不要带末尾斜杠也不要加 UTM 参数。OpenHands 内部会拼/v1/chat/completionsTaoToken 的入口兼容这个路径。如果你用 Docker 启动把这些变量通过-e传进去docker run -it --rm \ --pullalways \ -e LLM_API_KEYsk-your-taotoken-key \ -e LLM_BASE_URLhttps://taotoken.net/api \ -e LLM_MODELdeepseek-v4.1-flash \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latest \ -e LOG_ALL_EVENTStrue \ -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:latest3.3 在界面里确认模型启动后进设置页确认 Model 显示为deepseek-v4.1-flashBase URL 显示为https://taotoken.net/api。如果显示不对检查环境变量有没有传进去。你也可以在 模型对话页 先手动发一条消息确认 Key 和入口都通。提示OpenHands 的模型名要和 TaoToken 支持的名称一致。DeepSeek V4.1 Flash 在 TaoToken 上的标识就是deepseek-v4.1-flash填错会返回 404。4. 跑通任务每一轮 Agent 动作与 Token 消耗4.1 任务描述在 OpenHands 界面里新建任务把下面这段贴进任务框工作目录 /workspace/fastapi-demo。 任务把 requirements.txt 里的依赖升级到当前最新稳定版 然后运行 pytest根据报错修复所有 breaking change 直到全部测试通过。不要降低依赖版本来绕过问题。4.2 Agent 动作记录下面是我实测跑完一轮的完整记录。Token 数来自 OpenHands 的LOG_ALL_EVENTS输出我按轮次整理成表。轮次Agent 动作输入 Token输出 Token累计 Token说明1读取 requirements.txt 和项目结构18203402160初始探索开销小2执行 pip index versions 查最新版23405205020开始查版本3改写 requirements.txt 并 pip install31207808920安装新依赖4运行 pytest收集报错4560112014600第一次测试报错多5分析 pydantic v1→v2 报错5890168022170最烧 Token 的一轮6修改 models.py 的 validator4210134027720改代码7重跑 pytest仍有 httpx 报错398096032660第二轮测试8修改 tests/test_api.py 的调用方式345088036990改测试9重跑 pytest剩一个断言失败321074040940第三轮测试10修正 routes.py 的返回结构287069044500最后一处修改11最终 pytest 全绿输出总结198052047000收尾从表里能看出第 5 轮最烧 Token输入 5890、输出 1680合计 7570。原因是 pydantic v1 到 v2 的迁移涉及validator改成field_validator、Config类改成model_config、orm_mode改成from_attributes等多处改动Agent 需要把整个 models.py 读进来逐行分析上下文一下子涨上去。第 4 轮也不低因为第一次跑 pytest 会输出大量 tracebackAgent 要把这些报错全部读进上下文才能定位问题。4.3 关键代码改动Agent 最终改出来的models.py核心部分from pydantic import BaseModel, field_validator, ConfigDict class Item(BaseModel): model_config ConfigDict(from_attributesTrue) name: str price: float tags: list[str] [] field_validator(price) classmethod def price_must_be_positive(cls, v: float) - float: if v 0: raise ValueError(price must be positive) return vtests/test_api.py里 httpx 的调用从httpx.AsyncClient(appapp)改成了httpx.AsyncClient(transporthttpx.ASGITransport(appapp))这是 httpx 0.27 之后的接口变动。4.4 验证结果最终pytest -v输出tests/test_api.py::test_create_item PASSED tests/test_api.py::test_get_item PASSED tests/test_api.py::test_invalid_price PASSED tests/test_api.py::test_list_items PASSED 4 passed in 1.23s requirements.txt升级后fastapi0.115.6 uvicorn0.34.0 pydantic2.10.4 httpx0.28.1 pytest8.3.44.5 失败分支如果你跑的时候 Agent 卡在某一步反复重试常见原因有三个。一是模型名填错返回 404Agent 会一直重试同一个请求Token 白烧。二是LLM_TIMEOUT设太短长上下文请求超时Agent 拿不到回复就重发。三是任务描述里没限制「不要降低版本绕过」Agent 可能直接把 pydantic 降回 v1 来让测试通过这不符合任务目标。遇到第一种去 接入文档 核对模型名。第二种把LLM_TIMEOUT调到 180 以上。第三种在任务描述里明确写死约束。5. 成本、模型选择与限制5.1 成本估算这次任务总消耗约 4.7 万 Token其中输入约 3.7 万、输出约 1 万。输入占比高是因为 Agent 每一轮都要把之前的对话历史、文件内容、命令输出重新塞进上下文。这是 Agent 类任务的固有特征不是模型的问题。如果你想控制成本两个方向。一是把MAX_ITERATIONS设小一点逼 Agent 更快收敛但可能修不完。二是选一个输入价格更低的模型DeepSeek V4.1 Flash 在 TaoToken 上的定价属于中低档适合这种多轮任务。具体价格以 TaoToken 官网 实时显示为准我这里不写死数字。5.2 模型选择建议这个任务我选 DeepSeek V4.1 Flash原因是它在代码理解和多轮指令跟随上表现稳定而且响应速度够快11 轮跑下来没有一次超时。如果你要跑更复杂的重构任务比如跨多个模块的接口迁移可以考虑换更强的模型但 Token 消耗会相应上升。OpenHands 支持在界面里随时切换模型你不用改代码只要在设置页换LLM_MODEL对应的值就行。切换后新任务用新模型旧任务的历史不受影响。5.3 限制OpenHands 的 Agent 循环依赖模型返回结构化的动作指令。如果模型输出格式不对Agent 会解析失败并重试。DeepSeek V4.1 Flash 在这方面的稳定性不错但我还是建议把LLM_NUM_RETRIES设成 3给偶发格式错误留缓冲。另外Agent 跑任务时会在容器里执行任意命令包括pip install。确保你的沙箱环境是隔离的别在宿主机上直接跑。OpenHands 默认用 Docker 隔离这一点做得比较到位。最后Token 记录表里的数字是我这次实测的结果你的项目结构不同、报错数量不同消耗会有浮动。但「报错分析轮最烧 Token」这个规律基本成立你可以据此判断哪一步该重点优化。如果你还没建 Key从 TaoToken 控制台 进去建完直接填到上面的环境变量片段里就能跑。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度

相关新闻

agent-pm:多智能体协作的项目管理框架实战指南

agent-pm:多智能体协作的项目管理框架实战指南

1. 为什么我们需要一个“项目管理”框架来管AI智能体1.1 从“单兵作战”到“团队协作”的必然转变如果你最近半年一直在折腾AI智能体,大概率经历过这样一个阶段:一开始觉得特别新鲜,写个提示词让模型帮你查天气、写邮件、总结文档&#xff0c…

2026/9/20 18:28:34 阅读更多 →
Claude Code 实战:用 TaoToken 跑通 monorepo 依赖升级与快照测试修复

Claude Code 实战:用 TaoToken 跑通 monorepo 依赖升级与快照测试修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 18:28:34 阅读更多 →
Vue3组件库选型指南:六大主流库对比与真实避坑实战

Vue3组件库选型指南:六大主流库对比与真实避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 18:28:34 阅读更多 →

最新新闻

AssetRipper 提取 Unity 资源教程:从 .assets 到可导入文件的完整流程

AssetRipper 提取 Unity 资源教程:从 .assets 到可导入文件的完整流程

AssetRipper 提取 Unity 资源教程:从 .assets 到可导入文件的完整流程 【免费下载链接】AssetRipper GUI application to analyze game files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 假设你手上有一个 Unity 游戏包,想把…

2026/9/20 20:28:59 阅读更多 →
机器学习前的数学补课要多久?《数学要素》25 章配齐 121 个代码本

机器学习前的数学补课要多久?《数学要素》25 章配齐 121 个代码本

机器学习前的数学补课要多久?《数学要素》25 章配齐 121 个代码本 【免费下载链接】Book3_Elements-of-Mathematics Book_3_《数学要素》 | 鸢尾花书:从加减乘除到机器学习;上架;欢迎继续纠错,纠错多的同学还会有赠书&…

2026/9/20 20:28:59 阅读更多 →
ant-design-vue Tour 引导组件完全指南:从 API 到源码原理的深度实践

ant-design-vue Tour 引导组件完全指南:从 API 到源码原理的深度实践

前端UI组件设计系统 【免费下载链接】ant-design-vue 🌈 An enterprise-class UI components based on Ant Design and Vue. 🐜 项目地址: https://gitcode.com/gh_mirrors/an/ant-design-vue 点击查看 免费下载 Tour(引导&#…

2026/9/20 20:28:59 阅读更多 →
FreeRTOS 测试框架实操手册:3 步跑通第一条队列用例

FreeRTOS 测试框架实操手册:3 步跑通第一条队列用例

FreeRTOS 测试框架实操手册:3 步跑通第一条队列用例 【免费下载链接】FreeRTOS Classic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel. 项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS …

2026/9/20 20:28:59 阅读更多 →
Blackbird:一条命令扫遍 600+ 平台,OSINT 社交平台搜索与用户名反查工具

Blackbird:一条命令扫遍 600+ 平台,OSINT 社交平台搜索与用户名反查工具

Blackbird:一条命令扫遍 600 平台,OSINT 社交平台搜索与用户名反查工具 【免费下载链接】blackbird An OSINT tool to search for accounts by username and email in social networks. 项目地址: https://gitcode.com/GitHub_Trending/bl/blackbird …

2026/9/20 20:28:59 阅读更多 →
Faker 入门与进阶实战指南:用 Python 生成高质量假数据的完整方案

Faker 入门与进阶实战指南:用 Python 生成高质量假数据的完整方案

Faker 入门与进阶实战指南:用 Python 生成高质量假数据的完整方案 【免费下载链接】faker Faker is a Python package that generates fake data for you. 项目地址: https://gitcode.com/gh_mirrors/fak/faker Faker 是 Python 生态中一款生成假数据的工具包…

2026/9/20 20:27:58 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →