我做了一个开源项目:一次开发,全平台所有AI应用自动获得工具调用能力
大家好,我最近开源了一个有意思的项目——Cloud Skill,一个企业级云原生技能管理平台。
今天想和大家聊聊这个项目解决了什么问题,以及它和市面上其他动态工具方案有什么不同。
🤔 你是否遇到过这些痛点?
做企业级AI平台的同学应该都有体会:
当你的公司有10个AI应用,每个AI应用都需要调用"查询用户信息"、"查询订单"、"创建工单"这些工具,你会怎么做?
传统方案
每个AI应用都重复写一遍这些工具函数,然后每次工具更新,10个应用都要重新打包部署...
结果就是:
- ❌ 重复开发,浪费人力
- ❌ 更新发布慢,从需求到上线要按天算
- ❌ 多个应用版本不一致,维护困难
- ❌ 没有统一权限管控,安全风险大
- ❌ 调用数据分散,无法全局统计优化
💡 我的思路:技能云原生,一次开发全平台共享
Cloud Skill 的核心理念就是:
一次开发技能,全平台所有AI应用自动获得调用能力,动态更新实时生效,无需重启,无需重复部署。
整个架构分成三个部分:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Provider │ → │ Admin │ → │ Consumer │
│ 技能提供者 │ 扫描 │ 统一管理平台│ 拉取 │ AI消费者 │
│ 开发业务接口 │──────▶ 权限分配管理│──────▶ 动态注入使用│
└──────────────┘ └──────────────┘ └──────────────┘
工作流程:
- Provider:业务团队用 Spring MVC 开发好接口,引入
cloud-skill-scanner-spring-boot-starter,启动时自动扫描所有接口,生成技能定义,预注册到 Admin - Admin:平台管理员审核,分配权限给对应的 Consumer 服务
- Consumer:AI 消费者应用引入
cloud-skill-spring-boot-starter,自动从 Admin 拉取技能,动态转换为 Spring AI 的ToolCallback,注入到 ChatModel 中 - 实时更新:Provider 更新接口后,自动推送到所有 Consumer,秒级生效,不需要重启任何 Consumer 应用
✨ 核心特性
1. 🎯 真正的动态注入,版本一致性保证
市面上很多"动态工具"方案,都是说单个应用内部动态加载,而 Cloud Skill 是跨应用云原生动态:
- ✅ 注入前版本校验:每次调用前对比本地时间戳和服务端全局时间戳
- ✅ 过期自动同步:如果发现本地版本过期,自动触发全量同步
- ✅ Redis 发布订阅:技能变更实时推送,秒级生效
- ✅ 最终一致性:定时同步兜底,保证网络分区后数据最终一致
2. 🔌 同时兼容 Spring AI 和 Spring AI Alibaba
这个很重要,现在 Java AI 生态主要就是这两个:
| 框架 | 支持情况 |
|---|---|
| Spring AI 官方 | ✅ 完整支持 ChatModel/ChatClient/ReactAgent |
| Spring AI Alibaba (DashScope) | ✅ 特殊适配,正确转换工具格式 |
不需要改代码,引入依赖就能用。
3. 🛡️ 三级细粒度控制
支持全局/类/方法三级控制,优先级:方法注解 > 类注解 > 全局配置
@RestController
@EnableDynamicSkills // 整个类启用
public class AiController {
@GetMapping("/chat")
public String chat(String message) {
// 继承类注解,启用动态技能
return chatClient.prompt().user(message).call().content();
}
@GetMapping("/status")
@EnableDynamicSkills(false) // 这个方法禁用
public String status() {
return "ok";
}
}
4. 🔧 模板方法架构,易于扩展
技能变更监听和工具注入都采用模板方法模式:
// 新增一种消息队列只需要继承这个类
public abstract class AbstractSkillChangeListener {
// 模板方法:版本校验 + 消息处理 + 全量同步
public final void onSkillChange() {
checkVersion();
processMessage();
if (needFullSync()) {
doFullSync();
}
}
// 子类只需要实现具体细节
protected abstract void processMessage();
}
5. 📊 企业级生产特性
- 权限控制:公开/私有技能,服务级权限分配
- 容错降级:超时控制、重试、本地缓存降级
- 可观测性:内置 Micrometer 指标,全链路监控
- SPI 扩展:SkillConverter、SkillExecutionHook 允许自定义扩展
🆚 和其他开源项目对比
我调研了 GitHub 上几个类似的动态工具项目,整理一下区别:
| 项目 | 核心定位 | 和 Cloud Skill 的关键区别 |
|---|---|---|
| spring-ai-dynamic-tool | 本地 JAR 动态加载工具 | 它是单体应用本地加载;Cloud Skill 是云端分发全平台共享 |
| spring-ai-function-loader | 从文件加载函数定义 | 它只给当前应用加载;Cloud Skill 让全平台所有应用共享 |
| dynamic-function-calling-starter | 扫描 @Function 自动注册 | 它扫描注解方法本地注册;Cloud Skill 扫描 Spring MVC 接口注册到远程平台 |
| Cloud Skill (你的项目) | 云原生技能共享平台 | 一次开发,全平台共享,动态更新实时生效 |
一句话总结:
- 它们解决:单个应用内如何更好地动态管理工具
- Cloud Skill 解决:多个 AI 消费者应用如何从中心化平台动态共享技能
这是两个不同层级的问题。
📈 业务价值对比
| 维度 | 传统开发模式 | Cloud Skill 模式 |
|---|---|---|
| 工具开发 | 每个 AI 应用重复开发 | 一次开发,全平台自动获得 |
| 更新发布 | 每个应用重新打包部署 | 服务端注册后,所有消费者实时获得,秒级生效无需重启 |
| 运维成本 | 多应用分散维护,重复劳动 | 集中管理,一次更新全平台同步 |
| 版本一致性 | 不同应用版本参差不齐 | 所有消费者自动同步最新版本 |
| 安全管控 | 无统一管控 | 统一权限、审计、限流 |
| 可观测性 | 无统一监控 | 全链路监控,可观测性强 |
⚠️ 劣势分析(实话实说)
任何架构都有适用场景,Cloud Skill 也不是银弹:
- 需要额外部署:需要部署 Admin 平台 + Redis,对中小项目来说确实有点重
- 网络依赖:纯本地单机场景确实过度设计了
- 架构复杂:需要理解整条链路,调试比纯本地麻烦一点
- 适用场景:更适合企业级多租户 AI 平台,不适合个人小项目
所以:
- ✅ 如果你是做企业 AI 平台,多个消费者共享技能 → 非常适合
- ❌ 如果你只是做个个人小项目,就想本地用 → 那些轻量方案更适合
🚀 快速体验
1. Provider 端(技能提供者)引入 Scanner:
<dependency>
<groupId>cloud.skill</groupId>
<artifactId>cloud-skill-scanner-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
配置:
cloud:
skill:
scanner:
enabled: true
admin-server-url: http://your-admin-server:8080
global-mode: true # 自动扫描所有 Spring MVC 接口
启动应用,自动扫描注册到 Admin,搞定!
2. Consumer 端(AI 消费者)引入 SDK:
<dependency>
<groupId>com.cloudskill</groupId>
<artifactId>cloud-skill-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
配置:
cloud:
skill:
enabled: true
server-url: http://your-admin-server:8080
service-name: my-ai-app
直接使用:
@RestController
@EnableDynamicSkills
public class AiChatController {
private final ChatClient chatClient;
public AiChatController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/chat")
public String chat(@RequestParam String message) {
// 所有分配给你的技能已经自动注入了!
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
就这么简单,启动就能用!技能更新自动同步,不需要重启。
🏗️ 整体项目结构
cloud-skill/
├── cloud-skill-spring-boot-starter/ # SDK,消费者使用
├── cloud-skill-scanner/
│ └── cloud-skill-scanner-spring-boot-starter/ # 扫描器,提供者使用
└── cloud-skill-admin/ # 管理平台,统一管理
三个模块各司其职,松耦合,易扩展。
🎯 总结
Cloud Skill 填补了一个市场空白:企业级多租户 AI 平台的中心化技能共享解决方案。
它的核心理念就是:
让技能像云一样,按需分发,动态更新,一次开发,全平台共享。
如果你正在做企业 AI 平台,被多应用重复开发工具的问题困扰,欢迎试用一波,欢迎 Star 🌟
🔗 项目地址
GitHub: github.com/Rainbow0328…
欢迎 Star,欢迎 Issue,欢迎 PR!
你怎么看这个架构设计?欢迎在评论区交流讨论 👇
Tags: #Java #SpringBoot #SpringAI #AI #大模型 #函数调用 #ToolCalling #MCP #云原生 #开源