快速摘要
SkillHub 是科大讯飞开源的一套自托管 AI Agent 技能包注册与管理平台,支持团队在自有服务器上私有化部署,实现技能的发布、版本管理、权限分配、审核治理和全文搜索。 它的核心价值在于:让团队像管理代码仓库一样管理 AI 技能包,数据完全掌握在自己手上。本文将从 Agent Skills 的背景讲起,深入拆解 SkillHub 的系统架构、部署方式、功能模块和实操流程,帮助你判断它是否适合自己的团队。 往下看有更详细的架构分析、部署教程和使用技巧。

一、背景:为什么团队需要一个"技能包管理平台"?

2025 年下半年以来,AI Agent 领域发生了一个重要的变化——"技能包"(Skills)机制开始被广泛采用。所谓技能包,本质上是一个包含指令文件(通常是 SKILL.md)、脚本和参考资源的标准化文件夹。AI Agent 在工作时,会根据任务类型自动加载对应的技能包,从而获得特定领域的专业能力。

这种机制和传统的提示词(Prompt)有本质区别。提示词是"一次性"的,每次对话都要重新编写;而技能包是"可复用"的,写好一次就能反复调用,而且支持版本管理和团队共享。打个比方,提示词像是每次开会前临时写的备忘录,而技能包更像是一本成体系的操作手册——AI 需要的时候翻开对应章节就行。

技能包采用了一种"渐进式加载"的设计思路,分三个层级工作:第一层是元数据(name 和 description),AI 启动时就常驻在上下文里,用来判断什么时候该用哪个技能;第二层是核心指令,只在 AI 决定使用某个技能时才读取 SKILL.md 的正文内容;第三层是资源文件,包括脚本、模板、参考文档等,只在执行到具体步骤时才按需加载。这种设计非常节省上下文窗口,让 AI 可以同时"挂载"大量技能而不影响性能。

随着越来越多的团队把核心工作流封装成技能包,一个新问题浮出水面:这些技能包放在哪里?怎么管理?怎么在团队内安全共享?

公开的技能市场(比如 skills.sh、ClawHub 等)确实提供了大量社区贡献的技能包,但它们天然解决不了团队内部的需求——私有技能涉及企业内部流程和数据,不可能放到公开平台上;团队成员各自开发的技能包质量参差不齐,没有审核机制就容易出问题;技能包多了之后,版本混乱、重复开发的情况也会越来越严重。

我在黑龙江节点云计算科技公司考人工智能训练师的时候,就深刻体会到了这个问题。当时团队里每个人都在各自维护自己的提示词和工作流模板,缺乏统一的管理和分发机制,导致很多重复劳动和不一致的输出。如果当时有一套类似 SkillHub 的工具,效率和规范性都会提升不少。

这个缺口,其实和十年前的代码管理困境很像——代码有 Git 仓库管,容器镜像有 Docker Hub 分发,而团队自己的 AI 技能库管理,目前才刚刚起步。SkillHub 正是为了填补这个空白而诞生的。


二、SkillHub 是什么?

SkillHub 是科大讯飞技术团队在 GitHub 上开源的一个自托管(Self-Hosted)技能包注册与管理平台。你可以把它理解为团队内部的"技能包仓库",有点类似于 Docker Hub 之于容器镜像、npm Registry 之于 Node.js 包。

项目地址:https://github.com/iflytek/skillhub

它的核心定位是:让团队在自己的服务器上私有化部署一套技能管理系统,数据完全由团队自己掌控。 技能包的发布、搜索、下载、版本管理、权限控制、审核流程,都在这个平台上完成。

SkillHub 兼容 ClawHub CLI 协议,这意味着通过它发布的技能包,可以被 OpenClaw、Loomy、astron-agent 等主流 AI Agent 平台直接识别和调用。一次发布,多平台复用,不需要在每个平台上单独维护一份。

从发布状态来看,SkillHub 在 2026 年 3 月底刚刚从 beta 阶段推进到第一个稳定版本 0.1.0,覆盖了技能发布、审核、搜索发现、下载和治理工作流等核心功能,项目工程完成度相当高。


三、系统架构深度解析

理解 SkillHub 的架构设计,有助于判断它是否适合你的团队规模和技术栈,也有助于后续的运维和二次开发。

3.1 整体架构:三层分离的模块化单体

SkillHub 采用的是经典的三层架构设计,前端、后端、数据层之间职责分明:

前端层:基于 React 19 构建的单页应用(SPA),使用 Vite 作为构建工具,TanStack Router 处理路由,TanStack Query 管理数据请求。界面提供了技能搜索、发布、审核、命名空间管理等完整的 Web 操作入口。

后端层:基于 Spring Boot 的 Java 应用,设计为"模块化单体"(Modular Monolith),即虽然是单个应用,但内部按照领域职责被拆分成了六个 Maven 模块,结构清晰。

数据层:使用 PostgreSQL 作为主数据库(同时承担全文搜索职责),Redis 管理会话和缓存,MinIO(或其他 S3 兼容存储)存放技能包文件。

用一段简化的架构描述来表示:

┌─────────────────────────────────────────────────────┐
│                    前端(React 19 SPA)               │
│           Vite + TanStack Router + TanStack Query    │
└──────────────────────┬──────────────────────────────┘
                       │ HTTP / REST API
┌──────────────────────▼──────────────────────────────┐
│                 后端(Spring Boot)                    │
│  ┌──────────┬──────────┬──────────┬──────────┐       │
│  │ app      │ domain   │ auth     │ search   │       │
│  │(入口/组装)│(核心业务) │(认证授权) │(搜索抽象) │       │
│  ├──────────┼──────────┼──────────┤          │       │
│  │ storage  │ infra    │          │          │       │
│  │(对象存储) │(基础设施) │          │          │       │
│  └──────────┴──────────┴──────────┴──────────┘       │
└──────────────────────┬──────────────────────────────┘
                       │
┌──────────────────────▼──────────────────────────────┐
│           PostgreSQL  │  Redis  │  MinIO / S3        │
│          (数据+全文搜索) (会话缓存)  (文件存储)          │
└─────────────────────────────────────────────────────┘

3.2 后端六大模块详解

SkillHub 的后端遵循"洋葱架构"(Clean Architecture)的设计原则,依赖方向由外向内,核心领域模块不依赖任何框架或基础设施代码。六个模块各司其职:

  • skillhub-app:应用入口和组装模块,负责把其他所有模块拉起来,对外暴露 REST API 端点。可以理解为整个后端的"启动器"。
  • skillhub-domain:核心领域模块,定义了业务实体(技能、版本、命名空间、审核任务等)和仓储接口(Repository Interface)。这个模块完全不依赖 Spring、JPA 等具体技术,保证业务逻辑的纯净性。
  • skillhub-auth:认证与授权子系统,处理 OAuth2 登录(目前主要支持 GitHub 作为身份提供者)、API Token 管理、会话管理和基于角色的访问控制(RBAC)。
  • skillhub-search:搜索抽象层,当前使用 PostgreSQL 的全文搜索(FTS)作为默认实现,并且通过 SPI(Service Provider Interface)模式设计,未来可以平滑切换到 Elasticsearch 或向量搜索引擎,无需修改业务代码。
  • skillhub-storage:对象存储抽象层,同样采用 SPI 模式,提供了本地文件系统和 S3 兼容存储两种实现。开发环境可以用本地存储快速跑起来,生产环境切换到 MinIO 或其他 S3 服务即可。
  • skillhub-infra:基础设施层,负责实现 domain 模块定义的仓储接口,使用 Spring Data JPA 与数据库交互,同时提供一些跨模块的工具类。

这种模块化设计的好处是显而易见的:如果你想把搜索引擎从 PostgreSQL FTS 换成 Elasticsearch,只需要在 search 模块里新增一个实现,其他模块完全不用动。同样的道理,如果将来想支持更多的 OAuth 提供商(比如 GitLab、飞书等),只需要在 auth 模块里扩展即可。

3.3 数据完整性与安全设计

在数据安全方面,SkillHub 做了几个值得注意的设计:

技能包文件上传后,系统会计算并存储 SHA-256 哈希值,用于后续的文件完整性校验。上传过程中还会自动执行"预检查"——扫描文件内容中是否意外包含了密钥、Token 等敏感信息,如果发现会阻止发布。

文件上传还有一套扩展名白名单机制,默认只允许 .md.json.py.js 等安全的文件类型。如果你的团队需要包含其他类型的文件(比如 .docx.xlsx),可以通过环境变量自定义白名单:

SKILLHUB_PUBLISH_ALLOWED_FILE_EXTENSIONS=.md,.json,.xsd,.xsl,.dtd,.docx,.xlsx,.pptx

用户身份标识方面,SkillHub 的所有用户 ID 都是字符串类型而非整数,这是为了兼容外部身份源(SSO、OIDC)可能使用的非数字格式标识符,体现了面向企业场景的设计考量。


四、部署实操:从零搭建你的私有技能仓库

SkillHub 提供了多种部署方式,从最简单的一键脚本到适合生产环境的 Kubernetes 部署,覆盖了不同规模团队的需求。

4.1 前置条件

无论选择哪种部署方式,你都需要先确保服务器上安装了 Docker 和 Docker Compose。SkillHub 的容器镜像已经发布到 GitHub Container Registry(GHCR),支持 linux/amd64linux/arm64 两种架构,主流的服务器和 Mac 设备都能运行。

4.2 一键脚本部署(推荐新手)

如果你只是想快速体验,或者团队规模不大,一键脚本是最省事的选择。在终端执行:

curl -fsSL https://raw.githubusercontent.com/iflytek/skillhub/main/scripts/runtime.sh | sh -s -- up

这条命令会自动完成以下工作:从 GHCR 拉取预构建的前后端容器镜像、启动 PostgreSQL 和 Redis 实例、初始化数据库、创建默认管理员账号。

部署完成后,打开浏览器访问 http://localhost 就能看到 SkillHub 的首页了。后端 API 默认监听在 http://localhost:8080

4.3 Docker Compose 手动部署(推荐生产环境)

对于生产环境,建议使用项目提供的 compose.release.yml 配置文件,这样可以更精细地控制各项参数。基本步骤如下:

首先,把项目仓库克隆到服务器上:

git clone https://github.com/iflytek/skillhub.git
cd skillhub

然后,复制并编辑环境变量配置文件:

cp .env.release.example .env

打开 .env 文件,至少需要修改以下几项关键配置:

# 管理员账号(首次启动时自动创建)
SKILLHUB_BOOTSTRAP_ADMIN_USERNAME=admin
SKILLHUB_BOOTSTRAP_ADMIN_PASSWORD=你的强密码

# 对外访问地址(改成你的实际域名)
SKILLHUB_PUBLIC_BASE_URL=https://skillhub.your-company.com

# 数据库密码
POSTGRES_PASSWORD=你的数据库密码

# Redis 密码
REDIS_PASSWORD=你的Redis密码

配置完成后,启动所有服务:

docker compose -f compose.release.yml up -d

这里有一个很重要的安全提醒:部署到生产环境之前,一定要修改所有默认密码,并配置 HTTPS。 千万不要用默认密码跑在公网上。

4.4 Kubernetes 部署

对于有 K8s 基础设施的团队,项目在 deploy/k8s/ 目录下提供了基础的 Kubernetes 部署清单,包括 ConfigMap、Secret、Deployment 等资源定义。部署命令大致如下:

kubectl apply -f deploy/k8s/configmap.yaml
kubectl apply -f deploy/k8s/secret.yaml
kubectl apply -f deploy/k8s/backend-deployment.yaml
kubectl apply -f deploy/k8s/frontend-deployment.yaml

需要注意的是,K8s 部署默认假设你已经有外部的 PostgreSQL 和 Redis 实例,需要在 ConfigMap 和 Secret 中配置好连接信息。

4.5 本地开发环境

如果你想参与 SkillHub 的二次开发或者提交 PR,可以使用本地开发模式。这种模式下,只有基础设施服务(PostgreSQL、Redis、MinIO)运行在容器里,前后端都在本机直接运行,支持热重载:

make dev-all

这条命令会启动依赖服务、启动后端、启动前端,并自动重新生成 OpenAPI 类型定义。


五、核心功能模块详解

部署完成后,让我们逐一了解 SkillHub 的各个功能模块以及具体的操作方法。

5.1 命名空间:团队隔离的基础

命名空间是 SkillHub 组织技能的基本单元,类似于 GitHub 的 Organization 概念。每个团队拥有独立的命名空间,在里面发布和管理技能,互不干扰。

创建命名空间的操作步骤:

用管理员账号登录后,点击右上角头像,选择"我的命名空间",再点击"创建命名空间"。你需要填写两个信息——命名空间标识(slug,用于 URL 和 CLI 命令)和显示名称(方便人类阅读)。

创建完成后,你默认就是这个命名空间的所有者(Owner),拥有最高权限。

添加团队成员:

进入命名空间的"管理成员"页面,可以通过搜索用户名或直接输入 userId 来添加成员。SkillHub 支持两种角色:管理员(Admin)可以审核技能、管理成员;普通成员(Member)可以发布技能和下载技能。

这套设计意味着,不同的团队可以各管各的技能空间。比如一家公司里,后端团队和前端团队可以各有自己的命名空间,彼此发布的技能默认互不可见,但如果需要跨团队共享,可以把技能的可见性设置为公开(PUBLIC),或者申请"提升到全局"。

5.2 技能发布:从打包到上线

发布技能包的流程并不复杂,但有一些规范需要遵守。

第一步:准备技能包

技能包的本质是一个 ZIP 压缩文件,里面必须包含一个 SKILL.md 文件作为入口文档。标准的目录结构如下:

my-skill.zip
├── SKILL.md          # 必需:元数据 + 使用说明
├── manifest.json     # 可选:文件清单
└── src/
    ├── main.py       # 可选:脚本文件
    └── utils.py

SKILL.md 文件的开头必须包含 YAML 格式的元数据(frontmatter),定义技能的名称和描述:

---
name: my-awesome-skill
description: 这个技能用于自动生成项目周报,当用户提到"周报""进度汇总"时触发。
---

# 项目周报生成技能

## 指令

1. 收集本周的代码提交记录和任务完成情况
2. 按照模板格式整理周报内容
3. 输出 Markdown 格式的周报文档

## 示例

...

这里的 description 字段非常关键——AI Agent 就是根据这段描述来判断什么时候应该加载这个技能的。写得越精准,触发就越准确。一个好的 description 应该同时包含"这个技能做什么"和"什么场景下应该触发它"两部分信息,让 AI 在面对用户请求时能快速做出匹配判断。

关于 SKILL.md 的正文编写,有几个实践经验值得分享。首先,指令部分应该写得像操作手册而不是百科全书——AI 本身就具备很强的基础知识,你不需要解释"什么是 PDF"或者"什么是 REST API",只需要告诉它"在我们团队的场景下,应该按什么流程、用什么工具来处理这类任务"。其次,如果技能涉及多个工作场景,建议使用决策树的形式来组织指令,让 AI 根据不同条件自动选择不同的执行路径。最后,别忘了在技能包里放入具体的输入输出示例,AI 从示例中学习的效果往往比从抽象描述中学习要好得多。

第二步:通过 Web 界面发布

登录 SkillHub 后,点击顶部导航栏的"发布"按钮,进入发布页面。在这里你需要做三件事:选择目标命名空间、设置可见性级别、上传 ZIP 文件。

可见性有三个选项可选:PUBLIC(所有人可见)、NAMESPACE_ONLY(仅命名空间成员可见)、PRIVATE(仅自己可见)。选好后,把打包好的 ZIP 文件拖拽上传即可。

第三步:等待审核

提交后,系统会自动创建一个审核任务(ReviewTask),状态为"待审核"。如果你是普通成员,需要等命名空间的管理员审核通过后,技能才会正式上线。如果你本身就是管理员或所有者,可以自行审核。

发布成功后,在"我的技能"页面可以看到技能的审核状态、下载量、版本号等信息。SkillHub 支持语义化版本号(Semantic Versioning),并会自动追踪 latest 标签。

5.3 审核工作流:质量把关的关键环节

审核机制是 SkillHub 区别于简单文件共享的核心特性之一。

管理员登录后,进入"审核中心",可以看到所有待审核的技能列表,包含技能名称、版本号、提交者和提交时间。点击进入详情页,可以直接在浏览器里查看技能包内的所有文件内容——包括 SKILL.md 的说明文档、脚本代码等,不需要下载到本地解压。

审核人员可以根据以下几个维度做出判断:技能的指令描述是否清晰、脚本代码是否有安全隐患、是否与已有技能功能重复、是否符合团队的命名规范等。审核结果分为"通过"和"拒绝"两种,拒绝时需要填写原因说明。

这套审核流程确保了进入命名空间的每个技能都经过人工把关,不会把质量参差不齐的包直接暴露给团队成员。对于规模较大的团队来说,这一点尤为重要。

从实际使用的角度来看,审核环节的引入也带来了一个额外的好处——它促使技能开发者在提交之前更加认真地组织和测试自己的技能包。一个技能如果说明文档含糊不清、脚本代码有明显的逻辑错误,在审核阶段就会被打回。这种机制在无形中推动了团队技能包质量的整体提升。

如果管理员觉得一个团队级别的技能足够通用,希望让公司所有人都能使用,还可以通过"申请提升到全局"的功能来发起全局推广流程。全局技能的审核通常更加严格,需要更高权限的管理员(SKILL_ADMIN 角色)来批准。

5.4 搜索发现:快速定位你需要的技能

当命名空间里的技能越来越多时,高效的搜索就变得不可或缺。SkillHub 内置了基于 PostgreSQL 的全文搜索引擎(并且对中文搜索做了专门的优化),支持按关键词检索技能。

在首页或搜索页输入关键词后,搜索结果可以按三个维度排序:相关性、下载量、最新发布时间。还可以勾选"只看已收藏"来快速过滤自己关注的技能。

搜索结果会自动根据当前用户的命名空间成员身份和技能的可见性设置进行过滤——也就是说,你只能搜到你有权限看到的技能,不会越权访问。

从技术实现角度来看,搜索模块通过 SPI 模式设计,未来如果团队规模增长,可以平滑迁移到 Elasticsearch 甚至向量搜索引擎,而业务层面的代码无需改动。

5.5 API Token 与 CI/CD 集成

对于追求自动化的团队来说,SkillHub 的 Token 管理机制提供了将技能发布接入 CI/CD 流水线的能力。

在控制台的 Token 管理页面,点击"创建新 Token",填写名称并选择过期时间。系统支持 7 天、30 天、90 天、永不过期或自定义时间。Token 创建成功后,系统会展示一次完整的密钥字符串(以 sk_ 为前缀),此时务必立即复制保存,因为后续无法再次查看。

拿到 Token 后,就可以在 CI/CD 脚本中调用 SkillHub 的 REST API 来自动发布技能。API 端点为 POST /api/v1/skills/publish,需要在请求头中带上 Authorization: Bearer <your_token>

一个典型的使用场景是:开发人员在 Git 仓库中维护技能包的源文件,当代码合并到 main 分支后,CI 流水线自动打包成 ZIP 并调用 SkillHub API 完成发布。这样就实现了"代码变更→技能更新"的全自动闭环。

5.6 多平台复用

发布到 SkillHub 的技能包,可以被多个 Agent 平台直接调用。目前已验证支持的平台包括 OpenClaw、Loomy、astron-agent 等。

以 OpenClaw 为例,配置好 SkillHub 的注册中心地址后,通过 CLI 就能搜索和安装团队内部的技能:

# 配置注册中心地址
export CLAWHUB_REGISTRY=https://skillhub.your-company.com

# 如需认证,先登录一次
clawhub login --token YOUR_API_TOKEN

# 搜索技能
npx clawhub search email

# 安装技能
npx clawhub install my-skill

这意味着技能不再需要在每个平台上单独维护一份——一次发布到 SkillHub,各个 Agent 端都能直接拉取使用。

从技术实现上来说,SkillHub 之所以能做到多平台兼容,关键在于它遵循了 ClawHub CLI 协议规范。这个协议定义了技能包的标准搜索、下载和安装接口,只要 Agent 平台实现了这套协议,就能无缝对接 SkillHub 的技能注册中心。对于尚未直接支持 ClawHub 协议的 Agent 工具,也可以通过 SkillHub 的 REST API 来拉取技能包文件,然后手动放置到对应的技能目录中。

另外值得一提的是,SkillHub 的 CLI 认证采用了 Device Flow(设备流)模式。当你在命令行执行认证命令时,CLI 会显示一个短代码(例如 ABCD-1234)和一个 URL,你在浏览器里打开这个 URL、输入短代码并确认授权即可完成登录。这种方式不需要在终端里输入密码,对于 CI/CD 场景下的自动化认证也更加友好。


六、监控与运维

对于生产环境部署,SkillHub 项目还内置了一套可选的 Prometheus + Grafana 监控方案,位于仓库的 monitoring/ 目录下。

它会自动抓取 Spring Boot Actuator 暴露的 Prometheus 指标端点(默认地址是 http://host.docker.internal:8080/actuator/prometheus),你可以在 Grafana 中配置仪表盘来观察后端服务的健康状态、请求延迟、错误率等关键指标。

启动监控栈的命令:

cd monitoring
docker compose -f docker-compose.monitoring.yml up -d

需要注意的是,监控栈默认使用 host.docker.internal 来访问宿主机上的后端服务,这在 Docker Desktop(macOS/Windows)上是开箱即用的。如果在 Linux 服务器上运行,可能需要手动替换为宿主机的实际 IP 地址。

数据库迁移方面,SkillHub 使用 Flyway 来管理数据库版本。所有迁移脚本都以 V*.sql 的命名格式存放在后端代码中,应用启动时会自动检查并执行尚未应用的迁移。这个机制保证了数据库结构始终与应用版本保持同步,即使跨版本升级也不会出现结构不一致的问题。


七、适用场景与局限

适合使用 SkillHub 的场景

SkillHub 最适合以下几类团队:已经在使用 AI Agent 技能包机制,并且积累了一定数量的自研技能,需要统一管理和分发的团队;对数据安全有要求,不希望把内部技能上传到公开平台的企业;有多个团队或部门,需要技能隔离和权限控制的中大型组织;追求工程化和自动化,希望将技能发布接入 CI/CD 流程的技术团队。

需要注意的局限

SkillHub 当前是单实例共享注册中心,而非多租户平台,这意味着它适合一家企业内部使用,但不太适合"平台即服务"这种一个实例服务多家企业的场景。另外,项目的第一个稳定版本才刚刚发布不久,虽然核心功能已经齐全,但在细节打磨和生态集成方面还在快速迭代中。如果你的团队对稳定性要求极高,建议先在测试环境充分验证后再投入生产使用。


八、快速上手清单

如果你看完以上内容决定试试 SkillHub,这里给你一个简洁的上手路径:

  • 在服务器上安装 Docker 和 Docker Compose
  • 执行一键部署脚本,启动 SkillHub 实例
  • 用默认管理员账号登录,修改密码
  • 创建你的第一个团队命名空间
  • 邀请团队成员注册并加入命名空间
  • 准备一个技能包的 ZIP 文件(至少包含 SKILL.md)
  • 通过 Web 界面上传发布
  • 管理员审核通过后,其他成员即可搜索和下载
  • (进阶)创建 API Token,将发布流程接入 CI/CD
  • (进阶)配置 Prometheus + Grafana 监控

九、写在最后

从更宏观的视角来看,SkillHub 的出现代表了一个趋势:AI 工程化正在从"会用 AI"走向"管好 AI"。 当团队把越来越多的核心工作流封装成技能包时,管理这些技能的基础设施就变得和管理代码一样重要。

代码有 Git,容器有 Registry,AI 技能包也应该有自己的管理平台。SkillHub 作为这个方向上目前较为完善的开源方案之一,值得关注。

项目目前仍在活跃开发中,如果你在使用过程中遇到问题,可以到 GitHub 仓库提 Issue;如果有开发能力,也欢迎通过 PR 参与贡献。

GitHub 项目地址: https://github.com/iflytek/skillhub

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐