
1. 与其从零搭 LangChain不如先给 Claude Agent SDK 换条 API 通道最近我把 Claude Agent SDK 拿来跑了一个新闻研究代理主代理用 Firecrawl MCP 抓取最新 AI 资讯再叫 translator-agent 子代理把内容翻译成汉语最后生成 markdown 文件。这个流程如果按老思路可能又要去 LangChain 或 CrewAI 里搭 Agent、配 Tool、写编排逻辑但 Claude Agent SDK 已经把工具、MCP、子代理都内置了。唯一卡住我的是官方 API 凭据后来我把 Key 和 Base URL 换成 TaoTokenTaoToken代码里 model 没动就跑通了。为什么我会想到换通道因为原文脚本里的ClaudeAgentOptions默认会去找官方 API 的访问凭据而官方额度、环境变量、多 Key 管理这些东西凑在一起比写代理本身还费神。TaoToken 在这里扮演的是统一接入层的角色它把模型对话、Coding Plan、API Key 创建放在同一个控制台里让我拿到一把 Key 就能同时喂给 Claude Agent SDK、Claude Code 或其他兼容工具不需要为每个工具各配一套官方凭据。1.1 原文的场景回顾原文的思路很简洁用claude_agent_sdk的query方法发起一次异步请求在主代理里挂一个 Firecrawl MCP 服务器让它去抓取 AI 领域的新闻抓完以后主代理自己把结果写入ai_news_en.md再调用一个专门负责翻译的子代理translator-agent把内容翻译成汉语并写入另一个 markdown 文件。整个过程只有两个核心组件一个 MCP 连接器一个子代理剩下的判断和文件操作都由 SDK 内部完成。这件事放在 LangChain 里做通常要先定义工具、构造 Agent、配置执行器还要处理记忆和回调。Claude Agent SDK 把这些能力折叠成了AgentDefinition、McpHttpServerConfig和query三个概念。原文最后感叹「谁还在用 LangChain 做代理」正是因为这个对比。1.2 为什么这里需要 TaoToken原文代码里有一个很实际的问题ClaudeAgentOptions需要可用的 Anthropic API 凭据而很多开发者的官方账号额度紧张或者希望在这个脚本里换用 GLM 等非 Claude 模型。TaoToken 提供的兼容通道正好解决这一层它对外暴露的 Base URL 是https://taotoken.net/api和 Anthropic SDK 的请求格式兼容所以query的调用方式不用改只需要把环境变量里的地址和 Key 换掉。这样做的好处是不把配置硬编码进业务代码。我的脚本里依然保留modelglm-4.6也不需要在ClaudeAgentOptions里塞 token 参数SDK 会从环境变量读取ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY于是同一个脚本可以在「官方通道」和「TaoToken 通道」之间切换。对我来说这比维护多套 Key 的代码分支干净得多。2. 准备 TaoToken Key 和 Base URL在改脚本之前需要先做两件事去官网创建一把 API Key以及在终端里导出两个环境变量。这两步做完原文的脚本几乎原样就能跑。2.1 去官网创建 Key打开 TaoToken 注册登录后在控制台左侧找到 API Keys 页面创建一个新的 Key。创建完成后复制那一串以sk-开头的字符串它就是我们要填到环境变量里的YOUR_API_KEY。如果你担心 Key 泄漏可以在控制台随时吊销重建这一点和官方 Key 管理逻辑一致。需要说明的是TaoToken 首页能看模型广场和套餐但真正生成 Key 是在控制台的 API Keys 区域。我第一次去的时候在首页转了半圈没找到入口后来才发现控制台里才有「创建 Key」按钮。如果你也遇到同样的情况直接进https://taotoken.net/console/api-keys就行。2.2 环境变量怎么设Claude Agent SDK 和 Claude Code 一样会读取ANTHROPIC_BASE_URL、ANTHROPIC_API_KEY这两个标准环境变量。在项目目录下打开终端执行export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYYOUR_API_KEY注意这里的 Base URL 是https://taotoken.net/api末尾不要加/v1也不要带任何 UTM 参数。ANTHROPIC_API_KEY替换成你在 TaoToken 控制台复制的那串 Key。如果你用的是 Windows PowerShell语法会稍有不同但环境变量名完全一样。设置完之后可以先用一句话验证环境是否生效python -c import os; print(os.environ.get(ANTHROPIC_BASE_URL))如果输出https://taotoken.net/api说明 SDK 已经能拿到通道地址。这一步建议不要跳过因为后面脚本报错时排查顺序通常先看环境变量有没有真的导出。3. 初始新闻代理脚本Firecrawl MCP translator-agent环境变量准备好后我把原文的初始脚本稍微整理了一下去掉了个人路径保留了核心结构。这个脚本做的事情是通过 Firecrawl MCP 抓取 AI 资讯写入ai_news_en.md再调用 translator-agent 翻译成汉语写入另一个文件。3.1 代码主体import asyncio import os from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition from claude_agent_sdk.types import McpHttpServerConfig async def main(): firecrawl_api_key os.environ[FIRECRAWL_API_KEY] firecrawl_mcp McpHttpServerConfig( typehttp, urlhttps://mcp.firecrawl.dev/v2/mcp, headers{Authorization: fBearer {firecrawl_api_key}} ) translator_agent AgentDefinition( description将内容从任意语言翻译成其他任意语言。, prompt你是一名专业的语言翻译专家。, tools[Read, Edit, Bash, Grep], modelsonnet ) options ClaudeAgentOptions( modelglm-4.6, system_prompt你是一名专业的新闻研究员。, permission_modebypassPermissions, cwd/path/to/your/output, mcp_servers{firecrawl_mcp: firecrawl_mcp}, agents{translator-agent: translator_agent} ) async for message in query( prompt( 查找人工智能领域最新的新闻热点有哪些 将结果写入markdown文件并附上相关网址作为参考依据。 随后调用翻译代理translator-agent将内容翻译成汉语 并保存到另一个独立的markdown文件中。 ), optionsoptions ): print(message) asyncio.run(main())3.2 逐个拆解先看firecrawl_mcp。它通过 HTTP 方式连接 Firecrawl 的 MCP 服务头部携带FIRECRAWL_API_KEY这样主代理就获得了实时抓取网页的能力。McpHttpServerConfig里的url是 Firecrawl 官方地址和 TaoToken 没有关系不要混淆。再看translator_agent。这里定义了一个只有翻译职责的子代理它看不到 Firecrawl 的原始请求只负责把主代理丢给它的内容做语言转换。modelsonnet是子代理使用的模型主代理则用modelglm-4.6。如果你发现某个模型 ID 在当前模型广场不存在以 TaoToken 模型广场 当时列表为准换一个存在的 ID 即可。最后是ClaudeAgentOptions。cwd是输出目录我改成了/path/to/your/output实际运行时请换成你自己的目录。permission_modebypassPermissions表示允许代理执行文件读写和命令调用这个参数是官方 SDK 自带的不需要额外配置。整个脚本没有出现 LangChain 的任何 import这就是原文想表达的核心Claude Agent SDK 原生就能串起 MCP 和子代理。4. 升级版四个子代理一次跑完初始脚本验证了「抓取 翻译」这个最小路径。原文还给出了一个更复杂的例子一次运行完成调研、翻译、要点提取、网页开发、社交媒体文案生成。这个版本把子代理的优势体现得更充分因为每个子代理只需要关心自己那块任务。4.1 多代理编排import asyncio import os from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition from claude_agent_sdk.types import McpHttpServerConfig async def main(): firecrawl_api_key os.environ[FIRECRAWL_API_KEY] firecrawl_mcp McpHttpServerConfig( typehttp, urlhttps://mcp.firecrawl.dev/v2/mcp, headers{Authorization: fBearer {firecrawl_api_key}} ) translator AgentDefinition( description将内容从任意语言翻译成其他任意语言。, prompt你是一名专业的语言翻译专家。, tools[Read, Edit, Bash, Grep], modelsonnet ) highlights_extractor AgentDefinition( description从新闻中提取核心要点并生成markdown文件。, prompt你是一名擅长总结新闻要点的专家。请提炼最重要的信息、洞见和结论生成结构清晰的markdown文件。, tools[Read, Write, Edit] ) website_developer AgentDefinition( description使用HTML、CSS和JavaScript创建网页。, prompt你是一名专业的网页开发工程师。请创建现代化、响应式且结构规范的网页。, tools[Read, Write, Edit] ) social_media_creator AgentDefinition( description基于新闻内容创作领英和推特文案。, prompt你是一名社交媒体内容创作者。请创作有吸引力、能引发互动的文案使用合适话题标签。, tools[Read, Write, Edit] ) options ClaudeAgentOptions( modelglm-4.6, system_prompt你是一名专业的新闻研究员。, permission_modebypassPermissions, cwd/path/to/your/output, mcp_servers{firecrawl_mcp: firecrawl_mcp}, agents{ translator-agent: translator, highlights-extractor-agent: highlights_extractor, website-developer-agent: website_developer, social-media-creator-agent: social_media_creator } ) prompt 查找菲律宾关于防洪工程和公共工程与公路部DPWH的最新新闻动态。 将结果写入markdown文件并附上相关网址作为信息来源。 调用翻译代理将这些新闻翻译成汉语写入另一个markdown文件。 提取新闻核心要点写入第三个markdown文件。 调用网页开发代理创建一个展示这些资讯的HTML网页保存文件。 最后调用社交媒体创作代理基于这些资讯创作领英和推特文案保存到markdown文件。 async for message in query(promptprompt, optionsoptions): print(message) asyncio.run(main())4.2 输出文件清单跑完这个脚本后你的cwd目录下会出现类似这样的文件英文新闻原始 markdown、中文翻译 markdown、核心要点 markdown、一个 HTML 网页文件、社交媒体文案 markdown。每个子代理的职责边界非常清晰主代理负责拆解任务和调度子代理只处理自己那一段。这里有一个值得注意的点子代理的model字段没写时会继承主代理的模型如果显式写了modelsonnet则该子代理使用 Sonnet。实际选哪个模型看 TaoToken 模型广场上哪个可用。不要假设所有模型 ID 在所有通道下都存在跑之前花一分钟确认能省掉后面排查报错的时间。5. 验证这次调用是否真的走通脚本跑通的标准不是终端没有报错而是看到预期文件生成。原文里最直接的验证方式就是检查ai_news_en.md和ai_news_ko.md原文里写的是汉语翻译版但文件名用了ko我们沿用原文逻辑。如果这两个文件都出现了并且内容包含新闻链接和中文翻译说明整条链路——TaoToken 通道、Firecrawl MCP、主代理、翻译子代理——全部正常工作。5.1 看生成文件打开输出目录先看英文文件是不是真的包含近期 AI 新闻再看翻译文件是不是通顺的中文。如果英文文件有内容但中文文件为空问题多半出在 translator-agent 的调用上可能是子代理的model参数不对也可能是主代理没有正确委派任务。如果两个文件都不存在先看终端有没有打印错误信息再检查环境变量是否在当前终端会话中生效。我自己的体验是第一次跑通时看到两个 markdown 文件陆续生成心里那块石头才落下。因为这类代理脚本不像普通函数调用它中间可能经历十几轮模型推理任何一个环节静默失败都可能让你误以为 Key 不对。所以不要只看print(message)的输出一定要去文件系统里确认产物。5.2 去控制台核对用量文件生成后可以回到 TaoToken 控制台的用量页面看刚才那次调用是否被记录。这一步很关键它能帮你确认请求确实打到了 TaoToken而不是走了某个本地缓存的代理。如果用量页有条目且模型名、时间、token 数都对得上那这个通道就可以放心拿来做日常开发了。如果你打算长期用 Claude Agent SDK 跑这类非编码工作流建议在控制台看一下 Coding Plan 或 Token 套餐是否匹配你的调用量。对于偶尔跑一次的新闻代理按量付费可能更划算对于每天定时执行的脚本套餐通常能省一点。具体价格以控制台当时展示为准我这里不给数字。6. 排障Key、Base URL、模型名三类问题接入 TaoToken 之后最容易遇到的报错其实就三类。搞清楚它们能节省大量瞎试的时间。6.1 401 或 403Key 没生效如果你在环境变量里填了 Key但请求返回 401 Unauthorized 或 403 Forbidden最可能的原因是ANTHROPIC_API_KEY没有正确导出。先用python -c import os; print(os.environ.get(ANTHROPIC_API_KEY))确认。如果输出为空说明你在某个子 shell 里 export 的变量没传到当前终端。另外注意 Key 前后不要有多余空格复制的时候容易带换行符。还有一种情况你在 TaoToken 控制台创建的是用于「模型对话」的临时 Key和用于 API 调用的 Key 权限不同。如果反复确认后依然 401去控制台重新创建一个 Key 再试。6.2 404 或模型名报错如果报错信息里包含404 Not Found先检查ANTHROPIC_BASE_URL是不是多写了/v1。正确值必须是https://taotoken.net/api而不是https://taotoken.net/api/v1。Anthropic SDK 会自己拼路径TaoToken 的兼容层已经处理好了。如果错误提示是模型不存在那就要去模型广场核对model字段。原文里写的是glm-4.6和sonnet但你的脚本里不一定要用这两个。打开 TaoToken 模型广场看当时支持哪些模型 ID把ClaudeAgentOptions里的model和AgentDefinition里的model都改成广场上真实存在的值。改完重启脚本报错就会消失。7. 剩下的事把 LangChain 放一边用 TaoToken 跑非编码工作流这个示例跑通后你其实已经拥有了一条轻量的「AI 资讯处理流水线」。它不需要 L1 到 L5 的学习路线图也不需要 LangChain 的记忆模块和工具装饰器。Claude Agent SDK 原生支持工具、MCP、子代理而 TaoToken 解决了这条链路最外围的凭据和通道问题。7.1 核心价值回顾我印象最深的一点是AgentDefinition定义子代理的方式比 LangChain 里创建AgentExecutor要直观得多。你只需要描述职责、给出 prompt、指定工具剩下的任务拆解由主代理在运行时决定。再加上 Firecrawl 这类 MCP 服务器作为数据接口整个代理就能接触真实世界的新鲜内容而不只是停留在提示词层面。这种组合特别适合非编码任务每日新闻摘要、多语言翻译、竞品情报整理、会议纪要提炼。只要你能把任务描述清楚Claude Agent SDK 就能把它拆成子任务再通过 MCP 连接外部数据源。TaoToken 在这里的作用就是让你不用纠结官方额度、多 Key 管理和不同工具的 Base URL 差异统一走https://taotoken.net/api这一条通道。7.2 下一步动作如果你也想复现这个新闻代理建议按这个顺序操作先在 TaoToken 模型对话 里用同一把 Key 发一条消息确认模型 ID 和 Base URL 没填错然后去 创建 Key 拿一把新的 API Key导出环境变量最后运行上面的脚本。如果打算把 Claude Code 也接进来可以参考 Claude Code 接入文档。等文件生成、控制台看到用量记录你就能确定这套通道可以稳定支撑后续的自动化工作流了。