
Agent 工具调用 API 老变接不上TaoToken 这样改 LangChain 模型通道你在 LangChain 里跑 Agent 时最容易遇到的不是工具函数写错而是外部 API 一改版Agent 的规划、工具调用和结果整合就接不上。库存查询、天气查询这类多步工具调用示例常常会出现每个工具各配一套模型 Key、Base URL 的情况工具 A 用一套出口工具 B 用另一套出口最后日志里既有工具 API 的报错也有模型请求的 401、404排查方向完全乱了。TaoToken 的入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 先注册并创建 Key然后把 LangChain 里 OpenAI 兼容客户端的base_url或OPENAI_API_BASE填成 https://taotoken.net/api 模型名按 TaoToken 通道支持的名称写。TaoToken 在这里只负责统一模型通道不替 Agent 完成工具调用、推理规划或结果整合工具适配仍然在你的 LangChain 代码里完成。这样改完你先能把模型出口固定住再去处理工具 API 变更排查会清楚很多。原问题与场景LangChain Agent 工具调用接不上先别急着改工具 API原文把大模型 Agent 拆成动态推理规划、工具模块和记忆模块并列出 LangChain 等开源框架。工具模块的痛点很典型外部 API 一变更Agent 适应新接口的能力弱多个工具一起调用时又容易各配各的模型出口。本条只处理一个排障视角LangChain Agent 调模型时的 Key 与 Base URL不让 TaoToken 去完成工具调用或推理本身。假设你要按原文跑一个库存查询和天气查询的多步示例。用户输入是“帮我查一下 SKU-001 的库存再告诉我上海天气”。LangChain 里的 Agent 会先让模型做规划要不要调用工具、先调用哪个、参数怎么填。然后执行query_inventory和query_weather两个工具拿到结果后再让模型整合成自然语言回复。这个过程中有两个出口模型出口LangChain 的 ChatOpenAI 或 OpenAI 兼容客户端把消息发给大模型。工具出口库存系统、天气 API、数据库等由你的工具函数自己调用。“Agent 工具调用 API 老变接不上”经常不是工具函数本身多难改而是模型出口没有统一。比如你先把llm1给了规划节点又把llm2给了工具调用节点后来工具 API 改了你以为是 Agent 不适应其实是模型请求走错地址返回了 401 或 404。更常见的是每个工具内部各自 new 一个模型客户端Key 和 Base URL 散落在多个文件里换一次模型通道要改十处。正确的分层是LangChain Agent 只保留一个统一的模型客户端所有工具函数只负责业务 API不再关心模型 Key、Base URL 和模型名。模型通道出问题查 TaoToken 的 Key 和 Base URL工具 API 出问题查工具函数里的请求地址和参数。两者不要混在一起。TaoToken 前置Key、Base URL 与模型名怎么统一这一步只做前置准备不涉及工具调用逻辑。你打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进入控制台创建 API Key。Key 的占位符统一写成YOUR_API_KEY不要把它写进公开仓库也不要在多个工具里复制多份。需要统一的三个东西是KeyTaoToken 控制台创建的 API Key填到 LangChain 模型客户端里。Base URLOpenAI 兼容地址填 https://taotoken.net/api 不要加 UTM也不要写成其他平台地址。模型名按 TaoToken 通道支持的名称填写可以用MODEL_ID作为占位符。具体可用名称去模型对话或接入文档确认不要拿别家平台的模型名直接填。你可以用环境变量也可以直接在ChatOpenAI里显式传参。环境变量适合本地开发export OPENAI_API_KEYYOUR_API_KEY export OPENAI_API_BASEhttps://taotoken.net/api export OPENAI_BASE_URLhttps://taotoken.net/api有些 LangChain 版本读取OPENAI_API_BASE有些 OpenAI SDK 读取OPENAI_BASE_URL两个都设置可以避免版本差异。显式传参优先级更高适合排查时排除环境变量干扰。这里再说清楚一次TaoToken 不执行库存查询不查天气也不决定 Agent 该调用哪个工具。它只提供模型请求的统一入口。工具模块的 API 变更、参数映射、错误重试仍然由你的 LangChain 工具代码处理。这样分工后模型通道和工具通道才能分开排障。可复制配置在 agent.py 里改 ChatOpenAI 的 base_url 与 OPENAI_API_BASE下面给一个可复制的 LangChain Agent 配置。文件名假设为agent.py。核心改动只有模型客户端api_key用YOUR_API_KEYbase_url用 https://taotoken.net/api model用 TaoToken 通道支持的模型名。先安装依赖pip install langchain langchain-openai openai python-dotenv然后在agent.py里写import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.tools import tool load_dotenv() os.environ[OPENAI_API_KEY] os.getenv(OPENAI_API_KEY, YOUR_API_KEY) os.environ[OPENAI_API_BASE] https://taotoken.net/api os.environ[OPENAI_BASE_URL] https://taotoken.net/api llm ChatOpenAI( modelMODEL_ID, # 换成 TaoToken 通道支持的模型名 api_keyYOUR_API_KEY, # 建议从环境变量读取 base_urlhttps://taotoken.net/api, temperature0, timeout60, max_retries2, ) tool def query_inventory(sku: str) - str: 查询指定 SKU 的库存数量。 # 这里替换成你自己的库存 API 或数据库查询 # 注意工具内部不要再 new 一个模型客户端 return f{sku} 当前库存 15 件 tool def query_weather(city: str) - str: 查询指定城市的天气。 # 这里替换成你自己的天气 API 调用 # 工具只负责业务 API不负责模型出口 return f{city} 今天多云25 摄氏度 tools [query_inventory, query_weather] prompt ChatPromptTemplate.from_messages([ (system, 你可以使用工具查询库存和天气。先规划再调用工具最后整合结果。), (human, {input}), MessagesPlaceholder(agent_scratchpad), ]) agent create_openai_tools_agent(llm, tools, prompt) executor AgentExecutor(agentagent, toolstools, verboseTrue) if __name__ __main__: result executor.invoke({ input: 帮我查一下 SKU-001 的库存然后告诉我上海天气 }) print(result[output])如果你的 LangChain 版本使用create_tool_calling_agent把create_openai_tools_agent换掉即可模型出口仍然保持同一个llm实例。不要在query_inventory或query_weather里面再创建ChatOpenAI否则又回到“多工具各配各的模型出口”的老问题。.env文件可以这样写OPENAI_API_KEYYOUR_API_KEY OPENAI_API_BASEhttps://taotoken.net/api OPENAI_BASE_URLhttps://taotoken.net/api注意 API 地址只写 https://taotoken.net/api 不要在后面拼/v1除非接入文档明确要求你的 SDK 需要这样写。不同 SDK 对路径拼接方式不同路径重复会直接导致 404。验证请求跑库存查询和天气查询观察 Agent 规划与工具调用配置改完后不要一上来就跑完整 Agent。先验证模型出口是否通。用最小请求确认 Key、Base URL、模型名三件事from openai import OpenAI client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://taotoken.net/api, ) resp client.chat.completions.create( modelMODEL_ID, messages[{role: user, content: 只回复 OK}], ) print(resp.choices[0].message.content)如果这里能返回OK说明模型通道基本通了。如果这里报 401、404 或 model not found先不要怀疑 LangChain Agent先按下一节的报错排查处理。然后再跑agent.py。开启verboseTrue后你重点观察四件事规划是否正常模型有没有产生调用工具的意图而不是直接编答案。工具调用是否正常日志里是否出现query_inventory和query_weather的调用参数是否包含SKU-001和上海。结果整合是否正常工具返回“库存 15 件”和“上海多云”后模型是否能整合成一句完整回复。模型请求是否统一从 TaoToken 通道出去检查ChatOpenAI的base_url是否为 https://taotoken.net/api 环境变量是否被其他平台地址覆盖。成功时你大致会看到这样的链路用户输入 - 模型规划 - tool_calls: query_inventory(skuSKU-001) - 工具执行 - 返回库存结果 - tool_calls: query_weather(city上海) - 工具执行 - 返回天气结果 - 模型整合 - 输出最终回复如果工具调用能执行但模型整合报错通常还是模型通道问题比如模型名不支持当前工具调用格式或者 Key 在第二次请求时失效。如果模型规划正常但工具函数报错那就去查库存 API、天气 API 自己的地址和参数不要改 TaoToken 的 Base URL。本篇常见错排查401、404、model not found 与工具 schema下面这些错在 LangChain Agent 接模型通道时最常见。按报错类型排查不要每次都从头改代码。401 Unauthorized常见原因YOUR_API_KEY没换成真实 Key.env没加载Key 前后有空格用了其他平台的 Key显式参数和环境变量冲突。处理方式在agent.py里临时显式写api_keyYOUR_API_KEY确认能通后再改回环境变量。检查echo $OPENAI_API_KEY是否为空。404 Not Found常见原因base_url写成了https://taotoken.net/api/v1或者末尾多了/导致 SDK 拼接后路径重复。处理方式按接入文档填写 https://taotoken.net/api 。如果 SDK 自动补/v1不要手动再加。还要检查有没有旧环境变量OPENAI_API_BASE指向其他地址。model not found 或 400 Bad Request常见原因modelMODEL_ID没有换成 TaoToken 通道支持的模型名或者模型名大小写、版本号写错。处理方式去模型对话页面确认可用模型 ID再填回ChatOpenAI。不要直接套用其他平台文档里的模型名。工具 schema 报错常见原因使用的模型不支持 tool calling但代码用了create_openai_tools_agent或者工具函数的参数类型注解、描述不完整。处理方式换一个支持工具调用的模型给tool函数写清楚 docstring 和类型注解例如sku: str、city: str。如果模型确实不支持函数调用可以改用 ReAct 风格的提示词但模型出口仍然统一走 TaoToken。Agent 不调用工具直接编答案常见原因系统提示词没有要求先规划再调用工具模型温度太高工具描述太模糊。处理方式在 system prompt 里明确“需要实时数据时必须调用工具”把temperature设为 0并把工具 docstring 写清楚。不要通过换多个模型出口来解决先统一模型通道再看提示词。多工具各配各的模型出口常见原因在query_inventory和query_weather内部各自创建了ChatOpenAI或者规划节点和总结节点用了两个不同 Key。处理方式整个 Agent 只保留一个llm实例工具函数只调业务 API。这样外部 API 变更时你只改工具函数模型通道变更时你只改base_url和 Key。环境变量优先级混乱常见原因.env、shell 环境变量、代码显式参数同时存在。处理方式记住显式参数大于环境变量。排查时先把ChatOpenAI的api_key、base_url、model三个参数写死确认通道通再逐步切回环境变量。超时与重试常见原因网络出口不稳定、工具 API 慢、模型响应慢。处理方式给ChatOpenAI设置timeout60和max_retries2。如果是流式输出问题先关闭 streaming 跑一次非流式请求。不要在工具函数里做无限重试否则 Agent 会卡在某一轮工具调用。这些排查的共同原则是模型报错查 TaoToken 通道工具报错查业务 API。不要把两类问题混在一起改。语义一致 CTA接入文档、模型对话与 Coding Plan如果你现在卡在 Key、Base URL 或模型名先去 API Keys 页面创建并复制 Key再对照接入文档检查base_url和模型名API Keyshttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite如果你只是想先确认某个模型名能不能用打开模型对话发一条最小请求比在 LangChain 里反复改工具函数更快模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite如果你的 LangChain Agent 要长期跑在本地开发、自动化脚本或多人协作流程里建议用 Coding Plan 管理调用和模型通道避免每个工具、每个同学各配一套 KeyCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite回到这篇的场景Agent 工具调用 API 老变接不上先别急着重写工具模块。把 LangChain 的模型出口统一到 TaoTokenKey 用YOUR_API_KEYBase URL 用 https://taotoken.net/api 模型名按通道支持的名称写。工具 API 该改就改但模型通道只留一个入口排查和迁移都会轻很多。