Skip to content

Plugin Extensions CN

JAVA-Lw edited this page Sep 9, 2026 · 2 revisions

插件扩展

本类目面向插件开发者,说明如何选择扩展入口、实现插件、接入宿主并验证交付。先阅读本页,再选择下面的示例。

文章 解决的问题 示例状态
GitHub 一键登录认证插件 怎样增加一种登录方式,哪些职责归认证插件,哪些归宿主 实现设计示例;当前没有可直接安装的 GitHub 登录插件
新增模型供应商插件 新增大语言模型供应商要写哪些文件、实现哪些协议、如何打包验证 基于现有供应商实现与正式打包工具的开发指南

本文及两个示例均以宿主 2143c8d4 为代码基线。供应商示例另参考官方插件仓库 87c3468。日期:2026-09-09。这里只新增中文文档,其他语言待中文内容核验后再补。

先按职责选择入口

插件架构可以从三个独立问题理解:提供什么能力、代码在哪里执行、宿主怎样治理它。包名或目录名不能替代这三个问题。

要扩展什么?
│
├─ 登录认证、可信身份、宿主基础设施
│   └─ HostExtension:宿主启动时装配,变更按重启边界生效
│
├─ 调用模型供应商、适配上游协议
│   └─ RuntimeExtension:使用现有 Provider 进程协议
│
└─ 已开放接口的检查、事件处理、插件自有数据
    └─ 受管贡献:声明 + 宿主授权 + 执行绑定 + 有效计划

两种治理边界与原来的三个名称

名称 主要职责 当前使用方式
HostExtension 可信宿主扩展,例如认证、基础设施、系统级注册 宿主启动时注册和装配;实现必须有真实入口,不能只写 manifest
RuntimeExtension 在宿主提供的执行契约下完成运行时任务,例如模型供应商 原有供应商进程插件继续使用;新组合机制还提供受管贡献执行入口
CapabilityPlugin 在宿主开放的能力契约下提供能力贡献 名称与输入分类保留;能做什么取决于具体槽位、契约和授权

新的组合架构把治理边界收敛为 可信宿主扩展 和 受管插件。原来三个名称仍会出现在源码、manifest 和目录中;这不意味着要把现有插件全部重写成两种新格式。

RuntimeExtension 和 CapabilityPlugin 的旧包分类也不再适合表达所有职责:同一个新受管包可以声明多个贡献,每个贡献分别绑定处理器和权限。多贡献声明不意味着任意贡献都已有执行支持。

Rust 的进程插件与反复卸载宿主内 .so / .dll 是不同的执行方式。现有供应商可以继续用 Rust 编写独立进程;可信宿主扩展仍按启动和重启管理,不承诺 native 库反复热卸载。

两个示例分别走哪条路

需求 选择 原因
用 GitHub 账号登录 1flowbase 可信认证扩展与宿主认证装配 涉及外部身份验证、本地账号映射和宿主会话
给工作流新增一个大语言模型供应商 现有 model_provider 槽位及 Provider 协议 主要工作是配置、模型目录、请求和响应转换
在创建数据建模定义前执行组织规则 已开放的受管 Hook 宿主已有这个业务操作的阶段契约
创建完成后通知另一插件处理 已开放的受管事件契约 需要声明订阅、获得授权并绑定事件处理器

供应商协议里的 auth 用于获取上游供应商凭据,例如授权一个供应商实例。它不负责让用户登录 1flowbase,不能拿来代替 GitHub 登录认证。

注册、授权、调用和通知怎样衔接

对新受管贡献,可以按下面的顺序理解:

安装包
  → 解析贡献声明与逐贡献执行绑定
  → 分配到工作区
  → 宿主保存逐贡献授权事实
  → 编译并发布有效执行计划
  → 冻结本次调用所用的计划和版本
  → 执行 Hook / 消费事件 / 访问已授权数据

声明回答“插件希望提供和使用什么”;授权回答“这个安装实例的这个贡献现在被允许做什么”。插件不能通过修改自己的 manifest 获得权限。

同步 Hook 和事件通知分工不同:

机制 适合做什么 结果由谁负责
接口 Hook 在一次接口执行的已开放阶段做检查或观察 主业务结果由宿主接口负责
持久事件 业务提交后触发独立处理、重试和插件协作 业务提交与消费结果分别记录
Provider 调用 执行一次模型生成、列模型或供应商操作 Provider 协议与宿主运行时共同约束

受管事件采用持久记录、领取与确认、重试和幂等机制。涉及插件自有数据时,当前实现把受支持的数据写入与消费回执放在同一事务中。调用外部服务仍需对方支持幂等,不能由此推导出外部副作用严格只发生一次。

这些机制在技术底座协调注册、授权与交付;业务身份、会话、数据事务和供应商协议仍由各自的模块负责。

当前开放范围:不要把架构能力理解成全部接口已开放

六阶段 Hook 是什么意思

当前受管 Hook 的正式业务入口是 model_definitions.create,即创建数据建模定义。HTTP 路径是:

POST /api/console/settings/data-models/model-definitions

这里的数据建模定义是业务数据结构,不是大语言模型供应商注册,也不是一次大语言模型推理。

Hook 可以理解为宿主在这个操作中预留的回调位置:

阶段 通俗含义 插件边界
Authorization 是否允许执行这个操作 增加权限约束;不能推翻核心权限拒绝
Admission 这次请求是否满足接纳条件 在宿主契约内增加准入检查
Before 主业务执行前再检查一次 读取受允许的上下文,可否决;不能改写请求
After 主业务返回成功值后的回调 观察结果,不能把核心成功改成失败
Failure 适用的拒绝或失败回调 部分前置拒绝时主业务尚未执行;不能把拒绝或失败改成成功
Completion 成功或失败最终结束时的观察 观察终态,不能替换主结果

例如,创建一份“客户资料”数据建模定义时,插件可以检查是否满足组织命名规则;不满足就拒绝,满足才继续。它不能偷偷重命名字段。如果核心已经因为用户无权限而拒绝,插件返回“允许”也不能放行。

六个位置不是每次都顺序执行:前置拒绝会阻止主业务;成功与失败进入不同终态路径。观察 Hook 的错误由相应诊断或交付机制记录,不据此重写核心已经产生的结果。

宿主先读取主业务的 Ok / Err,再选择 After 或 Failure;这两个回调不负责判断主业务成败。观察插件自身也可报告失败,但“创建成功、观察失败”是两个独立结果。

事件仍是有限契约

基线实现覆盖创建事件及 A → B/C 的组合链,包括 acme.composition-a.processed@1,载荷和处理器受到约束。它证明了逐贡献授权、可靠交付和恢复机制,不是已经开放任意主题名、任意载荷和任意插件处理器的通用消息平台。

新增业务接口 Hook、插件事件类型或新的执行方式,都需要扩展宿主可识别的契约、处理器装配与验收,不能只在包里添加一个名字。

现有插件的兼容与版本

版本信息 表达什么 当前供应商示例
manifest_version 安装清单格式 1
schema_version 清单 schema 标识 1flowbase.plugin.manifest/v1
contract_version 宿主与插件的执行协议 1flowbase.provider/v2
version 插件发行版本 例如 0.1.0

因此,v1 清单搭配 Provider v2 协议是正常组合。新增普通供应商无需改用 manifest_version: 2。新受管多贡献清单与 Provider 协议是不同层面的版本,不能相互替换。

对受管安装,同一 plugin_id + version 的恢复需要原始归档字节完全一致。修改内容应发布新版本;重新打包得到不同校验和,也不能冒充原归档。缺少可信历史校验和时不能据当前文件认领旧身份。这个规则不能直接外推为所有纯旧版供应商重装路径都已改变。

受管插件停用或权限撤销会保留历史积压。恢复时仍需原精确目标和当前有效授权,重新启用不等于自动恢复,旧事件也不会自动交给最新版。

开发与交付检查

  1. 确定职责:宿主身份、运行时供应商,还是已开放的 Hook / 事件贡献。
  2. 找到实际契约和现有实现;区分声明入口与执行入口。
  3. 明确配置、凭据、数据和外部调用分别由谁拥有。
  4. 只声明实际实现的能力,补齐正常、拒绝、失败及停用路径。
  5. 使用正式安装或宿主装配路径验证;脚手架回显和独立 demo 不能证明端到端可用。
  6. 发布新版本,保留所需制品与证据,再验证升级行为。

延伸阅读与源码

1flowbase Wiki

Quickstart

License

Use Cases

Evaluation Checklists

插件扩展

Engineering

Project

Clone this wiki locally