base_url 写死火山方舟?TaoToken 这样改豆包调 FastMCP 的 OpenAI client

发布时间:2026/9/20 10:33:33
base_url 写死火山方舟?TaoToken 这样改豆包调 FastMCP 的 OpenAI client base_url 写死火山方舟TaoToken 这样改豆包调 FastMCP 的 OpenAI client一、问题场景FastMCP 跑通了模型通道却卡在硬编码如果你最近在用 FastMCP 开发 MCP 服务大概率会经历这样一个过程先用mcp.tool定义一个browser_navigate工具通过 Streamable HTTP 把它跑在127.0.0.1:10005/play_wright然后用client.list_tools()确认工具注册成功再call_tool(browser_navigate, {url: ...})拿到页面 HTML。到这里一切顺利说明 MCP 服务端和客户端都没问题。真正让人头疼的是下一步——让大模型来调用这个工具。原文里用的是豆包 1.5 thinking / pro通过 OpenAI 兼容的client.chat.completions.create()把工具列表传进去靠finish_reason tool_calls判断模型是否要调工具。逻辑本身没问题但代码里doubao_1_5函数把base_url写死成了火山方舟的https://ark.cn-beijing.volces.com/api/v3api_key和model_id也散落在文件顶部。想换一个模型通道就得同时改三处稍微漏一处就报 401 或 404。这篇就专门解决这个接入配置问题把豆包调 FastMCP 的 OpenAI client 模型通道改到 TaoToken。你只需要从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 拿到 Key把base_url换成https://taotoken.net/apimodel_id按通道支持的模型填其余 FastMCP 的browser_navigate逻辑、Playwright 启动流程、工具循环代码全部保持原样。TaoToken 在这里只提供 Key 和 Base URL不负责运行 FastMCP server也不替代browser_navigate里的 Playwright 逻辑这一点先明确避免后面排查时找错方向。二、TaoToken 前置拿 Key、认 Base URL、别填首页在动手改代码之前先把 TaoToken 这一侧的准备做完。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并进入控制台在 API Keys 页面创建一个新的 Key。这个 Key 就是后面要替换掉原文api_key xxx的那一串字符。创建完成后先复制保存页面刷新后通常不会再完整显示。接下来是 Base URL。这是最容易出错的一步base_url要填的是 API 地址https://taotoken.net/api不是官网首页。很多人习惯性把浏览器地址栏里的首页地址粘进去结果 OpenAI SDK 会在后面拼/chat/completions请求直接打到错误路径上返回 404 或者一段 HTML。记住这个对应关系官网入口注册、看文档、管理 Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endAPI Base URL写进代码里的https://taotoken.net/apiAPI Key控制台创建的YOUR_API_KEYmodel_id这一项按通道支持的模型填。原文里注释了doubao-1.5-thinking和doubao-1.5-pro两个候选你换成 TaoToken 通道支持的模型 ID 即可。如果你不确定该填哪个可以先去模型对话页面确认当前通道可用的模型名称再回到代码里替换。这一步不需要改 FastMCP 的任何代码browser_navigate工具的定义、StreamableHttpTransport的 URL、client.list_tools()的调用方式都保持原样。三、可复制配置只改 OpenAI client 这一段原文的doubao_1_5函数结构是完整的我们只动 OpenAI client 的初始化部分。改之前是这样api_key xxx model_id xxx # doubao-1.5-thinking def doubao_1_5(messages, tools): client OpenAI( api_keyapi_key, base_urlhttps://ark.cn-beijing.volces.com/api/v3, max_retries2, timeout600 )改之后把api_key换成你在 TaoToken 控制台创建的 Keybase_url换成https://taotoken.net/apimodel_id换成通道支持的模型api_key YOUR_API_KEY model_id 你的通道模型ID def doubao_1_5(messages, tools): client OpenAI( api_keyapi_key, base_urlhttps://taotoken.net/api, max_retries2, timeout600 )函数体里client.chat.completions.create()的调用完全不用动modelmodel_id、temperature0、messagesmessages、toolstools这些参数保持原样。finish_reason的判断逻辑、prompt_tokens/completion_tokens的打印、异常处理里的_e.response.json()也都不用改。需要提醒的是原文里available_tools的构造方式有一个细节它用的是input_schema这个键名而 OpenAI 兼容接口通常期望的是parameters。如果你在 TaoToken 通道上跑的时候发现模型不返回tool_calls可以先检查这里。不过这不是本篇接入配置的核心先按原文结构跑通遇到问题再对照第五节排查。FastMCP 服务端那一侧browser_navigate的定义、mcp.run_async(transportstreamable-http, host127.0.0.1, port10005, path/play_wright)这些都不需要改。TaoToken 只接管模型调用通道不碰 MCP 服务本身。四、验证请求从 list_tools 到 finish_reason配置改完后按原文顺序验证。第一步启动 FastMCP serverpython your_mcp_server.py看到异步启动MCP Server和 Uvicorn 在127.0.0.1:10005上监听的日志说明服务端起来了。第二步跑客户端连接测试确认browser_navigate在工具列表里async with client: await client.ping() tools await client.list_tools() print(f可用工具: {tools})如果输出里能看到browser_navigate说明 MCP 通道正常。第三步直接调用工具验证 Playwright 逻辑result await client.call_tool(browser_navigate, {url: https://www.baidu.com}) print(f调用工具返回{result})能返回一段 HTML说明browser_navigate本身没问题。第四步才是本篇的重点——跑大模型循环检查 TaoToken 通道是否正常返回tool_calls。运行原文的main()后观察控制台输出request_id: xxx, 耗时: x.xs, prompt tokens数量: xxx, output tokens数量: xxx [Calling tool browser_navigate with args {url: https://top.baidu.com/board?tabrealtime}]如果看到finish_reason tool_calls分支被触发并且工具结果被追加回messages说明 TaoToken 通道的模型调用和 FastMCP 工具循环已经打通。原文里豆包 1.5 thinking 会返回reasoning_content这个字段在completion.choices[0].message.model_extra里打印出来能看到模型的思考过程属于正常现象。一个实际观察原文跑百度热搜那个任务时第二次请求耗时 175 秒、prompt tokens 达到 81886主要原因是browser_navigate返回的 HTML 太长全部塞进了上下文。这跟模型通道无关换到 TaoToken 后如果也遇到类似情况可以考虑在工具里先做一层内容截断或提取而不是把整页 HTML 原样返回。五、本篇常见错排查报 401 Unauthorized先检查api_key是不是从 TaoToken 控制台复制的完整 Key有没有多余空格或换行。再确认base_url是https://taotoken.net/api不是官网首页。如果 Key 创建后很久没用可以重新创建一个再试。报 404 Not Found九成是base_url填成了首页地址。OpenAI SDK 会在base_url后面拼/chat/completions填首页就会变成https://taotoken.net/chat/completions路径不对。改成https://taotoken.net/api即可。模型不返回 tool_calls原文里提到豆包 1.5 pro 不会返回finish_reason tool_calls而是把工具调用信息放在content里。换到 TaoToken 通道后不同模型的行为可能不同。如果finish_reason一直是stop先确认available_tools的构造是否符合 OpenAI 规范特别是input_schema和parameters的键名问题。另外确认model_id填的是通道支持的模型填错模型 ID 也可能导致工具调用能力不生效。连接 FastMCP server 失败确认 server 已经启动127.0.0.1:10005/play_wright可访问。这一步跟 TaoToken 无关是 FastMCP 本身的连接问题。检查StreamableHttpTransport的 URL 是否和mcp.run_async里的host、port、path一致。工具结果追加后模型不继续检查messages.append里tool_call_id是否和completion.choices[0].message.tool_calls[0].id对应。这个 ID 对不上模型无法把工具结果和之前的调用关联起来循环就会卡住或报错。Playwright 启动报错browser_navigate里用的是chromium.launch(headlessFalse)需要本地有可用的 Chromium。如果报浏览器找不到先跑playwright install chromium。这跟模型通道无关属于 FastMCP 工具本身的依赖问题。六、接入文档与后续分流把豆包调 FastMCP 的 OpenAI client 模型通道改到 TaoToken核心动作只有三个从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 Key把base_url改成https://taotoken.net/api把model_id换成通道支持的模型。FastMCP 的browser_navigate、Streamable HTTP 传输、工具循环逻辑全部保持原样。如果你在改base_url或api_key的过程中遇到报错或者不确定model_id该填什么可以直接去 API Keys 页面和接入文档对照检查那里有完整的 Key 管理和接入说明。想先确认通道上有哪些模型可用去模型对话页面试跑一条消息最直观。如果你打算把这种 MCP 工具调用做成长期跑的编码或 Agent 流程而不是每次手动改代码验证可以了解一下 Coding Plan它更适合持续性的模型调用场景。接入配置本身不复杂难的是把 FastMCP 服务端、OpenAI client、工具循环这三层的边界分清楚。TaoToken 只负责模型通道这一层FastMCP 的 server 和 Playwright 逻辑仍然由你自己掌控。按上面的步骤改完从list_tools()到call_tool()再到finish_reason tool_calls整条链路就能跑通。