uuos
// 插件 · 自定义开发

你的功能模块,走官方插件同一条路

uuos 没有给自己开后门:saas 与 im-channel 用的注册接口、路由挂载、导航投影,就是你要用的那一套。实现一个 Go 接口、声明一份 manifest,你的模块获得一级导航、租户鉴权、能力控制与初始化对账。

五步接入

  1. 01

    声明 Descriptor

    一份 manifest 说清一切:ai.uuos.* 命名空间下的插件 ID、版本、认证/公开路由基址、能力(capabilities)、一级导航与菜单/页面/API 资源。校验器强制命名规范与路由合法性。

  2. 02

    实现 Plugin 接口

    六个方法:Descriptor / AuthenticatedRoutes / PublicRoutes / Ready / Close / Upgrade。认证路由自动挂在租户鉴权之后,公开路由留给 webhook 回调,Upgrade 在版本变更时执行迁移。

  3. 03

    保持依赖单向

    插件不 import 宿主内部包。定义自己的中立 Scope 契约,由宿主适配器把租户与身份注入进来——官方插件 saas 与 im-channel 都是独立仓库,一行 uuos 代码不引。

  4. 04

    前端接 HostBridge

    页面包只依赖宿主注入的 apiBaseUrl、短期 token、capabilities、主题与语言,不读宿主内部状态。registerProductPlugin 注册后,入口出现在左侧一级导航。

  5. 05

    注册并交给对账

    Registry.Add() 在路由冻结前强校验唯一性(ID / 路由 / 资源);每次启动幂等对账,checksum 漂移自动修复,初始化失败指数退避——插件的运维复杂度由平台兜底。

// 插件契约(internal/productplugin)
type Plugin interface {
    Descriptor() Descriptor
    AuthenticatedRoutes() []Route
    PublicRoutes() []Route
    Ready(context.Context) error
    Close(context.Context) error
    // 版本变更时执行迁移钩子
    Upgrade(ctx context.Context, prev string) error
}

// manifest:一份声明说清一切
Descriptor{
    ID:                "ai.uuos.my-plugin",
    Name:              "我的插件",
    Version:           "0.1.0",
    Mode:              "embedded",
    AuthenticatedBase: "/v1/my-plugin",
    Capabilities:      []string{
        "my-plugin.read",
    },
    // Navigation / Frontend / Resources …
}

// 启动时注册:ID / 路由 / 资源强校验
registry.Add(&MyPlugin{})

插件生命周期

从被发现到就绪的每一步都有状态落库,初始化报告经GET /v1/product-plugins/initialization 随时可查。

discoververifyinstallconfigureenableregisterready

失败不清除、只隔离:退避重试从 5 秒起步、5 分钟封顶,修复后自动回到 ready。

前端:页面包与宿主的约定

宿主给你什么

  • apiBaseUrl 与短期 token——请求自己的插件 API
  • tenant / workspace 上下文与 capabilities
  • 主题(亮/暗)与语言,跟随宿主切换
  • 导航注册:入口出现在一级菜单,按权限投影

页面包不读宿主内部 store——换个宿主也能跑。

// 前端注册(TypeScript)
registerProductPlugin({
  id: "ai.uuos.my-plugin",
  route: "/my-plugin",
  requiredCapability: "my-plugin.read",
  load: () => import("@my-org/my-plugin-web"),
})

常见问题

现在能开发第三方插件吗?

embedded 模式面向官方与源码级集成,机制今天就在生产路径上(saas、im-channel 即由此接入)。面向第三方的 remote 模式——独立服务 + M2M 短期令牌 + iframe 页面握手——契约已在设计文档中定义,实现在路线图上。想提前接入可以联系我们。

插件能添加自定义画布节点吗?

不能。画布节点是核心内置能力,保证「连出来的图一定能编译」。运行时扩展的正确姿势:用 HTTP 节点调用你的服务,或把工具以自定义 HTTP 工具 / MCP 服务器的形式接入工作流。

有参考实现吗?

有,而且就是生产代码:saas 与 im-channel 的接入没有走任何隐藏 API——宿主侧适配器、Descriptor 声明、前端页面包接线,都是自定义插件可以照抄的样板。

想成为首批第三方插件开发者?联系我们

继续了解插件体系
// 开始构建

下一个上线的 Agent,从一块空画布开始

Free 计划包含每月 100 次运行与 500K token,足够把完整流程跑通。无需信用卡。