LangChain 调 GPT-4.1 报 401?TaoToken 这样修模型通道再跑 ChatBI
1. 401 报错到底卡在哪一步你在 LangChain MCP Client 里跑create_react_agent控制台输入问题后没等到工具调用反而直接抛出openai.AuthenticationError: Error code: 401 - {error: {message: Incorrect API key provided...}}。这个报错跟 MCP Server、跟 chart 的 SSE 地址、跟 covid19-query 的本地服务都没关系它发生在智能体真正发起模型请求之前的那一层——鉴权。LangChain 的create_react_agent(openai:gpt-4.1, tools, ...)底层走的是langchain-openai它会读取环境变量OPENAI_BASE_URL和OPENAI_API_KEY来构造 OpenAI 客户端。只要这两个值有一个不对请求在到达模型之前就被拒了控制台里你看到的就是 401。常见三种情况Key 是随手填的sk-xxxxx占位符没换Base URL 写成了https://api.openai.com/v1但手上没有对应通道的 Key或者 Base URL 多带了/v1后缀导致路径拼接成/v1/v1/chat/completions服务端识别不了。这篇要解决的就是把模型通道修对让 GPT-4.1 的请求不再卡在鉴权然后回到原文main()重跑「确诊前十州折线图」确认 MCP 工具调用链恢复。适合正在用 LangChain MCP 搭 ChatBI、被 401 拦住、想快速定位是 Key 问题还是地址问题的人。整条链路是LangChain Agent → OpenAI 协议通道 → GPT-4.1 → 返回 tool_calls → 调 chart / covid19-query 两个 MCP Server。401 只出在第二环修好它后面可视化图表才能跑起来。2. 修通道前先拿对 Key 和地址TaoToken 在这里的角色很单一它提供一条兼容 OpenAI 协议的模型通道你把它当成OPENAI_BASE_URL的取值来源就行不碰你的 MCP Server也不改你的 Agent 逻辑。原文里 chart 和 covid19-query 两个 SSE 地址保持原样不动我们只替换模型这一层。先打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并登录进控制台创建 API Key。创建入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 列表页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。生成的 Key 形如sk-开头的一串字符复制下来后面填进OPENAI_API_KEY。地址这块有个高频坑单独拎出来说注意OPENAI_BASE_URL填https://taotoken.net/api不要加/v1也不要带任何 UTM 参数。langchain-openai 会自己在后面拼/chat/completions你多写一层/v1就变成双份路径请求直接 404 或 401。对照一下正确与错误写法配置项正确值常见错误值后果OPENAI_BASE_URLhttps://taotoken.net/apihttps://taotoken.net/api/v1路径重复请求失败OPENAI_BASE_URLhttps://taotoken.net/apihttps://taotoken.net/api?utm_source...参数污染鉴权异常OPENAI_API_KEY控制台新建的 sk- 开头 Keysk-xxxxx 占位符401 Incorrect API key模型名openai:gpt-4.1gpt-4.1缺前缀找不到 provider想先确认通道本身通不通可以到模型对话页 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 手动发一句话能正常回就说明 Key 和地址没问题再回去改代码。如果你后面要长期跑编码类 Agent可以了解下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。3. 可复制的配置改动原文main()里这两行是问题源头os.environ[OPENAI_BASE_URL] https://api.openai.com/v1 ## 支持openai协议的 API BASE os.environ[OPENAI_API_KEY] sk-xxxxx ## 你的API KEY改成下面这样其余代码一行不动import os # 模型通道TaoToken 兼容 OpenAI 协议 os.environ[OPENAI_BASE_URL] https://taotoken.net/api os.environ[OPENAI_API_KEY] sk-你从控制台新建的Key from langgraph.prebuilt import create_react_agent from langchain_mcp_adapters.client import MultiServerMCPClient from colorama import Fore, Style import asyncio from langgraph.checkpoint.memory import InMemorySaver async def main(): client MultiServerMCPClient( { chart: { url: https://mcp.api-inference.modelscope.net/530c948576c248/sse, transport: sse }, covid19-query: { url: http://127.0.0.1:6030/sse, transport: sse } } ) tools await client.get_tools() checkpointer InMemorySaver() agent create_react_agent( openai:gpt-4.1, tools, checkpointercheckpointer, promptYou are an AI assistant that helps people find information. ) config {configurable: {thread_id: 1}} while True: question input(请输入) if not question: continue if question q: break async for chunk in agent.astream( {messages: [{role: user, content: question}]}, stream_modeupdates, configconfig ): if agent in chunk: content chunk[agent][messages][0].content tool_calls chunk[agent][messages][0].tool_calls if tool_calls: for tool in tool_calls: print(Fore.YELLOW, Style.BRIGHT, f Call MCP Server: {tool[name]} , args: {tool[args]}) else: print(Fore.BLACK, Style.BRIGHT, fLLM: {content}) elif tools in chunk: content chunk[tools][messages][0].content name chunk[tools][messages][0].name print(Fore.GREEN, Style.BRIGHT, f {name} : {content}) if __name__ __main__: asyncio.run(main())两个 SSE 地址原封不动chart 走 ModelScope 的mcp-server-chartcovid19-query 走你本地127.0.0.1:6030/sse。改的只有环境变量两行。如果你用.env管理写法一样注意别在值末尾留空格也别把 Key 用引号包进去后带出多余字符。4. 验证请求与成功结果改完先确认本地 covid19-query MCP Server 已经起来端口 6030 在监听python covid19_query_server.py # 期望输出类似INFO: Uvicorn running on http://127.0.0.1:6030然后跑改好的main()python langchain_mcp_client.py控制台出现请输入后输入原文那条验证问题统计的确诊数量前十名的州以折线图的方式展示成功时你会看到三段输出顺序和颜色对应不同阶段 Call MCP Server: get_table_schema , args: {} get_table_schema : TABLE us_covid19_counties (date varchar COMMENT 日期, county varchar COMMENT 县, ...) Call MCP Server: run_sql , args: {sql: SELECT state, SUM(cases) AS total FROM us_covid19_counties GROUP BY state ORDER BY total DESC LIMIT 10} run_sql : [{state: California, total: ...}, ...] Call MCP Server: generate_line_chart , args: {...} generate_line_chart : https://.../chart.png LLM: 已为你生成确诊人数前十州的折线图图表链接如下...关键判断点只要看到 Call MCP Server出现就说明 401 已经解决模型通道通了Agent 正常拿到了 tool_calls。如果只打印LLM:而没有工具调用那是 prompt 或模型选择问题不是鉴权问题。折线图链接能打开、能看到各州确诊数走势整条 ChatBI 链路就算恢复。想再压一遍换饼图问题「找出确诊人数前五名的州按饼图的方式绘制给我」看generate_pie_chart是否被调用。5. 本篇常见错排查401 依旧出现先确认OPENAI_API_KEY是不是真的替换了sk-xxxxx很多人改了 Base URL 忘了改 Key。再确认 Key 没有多余空格或换行。最后确认 Base URL 是https://taotoken.net/api没带/v1、没带 UTM。报 404 而不是 401基本是 Base URL 多写了/v1路径拼成/api/v1/chat/completions。去掉/v1即可。报 model not foundcreate_react_agent第一个参数必须是openai:gpt-4.1这种带 provider 前缀的写法写成裸gpt-4.1会找不到 provider。工具调用不触发401 修好后如果模型只聊天不调工具检查 prompt 是否明确要求「先获取表结构、再生成 SQL、再画图」原文那段流程提示词别删。chart SSE 连不上这个跟模型通道无关是 ModelScope 的 SSE 地址网络问题确认地址没被改动、本地能访问外网。covid19-query 连不上确认本地 6030 端口服务已启动http://127.0.0.1:6030/sse能通数据库test3里us_covid19_counties表有数据。改了环境变量没生效os.environ必须在 importlangchain_openai之前设置放在文件最顶部。如果放在create_react_agent之后客户端已经用旧值初始化了。排障时如果怀疑是 Key 本身的问题去 API Keys 页 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新建一个接入规范看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。6. 通道修好后继续跑 ChatBI模型通道修对之后原文剩下的封装逻辑不用动FastAPI 那层verify_auth校验的是你自己写的api_key跟模型通道是两回事别混在一起排查。客户端连你的 FastAPI 服务时填的是你自定义的 Key而 FastAPI 内部调 GPT-4.1 用的是 TaoToken 的 Key两层鉴权分开看。回到main()重跑确诊前十州折线图确认get_table_schema → run_sql → generate_line_chart三个工具依次被调用图表链接能打开就说明整条 LangChain MCP ChatBI 可视化链路恢复。后续想换模型或调通道参数在模型对话页 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 先试通再写进代码能省掉不少来回改环境变量的时间。

相关新闻

MCP 握手后模型没收到工具结果?TaoToken 通道的 base_url 这样填。

MCP 握手后模型没收到工具结果?TaoToken 通道的 base_url 这样填。

/* 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 13:10:01 阅读更多 →
AI Agent工程师面试:阿里10道高频题与解题思路

AI Agent工程师面试:阿里10道高频题与解题思路

AI Agent 工程师这个岗位,这两年算是大厂里最抢手的方向之一。我前后帮几位朋友复盘过阿里的面试题,也把自己几次面试的录音翻出来重新听了两遍,发现一个很明显的特点:这个岗位的面试题和传统后端、算法岗差别非常大,不…

2026/9/20 13:10:01 阅读更多 →
做SEO的网站到底多少钱?广东实战拆解模板站翻车真相

做SEO的网站到底多少钱?广东实战拆解模板站翻车真相

做SEO的网站到底多少钱?广东实战拆解模板站翻车真相 别再被“998元高端SEO站”忽悠了。你花大价钱买的模板网站,上线后不仅丑得像十年前的PPT,更致命的是搜索引擎根本爬不进去,流量为零。很多老板问我, 做SEO的网站多少钱…

2026/9/20 13:09:50 阅读更多 →

最新新闻

PicoClaw MCP Server CLI 完全指南:用 `picoclaw mcp` 管理 MCP 服务器配置

PicoClaw MCP Server CLI 完全指南:用 `picoclaw mcp` 管理 MCP 服务器配置

PicoClaw MCP Server CLI 完全指南:用 picoclaw mcp 管理 MCP 服务器配置 【免费下载链接】picoclaw Tiny, Fast, and Deployable anywhere — automate the mundane, unleash your creativity 项目地址: https://gitcode.com/gh_mirrors/pi/picoclaw PicoCl…

2026/9/20 13:50:32 阅读更多 →
站点地图域名一致性检查:Front-End-Checklist 如何保证 sitemap 所有 URL 落在正确域名与协议上

站点地图域名一致性检查:Front-End-Checklist 如何保证 sitemap 所有 URL 落在正确域名与协议上

站点地图域名一致性检查:Front-End-Checklist 如何保证 sitemap 所有 URL 落在正确域名与协议上 【免费下载链接】Front-End-Checklist 🗂 The essential checklist for modern web development, for humans and AI agents 项目地址: https://gitcode.…

2026/9/20 13:50:32 阅读更多 →
ant-design-vue Divider 分割线组件完全指南:API、源码实现与实战配置

ant-design-vue Divider 分割线组件完全指南:API、源码实现与实战配置

ant-design-vue Divider 分割线组件完全指南:API、源码实现与实战配置 【免费下载链接】ant-design-vue 🌈 An enterprise-class UI components based on Ant Design and Vue. 🐜 项目地址: https://gitcode.com/gh_mirrors/an/ant-design-…

2026/9/20 13:50:32 阅读更多 →
DeepStream参考应用源码静态评测:72个源文件拆解与工程实践

DeepStream参考应用源码静态评测:72个源文件拆解与工程实践

DeepStream 出来这么多年,官方示例应用一直是很多人学习边缘视频分析的第一站,但真正把这套工程的源码当作“静态对象”去拆的人并不多。我最近把 DeepStream SDK 里参考应用的源码树完整过了一遍,统计出 72 个源文件,从入口 main…

2026/9/20 13:50:32 阅读更多 →
Enzyme 实战:深入理解 ReactWrapper.simulate() 事件模拟 API

Enzyme 实战:深入理解 ReactWrapper.simulate() 事件模拟 API

测试前端 【免费下载链接】enzyme JavaScript Testing utilities for React 项目地址: https://gitcode.com/gh_mirrors/en/enzyme 点击查看 免费下载 导读 .simulate() 是 Enzyme 中模拟用户交互事件(如点击、输入、键盘事件)的核心方法&a…

2026/9/20 13:50:32 阅读更多 →
用n8n实现公众号运营自动化:部署、接口对接与实战踩坑

用n8n实现公众号运营自动化:部署、接口对接与实战踩坑

简介:针对公众号运营中写文、配图、发布等重复性工作,这份 n8n 实战文档详细介绍如何搭建一套完整的自动化工作流。资源面向有一定编程基础和技术能力的公众号运营者或开发者,以 DeepSeek 完成 AI 写文、豆包模型生成配图、微信公众号 API 完…

2026/9/20 13:49:31 阅读更多 →

日新闻

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 阅读更多 →