
1. 从 Manus 提示词泄露说起browser_use 调用链到底长什么样Manus 系统提示词被曝这件事圈子里讨论最多的其实不是“越狱”本身而是它暴露出来的工具调用结构。简单说Manus 能做什么它把浏览器操作、文件读写、代码执行这些能力封装成一个个工具由模型来决定什么时候调用哪个工具。适合谁参考适合想自己搭一个类似 Agent 调用链的开发者尤其是对 browser_use 这个开源项目感兴趣、但不知道怎么把多模型接进来的人。泄露出来的信息里有几个点值得注意。第一Manus 不是单一模型在干活它用了 Claude 和不同版本的 Qwen 微调模型早期因为 Claude 3.5 Sonnet v1 不支持长思维链所以需要辅助模型来补推理能力。第二它确实用了 browser_use 这个开源项目Browser Use 官方甚至调侃说“Manus 只是另一个 Browser Use 包装器”。第三工具数量大概 29 个动作空间设计和常见学术方法差别不大。那问题来了如果你想在本地复现一条类似的 browser_use 调用链让 Claude 和 Qwen 都能走同一个入口怎么把多模型接入收敛到单一通道我试过用 TaoToken 统一 Key 来做这件事下面把配置骨架和验证过程完整拆一遍。2. TaoToken 前置统一 Key 在多模型路由里解决什么问题在复现 browser_use 调用链之前先想清楚一个事你的 Agent 在运行过程中可能会根据任务类型切换模型。比如规划阶段用 Claude 做长上下文推理执行浏览器操作时用 Qwen 做快速响应。如果每个模型都单独配一套 Key、一套 base_url、一套鉴权逻辑代码里会到处是 if-else维护成本很高。TaoToken 在这里的角色是一个统一入口。你拿到一个 Key就可以通过同一个 API 地址去请求不同的模型。对于 browser_use 这种需要频繁切换模型的场景好处很明显settings.json 和 config.toml 里只需要维护一份鉴权信息模型名称作为参数传入就行。具体操作上你需要先到 TaoToken 控制台创建一个 API Key。地址是 https://taotoken.net/api-keys 登录后点创建把 Key 复制出来。注意这个 Key 只在创建时显示一次丢了就得重新生成。拿到 Key 之后你的配置文件里就不用再写多个 provider 的密钥了。下面给出一份 settings.json 和 config.toml 的骨架你可以直接套用到自己的 browser_use 项目里。3. 可复制配置settings.json 与 config.toml 骨架先看 settings.json。这份配置的核心是把 TaoToken 作为统一的 provider模型名称通过环境变量或参数传入。假设你的项目根目录下有一个 config 文件夹settings.json 放在里面。{ llm: { provider: taotoken, base_url: https://taotoken.net/api, api_key: ${TAOTOKEN_API_KEY}, models: { planner: claude-3-7-sonnet, executor: qwen-max, browser: claude-3-5-sonnet }, timeout: 120, max_retries: 3 }, browser_use: { headless: false, max_steps: 50, tool_timeout: 30, screenshot_on_error: true }, agent: { system_prompt_path: ./prompts/manus_like.txt, tool_manifest: ./tools/manifest.json, enable_multi_agent: false } }这里有几个参数需要解释。base_url填 https://taotoken.net/api 不要加 UTM 参数。api_key用环境变量注入避免硬编码。models下面按角色分planner 用 Claude 做规划executor 用 Qwen 做执行browser 用 Claude 做浏览器操作。这样在代码里调用时只需要传角色名不用关心底层是哪个模型。再看 config.toml。如果你用的是 Rust 或 Python 的 tomllib 来读配置可以用这份骨架。[llm] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY default_model claude-3-5-sonnet [llm.routing] planner claude-3-7-sonnet executor qwen-max browser claude-3-5-sonnet fallback qwen-plus [browser_use] headless false max_steps 50 tool_timeout 30 screenshot_on_error true [agent] system_prompt_path ./prompts/manus_like.txt tool_manifest ./tools/manifest.json enable_multi_agent false两份配置的语义是一致的你可以根据项目语言选一份。重点在于routing或models这一段它把模型名称和角色绑定后续切换模型只需要改这里不用动业务代码。配置写完之后把 API Key 注入环境变量export TAOTOKEN_API_KEY你的Key如果你用的是 Windows PowerShell$env:TAOTOKEN_API_KEY你的Key4. 验证请求一次 browser_use 工具调用的完整检查配置就绪后先别急着跑完整 Agent用一个小请求验证通道是否打通。下面这段 Python 代码模拟一次 browser_use 工具调用的决策过程让模型判断当前页面是否需要点击某个按钮并返回工具调用参数。import os import json import requests API_KEY os.environ[TAOTOKEN_API_KEY] BASE_URL https://taotoken.net/api def call_model(model: str, messages: list, tools: list None): headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } payload { model: model, messages: messages, temperature: 0.2 } if tools: payload[tools] tools payload[tool_choice] auto resp requests.post(f{BASE_URL}/v1/chat/completions, headersheaders, jsonpayload, timeout60) resp.raise_for_status() return resp.json() browser_tool [{ type: function, function: { name: browser_click, description: 点击页面上的指定元素, parameters: { type: object, properties: { selector: {type: string, description: CSS 选择器}, reason: {type: string, description: 点击原因} }, required: [selector, reason] } } }] messages [ {role: system, content: 你是一个浏览器操作助手根据用户指令决定是否调用工具。}, {role: user, content: 当前页面有一个登录按钮选择器是 #login-btn请点击它。} ] result call_model(claude-3-5-sonnet, messages, browser_tool) print(json.dumps(result, ensure_asciiFalse, indent2))运行之后你应该看到返回的 JSON 里包含tool_calls字段里面是browser_click和对应的selector、reason参数。如果返回的是普通文本而不是工具调用检查一下tools字段是否传对以及模型是否支持 function calling。再换一个模型验证路由是否生效。把call_model的第一个参数改成qwen-max重新跑一次。如果两次都能正常返回工具调用说明统一 Key 通道已经打通Claude 和 Qwen 都走同一个入口。成功的结果长这样{ choices: [ { message: { role: assistant, tool_calls: [ { id: call_abc123, type: function, function: { name: browser_click, arguments: {\selector\: \#login-btn\, \reason\: \用户要求点击登录按钮\} } } ] } } ] }拿到这个返回后你的 browser_use 执行层就可以解析arguments调用实际的浏览器点击操作。整条链路是用户指令 - 模型决策 - 工具调用参数 - browser_use 执行 - 结果回传。TaoToken 在这里承担的是模型决策这一步的统一接入。5. 本篇常见错排查配置和验证过程中有几个坑比较常见。第一个是 401 错误。大概率是 API Key 没注入成功或者环境变量名写错了。检查echo $TAOTOKEN_API_KEY是否有输出以及配置文件里的api_key_env是否和实际环境变量名一致。第二个是 404 错误。检查base_url是否写成了https://taotoken.net/api不要多加/v1或者少写/api。路径拼接是base_url /v1/chat/completions。第三个是模型名称不识别。TaoToken 的模型名称和官方名称可能有差异比如 Claude 系列要用claude-3-5-sonnet而不是claude-3.5-sonnet。遇到 400 错误时先到模型对话页面确认一下可用模型列表。第四个是工具调用返回空。有些模型对tool_choice参数敏感如果设成auto但模型没有触发工具调用可以改成required强制触发或者检查 system prompt 是否明确要求使用工具。第五个是超时。browser_use 场景下模型可能需要较长时间推理把timeout调到 120 秒以上同时检查网络环境是否稳定。如果排查过程中遇到接入层面的问题可以直接看接入文档https://taotoken.net/doc 。文档里有各语言 SDK 的示例和错误码说明。6. 把多模型接入收敛到单一通道之后配置跑通之后你会发现 browser_use 调用链的维护成本降了很多。以前每加一个模型就要改一处鉴权、加一个 base_url现在只需要在routing里加一行映射。对于想复现 Manus 同类 Agent 的开发者来说这种收敛带来的好处是你可以把精力放在工具设计和提示词调优上而不是浪费在模型接入的琐碎配置里。如果你后续要长期跑编码类 Agent或者需要频繁切换模型做对比测试可以看一下 Coding Planhttps://taotoken.net/coding-plan 。它针对长时间运行的编码任务做了通道优化适合 browser_use 这种需要多轮工具调用的场景。验证模型是否可用可以直接在模型对话页面发一条测试消息https://taotoken.net/chat 。选好模型输入“返回当前模型名称”看返回是否符合预期。最后提醒一点Manus 泄露出来的系统提示词里工具描述会因为 RAG 机制在不同任务中变化所以不要照抄某一份提示词就以为能复现全部能力。真正重要的是调用链的结构——模型决策、工具执行、结果回传这三段怎么衔接。把 TaoToken 作为统一 Key 通道只是让第一段更可控。剩下的靠你在 browser_use 的执行层和提示词工程上慢慢磨。