ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【万字长文】LangChain DeepAgents 实战:用 TaoToken 统一 Key 搭建智能研究助手

【万字长文】LangChain DeepAgents 实战:用 TaoToken 统一 Key 搭建智能研究助手 1. 从多 Key 混乱到统一入口DeepAgents 研究助手到底解决什么问题LangChain DeepAgents 是 LangChain 团队开源的一个智能体框架专门为长周期、高复杂度的任务设计。它基于 LangChain 和 LangGraph 构建内置了任务规划、文件系统、子智能体等能力让智能体能够自主拆解任务、逐步执行、动态调整策略而不需要开发者从零搭建底层逻辑。简单说你给它一个研究问题它会自己规划步骤、调用搜索工具、整理发现、写出报告。适合谁用三类人最直接受益一是做行业研究、竞品分析的产品和运营同学需要快速产出结构化报告二是做 AI 应用开发的后端工程师想给自己的系统加一个能自主研究的 Agent 模块三是学生和研究者需要批量处理文献调研、数据对比这类重复性工作。但真正落地时第一个卡住大多数人的不是 Agent 逻辑而是模型 Key 的管理问题。DeepAgents 默认走 OpenAI 兼容接口而实际项目里你往往需要同时用多个模型规划阶段用推理强的执行阶段用速度快的报告润色用文笔好的。每个模型一个 Key、一个 Base URL散落在环境变量、配置文件、代码硬编码里换一个模型就要改三处调试时根本分不清是 Key 失效还是模型不兼容。我试过在一个研究助手项目里同时接了四个模型供应商结果光是排查一个 401 就花了半小时——最后发现是某个环境变量在子进程里没继承到。这种问题不是技术难点但极其消耗精力。TaoToken 在这里的价值就很明确它提供一个统一的 OpenAI 兼容入口你只需要一个 Key、一个 Base URL就能在多个模型之间切换。对于 DeepAgents 这种需要频繁调用不同模型能力的场景统一 Key 意味着配置只写一次模型 ID 改一个字符串就行。下面我会从环境准备开始一步步带你搭出一个能跑通完整研究任务的智能助手包括 config.toml 和 settings.json 的骨架、TaoToken 的接入步骤以及调用链的验证方法。2. TaoToken 前置准备统一 Key 与 OpenAI 兼容配置怎么接在开始写 DeepAgents 代码之前先把模型接入层理顺。TaoToken 的核心能力是提供 OpenAI 兼容的 API 网关你拿到的 Key 可以调用它支持的多个模型Base URL 统一为https://taotoken.net/api。这意味着你不需要为每个模型单独申请 Key、单独配 Base URLDeepAgents 里init_chat_model的配置可以保持极简。第一步获取 API Key。访问 TaoToken 控制台的 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content创建一个新的 Key。建议按项目命名比如deepagents-research方便后续排查。创建后立即复制保存页面刷新后不会再显示完整 Key。第二步确认你要用的模型 ID。TaoToken 的模型对话页面https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content列出了当前可用的模型及其调用名称。DeepAgents 的研究助手场景我建议规划阶段用推理能力强的模型执行和搜索阶段用响应快的模型。你可以在页面上对比不同模型的定位选一个作为主模型先跑通。第三步理解配置结构。DeepAgents 通过init_chat_model初始化模型它接受openai:前缀的模型字符串并读取OPENAI_BASE_URL和OPENAI_API_KEY两个环境变量。所以你的配置只需要两行export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEY你的TaoToken Key如果你用.env文件管理就写成OPENAI_BASE_URLhttps://taotoken.net/api OPENAI_API_KEYsk-你的Key这里有个容易踩的坑Base URL 末尾不要加/v1。TaoToken 的 API 地址是https://taotoken.net/apiOpenAI SDK 会自动拼接/chat/completions等路径。如果你手动加了/v1会变成/api/v1/chat/completions导致 404。这一点和某些其他网关的约定不同务必注意。第四步验证 Key 是否可用。在写 DeepAgents 代码之前先用一个最简单的 curl 确认连通性curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $OPENAI_API_KEY \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [{role: user, content: 回复OK}], max_tokens: 10 }如果返回包含choices的 JSON说明 Key 和 Base URL 都正确。如果返回 401检查 Key 是否复制完整如果返回 404检查 Base URL 是否多了/v1。这一步花两分钟能省掉后面半小时的排查。关于长期编码和 Agent 场景如果你打算把研究助手做成持续运行的服务可以了解 TaoToken 的 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content它在调用额度和并发上有更适合 Agent 场景的配置。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content里面有各语言 SDK 的示例。3. 可复制配置config.toml 与 settings.json 骨架及 DeepAgents 初始化这一节给出完整的配置文件骨架和 DeepAgents 初始化代码。你可以直接复制到项目里改掉 Key 和模型 ID 就能跑。先建项目结构deepagents-research/ ├── config.toml ├── settings.json ├── mcp_server.py ├── research_agent.py └── .envconfig.toml用来管理模型和运行参数[model] base_url https://taotoken.net/api api_key_env OPENAI_API_KEY default_model 你的模型ID temperature 0 [agent] max_iterations 15 stream_mode [updates, messages] [mcp] web_search_url http://localhost:6030/sse transport ssesettings.json用来管理 MCP 工具和系统提示词{ mcp_servers: { web-search: { url: http://localhost:6030/sse, transport: sse } }, system_prompt: 你是一位研究专家。你的工作是根据用户的要求进行彻底的研究然后写一份润色的报告。\n\n## 工作流程\n1. 理解核心需求识别关键要素。\n2. 制定任务规划明确待办事项。\n3. 逐步研究记录发现验证结论。\n4. 整体结果和审查必要时重新制定解决链路。\n5. 输出详细研究报告。 }.env文件OPENAI_BASE_URLhttps://taotoken.net/api OPENAI_API_KEYsk-你的TaoToken Key接下来是 MCP Server把搜索能力封装成工具。这里用 Tavily 作为搜索后端你需要去 Tavily 官网申请一个 Key免费额度够测试用from mcp.server.fastmcp import FastMCP from typing import Literal from tavily import TavilyClient mcp FastMCP(Web-Search-Server) tavily_client TavilyClient(api_keytvly-你的Tavily Key) mcp.tool() def web_search(query: str, max_results: int 5, topic: Literal[general, news, finance] general, include_raw_content: bool False): Run a web search return tavily_client.search( query, max_resultsmax_results, include_raw_contentinclude_raw_content, topictopic, ) mcp.tool() def extract(url: str): Extract web page content from URL. return tavily_client.extract(url) if __name__ __main__: mcp.settings.port 6030 mcp.run(sse)启动 MCP Serverpython mcp_server.py看到Uvicorn running on http://0.0.0.0:6030就说明搜索工具服务起来了。然后是 DeepAgents 主程序research_agent.pyimport os import asyncio import tomllib from langchain_core.messages import AIMessageChunk from deepagents import create_deep_agent from langchain_mcp_adapters.client import MultiServerMCPClient from langchain.chat_models import init_chat_model # 读取配置 with open(config.toml, rb) as f: config tomllib.load(f) os.environ[OPENAI_BASE_URL] config[model][base_url] os.environ[OPENAI_API_KEY] os.environ.get(config[model][api_key_env], ) system_prompt 你是一位研究专家。你的工作是根据用户的要求进行彻底的研究然后写一份润色的报告。 ## 工作流程 1. 理解核心需求识别关键要素。 2. 制定任务规划明确待办事项。 3. 逐步研究记录发现验证结论。 4. 整体结果和审查必要时重新制定解决链路。 5. 输出详细研究报告。 async def main(): # 初始化模型走 TaoToken 统一入口 llm init_chat_model( fopenai:{config[model][default_model]}, temperatureconfig[model][temperature] ) # 连接 MCP Server client MultiServerMCPClient( { web-search: { url: config[mcp][web_search_url], transport: config[mcp][transport] } } ) tools await client.get_tools() # 创建深度智能体 agent create_deep_agent( modelllm, toolstools, system_promptsystem_prompt ) # 执行研究任务流式输出 async for stream_type, chunk in agent.astream( input{ messages: [ {role: user, content: 埃菲尔铁塔与最高建筑相比有多高} ] }, stream_mode[updates, messages] ): if stream_type messages and type(chunk[0]) is AIMessageChunk: content chunk[0].content if not content: continue print(content, end, flushTrue) elif stream_type updates: if model in chunk: model chunk[model] if messages in model: messages model[messages] for message in messages: tool_calls message.tool_calls for tool_call in tool_calls: name tool_call[name] args tool_call[args] if name write_todos: todos args[todos] print_todos [] for todo in todos: todo_content todo[content] status todo[status] print_todos.append(f {todo_content} -- {status}) if print_todos: print_todos \n.join(print_todos) print(f\n TODO: \n{print_todos}\n\n) else: print(f\n Call MCP: {name}, args: {args}\n) if tools in chunk: tools chunk[tools] if messages in tools: messages tools[messages] for message in messages: content message.content if Updated todo list in content: continue print(\nMCP Result: \n, content, \n) if __name__ __main__: asyncio.run(main())这份配置的关键点模型初始化只依赖OPENAI_BASE_URL和OPENAI_API_KEY两个环境变量切换模型只需要改config.toml里的default_model。MCP 工具的地址和传输方式也在配置里不硬编码在代码中。这样你换模型、换搜索服务都不用动主逻辑。4. 验证请求与成功结果跑通一次完整研究任务配置写好后跑一次完整的研究任务来验证整条链路。确保 MCP Server 已经在 6030 端口运行然后执行python research_agent.py如果一切正常你会看到智能体先输出任务规划类似 TODO: 搜索埃菲尔铁塔的准确高度信息 -- in_progress 搜索世界最高建筑的信息和高度 -- pending 对比分析两者的高度差异 -- pending 整理并撰写详细的对比报告 -- pending然后它会调用 MCP 搜索工具 Call MCP: web_search, args: {query: 埃菲尔铁塔高度 准确数据 米}搜索返回后待办状态更新 TODO: 搜索埃菲尔铁塔的准确高度信息 -- completed 搜索世界最高建筑的信息和高度 -- in_progress 对比分析两者的高度差异 -- pending 整理并撰写详细的对比报告 -- pending接着继续搜索世界最高建筑最后进入报告撰写阶段。完整输出会包含一份结构化的研究报告里面有数据对比表格和结论。这里验证了几个关键点模型调用走的是 TaoToken 的 Base URLMCP 工具通过 SSE 正常连接DeepAgents 的任务规划、工具调用、状态更新、报告生成四个环节都跑通了。如果你看到的输出里 TODO 状态在流转、MCP 调用有返回、最后有报告正文说明整条链路没有问题。再测一个稍微复杂的问题比如“深度研究一下 CSDN 小毕超博主”观察智能体是否能自主拆解出多个搜索子任务、调用 extract 工具抓取页面、最后整合成报告。这一步能验证 DeepAgents 在长周期任务上的规划能力。如果你想在客户端里交互可以把这套逻辑封装成 OpenAI 兼容接口用 Cherry Studio 或 OpenWebUI 连接。核心是用 FastAPI 包一层/v1/chat/completions内部调用agent.astream把流式输出转成 SSE 格式返回。这样你就能在图形界面里提问看到智能体的完整研究过程。封装时注意两点一是 API Key 校验要独立于模型 Key客户端填的是你自定义的 Key不是 TaoToken 的 Key二是工具输出内容较多时可以选择只回传模型生成的文本把工具调用细节留在服务端日志里避免客户端界面被刷屏。5. 本篇常见错误排查401、local proxy failed、reading choices 怎么解跑 DeepAgents 接入 TaoToken 的过程中有几个报错出现频率很高。这一节按报错信息对照排查。401 Invalid authentication credentials这是最常见的。先检查.env里的OPENAI_API_KEY是否完整复制有没有多余空格。然后确认OPENAI_BASE_URL是https://taotoken.net/api不是https://taotoken.net/api/v1。如果 Key 确认没问题去 TaoToken 控制台看这个 Key 是否被禁用或额度耗尽。还有一种情况你在代码里同时设置了os.environ和.env文件两者冲突时以代码里的为准检查代码里有没有硬编码旧的 Key。local proxy failed / connection refused这个报错通常出现在 MCP Server 连接环节。检查mcp_server.py是否在运行端口是否是 6030。如果 MCP Server 启动时报端口占用改config.toml里的web_search_url和mcp_server.py里的mcp.settings.port为同一个新端口。另外确认transport写的是sse不是stdio或streamable_http。DeepAgents 通过MultiServerMCPClient连接时URL 要带/sse后缀。Error reading choices / KeyError: choices这个报错说明 API 返回的 JSON 结构里没有choices字段。常见原因有三个一是模型 ID 写错了TaoToken 返回了错误信息而不是正常响应二是请求体格式不对比如messages为空三是 Base URL 拼错请求打到了错误的路径。排查方法用第 2 节的 curl 命令单独测一次看返回的原始 JSON 是什么。如果返回{error: ...}根据错误信息调整。OAuth / token expired如果你用的是某些需要 OAuth 的模型服务可能会遇到 token 过期。TaoToken 的 Key 是长期有效的不存在 OAuth 刷新问题。如果你在代码里混用了其他服务的 OAuth token检查环境变量是否被覆盖。建议在项目里只保留一套OPENAI_BASE_URL和OPENAI_API_KEY避免多套凭证互相干扰。Agent 卡住不输出 / 一直 in_progress这不是报错但很常见。原因通常是模型返回了工具调用但 MCP Server 没有正确响应或者max_iterations设得太小导致提前终止。检查 MCP Server 日志有没有收到请求检查config.toml里max_iterations是否够用研究任务建议 15 以上。另外如果模型不支持 function callingDeepAgents 无法正常调用工具换一个支持工具调用的模型 ID。流式输出中断 / 只输出一半检查stream_mode是否同时包含updates和messages。如果只写messages你会看到模型文本但看不到 TODO 状态和工具调用如果只写updates你会看到状态但看不到报告正文。两个都要。另外客户端封装 SSE 时确保每个 chunk 以data:开头、以\n\n结尾最后发送data: [DONE]。6. 从跑通到用好研究助手的调优与长期运行建议跑通一次研究任务只是起点。要让这个助手真正好用还有几个调优方向。第一模型分层。规划阶段用推理强的模型执行搜索和内容提取用响应快的模型报告润色用文笔好的模型。DeepAgents 支持在create_deep_agent里指定不同模型你可以根据任务阶段动态切换。TaoToken 的统一 Key 让这种切换只需要改模型 ID 字符串不用重新配置凭证。第二系统提示词要具体。上面给的 system_prompt 是通用模板实际使用时根据你的研究领域调整。比如做技术调研加上“优先引用官方文档和 GitHub 仓库”做市场分析加上“关注数据来源的时效性和权威性”。提示词越具体智能体的规划越有针对性。第三MCP 工具可以扩展。除了 web_search 和 extract你可以把数据库查询、文件读取、API 调用都封装成 MCP 工具。DeepAgents 会自动把这些工具纳入任务规划。比如加一个query_internal_db工具智能体就能在研究中结合内部数据。第四长期运行要考虑并发和限流。如果你把研究助手做成服务多个请求同时进来时注意 MCP Server 的连接数和模型 API 的并发限制。TaoToken 的 Coding Plan 在并发上有更适合 Agent 场景的配置接入文档里有详细的限流说明和最佳实践。第五日志和可观测性。DeepAgents 的astream会输出完整的执行轨迹建议把这些轨迹存下来。出问题时可以回看智能体的决策过程定位是规划错了、工具调用失败了、还是模型输出质量不行。这比只看最终报告有用得多。最后说一个实际经验研究助手的输出质量很大程度上取决于搜索工具返回的内容质量。Tavily 的include_raw_content参数设为 True 时会返回网页正文智能体基于正文写报告比基于摘要写报告准确得多。但正文会占用更多 token需要在质量和成本之间权衡。我的做法是第一轮搜索用摘要快速定位第二轮对关键页面用 extract 抓正文深入分析。这套配置和代码你可以直接复制到项目里改掉 Key 和模型 ID 就能跑。遇到报错对照第 5 节排查基本能覆盖 90% 的问题。
返回列表