chore(i18n): refresh zh-CN translations
This commit is contained in:
parent
e0c7f06ec8
commit
b62b80e7c3
@ -1,20 +1,20 @@
|
||||
---
|
||||
read_when:
|
||||
- 设置 Slack 或调试 Slack socket/HTTP 模式时
|
||||
summary: Slack 设置与运行时行为(Socket Mode + HTTP Request URLs)
|
||||
- 设置 Slack 或排查 Slack socket/HTTP 模式问题
|
||||
summary: Slack 设置和运行时行为(Socket Mode + HTTP Request URLs)
|
||||
title: Slack
|
||||
x-i18n:
|
||||
generated_at: "2026-04-07T00:07:41Z"
|
||||
generated_at: "2026-04-08T05:00:32Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 2b8fd2cc6c638ee82069f0af2c2b6f6f49c87da709b941433a0343724a9907ea
|
||||
source_hash: cad132131ddce688517def7c14703ad314441c67aacc4cc2a2a721e1d1c01942
|
||||
source_path: channels/slack.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Slack
|
||||
|
||||
状态:已可用于通过 Slack 应用集成实现私信和渠道。默认模式为 Socket Mode;也支持 HTTP Request URLs。
|
||||
状态:已可用于通过 Slack 应用集成在私信和渠道中投入生产使用。默认模式为 Socket Mode;也支持 HTTP Request URLs。
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="配对" icon="link" href="/zh-CN/channels/pairing">
|
||||
@ -24,7 +24,7 @@ x-i18n:
|
||||
原生命令行为和命令目录。
|
||||
</Card>
|
||||
<Card title="渠道故障排除" icon="wrench" href="/zh-CN/channels/troubleshooting">
|
||||
跨渠道诊断与修复操作手册。
|
||||
跨渠道诊断和修复操作手册。
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@ -37,9 +37,9 @@ x-i18n:
|
||||
在 Slack 应用设置中,点击 **[Create New App](https://api.slack.com/apps/new)** 按钮:
|
||||
|
||||
- 选择 **from a manifest**,并为你的应用选择一个工作区
|
||||
- 粘贴下方的[示例清单](#manifest-and-scope-checklist),然后继续创建
|
||||
- 生成带有 `connections:write` 权限的 **App-Level Token**(`xapp-...`)
|
||||
- 安装应用,并复制显示的 **Bot Token**(`xoxb-...`)
|
||||
- 粘贴下面的[示例清单](#manifest-and-scope-checklist),然后继续创建
|
||||
- 生成一个带有 `connections:write` 的 **App-Level Token**(`xapp-...`)
|
||||
- 安装应用并复制显示的 **Bot Token**(`xoxb-...`)
|
||||
</Step>
|
||||
|
||||
<Step title="配置 OpenClaw">
|
||||
@ -85,7 +85,7 @@ openclaw gateway
|
||||
- 选择 **from a manifest**,并为你的应用选择一个工作区
|
||||
- 粘贴[示例清单](#manifest-and-scope-checklist),并在创建前更新 URL
|
||||
- 保存用于请求校验的 **Signing Secret**
|
||||
- 安装应用,并复制显示的 **Bot Token**(`xoxb-...`)
|
||||
- 安装应用并复制显示的 **Bot Token**(`xoxb-...`)
|
||||
|
||||
</Step>
|
||||
|
||||
@ -108,7 +108,7 @@ openclaw gateway
|
||||
<Note>
|
||||
为多账户 HTTP 使用唯一的 webhook 路径
|
||||
|
||||
为每个账户分配不同的 `webhookPath`(默认是 `/slack/events`),以避免注册冲突。
|
||||
为每个账户指定不同的 `webhookPath`(默认是 `/slack/events`),以避免注册冲突。
|
||||
</Note>
|
||||
|
||||
</Step>
|
||||
@ -125,7 +125,7 @@ openclaw gateway
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## 清单与作用域检查清单
|
||||
## 清单和 scope 检查清单
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Socket Mode(默认)">
|
||||
@ -290,14 +290,14 @@ openclaw gateway
|
||||
</Tabs>
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="可选作者身份作用域(写入操作)">
|
||||
如果你希望发出的消息使用当前智能体身份(自定义用户名和图标),而不是默认的 Slack 应用身份,请添加 `chat:write.customize` bot scope。
|
||||
<Accordion title="可选作者身份 scope(写入操作)">
|
||||
如果你希望出站消息使用当前智能体身份(自定义用户名和图标),而不是默认的 Slack 应用身份,请添加 `chat:write.customize` bot scope。
|
||||
|
||||
如果你使用 emoji 图标,Slack 要求采用 `:emoji_name:` 语法。
|
||||
如果你使用表情图标,Slack 期望使用 `:emoji_name:` 语法。
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="可选用户令牌作用域(读取操作)">
|
||||
如果你配置了 `channels.slack.userToken`,典型的读取作用域包括:
|
||||
<Accordion title="可选用户令牌 scope(读取操作)">
|
||||
如果你配置了 `channels.slack.userToken`,典型读取 scope 包括:
|
||||
|
||||
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
|
||||
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
|
||||
@ -314,39 +314,39 @@ openclaw gateway
|
||||
|
||||
- Socket Mode 需要 `botToken` + `appToken`。
|
||||
- HTTP 模式需要 `botToken` + `signingSecret`。
|
||||
- `botToken`、`appToken`、`signingSecret` 和 `userToken` 支持明文字符串或 SecretRef 对象。
|
||||
- `botToken`、`appToken`、`signingSecret` 和 `userToken` 接受明文字符串或 SecretRef 对象。
|
||||
- 配置中的令牌会覆盖环境变量回退。
|
||||
- `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` 环境变量回退仅适用于默认账户。
|
||||
- `userToken`(`xoxp-...`)仅支持通过配置提供(无环境变量回退),并默认采用只读行为(`userTokenReadOnly: true`)。
|
||||
- `userToken`(`xoxp-...`)仅可通过配置提供(无环境变量回退),且默认是只读行为(`userTokenReadOnly: true`)。
|
||||
|
||||
状态快照行为:
|
||||
|
||||
- Slack 账户检查会跟踪每个凭证的 `*Source` 和 `*Status` 字段(`botToken`、`appToken`、`signingSecret`、`userToken`)。
|
||||
- 状态值可以是 `available`、`configured_unavailable` 或 `missing`。
|
||||
- `configured_unavailable` 表示该账户通过 SecretRef 或其他非内联密钥源完成了配置,但当前命令或运行时路径无法解析实际值。
|
||||
- 在 HTTP 模式下会包含 `signingSecretStatus`;在 Socket Mode 下,必需的令牌对是 `botTokenStatus` + `appTokenStatus`。
|
||||
- Slack 账户检查会跟踪每个凭证对应的 `*Source` 和 `*Status` 字段(`botToken`、`appToken`、`signingSecret`、`userToken`)。
|
||||
- 状态值为 `available`、`configured_unavailable` 或 `missing`。
|
||||
- `configured_unavailable` 表示该账户通过 SecretRef 或其他非内联密钥来源完成了配置,但当前命令/运行时路径无法解析实际值。
|
||||
- 在 HTTP 模式下,会包含 `signingSecretStatus`;在 Socket Mode 下,所需的凭证对是 `botTokenStatus` + `appTokenStatus`。
|
||||
|
||||
<Tip>
|
||||
对于 actions/目录读取,如果配置了用户令牌,则可以优先使用用户令牌。对于写入操作,仍优先使用 bot 令牌;只有在 `userTokenReadOnly: false` 且 bot 令牌不可用时,才允许使用用户令牌写入。
|
||||
对于操作/目录读取,如果已配置用户令牌,则可以优先使用用户令牌。对于写入,仍优先使用 bot 令牌;只有在 `userTokenReadOnly: false` 且 bot 令牌不可用时,才允许使用用户令牌写入。
|
||||
</Tip>
|
||||
|
||||
## 操作与门控
|
||||
## 操作和门控
|
||||
|
||||
Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
|
||||
当前 Slack 工具中可用的操作分组:
|
||||
当前 Slack 工具中的可用操作组:
|
||||
|
||||
| 分组 | 默认值 |
|
||||
| 组 | 默认值 |
|
||||
| ---------- | ------- |
|
||||
| messages | enabled |
|
||||
| reactions | enabled |
|
||||
| pins | enabled |
|
||||
| memberInfo | enabled |
|
||||
| emojiList | enabled |
|
||||
| messages | 启用 |
|
||||
| reactions | 启用 |
|
||||
| pins | 启用 |
|
||||
| memberInfo | 启用 |
|
||||
| emojiList | 启用 |
|
||||
|
||||
当前 Slack 消息操作包括 `send`、`upload-file`、`download-file`、`read`、`edit`、`delete`、`pin`、`unpin`、`list-pins`、`member-info` 和 `emoji-list`。
|
||||
|
||||
## 访问控制与路由
|
||||
## 访问控制和路由
|
||||
|
||||
<Tabs>
|
||||
<Tab title="私信策略">
|
||||
@ -360,18 +360,18 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
私信标志:
|
||||
|
||||
- `dm.enabled`(默认 true)
|
||||
- `channels.slack.allowFrom`(推荐)
|
||||
- `channels.slack.allowFrom`(首选)
|
||||
- `dm.allowFrom`(旧版)
|
||||
- `dm.groupEnabled`(群组私信默认 false)
|
||||
- `dm.groupEnabled`(群私信默认 false)
|
||||
- `dm.groupChannels`(可选 MPIM 允许列表)
|
||||
|
||||
多账户优先级:
|
||||
|
||||
- `channels.slack.accounts.default.allowFrom` 仅适用于 `default` 账户。
|
||||
- 已命名账户在自身 `allowFrom` 未设置时,会继承 `channels.slack.allowFrom`。
|
||||
- 已命名账户不会继承 `channels.slack.accounts.default.allowFrom`。
|
||||
- 命名账户在其自身 `allowFrom` 未设置时,会继承 `channels.slack.allowFrom`。
|
||||
- 命名账户不会继承 `channels.slack.accounts.default.allowFrom`。
|
||||
|
||||
在私信中进行配对时,使用 `openclaw pairing approve slack <code>`。
|
||||
私信中的配对使用 `openclaw pairing approve slack <code>`。
|
||||
|
||||
</Tab>
|
||||
|
||||
@ -382,28 +382,28 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
- `allowlist`
|
||||
- `disabled`
|
||||
|
||||
渠道允许列表位于 `channels.slack.channels` 下,应使用稳定的渠道 ID。
|
||||
渠道允许列表位于 `channels.slack.channels` 下,并应使用稳定的渠道 ID。
|
||||
|
||||
运行时说明:如果 `channels.slack` 完全缺失(仅使用环境变量设置),运行时会回退到 `groupPolicy="allowlist"` 并记录警告(即使设置了 `channels.defaults.groupPolicy` 也是如此)。
|
||||
运行时说明:如果 `channels.slack` 完全缺失(仅使用环境变量设置),运行时会回退到 `groupPolicy="allowlist"` 并记录警告(即使已设置 `channels.defaults.groupPolicy` 也是如此)。
|
||||
|
||||
名称/ID 解析:
|
||||
|
||||
- 在令牌访问允许的情况下,渠道允许列表条目和私信允许列表条目会在启动时解析
|
||||
- 无法解析的渠道名条目会按配置保留,但默认在路由时被忽略
|
||||
- 入站授权和渠道路由默认优先使用 ID;直接的用户名/slug 匹配要求设置 `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
- 当令牌访问允许时,渠道允许列表条目和私信允许列表条目会在启动时解析
|
||||
- 无法解析的渠道名称条目会按配置保留,但默认会在路由时被忽略
|
||||
- 入站授权和渠道路由默认优先使用 ID;直接用户名/slug 匹配需要 `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="提及与渠道用户">
|
||||
渠道消息默认受提及门控控制。
|
||||
<Tab title="提及和渠道用户">
|
||||
渠道消息默认受提及门控限制。
|
||||
|
||||
提及来源:
|
||||
|
||||
- 显式应用提及(`<@botId>`)
|
||||
- 提及正则模式(`agents.list[].groupChat.mentionPatterns`,回退到 `messages.groupChat.mentionPatterns`)
|
||||
- 隐式回复 bot 线程行为(当 `thread.requireExplicitMention` 为 `true` 时禁用)
|
||||
- 提及正则模式(`agents.list[].groupChat.mentionPatterns`,回退为 `messages.groupChat.mentionPatterns`)
|
||||
- 隐式回复机器人线程行为(当 `thread.requireExplicitMention` 为 `true` 时禁用)
|
||||
|
||||
每个渠道的控制项(`channels.slack.channels.<id>`;名称仅可通过启动解析或 `dangerouslyAllowNameMatching` 使用):
|
||||
每渠道控制(`channels.slack.channels.<id>`;名称仅通过启动解析或 `dangerouslyAllowNameMatching` 生效):
|
||||
|
||||
- `requireMention`
|
||||
- `users`(允许列表)
|
||||
@ -412,49 +412,49 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
- `systemPrompt`
|
||||
- `tools`, `toolsBySender`
|
||||
- `toolsBySender` 键格式:`id:`、`e164:`、`username:`、`name:` 或 `"*"` 通配符
|
||||
(旧版未加前缀的键仍仅映射到 `id:`)
|
||||
(旧版无前缀键仍仅映射到 `id:`)
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## 线程、会话与回复标签
|
||||
## 线程、会话和回复标签
|
||||
|
||||
- 私信路由为 `direct`;渠道为 `channel`;MPIM 为 `group`。
|
||||
- 在默认 `session.dmScope=main` 下,Slack 私信会折叠到智能体主会话。
|
||||
- 私信路由为 `direct`;渠道路由为 `channel`;MPIM 路由为 `group`。
|
||||
- 使用默认 `session.dmScope=main` 时,Slack 私信会合并到智能体主会话。
|
||||
- 渠道会话:`agent:<agentId>:slack:channel:<channelId>`。
|
||||
- 线程回复在适用时可创建线程会话后缀(`:thread:<threadTs>`)。
|
||||
- `channels.slack.thread.historyScope` 默认是 `thread`;`thread.inheritParent` 默认是 `false`。
|
||||
- `channels.slack.thread.initialHistoryLimit` 控制新线程会话开始时获取多少已有线程消息(默认 `20`;设为 `0` 可禁用)。
|
||||
- `channels.slack.thread.requireExplicitMention`(默认 `false`):设为 `true` 时,会抑制隐式线程提及,因此 bot 只会响应线程中的显式 `@bot` 提及,即使 bot 已经参与了该线程。若不启用此项,在 bot 已参与的线程中回复将绕过 `requireMention` 门控。
|
||||
- 在线程回复适用时,可创建带线程会话后缀(`:thread:<threadTs>`)的会话。
|
||||
- `channels.slack.thread.historyScope` 默认值为 `thread`;`thread.inheritParent` 默认值为 `false`。
|
||||
- `channels.slack.thread.initialHistoryLimit` 控制新线程会话启动时抓取多少已有线程消息(默认 `20`;设为 `0` 可禁用)。
|
||||
- `channels.slack.thread.requireExplicitMention`(默认 `false`):设为 `true` 时,会抑制隐式线程提及,因此机器人只会响应线程中的显式 `@bot` 提及,即使机器人已经参与该线程。若不启用此项,已参与机器人线程中的回复会绕过 `requireMention` 门控。
|
||||
|
||||
回复线程控制:
|
||||
|
||||
- `channels.slack.replyToMode`: `off|first|all|batched`(默认 `off`)
|
||||
- `channels.slack.replyToModeByChatType`: 按 `direct|group|channel` 分别设置
|
||||
- 私聊的旧版回退:`channels.slack.dm.replyToMode`
|
||||
- `channels.slack.replyToModeByChatType`: 按 `direct|group|channel`
|
||||
- 私聊旧版回退:`channels.slack.dm.replyToMode`
|
||||
|
||||
支持手动回复标签:
|
||||
|
||||
- `[[reply_to_current]]`
|
||||
- `[[reply_to:<id>]]`
|
||||
|
||||
注意:`replyToMode="off"` 会禁用 Slack 中**所有**回复线程能力,包括显式的 `[[reply_to_*]]` 标签。这与 Telegram 不同,在 Telegram 中,显式标签在 `"off"` 模式下仍会生效。这种差异反映了平台的线程模型:Slack 线程会把消息隐藏在渠道之外,而 Telegram 回复仍会显示在主聊天流中。
|
||||
注意:`replyToMode="off"` 会禁用 Slack 中**所有**回复线程,包括显式 `[[reply_to_*]]` 标签。这与 Telegram 不同,在 Telegram 中,显式标签在 `"off"` 模式下仍会生效。这种差异反映了平台的线程模型:Slack 线程会将消息隐藏在渠道主流之外,而 Telegram 回复仍然显示在主聊天流中。
|
||||
|
||||
## 确认反应
|
||||
## Ack 反应
|
||||
|
||||
`ackReaction` 会在 OpenClaw 处理入站消息时发送一个确认 emoji。
|
||||
`ackReaction` 会在 OpenClaw 处理入站消息时发送一个确认表情。
|
||||
|
||||
解析顺序:
|
||||
|
||||
- `channels.slack.accounts.<accountId>.ackReaction`
|
||||
- `channels.slack.ackReaction`
|
||||
- `messages.ackReaction`
|
||||
- 智能体身份 emoji 回退(`agents.list[].identity.emoji`,否则为 `"👀"`)
|
||||
- 智能体身份表情回退(`agents.list[].identity.emoji`,否则为 `"👀"`)
|
||||
|
||||
说明:
|
||||
|
||||
- Slack 需要使用 shortcode(例如 `"eyes"`)。
|
||||
- 使用 `""` 可为该 Slack 账户或全局禁用该反应。
|
||||
- Slack 期望使用简码(例如 `"eyes"`)。
|
||||
- 使用 `""` 可为 Slack 账户或全局禁用该反应。
|
||||
|
||||
## 文本流式传输
|
||||
|
||||
@ -465,11 +465,13 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
- `block`:追加分块预览更新。
|
||||
- `progress`:生成期间显示进度状态文本,然后发送最终文本。
|
||||
|
||||
当 `streaming` 为 `partial` 时,`channels.slack.nativeStreaming` 控制 Slack 原生文本流式传输(默认:`true`)。
|
||||
当 `channels.slack.streaming.mode` 为 `partial` 时,`channels.slack.streaming.nativeTransport` 控制 Slack 原生文本流式传输(默认:`true`)。
|
||||
|
||||
- 必须存在回复线程,原生文本流式传输才会显示。线程选择仍遵循 `replyToMode`。如果没有线程,则会使用普通草稿预览。
|
||||
- 媒体和非文本负载会回退到普通投递方式。
|
||||
- 如果流式传输在回复中途失败,OpenClaw 会将剩余负载回退为普通投递。
|
||||
- 必须有可用的回复线程,Slack 原生文本流式传输和 Slack assistant 线程状态才会显示。线程选择仍遵循 `replyToMode`。
|
||||
- 当原生流式传输不可用时,渠道和群聊根消息仍可使用普通草稿预览。
|
||||
- 顶层 Slack 私信默认保持非线程模式,因此不会显示线程式预览;如果你希望那里有可见进度,请使用线程回复或 `typingReaction`。
|
||||
- 媒体和非文本负载会回退到普通投递。
|
||||
- 如果流式传输在回复中途失败,OpenClaw 会对剩余负载回退到普通投递。
|
||||
|
||||
使用草稿预览而不是 Slack 原生文本流式传输:
|
||||
|
||||
@ -477,8 +479,10 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
{
|
||||
channels: {
|
||||
slack: {
|
||||
streaming: "partial",
|
||||
nativeStreaming: false,
|
||||
streaming: {
|
||||
mode: "partial",
|
||||
nativeTransport: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -486,12 +490,13 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
|
||||
旧版键:
|
||||
|
||||
- `channels.slack.streamMode`(`replace | status_final | append`)会自动迁移到 `channels.slack.streaming`。
|
||||
- 布尔值 `channels.slack.streaming` 会自动迁移到 `channels.slack.nativeStreaming`。
|
||||
- `channels.slack.streamMode`(`replace | status_final | append`)会自动迁移到 `channels.slack.streaming.mode`。
|
||||
- 布尔值 `channels.slack.streaming` 会自动迁移到 `channels.slack.streaming.mode` 和 `channels.slack.streaming.nativeTransport`。
|
||||
- 旧版 `channels.slack.nativeStreaming` 会自动迁移到 `channels.slack.streaming.nativeTransport`。
|
||||
|
||||
## 输入中反应回退
|
||||
## 正在输入反应回退
|
||||
|
||||
`typingReaction` 会在 OpenClaw 处理回复期间,为入站 Slack 消息添加一个临时反应,并在本次运行结束时移除。它在线程回复之外最有用,因为线程回复默认使用 “is typing...” 状态指示。
|
||||
`typingReaction` 会在 OpenClaw 处理回复期间,为入站 Slack 消息临时添加一个反应,并在运行结束时将其移除。这在非线程回复场景中特别有用,因为线程回复会使用默认的“正在输入...”状态指示器。
|
||||
|
||||
解析顺序:
|
||||
|
||||
@ -500,28 +505,28 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
|
||||
说明:
|
||||
|
||||
- Slack 需要使用 shortcode(例如 `"hourglass_flowing_sand"`)。
|
||||
- 该反应采用尽力而为方式,且在回复或失败路径完成后会自动尝试清理。
|
||||
- Slack 期望使用简码(例如 `"hourglass_flowing_sand"`)。
|
||||
- 该反应属于尽力而为,系统会在回复完成或失败路径结束后自动尝试清理。
|
||||
|
||||
## 媒体、分块与投递
|
||||
## 媒体、分块和投递
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="入站附件">
|
||||
Slack 文件附件会从 Slack 托管的私有 URL 下载(基于令牌认证的请求流程),并在抓取成功且大小限制允许时写入媒体存储。
|
||||
Slack 文件附件会通过 Slack 托管的私有 URL 下载(基于令牌鉴权的请求流程),并在获取成功且大小限制允许时写入媒体存储。
|
||||
|
||||
运行时入站大小上限默认为 `20MB`,除非通过 `channels.slack.mediaMaxMb` 覆盖。
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="出站文本与文件">
|
||||
<Accordion title="出站文本和文件">
|
||||
- 文本分块使用 `channels.slack.textChunkLimit`(默认 4000)
|
||||
- `channels.slack.chunkMode="newline"` 启用按段落优先拆分
|
||||
- 文件发送使用 Slack 上传 API,并可包含线程回复(`thread_ts`)
|
||||
- 如果配置了 `channels.slack.mediaMaxMb`,出站媒体上限遵循该值;否则渠道发送使用媒体流水线中的 MIME 类型默认值
|
||||
- 配置 `channels.slack.mediaMaxMb` 时,出站媒体上限遵循该值;否则渠道发送使用媒体管道中的 MIME 类型默认值
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="投递目标">
|
||||
推荐使用显式目标:
|
||||
首选的显式目标:
|
||||
|
||||
- `user:<id>` 用于私信
|
||||
- `channel:<id>` 用于渠道
|
||||
@ -531,19 +536,19 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## 命令与斜杠行为
|
||||
## 命令和斜杠行为
|
||||
|
||||
- Slack 的原生命令自动模式默认**关闭**(`commands.native: "auto"` 不会启用 Slack 原生命令)。
|
||||
- 使用 `channels.slack.commands.native: true`(或全局 `commands.native: true`)启用 Slack 原生命令处理器。
|
||||
- 使用 `channels.slack.commands.native: true`(或全局 `commands.native: true`)启用原生 Slack 命令处理器。
|
||||
- 启用原生命令后,在 Slack 中注册匹配的斜杠命令(`/<command>` 名称),但有一个例外:
|
||||
- 为状态命令注册 `/agentstatus`(Slack 保留 `/status`)
|
||||
- 如果未启用原生命令,你可以通过 `channels.slack.slashCommand` 运行一个已配置的单一斜杠命令。
|
||||
- 如果未启用原生命令,你可以通过 `channels.slack.slashCommand` 运行单个已配置的斜杠命令。
|
||||
- 原生参数菜单现在会自适应其渲染策略:
|
||||
- 最多 5 个选项:按钮块
|
||||
- 6-100 个选项:静态选择菜单
|
||||
- 超过 100 个选项:当可用 interactivity 选项处理器时,使用带异步选项过滤的外部选择
|
||||
- 如果编码后的选项值超出 Slack 限制,该流程会回退为按钮
|
||||
- 对于较长的选项负载,斜杠命令参数菜单会在分发所选值之前显示确认对话框。
|
||||
- 超过 100 个选项:当交互选项处理器可用时,使用支持异步选项过滤的外部选择
|
||||
- 如果编码后的选项值超过 Slack 限制,流程会回退到按钮
|
||||
- 对于较长的选项负载,斜杠命令参数菜单会在派发所选值前使用确认对话框。
|
||||
|
||||
默认斜杠命令设置:
|
||||
|
||||
@ -556,11 +561,11 @@ Slack 操作由 `channels.slack.actions.*` 控制。
|
||||
|
||||
- `agent:<agentId>:slack:slash:<userId>`
|
||||
|
||||
并且仍会根据目标会话键(`CommandTargetSessionKey`)对目标会话执行命令路由。
|
||||
并且仍会将命令执行路由到目标会话(`CommandTargetSessionKey`)。
|
||||
|
||||
## 交互式回复
|
||||
|
||||
Slack 可以渲染由智能体编写的交互式回复控件,但该功能默认禁用。
|
||||
Slack 可以渲染由智能体编写的交互式回复控件,但此功能默认禁用。
|
||||
|
||||
全局启用:
|
||||
|
||||
@ -576,7 +581,7 @@ Slack 可以渲染由智能体编写的交互式回复控件,但该功能默
|
||||
}
|
||||
```
|
||||
|
||||
或者仅为某个 Slack 账户启用:
|
||||
或者仅为一个 Slack 账户启用:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -603,32 +608,34 @@ Slack 可以渲染由智能体编写的交互式回复控件,但该功能默
|
||||
|
||||
说明:
|
||||
|
||||
- 这是 Slack 专用 UI。其他渠道不会将 Slack Block Kit 指令翻译为它们自己的按钮系统。
|
||||
- 交互回调值是 OpenClaw 生成的不透明令牌,不是智能体编写的原始值。
|
||||
- 如果生成的交互块会超出 Slack Block Kit 限制,OpenClaw 会回退为原始文本回复,而不是发送无效的 blocks 负载。
|
||||
- 这是 Slack 专用 UI。其他渠道不会将 Slack Block Kit 指令转换为它们自己的按钮系统。
|
||||
- 交互回调值是 OpenClaw 生成的不透明令牌,而不是智能体原始编写的值。
|
||||
- 如果生成的交互块会超过 Slack Block Kit 限制,OpenClaw 会回退为原始文本回复,而不是发送无效的 blocks 负载。
|
||||
|
||||
## Slack 中的 Exec 审批
|
||||
|
||||
Slack 可以作为原生审批客户端,使用交互式按钮和交互,而不是回退到 Web UI 或终端。
|
||||
Slack 可以充当原生审批客户端,使用交互按钮和交互流程,而不是回退到 Web UI 或终端。
|
||||
|
||||
- Exec 审批使用 `channels.slack.execApprovals.*` 进行原生私信/渠道路由。
|
||||
- 当请求已落在 Slack 中且审批 ID 类型为 `plugin:` 时,插件审批仍可通过同样的 Slack 原生按钮界面完成。
|
||||
- 当请求已经到达 Slack 且审批 ID 类型为 `plugin:` 时,插件审批仍可通过同一个 Slack 原生按钮界面进行处理。
|
||||
- 审批人授权仍会被强制执行:只有被识别为审批人的用户才能通过 Slack 批准或拒绝请求。
|
||||
|
||||
这使用与其他渠道相同的共享审批按钮界面。当你在 Slack 应用设置中启用 `interactivity` 时,审批提示会直接在会话中渲染为 Block Kit 按钮。
|
||||
当这些按钮存在时,它们就是主要的审批 UX;只有当工具结果表明聊天审批不可用或手动审批是唯一途径时,OpenClaw 才应包含手动 `/approve` 命令。
|
||||
这使用与其他渠道相同的共享审批按钮界面。当你的 Slack 应用设置中启用了 `interactivity` 时,审批提示会直接以 Block Kit 按钮形式渲染在会话中。
|
||||
当这些按钮存在时,它们就是主要的审批体验;只有当工具结果表明聊天审批不可用,或手动审批是唯一途径时,OpenClaw
|
||||
才应包含手动 `/approve` 命令。
|
||||
|
||||
配置路径:
|
||||
|
||||
- `channels.slack.execApprovals.enabled`
|
||||
- `channels.slack.execApprovals.approvers`(可选;在可能时回退到 `commands.ownerAllowFrom`)
|
||||
- `channels.slack.execApprovals.approvers`(可选;尽可能回退到 `commands.ownerAllowFrom`)
|
||||
- `channels.slack.execApprovals.target`(`dm` | `channel` | `both`,默认:`dm`)
|
||||
- `agentFilter`、`sessionFilter`
|
||||
|
||||
当 `enabled` 未设置或为 `"auto"`,且至少解析出一位审批人时,Slack 会自动启用原生 exec 审批。设置 `enabled: false` 可显式禁用 Slack 作为原生审批客户端。
|
||||
设置 `enabled: true` 可在审批人成功解析时强制启用原生审批。
|
||||
当 `enabled` 未设置或为 `"auto"`,且至少解析出一名
|
||||
approver 时,Slack 会自动启用原生 exec 审批。设置 `enabled: false` 可显式禁用 Slack 作为原生审批客户端。
|
||||
设置 `enabled: true` 可在 approver 解析成功时强制启用原生审批。
|
||||
|
||||
没有显式 Slack exec 审批配置时的默认行为:
|
||||
无显式 Slack exec 审批配置时的默认行为:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -638,7 +645,8 @@ Slack 可以作为原生审批客户端,使用交互式按钮和交互,而
|
||||
}
|
||||
```
|
||||
|
||||
只有当你想覆盖审批人、添加筛选器或启用源聊天投递时,才需要显式的 Slack 原生配置:
|
||||
只有在你希望覆盖 approver、添加过滤器,或
|
||||
选择将审批投递到来源聊天时,才需要显式 Slack 原生配置:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -654,35 +662,38 @@ Slack 可以作为原生审批客户端,使用交互式按钮和交互,而
|
||||
}
|
||||
```
|
||||
|
||||
共享的 `approvals.exec` 转发是独立的。只有当 exec 审批提示还必须路由到其他聊天或显式的带外目标时,才使用它。共享的 `approvals.plugin` 转发同样独立;当这些请求已经落在 Slack 中时,Slack 原生按钮仍可完成插件审批。
|
||||
共享 `approvals.exec` 转发是独立的。仅在 exec 审批提示还必须
|
||||
路由到其他聊天或显式带外目标时才使用它。共享 `approvals.plugin` 转发也
|
||||
是独立的;当这些请求已经到达
|
||||
Slack 时,Slack 原生按钮仍可处理插件审批。
|
||||
|
||||
同一聊天中的 `/approve` 也可在已支持命令的 Slack 渠道和私信中使用。完整审批转发模型请参见 [Exec approvals](/zh-CN/tools/exec-approvals)。
|
||||
同聊天 `/approve` 在已支持命令的 Slack 渠道和私信中同样可用。完整的审批转发模型请参见 [Exec approvals](/zh-CN/tools/exec-approvals)。
|
||||
|
||||
## 事件与运行行为
|
||||
## 事件和运行行为
|
||||
|
||||
- 消息编辑/删除/线程广播会映射为系统事件。
|
||||
- 反应添加/移除事件会映射为系统事件。
|
||||
- 成员加入/离开、渠道创建/重命名以及置顶添加/移除事件会映射为系统事件。
|
||||
- 当启用 `configWrites` 时,`channel_id_changed` 可迁移渠道配置键。
|
||||
- 渠道 topic/purpose 元数据被视为不可信上下文,并可注入路由上下文。
|
||||
- 在线程发起者和初始线程历史上下文填充时,会在适用情况下按已配置的发送者允许列表进行过滤。
|
||||
- Block actions 和 modal 交互会发出结构化的 `Slack interaction: ...` 系统事件,并包含丰富的负载字段:
|
||||
- block actions:所选值、标签、选择器值以及 `workflow_*` 元数据
|
||||
- modal `view_submission` 和 `view_closed` 事件,带有已路由的渠道元数据和表单输入
|
||||
- 成员加入/离开、渠道创建/重命名,以及 pin 添加/移除事件会映射为系统事件。
|
||||
- 当启用 `configWrites` 时,`channel_id_changed` 可以迁移渠道配置键。
|
||||
- 渠道 topic/purpose 元数据被视为不可信上下文,并可注入到路由上下文中。
|
||||
- 在线程发起者和初始线程历史上下文植入时,会在适用情况下按已配置的发送方允许列表进行过滤。
|
||||
- Block 操作和模态交互会发出结构化的 `Slack interaction: ...` 系统事件,并携带丰富的负载字段:
|
||||
- block 操作:所选值、标签、选择器值以及 `workflow_*` 元数据
|
||||
- 模态 `view_submission` 和 `view_closed` 事件,包含路由后的渠道元数据和表单输入
|
||||
|
||||
## 配置参考指针
|
||||
## 配置参考指引
|
||||
|
||||
主要参考:
|
||||
|
||||
- [配置参考 - Slack](/zh-CN/gateway/configuration-reference#slack)
|
||||
|
||||
高信号的 Slack 字段:
|
||||
- 模式/凭证:`mode`、`botToken`、`appToken`、`signingSecret`、`webhookPath`、`accounts.*`
|
||||
高信号 Slack 字段:
|
||||
- mode/auth:`mode`、`botToken`、`appToken`、`signingSecret`、`webhookPath`、`accounts.*`
|
||||
- 私信访问:`dm.enabled`、`dmPolicy`、`allowFrom`(旧版:`dm.policy`、`dm.allowFrom`)、`dm.groupEnabled`、`dm.groupChannels`
|
||||
- 兼容性开关:`dangerouslyAllowNameMatching`(破玻璃开关;除非确有需要,否则保持关闭)
|
||||
- 兼容性开关:`dangerouslyAllowNameMatching`(紧急兜底;除非确有需要,否则保持关闭)
|
||||
- 渠道访问:`groupPolicy`、`channels.*`、`channels.*.users`、`channels.*.requireMention`
|
||||
- 线程/历史:`replyToMode`、`replyToModeByChatType`、`thread.*`、`historyLimit`、`dmHistoryLimit`、`dms.*.historyLimit`
|
||||
- 投递:`textChunkLimit`、`chunkMode`、`mediaMaxMb`、`streaming`、`nativeStreaming`
|
||||
- 投递:`textChunkLimit`、`chunkMode`、`mediaMaxMb`、`streaming`、`streaming.nativeTransport`
|
||||
- 运维/功能:`configWrites`、`commands.native`、`slashCommand.*`、`actions.*`、`userToken`、`userTokenReadOnly`
|
||||
|
||||
## 故障排除
|
||||
@ -694,7 +705,7 @@ Slack 可以作为原生审批客户端,使用交互式按钮和交互,而
|
||||
- `groupPolicy`
|
||||
- 渠道允许列表(`channels.slack.channels`)
|
||||
- `requireMention`
|
||||
- 每个渠道的 `users` 允许列表
|
||||
- 每渠道 `users` 允许列表
|
||||
|
||||
有用的命令:
|
||||
|
||||
@ -711,7 +722,7 @@ openclaw doctor
|
||||
|
||||
- `channels.slack.dm.enabled`
|
||||
- `channels.slack.dmPolicy`(或旧版 `channels.slack.dm.policy`)
|
||||
- 配对审批 / 允许列表条目
|
||||
- 配对批准 / 允许列表条目
|
||||
|
||||
```bash
|
||||
openclaw pairing list slack
|
||||
@ -720,16 +731,17 @@ openclaw pairing list slack
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Socket mode 未连接">
|
||||
验证 bot 与 app 令牌,以及 Slack 应用设置中的 Socket Mode 是否已启用。
|
||||
校验 bot 和 app 令牌,以及 Slack 应用设置中的 Socket Mode 是否已启用。
|
||||
|
||||
如果 `openclaw channels status --probe --json` 显示 `botTokenStatus` 或
|
||||
`appTokenStatus: "configured_unavailable"`,说明 Slack 账户已配置,
|
||||
但当前运行时无法解析由 SecretRef 支持的实际值。
|
||||
`appTokenStatus: "configured_unavailable"`,则表示 Slack 账户
|
||||
已配置,但当前运行时无法解析由 SecretRef 支持的
|
||||
实际值。
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="HTTP 模式未接收事件">
|
||||
验证:
|
||||
<Accordion title="HTTP 模式未接收到事件">
|
||||
校验:
|
||||
|
||||
- signing secret
|
||||
- webhook 路径
|
||||
@ -737,17 +749,18 @@ openclaw pairing list slack
|
||||
- 每个 HTTP 账户使用唯一的 `webhookPath`
|
||||
|
||||
如果账户快照中出现 `signingSecretStatus: "configured_unavailable"`,
|
||||
说明该 HTTP 账户已配置,但当前运行时无法解析由 SecretRef 支持的 signing secret。
|
||||
则表示该 HTTP 账户已配置,但当前运行时无法
|
||||
解析由 SecretRef 支持的 signing secret。
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="原生/斜杠命令未触发">
|
||||
请确认你想要的是:
|
||||
确认你想要的是:
|
||||
|
||||
- 原生命令模式(`channels.slack.commands.native: true`),并在 Slack 中注册匹配的斜杠命令
|
||||
- 原生命令模式(`channels.slack.commands.native: true`),并且已在 Slack 中注册匹配的斜杠命令
|
||||
- 或单一斜杠命令模式(`channels.slack.slashCommand.enabled: true`)
|
||||
|
||||
还要检查 `commands.useAccessGroups` 以及渠道/用户允许列表。
|
||||
另外也请检查 `commands.useAccessGroups` 以及渠道/用户允许列表。
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@ -1,111 +1,114 @@
|
||||
---
|
||||
read_when:
|
||||
- 解释渠道上的流式传输或分块如何工作
|
||||
- 修改分块流式传输或渠道分块行为
|
||||
- 调试重复 / 过早的分块回复或渠道预览流式传输
|
||||
- 说明流式传输或分块在各渠道中的工作方式
|
||||
- 更改分块流式传输或渠道分块行为
|
||||
- 调试重复/过早的分块回复或渠道预览流式传输
|
||||
summary: 流式传输 + 分块行为(分块回复、渠道预览流式传输、模式映射)
|
||||
title: 流式传输和分块
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T08:22:40Z"
|
||||
generated_at: "2026-04-08T04:59:54Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 44b0d08c7eafcb32030ef7c8d5719c2ea2d34e4bac5fdad8cc8b3f4e9e9fad97
|
||||
source_hash: a8e847bb7da890818cd79dec7777f6ae488e6d6c0468e948e56b6b6c598e0000
|
||||
source_path: concepts/streaming.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# 流式传输 + 分块
|
||||
|
||||
OpenClaw 有两个彼此独立的流式传输层:
|
||||
OpenClaw 有两层彼此独立的流式传输:
|
||||
|
||||
- **分块流式传输(渠道):** 当助手写出完整**块**时立即发送。这些是普通渠道消息(不是 token 增量)。
|
||||
- **预览流式传输(Telegram / Discord / Slack):** 在生成过程中更新一个临时的**预览消息**。
|
||||
- **分块流式传输(渠道):** 在助手写作时发送已完成的**块**。这些是正常的渠道消息(不是 token 增量)。
|
||||
- **预览流式传输(Telegram/Discord/Slack):** 在生成过程中更新一个临时的**预览消息**。
|
||||
|
||||
目前还**没有真正的 token 增量流式传输**到渠道消息。预览流式传输是基于消息的(发送 + 编辑 / 追加)。
|
||||
目前还**没有真正的 token 增量流式传输**发送到渠道消息。预览流式传输是基于消息的(发送 + 编辑/追加)。
|
||||
|
||||
## 分块流式传输(渠道消息)
|
||||
|
||||
分块流式传输会在内容可用时,以较粗粒度的块发送助手输出。
|
||||
分块流式传输会在助手输出可用时,以较粗粒度的块发送。
|
||||
|
||||
```
|
||||
模型输出
|
||||
Model output
|
||||
└─ text_delta/events
|
||||
├─ (blockStreamingBreak=text_end)
|
||||
│ └─ 随着缓冲区增长,chunker 发出块
|
||||
│ └─ chunker emits blocks as buffer grows
|
||||
└─ (blockStreamingBreak=message_end)
|
||||
└─ chunker 在 message_end 时刷新
|
||||
└─ 渠道发送(分块回复)
|
||||
└─ chunker flushes at message_end
|
||||
└─ channel send (block replies)
|
||||
```
|
||||
|
||||
图例:
|
||||
|
||||
- `text_delta/events`:模型流事件(对于非流式模型,可能较稀疏)。
|
||||
- `chunker`:应用最小 / 最大边界和断点偏好的 `EmbeddedBlockChunker`。
|
||||
- `channel send`:实际的出站消息(分块回复)。
|
||||
- `text_delta/events`:模型流事件(对于非流式模型,这些事件可能很稀疏)。
|
||||
- `chunker`:应用最小/最大边界和断点偏好的 `EmbeddedBlockChunker`。
|
||||
- `channel send`:实际发出的出站消息(分块回复)。
|
||||
|
||||
**控制项:**
|
||||
|
||||
- `agents.defaults.blockStreamingDefault`:`"on"` / `"off"`(默认关闭)。
|
||||
- 渠道覆盖:`*.blockStreaming`(以及按账户变体),用于为每个渠道强制设为 `"on"` / `"off"`。
|
||||
- `agents.defaults.blockStreamingDefault`:`"on"`/`"off"`(默认关闭)。
|
||||
- 渠道覆盖:`*.blockStreaming`(以及每账号变体)可为每个渠道强制设为 `"on"`/`"off"`。
|
||||
- `agents.defaults.blockStreamingBreak`:`"text_end"` 或 `"message_end"`。
|
||||
- `agents.defaults.blockStreamingChunk`:`{ minChars, maxChars, breakPreference? }`。
|
||||
- `agents.defaults.blockStreamingCoalesce`:`{ minChars?, maxChars?, idleMs? }`(在发送前合并流式块)。
|
||||
- 渠道硬上限:`*.textChunkLimit`(例如 `channels.whatsapp.textChunkLimit`)。
|
||||
- 渠道分块模式:`*.chunkMode`(默认 `length`,`newline` 会先按空行即段落边界分块,再按长度分块)。
|
||||
- Discord 软上限:`channels.discord.maxLinesPerMessage`(默认 17),会拆分过高的回复以避免 UI 裁切。
|
||||
- 渠道分块模式:`*.chunkMode`(默认 `length`,`newline` 会先按空行即段落边界拆分,再按长度分块)。
|
||||
- Discord 软上限:`channels.discord.maxLinesPerMessage`(默认 17)会拆分过高的回复,以避免 UI 裁剪。
|
||||
|
||||
**边界语义:**
|
||||
|
||||
- `text_end`:只要 chunker 发出块就立即流式发送;在每个 `text_end` 时刷新。
|
||||
- `text_end`:一旦 chunker 产生块就立即流式发送;在每个 `text_end` 时刷新。
|
||||
- `message_end`:等待助手消息完成后,再刷新缓冲输出。
|
||||
|
||||
如果缓冲文本超过 `maxChars`,`message_end` 仍会使用 chunker,因此它可能在结尾发出多个块。
|
||||
`message_end` 仍然会在缓冲文本超过 `maxChars` 时使用 chunker,因此它可以在结尾发出多个块。
|
||||
|
||||
## 分块算法(低 / 高边界)
|
||||
## 分块算法(低/高边界)
|
||||
|
||||
分块实现由 `EmbeddedBlockChunker` 完成:
|
||||
分块由 `EmbeddedBlockChunker` 实现:
|
||||
|
||||
- **低边界:** 在缓冲区达到 `minChars` 之前不发送(除非被强制发送)。
|
||||
- **高边界:** 优先在 `maxChars` 之前断开;如被强制,则在 `maxChars` 处断开。
|
||||
- **断点偏好:** `paragraph` → `newline` → `sentence` → `whitespace` → 硬断开。
|
||||
- **代码围栏:** 绝不会在围栏内断开;如果被迫在 `maxChars` 处断开,则会先关闭再重新打开围栏,以保持 Markdown 有效。
|
||||
- **高边界:** 优先在 `maxChars` 之前拆分;如果必须强制拆分,就在 `maxChars` 处拆分。
|
||||
- **断点偏好:** `paragraph` → `newline` → `sentence` → `whitespace` → 硬拆分。
|
||||
- **代码围栏:** 绝不在围栏内部拆分;如果被迫在 `maxChars` 处拆分,会先关闭再重新打开围栏,以保持 Markdown 有效。
|
||||
|
||||
`maxChars` 会被限制到渠道的 `textChunkLimit`,因此不会超过每个渠道的上限。
|
||||
`maxChars` 会被限制到渠道的 `textChunkLimit`,因此你无法超过各渠道的上限。
|
||||
|
||||
## 合并(合并流式块)
|
||||
|
||||
启用分块流式传输时,OpenClaw 可以在发送前**合并连续的分块内容**。这样可以减少“单行刷屏”,同时仍然提供渐进式输出。
|
||||
启用分块流式传输时,OpenClaw 可以在发送前**合并连续的分块**。
|
||||
这样既能提供渐进式输出,又能减少“单行刷屏”。
|
||||
|
||||
- 合并会等待**空闲间隔**(`idleMs`)后再刷新。
|
||||
- 缓冲区受 `maxChars` 限制,超出时会立即刷新。
|
||||
- `minChars` 会阻止过小片段在文本积累到足够长度前发送
|
||||
(最终刷新总会发送剩余文本)。
|
||||
- 缓冲区受 `maxChars` 限制,超过时会刷新。
|
||||
- `minChars` 会阻止过小的片段被提前发送,直到积累足够文本
|
||||
(最终刷新始终会发送剩余文本)。
|
||||
- 连接符由 `blockStreamingChunk.breakPreference`
|
||||
决定(`paragraph` → `\n\n`,`newline` → `\n`,`sentence` → 空格)。
|
||||
- 可通过 `*.blockStreamingCoalesce` 进行渠道级覆盖(包括按账户配置)。
|
||||
- 除非显式覆盖,否则 Signal / Slack / Discord 的默认合并 `minChars` 会提高到 1500。
|
||||
- 可通过 `*.blockStreamingCoalesce` 进行渠道级覆盖(包括每账号配置)。
|
||||
- 对于 Signal/Slack/Discord,默认合并 `minChars` 会提升到 1500,除非被覆盖。
|
||||
|
||||
## 分块之间更像人类的节奏
|
||||
## 块之间的类人节奏
|
||||
|
||||
启用分块流式传输时,你可以在分块回复之间添加**随机暂停**(首个块之后)。这样会让多气泡回复显得更自然。
|
||||
启用分块流式传输时,你可以在分块回复之间加入**随机暂停**
|
||||
(第一个块之后)。这会让多气泡回复显得更自然。
|
||||
|
||||
- 配置:`agents.defaults.humanDelay`(可通过 `agents.list[].humanDelay` 按智能体覆盖)。
|
||||
- 模式:`off`(默认)、`natural`(800–2500 毫秒)、`custom`(`minMs` / `maxMs`)。
|
||||
- 模式:`off`(默认)、`natural`(800–2500ms)、`custom`(`minMs`/`maxMs`)。
|
||||
- 仅适用于**分块回复**,不适用于最终回复或工具摘要。
|
||||
|
||||
## “流式发送分块还是最后一次性发送”
|
||||
## “流式发送分块,还是一次性全部发送”
|
||||
|
||||
其映射关系如下:
|
||||
它对应为:
|
||||
|
||||
- **流式发送分块:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"`(边生成边发送)。非 Telegram 渠道还需要将 `*.blockStreaming` 设置为 `true`。
|
||||
- **最后一次性发送全部内容:** `blockStreamingBreak: "message_end"`(一次刷新,如果很长,可能仍分成多个块)。
|
||||
- **流式发送分块:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"`(边生成边发送)。非 Telegram 渠道还需要将 `*.blockStreaming` 设为 `true`。
|
||||
- **在结尾一次性发送全部内容:** `blockStreamingBreak: "message_end"`(刷新一次;如果内容很长,可能仍会拆成多个块)。
|
||||
- **不使用分块流式传输:** `blockStreamingDefault: "off"`(只发送最终回复)。
|
||||
|
||||
**渠道说明:** 除非
|
||||
显式将 `*.blockStreaming` 设为 `true`,否则分块流式传输**处于关闭状态**。渠道可以在没有分块回复的情况下使用实时预览流式传输(`channels.<channel>.streaming`)。
|
||||
**渠道说明:** 除非显式将
|
||||
`*.blockStreaming` 设为 `true`,否则分块流式传输**默认关闭**。渠道仍然可以启用实时预览
|
||||
(`channels.<channel>.streaming`),而不发送分块回复。
|
||||
|
||||
配置位置提醒:`blockStreaming*` 默认值位于
|
||||
`agents.defaults` 下,而不是根配置。
|
||||
`agents.defaults` 下,而不是根配置下。
|
||||
|
||||
## 预览流式传输模式
|
||||
|
||||
@ -114,50 +117,51 @@ OpenClaw 有两个彼此独立的流式传输层:
|
||||
模式:
|
||||
|
||||
- `off`:禁用预览流式传输。
|
||||
- `partial`:单个预览,始终替换为最新文本。
|
||||
- `block`:以分块 / 追加方式更新预览。
|
||||
- `progress`:在生成过程中显示进度 / 状态预览,完成时再发送最终答案。
|
||||
- `partial`:使用单个预览,并用最新文本替换。
|
||||
- `block`:以分块/追加的方式更新预览。
|
||||
- `progress`:在生成期间显示进度/状态预览,完成后给出最终答案。
|
||||
|
||||
### 渠道映射
|
||||
|
||||
| 渠道 | `off` | `partial` | `block` | `progress` |
|
||||
| --------- | ----- | --------- | ------- | ----------------- |
|
||||
| Telegram | ✅ | ✅ | ✅ | 映射为 `partial` |
|
||||
| Discord | ✅ | ✅ | ✅ | 映射为 `partial` |
|
||||
| Slack | ✅ | ✅ | ✅ | ✅ |
|
||||
| 渠道 | `off` | `partial` | `block` | `progress` |
|
||||
| ---- | ----- | --------- | ------- | ---------- |
|
||||
| Telegram | ✅ | ✅ | ✅ | 映射为 `partial` |
|
||||
| Discord | ✅ | ✅ | ✅ | 映射为 `partial` |
|
||||
| Slack | ✅ | ✅ | ✅ | ✅ |
|
||||
|
||||
仅适用于 Slack:
|
||||
仅限 Slack:
|
||||
|
||||
- `channels.slack.nativeStreaming` 会在 `streaming=partial` 时切换 Slack 原生流式 API 调用(默认:`true`)。
|
||||
- `channels.slack.streaming.nativeTransport` 在 `channels.slack.streaming.mode="partial"` 时切换 Slack 原生流式 API 调用(默认:`true`)。
|
||||
- Slack 原生流式传输和 Slack 助手线程状态都需要回复线程目标;顶层私信不会显示这种线程式预览。
|
||||
|
||||
旧版键迁移:
|
||||
旧键迁移:
|
||||
|
||||
- Telegram:`streamMode` + 布尔值 `streaming` 会自动迁移到枚举 `streaming`。
|
||||
- Discord:`streamMode` + 布尔值 `streaming` 会自动迁移到枚举 `streaming`。
|
||||
- Slack:`streamMode` 会自动迁移到枚举 `streaming`;布尔值 `streaming` 会自动迁移到 `nativeStreaming`。
|
||||
- Telegram:`streamMode` 和布尔值 `streaming` 会自动迁移到枚举 `streaming`。
|
||||
- Discord:`streamMode` 和布尔值 `streaming` 会自动迁移到枚举 `streaming`。
|
||||
- Slack:`streamMode` 会自动迁移到 `streaming.mode`;布尔值 `streaming` 会自动迁移到 `streaming.mode` 加 `streaming.nativeTransport`;旧版 `nativeStreaming` 会自动迁移到 `streaming.nativeTransport`。
|
||||
|
||||
### 运行时行为
|
||||
|
||||
Telegram:
|
||||
|
||||
- 在私信和群组 / 主题中使用 `sendMessage` + `editMessageText` 更新预览。
|
||||
- 当 Telegram 的分块流式传输被显式启用时,会跳过预览流式传输(以避免双重流式传输)。
|
||||
- 在私信和群组/话题中使用 `sendMessage` + `editMessageText` 更新预览。
|
||||
- 当 Telegram 分块流式传输被显式启用时,会跳过预览流式传输(以避免双重流式传输)。
|
||||
- `/reasoning stream` 可以将 reasoning 写入预览。
|
||||
|
||||
Discord:
|
||||
|
||||
- 使用发送 + 编辑预览消息。
|
||||
- `block` 模式使用草稿分块(`draftChunk`)。
|
||||
- 当 Discord 的分块流式传输被显式启用时,会跳过预览流式传输。
|
||||
- 当 Discord 分块流式传输被显式启用时,会跳过预览流式传输。
|
||||
|
||||
Slack:
|
||||
|
||||
- `partial` 在可用时可使用 Slack 原生流式传输(`chat.startStream` / `append` / `stop`)。
|
||||
- `partial` 在可用时可以使用 Slack 原生流式传输(`chat.startStream`/`append`/`stop`)。
|
||||
- `block` 使用追加式草稿预览。
|
||||
- `progress` 使用状态预览文本,完成后再发送最终答案。
|
||||
- `progress` 使用状态预览文本,然后发送最终答案。
|
||||
|
||||
## 相关内容
|
||||
|
||||
- [消息](/concepts/messages) —— 消息生命周期和传递
|
||||
- [重试](/concepts/retry) —— 传递失败时的重试行为
|
||||
- [渠道](/channels) —— 每个渠道的流式传输支持
|
||||
- [消息](/zh-CN/concepts/messages) — 消息生命周期和投递
|
||||
- [重试](/zh-CN/concepts/retry) — 投递失败时的重试行为
|
||||
- [渠道](/zh-CN/channels) — 各渠道的流式传输支持
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user