04 AgentSkills SDK 开发与框架集成实战

发布时间:2026/5/22 21:24:59

04 AgentSkills SDK 开发与框架集成实战 04 AgentSkills SDK 开发与框架集成实战关键词agentskills-core、agentskills-langchain、agentskills-mcp-server、SkillRegistry、LangChain 集成、Spring AI、自定义 Provider、技能注册、框架集成实战一、为什么需要 SDKAgent Skills 规范本身是一套文件格式标准它告诉你如何组织技能包。但在实际工程中你还需要一套代码层面的工具来回答这些问题如何从文件系统批量加载技能如何把技能目录注入到 LangChain 的 Agent 里如何通过 MCP 协议暴露技能给外部调用如何实现跨语言、跨框架的技能复用这就是Agent Skills SDK要解决的问题。SDK 把渐进式披露的加载逻辑、技能注册管理、框架适配等工程细节封装好让你专注于业务技能的开发而不是重复造轮子。二、SDK 包架构全景Agent Skills SDK 采用分层设计核心包与框架适配包分离--------------------------------------------- | 业务技能包用户自己开发 | --------------------------------------------- | | --------v-------- --------v-------- | agentskills- | | agentskills- | | langchain | | agentframework | | LangChain 适配 | | MS Agent 适配 | ----------------- ----------------- | | --------v--------------------v-------- | agentskills-core | | 注册 | 验证 | 目录管理 | 披露 API | -------------------------------------- | | --------v-------- --------v-------- | agentskills-fs | | agentskills-http| | 本地文件系统 | | HTTP 远程 Provider| | Provider | | S3/CDN/Azure | ----------------- ----------------- ------------------- | agentskills-mcp | | MCP 协议服务器 | | 向外暴露技能 | -------------------各包职责包名职责agentskills-core核心SkillRegistry、验证、技能目录管理、渐进式披露 APIagentskills-fs本地文件系统 Provider扫描本地目录加载技能agentskills-httpHTTP 远程 Provider从 S3/Azure Blob/CDN 加载技能agentskills-langchain生成 LangChain StructuredTool注入到 LangChain Agentagentskills-agentframework微软 Agent Framework 适配层agentskills-mcp-server将技能注册表暴露为 MCP 服务器三、agentskills-core基础用法3.1 安装pipinstallagentskills-core agentskills-fs3.2 初始化与注册技能importasynciofrompathlibimportPathfromagentskills_coreimportSkillRegistryfromagentskills_fsimportLocalFileSystemSkillProviderasyncdefmain():# 创建 Provider指向本地技能目录providerLocalFileSystemSkillProvider(Path(./skills))# 创建注册表registrySkillRegistry()# 批量注册目录下的所有技能awaitregistry.register_from_provider(provider)# 或者注册单个技能awaitregistry.register(pdf-processing,provider)print(f已加载{len(registry.skills)}个技能)asyncio.run(main())3.3 获取技能目录# 获取 XML 格式的技能目录用于注入系统提示catalog_xmlawaitregistry.get_skills_catalog(formatxml)print(catalog_xml)# 输出# skills_catalog# skill# namepdf-processing/name# description处理 PDF 文档。适用文本提取、表单填写.../description# /skill# ...# /skills_catalog# 获取系统提示注入文本纯文本格式system_prompt_additionawaitregistry.get_system_prompt_addition()3.4 加载完整技能内容# 激活指定技能获取完整 SKILL.md 内容skill_contentawaitregistry.load_skill(pdf-processing)print(skill_content.instructions)# SKILL.md 正文print(skill_content.allowed_tools)# allowed-tools 字段值# 读取 references 文件ref_contentawaitskill_content.read_reference(env-checklist.md)# 获取 scripts 路径供 Agent 执行script_pathskill_content.get_script_path(extract.py)四、LangChain 集成实战4.1 安装pipinstallagentskills-langchain langchain langchain-anthropic4.2 基础集成frompathlibimportPathfromlangchain_anthropicimportChatAnthropicfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutorfromlangchain_core.promptsimportChatPromptTemplatefromagentskills_coreimportSkillRegistryfromagentskills_fsimportLocalFileSystemSkillProviderfromagentskills_langchainimportget_tools,get_tools_usage_instructionsasyncdefbuild_agent_with_skills():# 初始化技能注册表providerLocalFileSystemSkillProvider(Path(./skills))registrySkillRegistry()awaitregistry.register_from_provider(provider)# 获取 LangChain 工具列表# get_tools 会为每个技能生成一个 StructuredTooltoolsget_tools(registry)# 获取工具调用说明注入系统提示usage_instructionsget_tools_usage_instructions(registry)# 获取技能目录注入系统提示的发现层skills_catalogawaitregistry.get_skills_catalog(formatxml)# 构建系统提示system_promptf你是一个专业的 AI 助手。 以下是你可用的技能{skills_catalog}工具使用说明{usage_instructions}根据用户请求判断是否需要激活对应技能并执行。# 创建 LangChain AgentllmChatAnthropic(modelclaude-opus-4-5)promptChatPromptTemplate.from_messages([(system,system_prompt),(human,{input}),(placeholder,{agent_scratchpad}),])agentcreate_tool_calling_agent(llm,tools,prompt)agent_executorAgentExecutor(agentagent,toolstools,verboseTrue)returnagent_executor# 使用 Agentasyncdefmain():agentawaitbuild_agent_with_skills()resultawaitagent.ainvoke({input:帮我把 report.pdf 里的表格数据提取出来})print(result[output])4.3 技能工具的内部机制get_tools(registry)生成的每个 LangChain 工具背后的逻辑是这样的# agentskills-langchain 内部实现示意fromlangchain.toolsimportStructuredTooldefcreate_skill_tool(registry,skill_name:str,skill_description:str):asyncdefactivate_skill(task_description:str)-str:激活技能并返回完整指令skillawaitregistry.load_skill(skill_name)returnf 技能已激活{skill_name}执行指令{skill.instructions}请按照上述指令执行任务{task_description}returnStructuredTool.from_function(funcactivate_skill,namefactivate_{skill_name.replace(-,_)},descriptionskill_description,coroutineactivate_skill,)这个设计让技能激活变成一次工具调用与 LangChain 的 Tool Calling 机制完美融合。五、Spring AI 集成方案Spring AI 是 Java 生态里最活跃的 AI 框架对 Agent Skills 的支持通过spring-ai-agent-utils包实现。5.1 Maven 依赖dependencygroupIdio.springai/groupIdartifactIdspring-ai-agent-utils/artifactIdversion0.4.2/version/dependency要求Spring AI 2.0.0-M2 或 Spring Boot 3.35.2 基础配置ConfigurationpublicclassAgentSkillsConfig{BeanpublicSkillsToolskillsTool(){// 从本地目录加载技能returnSkillsTool.builder().skillsDirectory(Path.of(src/main/resources/skills)).build();}BeanpublicChatClientchatClient(ChatModelchatModel,SkillsToolskillsTool,FileSystemToolsfileSystemTools){returnChatClient.builder(chatModel).defaultTools(skillsTool,fileSystemTools).defaultSystem( 你是一个专业助手拥有以下技能 {skills_catalog} 根据用户需求激活合适的技能完成任务。 ).build();}}5.3 从 Classpath 加载技能对于打包在 jar 里的内置技能BeanpublicSkillsToolskillsTool(){returnSkillsTool.builder().classpathSkillsDirectory(skills/)// resources/skills/.build();}5.4 与 ShellTools 协同使用当技能的 scripts 目录包含 Shell 脚本时需要配合ShellTools使用BeanpublicShellToolsshellTools(){returnShellTools.builder().allowedDirectories(List.of(Path.of(/tmp),Path.of(./output))).maxOutputLength(10_000).build();}BeanpublicChatClientchatClient(ChatModelchatModel,SkillsToolskillsTool,ShellToolsshellTools){returnChatClient.builder(chatModel).defaultTools(skillsTool,shellTools).build();}六、agentskills-mcp-server通过 MCP 暴露技能如果你想让技能通过 MCP 协议对外提供服务例如让其他不支持 AgentSkills 的系统也能访问技能agentskills-mcp-server是关键组件。6.1 启动 MCP 服务器frompathlibimportPathfromagentskills_coreimportSkillRegistryfromagentskills_fsimportLocalFileSystemSkillProviderfromagentskills_mcp_serverimportMCPSkillServerasyncdefmain():providerLocalFileSystemSkillProvider(Path(./skills))registrySkillRegistry()awaitregistry.register_from_provider(provider)# 启动 MCP 服务器serverMCPSkillServer(registryregistry,hostlocalhost,port8765,transportstdio# 或 websocket)awaitserver.start()# 现在任何支持 MCP 的 Agent 都可以通过这个服务器访问技能6.2 MCP 服务器暴露的工具MCP 服务器会自动将注册表里的每个技能暴露为一个 MCP 工具list_skills列出所有可用技能Discovery 层activate_skill(name: str, task: str)激活指定技能并获取指令Activation 层read_reference(skill_name: str, ref_file: str)读取参考文档Execution 层这样即使使用的是不原生支持 AgentSkills 的 LLM 平台也可以通过 MCP 协议访问技能能力。七、自定义 Provider 开发当技能存储在数据库、私有对象存储、或需要权限控制时可以自定义 Provider。7.1 实现 SkillProvider 接口fromagentskills_coreimportSkillProvider,SkillMetadata,SkillContentfromtypingimportList,OptionalimportaiohttpclassS3SkillProvider(SkillProvider):def__init__(self,bucket:str,prefix:str,credentials):self.bucketbucket self.prefixprefix self.credentialscredentialsasyncdeflist_skills(self)-List[SkillMetadata]:返回技能元数据列表用于构建 Discovery 层skills[]# 从 S3 bucket 扫描技能目录asyncforkeyinself._list_objects(f{self.prefix}/):ifkey.endswith(/SKILL.md):skill_namekey.split(/)[-2]metadataawaitself._load_metadata(skill_name)skills.append(metadata)returnskillsasyncdefload_skill(self,name:str)-Optional[SkillContent]:加载完整技能内容用于 Activation 层skill_md_keyf{self.prefix}/{name}/SKILL.mdcontentawaitself._download_file(skill_md_key)ifnotcontent:returnNonereturnSkillContent.parse(name,content)asyncdefread_reference(self,name:str,ref_file:str)-Optional[str]:读取参考文档用于 Execution 层ref_keyf{self.prefix}/{name}/references/{ref_file}returnawaitself._download_file(ref_key)asyncdef_download_file(self,key:str)-Optional[str]:# S3 下载逻辑...7.2 数据库存储方案对于需要动态更新、细粒度权限控制的企业场景可以把技能存储在数据库里classDatabaseSkillProvider(SkillProvider):def__init__(self,db_pool,tenant_id:str):self.dbdb_pool self.tenant_idtenant_idasyncdeflist_skills(self)-List[SkillMetadata]:asyncwithself.db.acquire()asconn:rowsawaitconn.fetch(SELECT name, description FROM skills WHERE tenant_id $1 AND active true,self.tenant_id)return[SkillMetadata(namer[name],descriptionr[description])forrinrows]asyncdefload_skill(self,name:str)-Optional[SkillContent]:asyncwithself.db.acquire()asconn:rowawaitconn.fetchrow(SELECT skill_md_content FROM skills WHERE tenant_id $1 AND name $2,self.tenant_id,name)ifnotrow:returnNonereturnSkillContent.parse(name,row[skill_md_content])八、缓存与热重载生产环境中频繁从文件系统或网络加载技能会影响响应速度。SDK 提供了内置的缓存支持以及文件系统监听实现热重载。8.1 启用缓存fromagentskills_coreimportSkillRegistry,CacheConfig registrySkillRegistry(cacheCacheConfig(ttl300,# 缓存 5 分钟max_size100,# 最多缓存 100 个技能内容strategylru# LRU 淘汰策略))8.2 文件系统热重载fromagentskills_fsimportLocalFileSystemSkillProvider,WatchConfig providerLocalFileSystemSkillProvider(pathPath(./skills),watchWatchConfig(enabledTrue,debounce_ms500# 文件变更后 500ms 触发重载))# 注册变更回调registry.on_skill_updatedasyncdefhandle_skill_update(skill_name:str):print(f技能已更新:{skill_name})# 通知下游组件刷新九、小结Agent Skills SDK 的分层设计体现了关注点分离的工程原则agentskills-core处理通用逻辑与框架无关Provider 层处理存储后端的差异框架适配层langchain、agentframework处理与具体框架的集成细节agentskills-mcp-server通过协议暴露实现跨语言、跨系统的技能调用。这套架构让技能开发者只需要关注 SKILL.md 的内容质量具体的加载、注册、框架适配由 SDK 负责。同时Provider 接口的扩展性保证了在任何存储后端本地、云存储、数据库都能无缝集成。下一篇将从技术选型的角度深度对比 AgentSkills 和 MCP 协议帮你在不同场景下做出合理的架构决策。

相关新闻