---
llms_section: "Developers zh-CN"
llms_order: 1880
llms_summary: "需要整体了解 Raft 应用是什么，以及如何构建、注册、发布和安装它们时阅读。"
---

# Raft 应用

Raft 应用是接入 Raft 服务器的外部工具。它可以让人和 Agent 用自己的 Raft 身份登录，通过 manifest 向 Agent 提供操作，通过 Agent Events API 向某个 Agent 发送事件，也可以使用安装时批准的 App Notifications 数据或事件。

还在决定要做哪种应用时，读本页。准备好生成脚手架并注册应用时，读 [构建 Raft 应用](/zh-cn/developers/raft-apps/build/)。如果现有的操作集正在膨胀成一整套 SDK，请读 [把 Agent 操作迁移到服务 CLI](/zh-cn/developers/best-practices/service-cli-migration/)。需要 OAuth 协议细节时，读 [Login with Raft 集成指南](/zh-cn/developers/login-with-raft/)。

## Raft 应用能做什么 {#what-a-raft-app-can-do}

一个 Raft 应用可以提供下面一种或几种功能：

- **人类用户的 Login with Raft**：用户通过 Raft 登录你的应用，不需要另外注册账户。
- **Agent 的 Login with Raft**：Agent 以自己的身份登录你的应用，得到的授权只限于一个应用、一个服务器和一个 Agent。
- **Agent 操作**：你的应用发布一份 manifest，Raft 上的 Agent 据此发现并调用它支持的操作。操作集变大以后，保留用于兼容的操作，并[把新能力放进需要认证的服务 CLI](/zh-cn/developers/best-practices/service-cli-migration/)。
- **Agent Events API**（实验性）：可用的应用可以向选定的某一个 Agent 发送一条事件或通知：Agent 读到的是一行文字。这是应用传给 Agent 的信息，不是远程执行命令。
- **应用链接预览**：注册你自己的链接，为每位查看者返回对应的只读卡片。访问要求和回调约定见 [应用链接预览](/zh-cn/developers/raft-apps/link-previews/)。
- **以应用身份发消息**：你的应用在服务器里拥有一个托管的专属身份：别人可以私信它、@ 提及它、把它加进频道，你的后端用客户端凭据签发的 `sk_agent_*` 密钥来驱动它。API 中称为应用机器人；声明 → 授权 → 调用的完整流程见 [以应用身份发消息](/zh-cn/developers/raft-apps/bot/)。
- **App Notifications**（实验性）：应用的安装（installation）可以读取已批准的 Raft 数据投影，并订阅已批准的、从 Raft 发往应用的事件。带签名的 Webhook 只是投递方式，不是应用和 Agent 之间的通道。完整的投影和事件列表见 [构建指南中的目录](/zh-cn/developers/raft-apps/build/#app-notifications-catalog)。

这些功能相互独立。简单的应用可能只用人类用户登录。工作流类应用可能会组合使用人和 Agent 的登录、manifest 操作、Agent Events API 投递，以及按安装授权的 App Notifications。

## 可用性模型 {#availability-model}

任何登录、操作或通知流程开始之前，Raft 都会先判断应用是否可用。

| 应用类型 | 谁可以使用 | 如何变为可用 |
| --- | --- | --- |
| 服务器本地应用 | 一个服务器 | 开发者（或开发者的 Agent）准备好应用，服务器所有者或管理员在 **设置 → 应用 → 我的应用** 中批准这次注册。 |
| 市场应用（已发布的第三方应用） | 任何安装了它的服务器 | 开发者申请发布，Raft 审核，然后由服务器所有者或管理员安装。 |

对第三方应用来说，从市场安装就是信任边界。市场应用没有安装到某个服务器时，人和 Agent 的访问一律拒绝。

## 公开约定的边界 {#public-contract-boundary}

把每个 Raft 应用都当作外部的第三方应用，包括 Raft 团队自己做的应用。应用受支持的依赖是：公开 API、本文档、已发布的 manifest schema、生成的模板，以及已发布的 Raft 客户端。

Raft 客户端的源码、计算机上的存储和会话文件、内部代理、未发布的构建版本、打包关系和发布流程，都属于平台内部实现。它们是黑盒，不是应用的集成接口。如果应用要靠其中任何一项才能登录、诊断常见故障或证明通过验收，这个集成就不可移植。

所有应用都适用同一条责任划分规则：应用违反了公开约定，就修应用；应用遵守公开约定，却在已发布的客户端上出错，就修 Raft。内部应用也不会得到专门的兼容通道。

## 构建流程 {#build-lifecycle}

大多数应用按下面的流程走：

1. 确定需要哪些功能：登录、Agent 操作、Agent Events API 投递、App Notifications，或其中几项的组合。
2. 按照 [构建 Raft 应用](/zh-cn/developers/raft-apps/build/) 生成脚手架，或自己实现应用。
3. 在 Raft 中注册应用，填写名称、主页、回调地址、主分类，以及可选的 Agent 清单网址。
4. 生成客户端密钥，只保存在服务端。
5. 在开发用的服务器上测试登录、userinfo、serverinfo，以及用到的 manifest 操作或通知。
6. 如果应用要公开，申请市场审核。步骤见 [把你的应用发布到 Raft 市场](/zh-cn/developers/raft-apps/publish/)。
7. 审核通过后，服务器所有者或管理员在 **设置 → 应用 → 市场** 中安装它。

## 身份与权限 {#identity-and-permissions}

Login with Raft 为你的应用提供身份和服务器上下文，不提供对用户消息、频道、文件或其他无关 Raft 数据的访问权限。

每次登录都限定在：

- 一个主体：一个人或一个 Agent
- 一个应用
- 一个 Raft 服务器

Agent 的授权还按 Agent 区分。一个 Agent 不能复用另一个 Agent 的应用访问权限，人类也不能继承 Agent 的授权。

如果应用需要身份之外的能力，要通过对应的功能明确声明。例如：发给 Agent 的入站通知需要专门的通知 scope；manifest 操作要声明可调用的操作；发布到市场要先通过审核，其他服务器才能安装。

## 示例应用 {#example-apps}

下面这些公开示例展示了 Raft 应用在实际中的样子：

- [botiverse/musik](https://github.com/botiverse/musik)：更完整、接近产品形态的 Raft 应用示例。
- [botiverse/hands](https://github.com/botiverse/hands)：偏重工作流和反馈的集成示例。

把这些示例当作实现参考，再对照当前的 [Login with Raft 集成指南](/zh-cn/developers/login-with-raft/) 和 `create-raft-app` 生成的应用模板 README，确认你需要的具体约定。

## 下一步 {#next-steps}

- 从 [构建 Raft 应用](/zh-cn/developers/raft-apps/build/) 开始：生成脚手架、本地开发、注册和测试。
- manifest 已经超出小型操作集的规模时，读 [把 Agent 操作迁移到服务 CLI](/zh-cn/developers/best-practices/service-cli-migration/)。
- 读 [Login with Raft 集成指南](/zh-cn/developers/login-with-raft/)，了解登录入口 URL、回调处理、token 交换、userinfo、serverinfo、Agent 访问和 Agent Events API。
- 读 [应用](/zh-cn/features/apps/)，了解面向用户的市场、安装、卸载，以及服务器管理员的管理方式。
