技能市场
- 内部部署仓库 docker-compose.yaml / Helm / nginx配置(部署硬事实)
- Mininglamp-OSS/octo-marketplace(Go独立微服务,开源可读,源码级确认)
- octo-server对接路由(令牌/审批卡)
- 00-inbox/product-bot-answers/2026-09-22-P1-r2-Q7-Marketplace市场深度回答.md
- 00-inbox/product-bot-answers/2026-09-21-P0扩展-Marketplace市场模块回答.md
市场Marketplace模块说明 v1.0
⚠️ 市场 ≠ BotFather(售前/交付必须记住)
Marketplace = Skills 与 MCP servers 的目录+发布服务,是独立 Go 微服务 `octo-marketplace`;负责上架分发/安装/版本/计数/评分。
BotFather = 创建/注册 Bot(bot_token + 基础配置 + runtime onboarding)。
两者完全解耦,Bot 不是 Marketplace 的分发类型。
§1 核心定位与 BotFather 边界
1.1 一句话定位
Marketplace = Skills 与 MCP servers 目录 + 发布服务(独立微服务 octo-marketplace,Go 语言)。
能力覆盖:Space 感知发现 / owner 管理发布 / 归档解析 / 版本历史 / 对象存储下载 / MCP 连接元数据探测。
octo-server 仅保留对接令牌与审批卡路由,不承载市场业务逻辑。
1.2 🔑 市场 ≠ BotFather(售前/交付强口径)
| 维度 | Marketplace(市场) | BotFather |
|---|---|---|
| 职责 | 上架分发 / 安装 / 版本 / 计数 / 评分 | 创建/注册 Bot、发放 bot_token、基础配置、runtime onboarding |
| 分发对象 | expert / expert_team / skill / connector(MCP server) | 不做分发,只创建 Bot 身份 |
| Bot 是否在此出现 | ❌ Bot 不是分发类型,仅可作为创建者身份(creator)上架插件 | ✅ Bot 的唯一创建/管理入口 |
| 入口 | Web「回路→专家市场」「插件市场」+ octo-cli | 私聊 BotFather(/newbot、/connect、/mybots) |
| 解耦关系 | 两者独立——装了 Marketplace 不需要 BotFather 分发插件;用 BotFather 建 Bot 也不经过市场 | 同左 |
📝 常见误解纠正:
- ❌ "Marketplace 是 Bot 市场" → Bot 不在 Marketplace 分发
- ❌ "Bot 是一种 PluginType" → Bot 是创建者身份(CreatedByType: human/bot/import),不是插件类型
- ❌ "自定义 Bot 可整体发布为插件" → 源码未找到此端点,Bot 仅作 creator
§2 四种 PluginType 全景
| PluginType | 中文名 | 定义 | 运行环境 | 传输/安装方式 | 备注 |
|---|---|---|---|---|---|
expert |
专家(单 Agent) | 可安装的 AI 协作体 | Loop/Fleet 云端编排 | Fleet 以调用者转发 token 授权安装 | 原"AI队友" |
expert_team |
专家团队(Squad) | 多专家协作小队,含 leader/members/strategies/dependencies | Loop/Fleet 云端编排 | 同上;通过 expert_team_expert 关系内嵌多个 expert |
原"AI小队";MaxSquadMembers=30 / MaxExpertSkills=20 |
skill |
技能包 | 可复用能力包 | 本地 runtime(Skills 根目录) | octo-cli 安装:在线 marketplace skills 或离线 skills --install(zip/.skill 包) |
制品存 MinIO,SHA256 校验 |
connector |
连接器(MCP server) | 外部工具/服务连接器,含 Tool{Name,Description} 结构 | 随 expert/runtime 调用 | 三种传输:stdio(本地进程)/ streamable-http / sse |
即 MCP server;v2026.08.10 中文化为「连接器」 |
- Tool 不是独立 PluginType:Tool 是 connector 下的
{Name, Description}结构,不单独上架 - Agent/Squad 是安装产物:expert/expert_team 安装后在 Fleet/Loop 中编排运行,但它们本身是分发类型
- Bot 身份不影响分发能力:Bot 可作为 creator 上架 skill/connector,但 owner 同 Bot owner,无权限增益(仅市场徽章)
§3 上架 / 审核 / 安装 / 私有市场
3.1 生命周期状态机
- 上架态(listing_state):
draft/published/delisted - 审核展示态:
draft→pending_review→published/rejected→delisted(下架)
draft → pending_review → published → delisted
↘ rejected
3.2 发布流程(API 链路)
POST /skill_uploads (init 上传)
→ POST /skill_uploads/:id/parse (解析元数据)
→ poll 解析结果
→ POST /plugins/publish (提交发布)
3.3 🔑 审核默认 auto-approve(安全注意)
| 审核项 | 说明 |
|---|---|
| 默认策略 | is_auto_approve_enabled = true(默认自动通过) |
| 修改方式 | Space owner / admin 可 PATCH 关闭,改为人审 |
| 人审队列 | submit / list / approve / reject / cancel |
| 审批回调 | 支持经 IM 卡片回调(HMAC 签名重推防伪造) |
⚠️ 售前/交付口径:企业部署时如对插件上架有安全要求,必须显式关闭 auto-approve 并配置人工审核流程。默认配置下任何人提交的插件都会自动上架。
3.4 私有市场(Visibility 四档)
| visibility | 可见范围 |
|---|---|
public |
公开市场,所有 Space 可见 |
space |
Space 级私有,仅当前 Space 成员可见 |
private |
私有,仅 owner 可见 |
system |
系统内置(官方发布标识) |
✅ 企业可搭建 Space 级私有市场(M-04 确认解决)。
3.5 离线导入与 octo-cli 安装
| 场景 | 方式 |
|---|---|
| 在线安装 skill | octo-cli marketplace skills (CLI 用 Bot 凭证从同一 Marketplace 下载) |
| 离线导入 skill | zip / .skill 包上传解析(service/plugin/import.go);octo-cli skills --install <本地包> |
| expert / expert_team | 通过 Fleet 安装到 Loop 工作区 |
| connector (MCP) | 通过市场分发 MCP 连接元数据,expert 配置中引用 |
3.6 安装行为
- skill 安装:经 octo-cli 写入本地 runtime Skills 根目录,写入安装策略 + 自动去重 + 失败重试
- expert/expert_team 安装:经 Fleet 以调用者转发 token 授权,写入 Loop/Fleet 云端编排,强制 workspace/runtime/Space 作用域
- 安装后统计:install 计数 +1
§4 版本管理
| 版本特性 | 说明 |
|---|---|
| 不可变快照 | 已发布版本 = 不可变快照(plugin_versions 表 + migrations),append-only 审计 |
| 版本并存 | current v1 与 in-review v2 可并存,用户看到已发布版,审核者看到待审版 |
| 版本号规则 | 强制 SemVer x.y.z,升级校验 VersionNotRegressed——只能升或不变,不可回退版本号 |
| 灰度 canary | ❌ 未找到灰度发布能力 → 🔴待私有仓确认 |
| 一键回滚 | ❌ 未找到一键回滚端点 → 🔴待私有仓确认 |
| 配置/数据迁移 | ❌ 未找到版本升级时配置或数据迁移机制 → 🔴待私有仓确认 |
§5 Bot / Skill / Expert 组合关系
5.1 包含关系(非并列)
expert_team (Squad)
└── expert (成员) ← expert_team_expert 关系,MaxSquadMembers=30
└── skill (技能) ← expert_skill 关系,MaxExpertSkills=20
└── connector (MCP server,expert 运行时调用)
└── tool {Name, Description}(connector 下的工具结构)
5.2 同源关系
- octo-cli 的 skill 与 Marketplace 的 skill 同源:CLI 使用 Bot 凭证从同一 Marketplace 服务下载制品,本地与市场是同一个 skill 包体系。
5.3 Bot 作为创建者
- Bot 可作为 creator 上架 skill/connector(
CreatedByType: bot) - 但 owner 同 Bot owner,无权限增益,仅在市场展示 Bot 创建徽章
- ❌ "自定义 Bot 整体发布为可分发插件" → 源码中未找到此端点,Bot 仅作为 creator 身份存在
§6 安全模型
6.1 Marketplace 层已确认安全能力
| 安全项 | 状态 | 说明 |
|---|---|---|
| 认证委托 | ✅ | AUTH_ENABLED=true,认证委托 octo-server |
| API Space 强隔离 | ✅ | 身份/Space 只来自已验证请求上下文,请求 body 不能自选 owner/space;跨 Space 请求返回 NOT_FOUND(不泄露资源是否存在) |
| 下载鉴权 | ✅ | OSS_DOWNLOAD_SIGNED=true,MinIO marketplace bucket 私有,所有下载走签名 URL |
| 制品完整性校验 | ✅ | skill 制品 SHA256 摘要校验 + 大小上限(MAX_UPLOAD_MB=20) |
| 安装授权 | ✅ | expert/skill 经 Fleet 以调用者转发 token 授权,Fleet 强制 workspace/runtime/Space 作用域 |
| 审批回调防伪造 | ✅ | IM 审批卡片使用 HMAC 签名重推 |
| 密码安全 | ✅ | market-preflight 校验 DB 密码非空、合法字符集、非 CHANGE_ME、非常量默认值 |
| MinIO 凭据隔离 | ✅ | 使用独立 app 用户 octo-app,密钥经环境变量注入 |
6.2 Marketplace 本身不运行插件
Marketplace 是纯分发/目录服务,不在自身进程中加载或执行任何插件代码。
插件运行在 Fleet(expert/expert_team 云端编排)或本地 octo-daemon/runtime(skill/connector)中。
6.3 🔴 P0 运行期安全待确认(私有仓边界)
| 待确认项 | 优先级 | 说明 |
|---|---|---|
| 运行期 seccomp / 容器沙箱隔离 | 🔴 P0 | skill/connector 在本地 runtime 执行时是否有系统调用过滤/容器隔离 |
| 宿主文件系统 / 网络白名单 | 🔴 P0 | 插件是否可以任意访问宿主文件系统和网络,或有白名单限制 |
| 显式权限声明模型 | 🔴 P0 | 安装前是否展示权限清单、安装后是否收紧权限、卸载是否立即撤销授权 |
| 制品安全扫描 / 病毒扫描 | 🔴 P0 | 上传制品是否有静态安全扫描;当前仅有 SHA256 完整性校验(非安全扫描) |
| 制品数字签名 | P1 | 上传/下载制品是否有数字签名验证;当前"签名"仅指审批卡 HMAC,非制品签名 |
⚠️ 售前口径提醒:在 P0 安全项未确认前,对客户表述 Marketplace 安全能力时应明确"分发层鉴权完备,运行期沙箱能力待 Fleet/octo-daemon 确认",不要声称"插件完全沙箱隔离"。
§7 评分与统计
7.1 评分机制(管理员评分,非众评)
| 评分项 | 说明 |
|---|---|
| 评分字段 | 单字段 rating TINYINT(1-5) |
| 设置方式 | 仅管理员经 PATCH /admin/plugins/:id/rating 设置 |
| 用户评分/评论 | ❌ 不存在用户评分或评论功能 |
🔑 售前口径:评分是平台运营/管理员手动打星,不是 App Store 式的用户众评。如果客户问"用户评分在哪看",需要明确告知当前版本不支持用户评分。
7.2 统计数据
| 统计项 | 说明 |
|---|---|
| view 计数 | 浏览量 |
| download 计数 | 下载量 |
| install 计数 | 安装量 |
§8 部署与基础设施硬事实(保留)
8.1 marketplace 主服务
| 项目 | 事实 |
|---|---|
| 服务镜像 | mininglamposs/octo-marketplace:latest |
| 容器端口 | 8092(API_PORT) |
| 数据库 | MySQL octo_marketplace(utf8mb4_general_ci),用户 marketplace |
| 缓存 | Redis DB 0(redis://redis:6379/0) |
| 对象存储 | MinIO bucket marketplace(资源包/图标/截图) |
| 存储驱动 | OSS(S3 兼容,对接 MinIO) |
| 认证 | AUTH_ENABLED=true(委托 octo-server) |
| 上传限制 | MAX_UPLOAD_MB=20 |
| 下载安全 | OSS_DOWNLOAD_SIGNED=true(签名 URL,bucket 私有) |
| 健康检查 | GET /healthz(端口 8092) |
| Profile 开关 | docker-compose 默认启动;Helm marketplace.enabled 默认 false |
8.2 Nginx 路由
| URL 路径 | 后端 | 说明 |
|---|---|---|
/market/api/* |
marketplace:8092 | rewrite → :8092/api/* |
/market/healthz |
marketplace:8092 | 健康检查直连 |
⚠️ 前端环境变量 `MARKET_API_URL: http://marketplace:8092`(容器内直连)与 nginx `/market/api/*` 路由并存,前端实际走哪条路径待查前端代码确认。
8.3 初始化
- market-preflight(每次启动幂等):创建数据库/用户/授权,校验密码强度
- minio-init:预创建
marketplacebucket,不设匿名策略(保持私有)
§9 私有仓待确认项汇总
| 编号 | 待确认项 | 所在组件 | 优先级 |
|---|---|---|---|
| P0-1 | 运行期 seccomp / 容器沙箱隔离 | Fleet / octo-daemon | 🔴 P0 |
| P0-2 | 宿主文件系统 / 网络白名单 | Fleet / octo-daemon | 🔴 P0 |
| P0-3 | 显式权限声明模型(安装前展示/安装后收紧/卸载撤销) | Fleet / octo-daemon | 🔴 P0 |
| P0-4 | 制品安全扫描 / 病毒扫描 | marketplace / upload pipeline | 🔴 P0 |
| P1-1 | 制品数字签名(非审批卡 HMAC) | marketplace | P1 |
| P1-2 | 灰度 canary 发布 | marketplace / Fleet | P1 |
| P1-3 | 一键回滚机制 | marketplace / Fleet | P1 |
| P1-4 | 配置/数据升级迁移 | marketplace / Fleet | P1 |
| P2-1 | 前端 API 走直连还是 nginx 路由 | web 前端 | P2 |
| P2-2 | Helm vs docker-compose 生产默认 profile | deployment | P2 |
| P2-3 | 安装审计日志(谁/何时/装了什么) | marketplace | P2 |
§10 与其他模块关系
| 模块 | 关系 |
|---|---|
| octo-server | 认证委托(AUTH_ENABLED + OCTO_API_URL);保留对接令牌与审批卡路由 |
| BotFather | 🔑 完全独立解耦:Bot 通过 BotFather 创建/管理,不走 Marketplace 分发 |
| Loop / Fleet | expert/expert_team 安装后在 Fleet 云端编排;安装经 Fleet 以调用者转发 token 授权 |
| octo-cli / local runtime | skill 安装到本地 runtime Skills 根目录;CLI 用 Bot 凭证从 Marketplace 下载;connector(stdio) 本地运行 |
| MinIO | 资源包/图标/截图存储(marketplace bucket,签名 URL 下载) |
| MySQL | 元数据存储(octo_marketplace 库,plugins/plugin_versions/plugin_relations 等表) |
| Redis | 高频查询缓存(DB 0) |
| OctoPush | 客户端有独立的"龙虾专家市场",与 Web Marketplace 为不同承载面 |
§11 版本记录
- v0.1(2026-09-21):基于内部部署仓库硬事实初版;资源类型推断为"Skill/Bot/MCP"三类
- v0.2(2026-09-21):根据产品管家首轮回答修订;纠正 Bot 不是分发类型;MCP 以「连接器」形态出现;待确认项 M-01~M-09
- v1.0(2026-09-22):🔴 源码确认级重大升级——基于 Mininglamp-OSS/octo-marketplace 全量开源代码 + Q7 深度回答:
- PluginType 精确为 4 种:expert / expert_team / skill / connector(删除 v0.2 中"插件"作为独立类型的模糊描述;connector 即 MCP server)
- 新增 §1 BotFather 边界专节:醒目标注"市场 ≠ BotFather",含对比表
- 新增 §2 四种 PluginType 全景表:含定义/运行环境/传输方式/上限常量(MaxSquadMembers=30/MaxExpertSkills=20)
- 新增 §3 上架/审核/安装/私有市场完整流程:生命周期状态机、发布 API 链路、默认 auto-approve 安全警告、visibility 四档确认(解决 M-04)、离线导入、IM 审批 HMAC
- 新增 §4 版本管理:不可变快照/版本并存/semver 只升不降;灰度/回滚/迁移标🔴待确认
- 新增 §5 组合关系:plugin_relations 包含链(team→expert→skill→connector→tool)、octo-cli 同源、Bot creator 身份
- 新增 §6 安全模型:Marketplace 不运行插件、API Space 强隔离、SHA256 校验、Fleet 转发 token 授权;🔴 P0 运行期待确认项单独列表
- 新增 §7 评分与统计:管理员评分非众评(关键售前口径)、view/download/install 三类计数
- 部署硬事实保留为 §8:环境变量/路由/初始化信息完整保留
- 待确认项重构为 §9:按优先级分 P0/P1/P2,明确标注私有仓边界
- confidence 从 medium-high 提升至 high(开源仓全可读,分发层确认级约 18 条;仅运行期待私有仓确认)
- v0.2 中"插件市场"与"专家市场"分两个承载面的描述整合为统一 PluginType 模型