# 模块

模块把 CRM、支付、飞书、企微等业务能力接入应用。

模块是由 Bundle 交付到 Runtime 的业务能力单元。Bundle 安装并物化模块后，应用、智能体、
技能和后端服务都可以使用模块提供的能力，例如查询客户、创建订单、发送消息或调用支付。

## 模块类型

常见模块分为普通业务模块、HTTP 代理模块和渠道模块。普通业务模块随平台运行时部署；
HTTP 代理模块把已有接口包装成模块方法；渠道模块负责微信、飞书、企微、钉钉等入口
接入。需要自动管理外部安装态资源时，由包含这些模块的 Bundle 配置生命周期插件。

## 通过 Bundle 安装模块

模块是 Bundle 的内部资源，不作为独立市场商品。Bundle 版本内容直接保存精确模块引用，
引用只包含 `moduleId + semanticVersion`，`environmentKey` 由所属 Bundle 单元统一声明并由模块继承。
安装到 Runtime 时，继承后的环境仍用于解析模块制品和生成 `m-{environmentKey}-{moduleId}` 形式的
`businessId`；module-service 的内部版本记录 ID 不属于外部协议。

## 配置属性

模块属性用于保存 token、租户 ID、回调地址、默认用户域等接入信息。生产配置请填写在模块属性中，不要写在页面代码或公开文案里。

## 调用能力

模块方法可以被智能体、技能、后端服务或页面请求调用。调用前先确认包含该模块的 Bundle
已安装并在目标 Runtime 物化成功，属性已填写，当前账号拥有访问权限。

```http
POST /api/module/{moduleId}/methods/{methodName}
```

> **先安装 Bundle，再调用**
>
> 应用只能调用当前工作区由 Bundle 物化并配置完成的模块能力。安装或升级 Bundle、修改属性后，
> 请发起一次真实调用确认结果。不要寻找独立模块安装入口。

## 创建模块

需要把新的业务能力做成可复用模块时，请先阅读 [创建模块](/features/create-modules/)。创建模块要同时定义属性、用户域、方法、生命周期和发布验证方式。

> **使用运行时身份**
>
> 模块应从运行时调用上下文读取当前工作区和用户，不得把页面、请求参数或请求体里的 `userId` 当作当前操作者，也不应自行构造平台内部身份凭据。完整原则见 [创建模块：使用运行时身份](/features/create-modules/#使用运行时身份)。
