Files
LangBot/zh/plugin/certified-plugins.mdx
T

61 lines
3.7 KiB
Plaintext

---
title: "认证插件与无状态组件"
description: "认证插件为什么共享 Worker,以及 stateless-v1 组件规范。"
---
认证只代表精确、不可变的插件制品可在 LangBot Cloud 跨租户共享,不是一般的质量或安全徽章。安装的制品拥有有效可信签名后必须以 shared 模式运行,不得回退到 dedicated。市场上的**认证插件**标识本身不能证明下载的 ZIP 已通过验证,也不能证明线上 Worker 实际共享。相同 artifact digest 的安装共享一个 Worker、一个 `BasePlugin` 实例和一组组件实例;每个安装只保留轻量的配置、权限与生命周期上下文。这里的“一组组件”指每个已声明组件 manifest 各一个实例,包括 EventListener、Tool、Command、KnowledgeEngine、Parser、Page 和 Runner。
## 声明
```yaml
execution:
python:
path: main.py
attr: Plugin
sharedRuntime: shared-runtime-v1
componentModel: stateless-v1
```
两个字段必须同时出现。声明只是申请,不能代替绑定精确制品的可信辅助审查、人工批准和有效签名。辅助审查只是内部前置证据,不是中间认证等级。
## 无状态组件规范
- `BasePlugin.initialize()` 和组件 `initialize()` 是进程级初始化,每个 Worker 只运行一次。
- 所有组件实例都可能同时处理不同工作区的调用,必须可重入。
- 在 `BasePlugin` 中使用 `self.get_config()`;在组件中使用 `self.get_plugin_config()` 或 `self.plugin.get_config()` 读取当前安装配置。
- 不得在实例字段或模块全局变量中保存配置、凭据、Workspace/installation ID 或请求数据。
- 不得在 `initialize()` 中读取并保存租户配置。
- 存储、文件、凭据、日志、模型及其他平台能力必须通过 SDK Host API 访问;SDK 从当前 task-local invocation context 取得权限。
- 持久租户状态必须保存在 Host 服务中。进程内 cache 只能保存 artifact 级公共数据,或以完整 installation binding 为 key 并支持撤销清理。
- `stateless-v1` 当前禁止携带租户数据的 detached 后台任务或线程;SDK 尚未提供插件侧所有权/撤销 API。
这些约束为未来 serverless 组件执行保留接口语义;当前版本仍运行长生命周期 Worker,并未提供 serverless 部署模式。
## 配置访问示例
```python
class LookupTool(Tool):
async def initialize(self):
self.transport = StatelessHTTPTransport()
async def call(self, params, **kwargs):
config = self.get_plugin_config()
return await self.transport.lookup(config["endpoint"], params)
```
不要这样写:
```python
async def initialize(self):
self.endpoint = self.plugin.config["endpoint"]
self.api_key = self.plugin.config["api_key"]
```
共享初始化没有租户配置,因此这段代码会读取空值/旧值或失败;任何把调用配置保存到共享对象的做法都是认证 blocker。
## 兼容旧插件
旧源码和未签名插件包仍兼容专属 Worker,Cloud 也允许未签名专属安装。不存在专属运行认证或专属签名。Cloud 必须拒绝畸形、伪造、不可信或缺少 `stateless-v1` 声明的旧版签名证书,不能将其当作未签名制品。自托管 OSS 不内置认证签发方公钥,仅支持单工作区;不支持配置公钥获得认证共享运行。已有安装或市场标识不代表获得共享资格。仅修改 manifest 不会通过认证审查。
认证流程仍包括辅助代码审查和人工批准,并将插件身份、版本、digest、`shared-runtime-v1` 与 `stateless-v1` 一起签入证书。提交方式参阅[发布到插件市场](/zh/plugin/dev/publish/market)。