拆解 OpenHands 核心理念,LLM 通道的 Key 从 TaoToken 拿行不行?
1. 拆 OpenHands 之前先把 LLM 通道接稳OpenHands 是一个开源的 AI 软件开发代理框架前身叫 OpenDevin目前在 GitHub 上星标已经超过 6.5 万。它能做什么简单说你用自然语言给它下任务它自己规划步骤、调用工具、写代码、跑命令、看结果再决定下一步。适合谁想学 AI Agent 框架底层逻辑的开发者、需要快速验证 Agent 原型的团队以及想把 Agent 能力接进自己工作流的技术决策者。但很多人拆 OpenHands 源码时卡在第一步LLM 通道没接通。你打开llm/目录看到 LiteLLM 集成层想跑一个最小 ReAct 循环验证 AgentController 怎么驱动 Action 和 Observation结果发现每个模型都要单独找 Key、单独配 Base URL。拆架构的节奏被打断注意力全耗在“这个模型用哪个 Key、那个模型填什么地址”上。这篇就解决这个问题把 OpenHands 的 LLM 通道统一接到 TaoToken拿到一个 Key 和一个 Base URL让 LiteLLM 集成先走通再回去对照核心理念看 LLM 调用链。TaoToken 在这里只做一件事——提供模型通道的 Key 和 Base URL不替代 OpenHands 本身也不改变它的架构逻辑。2. TaoToken 在 OpenHands 里的角色只做模型通道先把定位说清楚。OpenHands 的核心理念里LLM 只是“认知中枢”真正干活的是 AgentController 驱动的 ReAct 循环、EventStream 的事件分发、Runtime 的沙箱执行。TaoToken 不碰这些它只负责 LLM 这一层的接入给你一个 Key一个 Base URL让 LiteLLM 能统一对接底层完成模型。为什么用 TaoToken 而不是每个模型单独找 Key因为 OpenHands 的llm/模块靠 LiteLLM 做抽象LiteLLM 本身支持多种模型提供方但配置入口是统一的。你把 Base URL 指向 TaoTokenKey 用 TaoToken 创建的LiteLLM 就能通过这一个通道调用模型。这样你在拆AgentController怎么一步步推动 Agent 前进时不用中途停下来换 Key。操作入口在这里打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册账号然后在控制台创建 Key。注意创建 Key 的页面是 console 下的 api-keys不是首页。拿到 Key 后Base URL 填https://taotoken.net/api不要加/v1也不要把官网带 UTM 的地址填进去。这一点后面排错会专门讲。3. 可复制配置把 OpenHands 的 LLM 通道指向 TaoTokenOpenHands 的配置方式取决于你用的是 CLI 还是 Docker 还是源码启动。这里给一个通用的环境变量配置适用于大多数启动方式。你可以在项目根目录建一个.env文件或者直接 export。# OpenHands LLM 通道配置 export LLM_API_KEY你在 TaoToken 创建的 Key export LLM_BASE_URLhttps://taotoken.net/api export LLM_MODELclaude-sonnet-4-20250514如果你用的是 OpenHands 的config.toml对应字段是这样[llm] api_key 你在 TaoToken 创建的 Key base_url https://taotoken.net/api model claude-sonnet-4-20250514如果你在源码里直接改llm/模块的初始化参数找到 LiteLLM 的调用入口把base_url和api_key传进去。OpenHands 的 LLM 类封装了 LiteLLM所以本质上你是在给 LiteLLM 传参。LiteLLM 的completion函数接受base_url参数OpenHands 会把它透传下去。这里有个细节Base URL 末尾不要带/v1。LiteLLM 在某些版本里会自动拼接路径如果你填了https://taotoken.net/api/v1实际请求可能变成https://taotoken.net/api/v1/v1/chat/completions直接 404。填https://taotoken.net/api就行。模型名怎么写TaoToken 的模型对话页面有模型列表你可以在那里确认可用的模型标识。OpenHands 的LLM_MODEL填模型标识LiteLLM 会把它作为model参数传下去。如果你不确定先用一个通用模型跑通链路再换。4. 验证请求让 LiteLLM 先走通一次配置写好后别急着启动整个 OpenHands。先单独验证 LiteLLM 能不能通过 TaoToken 拿到响应。写一个最小 Python 脚本from litellm import completion import os os.environ[LLM_API_KEY] 你在 TaoToken 创建的 Key os.environ[LLM_BASE_URL] https://taotoken.net/api response completion( modelclaude-sonnet-4-20250514, messages[{role: user, content: 回复 OK 两个字母}], base_urlos.environ[LLM_BASE_URL], api_keyos.environ[LLM_API_KEY], ) print(response.choices[0].message.content)跑通的话你会看到输出OK。这一步成功说明 Key 和 Base URL 没问题LiteLLM 到 TaoToken 的通道是通的。接下来验证 OpenHands 的 LLM 类。在 OpenHands 源码目录下找到llm/模块用它的 LLM 类发一个请求from openhands.llm.llm import LLM llm LLM( modelclaude-sonnet-4-20250514, base_urlhttps://taotoken.net/api, api_key你在 TaoToken 创建的 Key, ) result llm.completion(messages[{role: user, content: 回复 OK}]) print(result)如果这一步也通了说明 OpenHands 的 LLM 集成层已经接上 TaoToken。你可以回去继续拆AgentController怎么驱动 ReAct 循环每一步调用模型时都会走这个通道。实测下来最容易出问题的是 Base URL 的写法。我试过填官网地址结果 LiteLLM 把 UTM 参数当成路径的一部分请求直接失败。记住Base URL 只填https://taotoken.net/api不要带任何查询参数。5. 本篇常见错排查5.1 报错 404Base URL 带了 /v1 或 UTM这是最高频的错。LiteLLM 在拼接请求路径时如果base_url末尾有/v1它会再拼一次/v1变成/v1/v1/chat/completions。TaoToken 的 API 入口是https://taotoken.net/api不要加/v1。另外不要把官网的 UTM 地址填进base_urlUTM 参数是给页面统计用的不是 API 路径。5.2 报错 401Key 没传对或没生效检查三件事Key 是不是在 TaoToken 控制台的 api-keys 页面创建的环境变量名是不是 OpenHands 期望的有些版本用LLM_API_KEY有些用OPENHANDS_LLM_API_KEY有没有在代码里硬编码了旧 Key。如果你在.env里改了 Key记得重启 OpenHands 进程环境变量不会热加载。5.3 模型名不识别LiteLLM 找不到模型LiteLLM 需要知道模型标识对应哪个提供方。如果你填的模型名 TaoToken 不支持会报模型不存在。先去 TaoToken 的模型对话页面确认可用模型列表把模型标识复制过来。如果你用的是自定义模型名可能需要在 LiteLLM 里注册提供方但用 TaoToken 的通道通常不需要直接填模型标识即可。5.4 请求超时网络或模型响应慢OpenHands 的 AgentController 在 ReAct 循环里每一步都调模型如果模型响应慢整个循环会卡住。先单独用 curl 测一下 TaoToken 的响应时间curl -X POST https://taotoken.net/api/chat/completions \ -H Authorization: Bearer 你的Key \ -H Content-Type: application/json \ -d {model:claude-sonnet-4-20250514,messages:[{role:user,content:hi}]}如果 curl 很快但 OpenHands 慢可能是 OpenHands 的 LLM 类有重试逻辑或超时设置。检查llm/模块里的 timeout 参数适当调大。5.5 EventStream 里看不到 LLM 调用事件OpenHands 的事件驱动架构里LLM 调用会作为事件发布到 EventStream。如果你在拆events/目录时发现看不到 LLM 调用事件先确认 LLM 通道是否真的通了。通道不通AgentController 不会产生 ActionEventStream 里自然没有对应事件。先用第 4 节的脚本验证通道再回去看事件流。6. 接稳通道后继续拆核心理念LLM 通道接通后你可以回到 OpenHands 的核心理念拆解AgentController 怎么初始化 Agent、怎么管理 State、怎么驱动 ReAct 循环Action 和 Observation 怎么通过 EventStream 协同Runtime 怎么在沙箱里执行命令并返回结果。这些才是 OpenHands 作为 AI Agent 框架的真正门槛——把不确定的模型输出封装成确定性的系统。TaoToken 在这里的角色很明确它只提供模型通道的 Key 和 Base URL让你在拆架构时不用为每个模型单独找接入方式。你先到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 Key把 Base URL 填https://taotoken.net/api让 LiteLLM 集成走通再回来对照核心理念看 LLM 调用链。通道稳了拆架构的注意力才能回到 AgentController、EventStream、Runtime 这些真正决定 Agent 能不能落地的模块上。如果你在配 OpenHands 的 LLM 通道时遇到其他报错可以先看接入文档或者在模型对话页面确认模型可用性。长期跑编码任务的话Coding Plan 的通道配置和单次调用一致Key 和 Base URL 不变换模型标识就行。