首页/新闻资讯/正文详情

LangChain多智能体之Skills:用TaoToken统一Key打通配置骨架

发布时间:2026/9/26 13:12:22 来源:云帆数科 栏目:资讯中心
LangChain多智能体之Skills:用TaoToken统一Key打通配置骨架
1. 多智能体 Skills 场景下Key 分散到底有多痛LangChain 的多智能体 Skills 结构本质是把「专项能力」封装成可被 agent 按需调用的技能单元。每个技能由专用提示词驱动agent 根据上下文动态加载而不是一次性把所有能力塞进系统提示词。这套渐进式披露progressive disclosure的思路和 Agent Skills、llms.txt 的设计理念高度一致——通过工具调用实现文档的渐进式暴露只不过技能模式把这种「渐进式暴露」用在了专用提示词和领域知识上。问题出在落地阶段。当你按官方教程搭一个 SQL 助手代码里会同时出现好几个模型入口主 agent 用ChatOpenAI(modelgpt-4.1)某个技能内部可能想换成 Claude 做长文审阅另一个技能想用本地小模型做分类。于是环境变量里躺着OPENAI_API_KEY、ANTHROPIC_API_KEY、DASHSCOPE_API_KEY……每加一个技能就多一份 Key 管理成本。本地开发时更乱.env文件散落在多个目录settings.json和config.toml各写一份改一个模型要翻三个文件。我试过在一台机器上同时跑三个 Skills demo结果因为 Key 前缀写错、base_url 漏配agent 在load_skill之后调用模型直接 401排查了半小时才发现是环境变量没生效。这类问题不涉及算法纯粹是配置骨架没搭好。这篇就聚焦一件事用 TaoToken 统一 Key 和 API 通道把 LangChain 多智能体 Skills 的配置收敛成一份可复制的骨架并给出启动后验证调用链是否连通的检查动作。适合谁看正在本地开发或调试 LangChain 多智能体、被多模型 Key 分散困扰、想要一份能直接抄的settings.json/config.toml配置的开发者。读完你能拿到两套配置模板、一段可运行的 Skills 加载代码以及一套验证调用链的检查清单。2. TaoToken 前置统一 Key 与 API 通道TaoToken 在这里扮演的角色很单纯它是一个统一的模型接入通道。你不需要为每个模型厂商单独维护 Key而是用一份 TaoToken 的 API Key通过统一的 base_url 去调用不同模型。对 LangChain 来说这意味着ChatOpenAI、ChatAnthropic这些类的base_url和api_key可以指向同一个入口模型名通过参数区分。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数配置里直接写这个。你需要先拿到 API Key。进入控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 然后在 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。生成后复制那串sk-开头的字符串后面配置里会用到。注意API Key 只显示一次生成后立刻保存到本地配置文件或密码管理器。不要提交到 Git 仓库。如果你只是想先验证模型能不能通可以直接用模型对话页面测一下https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。确认通道可用后再往下做 LangChain 集成。对于长期跑编码任务或 Agent 的场景可以考虑 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到参数细节可以对照查。3. 可复制配置骨架settings.json 与 config.toml配置骨架的目标是一份文件管住所有模型的 Key 和 base_urlSkills 代码只读配置不硬编码。下面给两套按你的项目习惯选一套即可。3.1 settings.json 骨架适合 Python 项目用pydantic-settings或直接json.load读取。放在项目根目录的config/settings.json{ taotoken: { api_key: sk-你的TaoToken密钥, base_url: https://taotoken.net/api, default_model: gpt-4.1, timeout: 60, max_retries: 2 }, models: { main_agent: { model: gpt-4.1, temperature: 0.2 }, skill_sql: { model: gpt-4.1, temperature: 0.0 }, skill_review: { model: claude-3-5-sonnet-20241022, temperature: 0.3 } }, skills: { enabled: [sales_analytics, inventory_management], load_tool_name: load_skill } }读取代码import json from pathlib import Path def load_settings(path: str config/settings.json) - dict: with open(Path(path), r, encodingutf-8) as f: return json.load(f) settings load_settings() tt settings[taotoken]3.2 config.toml 骨架如果你偏好 TOML放在config/config.toml[taotoken] api_key sk-你的TaoToken密钥 base_url https://taotoken.net/api default_model gpt-4.1 timeout 60 max_retries 2 [models.main_agent] model gpt-4.1 temperature 0.2 [models.skill_sql] model gpt-4.1 temperature 0.0 [models.skill_review] model claude-3-5-sonnet-20241022 temperature 0.3 [skills] enabled [sales_analytics, inventory_management] load_tool_name load_skill读取代码Python 3.11 自带 tomllibimport tomllib from pathlib import Path def load_config(path: str config/config.toml) - dict: with open(Path(path), rb) as f: return tomllib.load(f) config load_config() tt config[taotoken]3.3 把配置接到 LangChain 模型上关键点所有模型类都指向同一个base_url和api_key模型名从配置里取。import os from langchain_openai import ChatOpenAI def build_model(cfg: dict, role: str main_agent) - ChatOpenAI: tt cfg[taotoken] m cfg[models][role] return ChatOpenAI( modelm[model], temperaturem.get(temperature, 0.2), api_keytt[api_key], base_urltt[base_url], timeouttt.get(timeout, 60), max_retriestt.get(max_retries, 2), ) main_model build_model(config, main_agent) sql_model build_model(config, skill_sql)这样 Skills 中间件和load_skill工具都不需要关心 Key 从哪来只从config里拿模型实例。新增一个技能时只在models段加一条代码零改动。提示base_url末尾不要带/v1TaoToken 的 API 入口是https://taotoken.net/apiSDK 会自己拼接路径。如果你用的是 Anthropic SDKbase_url 同样填这个模型名用claude-3-5-sonnet-20241022这类标识。4. 验证请求Skills 调用链是否连通配置写完不算完要验证「agent → load_skill → 模型 → 返回」这条链真的通了。下面给一个最小可运行的 Skills 骨架然后给检查动作。4.1 最小 Skills 骨架from typing import TypedDict from langchain.tools import tool from langchain.agents import create_agent from langchain.agents.middleware import ModelRequest, ModelResponse, AgentMiddleware from langchain.messages import SystemMessage from langgraph.checkpoint.memory import InMemorySaver from typing import Callable class Skill(TypedDict): name: str description: str content: str SKILLS: list[Skill] [ { name: sales_analytics, description: 用于销售数据分析的数据库结构和业务逻辑包括客户、订单和收入。, content: # 销售分析 Schema\n## 表结构\n### customers\n- customer_id (主键)\n- name\n- email\n- status (active/inactive)\n### orders\n- order_id (主键)\n- customer_id (外键)\n- total_amount\n- status (pending/completed/cancelled)\n## 业务逻辑\n高价值订单total_amount 1000\n收入计算仅统计 status completed 的订单, }, { name: inventory_management, description: 用于库存跟踪的数据库结构和业务逻辑包括产品、仓库和库存水平。, content: # 库存管理 Schema\n## 表结构\n### products\n- product_id (主键)\n- product_name\n- reorder_point\n- discontinued (布尔值)\n### inventory\n- product_id (外键)\n- warehouse_id (外键)\n- quantity_on_hand\n## 业务逻辑\n需要补货的产品总库存 reorder_point, }, ] tool def load_skill(skill_name: str) - str: 将技能的完整内容加载到智能体上下文中。 当需要详细了解如何处理某类请求时使用此工具。 参数: skill_name: 要加载的技能名称 for skill in SKILLS: if skill[name] skill_name: return f已加载技能: {skill_name}\n\n{skill[content]} available , .join(s[name] for s in SKILLS) return f未找到技能 {skill_name}。可用技能{available} class SkillMiddleware(AgentMiddleware): tools [load_skill] def __init__(self): skills_list [f- **{s[name]}**: {s[description]} for s in SKILLS] self.skills_prompt \n.join(skills_list) def wrap_model_call( self, request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse], ) - ModelResponse: skills_addendum ( f\n\n## 可用技能\n\n{self.skills_prompt}\n\n 当需要详细了解如何处理某类请求时请使用 load_skill 工具。 ) new_content list(request.system_message.content_blocks) [ {type: text, text: skills_addendum} ] new_system_message SystemMessage(contentnew_content) modified_request request.override(system_messagenew_system_message) return handler(modified_request) agent create_agent( main_model, system_prompt你是一个 SQL 查询助手帮助用户针对业务数据库编写查询语句。, middleware[SkillMiddleware()], checkpointerInMemorySaver(), )4.2 检查动作一模型通道连通先不跑 agent单独测模型resp main_model.invoke(回复 OK 两个字母) print(resp.content)预期输出包含OK。如果报 401检查api_key是否复制完整如果报 404检查base_url是否写成了https://taotoken.net/api不要带/v1。4.3 检查动作二load_skill 工具可调用print(load_skill.invoke({skill_name: sales_analytics})[:80])预期输出以已加载技能: sales_analytics开头。如果返回「未找到技能」说明SKILLS列表里的name和调用参数不一致。4.4 检查动作三完整调用链import uuid thread_id str(uuid.uuid4()) config {configurable: {thread_id: thread_id}} result agent.invoke( { messages: [ { role: user, content: 写一个 SQL 查询找出上个季度收入排名前 10 的客户, } ] }, config, ) for message in result[messages]: if hasattr(message, pretty_print): message.pretty_print() else: print(f{message.type}: {message.content})预期输出顺序Human Message → Ai Message含load_skill的 Tool Calls→ Tool Message已加载技能: sales_analytics→ Ai Message最终 SQL。只要看到 Tool Calls 里出现load_skill且 Tool Message 返回了技能内容就说明调用链连通。5. 本篇常见错排查5.1 401 Unauthorized最常见。原因通常是api_key没读到或者读到了空字符串。检查config加载后tt[api_key]是否以sk-开头。如果你用环境变量覆盖确认os.environ里没有残留的旧 Key 把配置覆盖掉。5.2 404 Not Foundbase_url写错。正确值是https://taotoken.net/api。不要写成https://taotoken.net/api/v1也不要漏掉/api。如果你用的是ChatAnthropic同样填这个 base_url。5.3 load_skill 没被调用agent 直接回答了没有走工具。原因可能是系统提示词里没有明确告诉它「有技能可用」。检查SkillMiddleware的wrap_model_call是否真的把skills_addendum拼进了 system message。可以在wrap_model_call里加一行print(new_system_message.content)确认。5.4 技能加载了但 SQL 不对技能内容里的表结构和业务逻辑要写清楚。比如「高价值订单」的定义、收入只算completed状态这些必须写进content。如果 agent 加载了技能还是写错检查content里有没有把关键字段名和状态值列全。5.5 多技能切换时模型串了如果你给不同技能配了不同模型确认build_model是按role取的。常见错误是SkillMiddleware里硬编码了main_model导致所有技能都用同一个模型。把模型实例通过构造函数传进中间件而不是在中间件里 import 全局变量。5.6 配置改了但没生效Python 进程缓存了旧配置。如果你在 Jupyter 里改settings.json需要重新执行load_settings()。如果是脚本确认没有在模块顶层把config存成全局变量后被其他模块 import 缓存。6. 继续往下走配置骨架搭好之后下一步是把技能内容从代码里挪出去。现在SKILLS是硬编码的 list实际项目里应该从文件系统或数据库加载。你可以把每个技能写成一个 Markdown 文件load_skill改成读文件这样新增技能不用改代码。模型通道方面如果你要跑更长的编码任务或 Agent 工作流可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入细节和参数说明在文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。需要新建 Key 或管理多个项目的 Key去 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。最后提醒一个实操细节把settings.json和config.toml加进.gitignore只提交一份settings.example.json作为模板。Key 泄露的代价远高于多写一行忽略规则。

相关推荐

STM32理论体系全解析:从最小系统到外设实战
STM32理论体系全解析:从最小系统到外设实战

1. STM32理论体系的全景认知1.1 为什么"理论"比"点灯"更重要很多人第一次接触STM32,都是从"点灯"开始的。买一块最小系统板,装好Keil,找个现成工程模板,改两行代码,LED亮了,… · 2026/9/26 13:12:22

OpenClaw + VibeCoding 双引擎实战:用 TaoToken 统一 Key 打通 Agent 工作流配置
OpenClaw + VibeCoding 双引擎实战:用 TaoToken 统一 Key 打通 Agent 工作流配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:12:16

新手部署 OpenClaw 总踩坑?Windows 可视化完整实操 + 问题解决方案(TaoToken 统一 Key 配置篇)
新手部署 OpenClaw 总踩坑?Windows 可视化完整实操 + 问题解决方案(TaoToken 统一 Key 配置篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:12:16

2025建站系统选型:从SaaS到开源CMS的避坑与实操指南
2025建站系统选型:从SaaS到开源CMS的避坑与实操指南

“建站系统哪个好”是我做技术咨询这几年被问得最多的问题,也是最容易一句话就把人带沟里的问题。每次有人这么问,我一般不会直接报名字,而是会反问一句:你要用这个网站干什么,准备投多少预算,团队里有没有… · 2026/9/26 13:43:41

BTC协议深度解析:从UTXO到脚本看比特币底层技术栈
BTC协议深度解析:从UTXO到脚本看比特币底层技术栈

先把话说在前面:很多人把“BTC协议”这五个字当成一个简单的名词,以为它约等于“比特币的规则”。但真到了实际工作中——无论是做钱包接入、交易广播、区块解析,还是自己跑节点、写RPC调底层接口——你会发现“BTC协议”根本不是一张纸&… · 2026/9/26 13:43:41

从UART到MQTT:嵌入式与工业协议全景解析及调试实战
从UART到MQTT:嵌入式与工业协议全景解析及调试实战

做嵌入式、工控或者网络运维的朋友,一定都见过这种场面:项目文档里写着一堆协议名字,UART、SPI、IIC、CAN、Modbus、MQTT、TCP/IP、HTTPS……每一个好像都懂一点,真到了要对接设备、抓包分析、排查问题的时候,又觉得哪… · 2026/9/26 13:43:41

百度网盘解析原理与Python实现:从分享链接到下载直链
百度网盘解析原理与Python实现:从分享链接到下载直链

先问一句:你有没有遇到过这种情况,群里有人甩出一个百度网盘链接,你复制到浏览器打开,发现文件确实在,但要么需要登录客户端,要么下载速度让人血压飙升。后来有人告诉你,可以用“百度网盘解析网… · 2026/9/26 13:43:41

SpringBoot+Android+Vue3实现仓库管理APP:从技术选型到全栈落地
SpringBoot+Android+Vue3实现仓库管理APP:从技术选型到全栈落地

最近把之前做的一个仓库管理APP项目整体复盘了一遍,发现当年选型时纠结的PHP、asp.net、java、Springboot、SSM、vue3这些关键字,其实正好覆盖了一整套移动端服务端管理后台的方案。这个项目的题目一眼看上去很吓人,像是把市面上主流技术全塞… · 2026/9/26 13:43:41

用 OpenPencil Vue SDK 打造自定义编辑器外壳:provideEditor、CanvasRoot 与无样式组件实战
用 OpenPencil Vue SDK 打造自定义编辑器外壳:provideEditor、CanvasRoot 与无样式组件实战

前端桌面应用AI 应用MCP 服务 【免费下载链接】open-pencil AI-native design editor. Open-source Figma alternative. 项目地址: https://gitcode.com/gh_mirrors/op/open-pencil 点击查看 免费下载 导读:OpenPencil 不仅是开箱即用的 AI 原生设计编辑… · 2026/9/26 13:43:35

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码