4.5. 跨框架 Skills 互操作是避免供应商锁定的关键

跨框架 Skills 互操作是避免供应商锁定的关键

2026 年 5 月,你在 CrewAI 里精心打磨了一个“深度调研”Skill:先并行搜索 Google 和 arXiv,再用浏览器渲染动态页面,最后交给本地模型整理摘要。第二天同事问:“能把这个 Skill 直接挂到 LangGraph 的工作流里吗?”你沉默了几秒,发现自己把 SearchTool、Playwright 和推理逻辑全都写在了 CrewAI 的 @tool 装饰器里——它已经和框架长在了一起。这不是某个团队的偶然失误,而是一个正在扩大的行业隐患:每多选一个 Agent 框架,Skill 就要重写一次;框架一迭代,依赖库一换,几十个 Skill 就成了技术债。

当前的多框架格局正在加速演变。LangGraph、CrewAI、AutoGen、Agno、Semantic Kernel……各自定义了不同的 Tool/Skill 接口、调用协议和任务编排方式。与此同时,两大互通协议——Anthropic 主导的 Model Context Protocol(MCP) 和 Google 推出的 Agent-to-Agent Protocol(A2A)——已于 2025 年底相继进入 Linux 基金会旗下 Agentic AI Foundation (AAIF) 的统一治理,覆盖工具调用、资源访问与智能体间协作。这些协议让“一次定义、跨框架复用”的 Skill 互操作不再是空谈,而是眼下就可落地的架构决策。

本章将拆解三层关键:描述格式、运行时适配、社区验证,让你能够设计一套适配层,让 Skill 的定义与框架彻底解耦——今天在 CrewAI 当研究员,明天换 AutoGen 照样用。

互操作的三个维度:现状与评估

想实现跨框架 Skill 复用,不能只靠“写个适配器”的念头。我们从 Skill 描述格式、运行时代理/自动转换、社区实践 三个维度切入,逐一分析现有方案的可操作性、风险与投入成本。

维度一:通用 Skills 描述格式——基于 OpenAPI 的扩展标准

问题的起点是:如何用一种框架无关的方式把“Skill 能干什么、怎么调用、需要什么权限”完整描述出来?目前社区形成了三种流派:

描述方式 代表方案 互操作范围 优势 劣势 作者结论
协议原生格式(MCP 的 Tool 列表、A2A 的 Agent Card) MCP 的 tools/list、A2A 的 /.well-known/agent-card.json 协议内通用,跨框架可用 标准化程度高,已有大量生态工具 较难表达复杂组合逻辑与依赖关系 推荐作为基础传输和发现层
包管理风格(OpenAI Codex / Claude Skills) SKILL.md + 目录约定,或 skill.json 单一平台内复用 上手快,对单体代理友好 无统一语义,绑定平台特性 仅适用于轻量场景,不适合跨框架长期继承
结构化扩展 Schema(基于 OpenAPI / JSON Schema 的扩展) 自定义 skill.schema.json(可参考 OpenAPI 3.1 的扩展点 x-skill-* 全框架通用(需适配器) 可以表达输入/输出类型、并发限制、权限声明、组合关系 需要自建生态,维护成本较高 是长期战略的最佳选择,但需要配套运行时适配层

当前调研资料显示,MCP 的 tools/list 和 A2A 的 Agent Card 已经可以覆盖大部分 Skill 的能力声明——工具名称、描述、输入参数 Schema、输出 Schema。缺失的是更复杂的元信息:超时限制、并发上限、依赖的其他 Skill、执行成本预估等。因此一个务实的方案是:以 OpenAPI 3.1 为基底,扩展自定义字段来承载这些元信息,同时保留一个“协议映射层”将 Skill 描述自动转换为 MCP Tool 或 A2A Agent Card。

示例:一个通用 Skill 描述片段(JSON Schema 混 YAML 表示):

openapi: "3.1.0"
info:
  title: "Deep Research Skill"
  version: "1.2.0"
x-skill-type: "tool"
x-skill-concurrency: 5
x-skill-timeout: 30s
paths:
  /deep-research:
    post:
      operationId: execute
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/QueryInput"
      responses:
        "200":
          description: "Structured research results"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResearchResult"
components:
  schemas:
    QueryInput:
      type: object
      properties:
        topic:
          type: string
        max_sources:
          type: integer
          default: 10

这个描述可以自动生成 MCP 的 Tool 结构、A2A 的 Agent Card,同时能被一个运行时代理解读,用于并发控制和超时处理。

维度二:运行时代理与自动转换——动态适配层的设计

有了标准描述只是第一步,真正的难关在于如何让不同框架“执行”同一个 Skill。因为框架内部的调用方式差异很大:CrewAI 要求 Tool 是可调用对象,LangGraph 需要 BaseTool 或函数节点,AutoGen 使用 @tool 装饰且依赖消息流,Semantic Kernel 则通过 KernelFunction 插件系统。

核心思路:构建一个轻量级的 Runtime Proxy,它接收来自任意框架的标准请求(例如根据 MCP 的 tools/call 或自己定义的 HTTP API),将其翻译为目标 Skill 的实际执行体,再把结果按原格式返回。架构如下:

  • Skill Execution Engine:负责加载 Skill 定义,管理生命周期、并发、超时、重试等,具体执行可由本地函数、Docker 容器或远程 MCP Server 完成。
  • Framework Adapter:每个框架提供一个 Adapter(插件),实现框架特定的 Tool/Skill 接口,内部则向 Proxy 发起调用。这样框架开发者感觉就像一个“本地工具”,但实际执行在统一的 Skill 层。
  • Discovery Layer:根据框架的要求提供 Skill 列表。例如在 LangGraph 中,Adapter 可以查询 Proxy,自动生成 ToolNode 列表;在 A2A 中,Adapter 就是 Agent Card 的生成器。

这种设计类似于浏览器中的 Web Component:每个框架通过标准 DOM 事件访问组件,而组件本身与框架无关。我们已经在调研材料中观察到类似实践——GitHub 上的 obra/superpowers 项目使用可组合的 Skill 目录和指令,虽然它侧重编码助手,但其“Skill 与代理指令分离”的理念完全可借鉴。

关键设计决策:调用协议建议统一采用 MCP 的 Streamable HTTP(而非旧版 HTTP+SSE),因为它原生支持请求-响应、流式结果和服务器推送,且 Google AI Agents Intensive 2025 的资料也确认了该方式对现代 Agent 工具的兼容性。安全层统一使用 OAuth 2.1 with Resource Indicators,避免后续跨框架调用时的认证重写。

维度三:验证与社区实践调查——避坑与可行性

实现跨框架适配层之前,必须正视社区已有的尝试和它们暴露出的局限。我们从几个有代表性的项目切入:

项目/实践 互操作方式 成熟度 暴露的问题 对适配层设计的启示
MCP + A2A 联合使用 MCP 提供工具整合,A2A 做 Agent 发现与任务委派 高(已有 Azure Agent Factory 等落地案例) 两个协议之间缺乏官方映射规范,需自行处理能力转换和任务状态同步 适配层必须预留协议映射表,避免硬编码
SkillsMP 市场 / LobeHub Skills Marketplace 聚合 Codex、Claude 等平台的 Skill 包 低(社区驱动,格式各异) Skill 定义严重依赖特定平台指令格式(如 Claude 的 SKILL.md),无法直接跨框架 不要寄望于“市场”解决跨框架,关键在于标准定义
开源适配器项目(如 agent-framework-adapter 等) 手动将 CrewAI 工具转换为 LangChain 工具 每个转换都需手写,工具量变大时不可维护 运行时自动转换是唯一可扩展方案
ANP 等去中心化协议 基于 W3C DID 和代理发现的最彻底解耦 低(标准仍在早期) 引入大量复杂度和延迟,没有在生产环境大规模验证 现阶段作为远期目标,不要在基础适配层中绑定

从调研材料看,仅靠单一协议或手动适配是无法避免框架锁定的。MCP 解决了工具调用的标准化,A2A 解决了 Agent 间如何发现和委托任务,但二者协同才能构成完成的互操作基础。未来一项重要进展是 MCP/A2A 联合规范(据 zylos.ai 报告,2026 Q3 可能出现),在此之前设计适配层时应明确层次:底层协议适配、中层 Skill 抽象、顶层框架插件,任何一层改动都不应波及其他层。

结论:跨框架 Skill 复用的最佳路径

核心结论

  1. 采用 OpenAPI 3.1 扩展 Schema 作为 Skill 的规范描述,同时生成 MCP Tool 和 A2A Agent Card 协议表示,这是当前性价比最高的解耦方案。
  2. 构建 Runtime Proxy + Framework Adapter 的双层架构,让每个框架通过统一 API 执行 Skill,彻底切断 Skill 实现与框架之间的耦合。

将不同方案的对比落在下表,方便你做架构决策:

方案 投入 解耦程度 适用规模 远期风险 作者推荐指数
纯 MCP(无 A2A 和多框架适配) 仅解除工具与框架的绑定 小团队,单框架为主 切换框架时仍需修改任务编排代码 ★★★☆
MCP + A2A,手动为每个框架编写工具包装器 实现工具和发现解耦,但调用层仍依赖人工编码 中小型项目 工具数量增多后维护成本飙升 ★★★
自定义 Skill Schema + Runtime Proxy + 自动适配器 高(初期) 全解耦,Skill 与框架互不影响 中大型工程,长期维护 需要社区推动标准,初始开发成本高 ★★★★★
等待市场成熟后再采用 试图观望的团队 框架锁定风险最高,未来迁移代价巨大 ★☆

按场景推荐:从现在开始怎么做

根据你当下的项目阶段,可以分三种策略落地:

  • 场景 A:已有多个 MCP 工具,要扩展到多个框架
    立即建立一个内部的 Skills Schema Registry,把现有 MCP 工具注册进来,附带并发限制、超时等元信息。然后为每个框架编写一个 Adapter,封装 Proxy 调用。这样新 Skill 直接按 Schema 定义,无需再为框架不同而重复开发。

  • 场景 B:刚开始构建 Agent 系统,希望一步到位避免锁定
    从 Day 1 就采用自定义 Schema + Proxy 架构。Skill 的第一次落地仍然需要绑定到具体框架(比如 CrewAI),但代码中只调用 Proxy 的接口,框架 Adapter 作为薄薄的一层接入。未来换框架时,只需替换 Adapter,Skill 本身零改动。

  • 场景 C:已有大量单体 Agent 代码,想逐步解耦
    抽取最常用、跨团队复用频率最高的 Skill(如“网页抓取”“数据库查询”),按 Schema 重构并接入 Proxy。其他低频 Skill 暂时保留原样。逐步用自动化工具扫描代码,将硬编码的 @tool 函数标记为待迁移项,设定季度迁移目标。

实施中的几个关键提醒(基于调研资料中的坑):

  1. 传输层立刻切换到 MCP Streamable HTTP,旧 HTTP+SSE 会在 2026 年底被逐渐弃用。
  2. 安全认证统一用 OAuth 2.1 + Resource Indicators,不要为每个框架实现不同认证。
  3. Skill 描述中的 operationId 必须保持稳定且唯一,它会成为跨协议调用的唯一标识。
  4. 在 Proxy 层内置指标收集(延迟、错误率、并发数),因为跨框架调用链一旦出问题,排查极难。

所有这一切的最终目标不是“用最时髦的协议”,而是确保你的团队在未来三到五年的技术演进中,不会因为框架更替而被迫丢弃积累的领域能力。Skill 不是 UI 组件,换一套框架重新画一遍界面也许可行;Skill 是团队对一个专业问题的经验编码,是时间的沉淀——它们理应比任何框架都活得更久。


至此,你的 Skill 已经可以横跨 CrewAI、LangGraph 和 AutoGen 自由流动了。但另一个问题立刻浮出水面:当多个任务同时触发同一个 Skill,或者一个 Skill 内部需要向数十个数据源并行发出请求,如何保证不超时、不阻塞、不拖慢整个系统?下一章 《异步任务与并发控制决定了 Skills 的吞吐量》 将拆解异步 I/O、任务队列和背压机制,让你的 Skill 在高并发下依然保持毫秒级响应。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~