CurrencyAgent 起 A2A Server 报 MissingAPIKeyError?TaoToken 这样填 TOOL_LLM_URL
2026/9/19 18:59:54 网站建设 项目流程

从 MissingAPIKeyError 说起:CurrencyAgent 的 A2A Server 为什么起不来

如果你正在跟着 LangGraph 版的 A2A 示例跑 CurrencyAgent,大概率会在启动 A2A Server 的那一刻撞上这个报错:

Error: TOOL_LLM_URL environment variable not set.

或者更早一点,在model_source还是默认google的时候,直接抛出:

Error: GOOGLE_API_KEY environment variable not set.

这两个报错都来自__main__.py里那个自定义的MissingAPIKeyError。它的逻辑很直白:启动前先检查环境变量,model_sourcegoogle就查GOOGLE_API_KEY,否则就查TOOL_LLM_URLTOOL_LLM_NAME,缺一个就sys.exit(1),Server 根本进不到uvicorn.run那一步。

问题不在于代码写错了,而在于 CurrencyAgent 的 LangGraph 调用链需要一条真实可用的模型通道。示例默认走 Google,但很多人本地并没有配 Google 的 Key,于是把model_source改成非 google,结果又忘了补TOOL_LLM_URLTOOL_LLM_NAME,报错就卡在这里。这篇就按排障视角,把这条 LLM 通道用 TaoToken 配通,让 A2A Server 正常起来。

TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,注册后创建 Key,拿到 Base URL 和模型名,填进环境变量即可。它在这里只做一件事:提供一条可用的模型通道,让 CurrencyAgent 的 LangGraph 调用能跑通,不替代你的编辑器,也不改你的 Agent 逻辑。

前置准备:拿到 Key、Base URL 和模型名

在动环境变量之前,先把三样东西准备好。

第一,打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册账号。注册完成后进入控制台,创建一个 API Key。这个 Key 就是后面要填进环境变量的凭证,形如YOUR_API_KEY,请替换成你自己的真实值。

第二,确认 Base URL。TaoToken 的 API 地址是:

https://taotoken.net/api

注意这里不带任何 UTM 参数,直接作为TOOL_LLM_URL的值使用。

第三,确认模型名。TOOL_LLM_NAME要按通道支持的模型名填写,比如 DeepSeek 系列的模型 ID。具体支持哪些模型,可以在控制台或模型对话页面查看,填的时候用完整的模型 ID,不要自己简写。

如果你还没创建 Key,可以直接去 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。接入相关的文档在:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。

这三样准备好之后,就可以进入配置环节了。

可复制配置:把 TOOL_LLM_URL 和 TOOL_LLM_NAME 填对

回到示例代码的langgraph目录。__main__.py里用load_dotenv()加载.env,所以最省事的做法是在同目录建一个.env文件,把环境变量写进去。

关键点在于model_source。默认值是google,一旦你不想用 Google,就要显式把它设成非 google 的值,这样代码才会走else分支去检查TOOL_LLM_URLTOOL_LLM_NAME

.env内容参考如下:

model_source=taotoken TOOL_LLM_URL=https://taotoken.net/api TOOL_LLM_NAME=你的模型ID TOOL_LLM_API_KEY=YOUR_API_KEY

这里有几个容易踩的点,逐个说清楚。

model_source只要不是google就行,写taotoken只是语义清晰,代码判断的是os.getenv('model_source', 'google') == 'google',所以任何非 google 的值都会走另一条分支。

TOOL_LLM_URL必须填https://taotoken.net/api,不要多加斜杠,也不要带 UTM 参数。示例里检查的是这个变量是否存在,但真正发起请求时用的是它的值,填错会导致请求打不到正确地址。

TOOL_LLM_NAME填通道支持的模型名。这个值会传给 LangGraph 里的模型初始化逻辑,填错模型名通常不会在启动时报MissingAPIKeyError,而是在实际调用时失败,所以启动通过不代表模型名一定对,后面验证环节要留意。

Key 放进对应变量。示例代码里检查的是TOOL_LLM_URLTOOL_LLM_NAME,但真正调用模型还需要 Key。不同版本的示例对 Key 变量名的约定可能不同,常见的是TOOL_LLM_API_KEYOPENAI_API_KEY之类。你需要对照app/agent.py里模型初始化的部分,确认它读的是哪个变量名,然后把YOUR_API_KEY填进去。这一步是排障的核心:MissingAPIKeyError只检查了 URL 和 NAME,但 Key 缺失会在调用阶段以另一种形式暴露出来。

如果你更习惯用 shell 导出而不是.env,等价写法是:

export model_source=taotoken export TOOL_LLM_URL=https://taotoken.net/api export TOOL_LLM_NAME=你的模型ID export TOOL_LLM_API_KEY=YOUR_API_KEY

两种方式选一种即可,不要同时用导致互相覆盖。配好之后,再启动 Server。

验证请求:启动 A2A Server 并发一次汇率查询

配置就绪后,在langgraph目录下启动:

python __main__.py --host localhost --port 10000

如果环境变量都填对了,这次不会再抛MissingAPIKeyError,而是看到 uvicorn 正常启动,监听在localhost:10000。启动日志里会打印 AgentCard 的构建信息,说明AgentCardDefaultRequestHandlerA2AStarletteApplication都已经装配完成。

接下来用 A2A Client 发一次汇率查询,验证整条链路。示例的 client 端会先获取 AgentCard,再发送消息。你可以发一条类似这样的 query:

What is exchange rate between USD and GBP?

预期结果是:Client 能拿到 AgentCard,DefaultRequestHandler正常分发任务,CurrencyAgent 调用工具完成汇率查询,流式响应逐段返回。因为 AgentCard 里capabilities设置了streaming=True,所以流式响应是否正常是验证的重点之一。

如果流式响应能正常返回内容,说明三件事都通了:环境变量配置正确、TaoToken 的模型通道可用、LangGraph 的调用链完整。如果启动通过了但查询阶段报错,那问题多半在模型名或 Key 上,而不是MissingAPIKeyError本身。

本篇常见错排查

排障视角下,把几个高频问题列出来,方便对照。

仍然报TOOL_LLM_URL environment variable not set说明model_source还是google,或者.env没被加载到。先确认model_source的值不是google,再确认.env文件和__main__.py在同一目录,且load_dotenv()能读到。用 shell 导出的话,确认当前终端会话里echo $TOOL_LLM_URL有值。

TOOL_LLM_NAME environment not variable not set这是示例代码里的原文拼写,检查TOOL_LLM_NAME是否漏填。注意变量名是TOOL_LLM_NAME,不是TOOL_LLM_MODEL之类。

启动通过,但查询时报鉴权或模型不存在。这类问题不在MissingAPIKeyError的检查范围内。回查 Key 是否填进了app/agent.py实际读取的那个变量,以及TOOL_LLM_NAME是否是通道支持的完整模型 ID。模型名建议直接从控制台复制,避免手打出错。

改了.env但行为没变。可能是 shell 里已经 export 了同名变量,优先级高于.env。先unset掉再启动,或者统一只用一种配置方式。

端口被占用导致启动失败。这不是MissingAPIKeyError,但容易和配置问题混淆。换一个端口,比如--port 10001,再试。

排查顺序建议是:先看报错信息里具体缺哪个变量,再确认model_source分支走对没有,最后才怀疑 Key 和模型名。MissingAPIKeyError是启动前的静态检查,它过了,说明变量层面没问题,剩下的就是运行时问题。

配通之后:让 A2A CurrencyAgent 稳定跑起来

回到最初的目标:CurrencyAgent 起 A2A Server 报MissingAPIKeyError,本质是 LLM 通道没配。把model_source设为非 google,TOOL_LLM_URLhttps://taotoken.net/apiTOOL_LLM_NAME填通道支持的模型名,Key 放进对应变量,Server 就能正常启动,A2A Client 也能完成汇率查询和流式响应验证。

如果你在接入或排障过程中还遇到其他环境变量或配置问题,可以对照接入文档再核一遍:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。Key 的管理和新建在 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。

如果你打算长期跑编码类或 Agent 类的任务,而不是只做一次验证,可以了解一下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。想先直接对话验证模型通道是否可用,去模型对话页面:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。

整套配置的核心就一句话:TaoToken 提供 Key 和 Base URL,CurrencyAgent 的 LangGraph 调用通过这条通道跑通,A2A Server 不再卡在MissingAPIKeyError

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询