扣子编程支持流式插件,低代码智能体或工作流在单次调用插件时,可以输出多条消息,每条消息能够以类似打字机的效果逐条动态显示,实现流式输出效果。
流式插件适用于需要实时处理和展示连续消息流的场景,它能够提供动态的消息输出,增强用户体验,例如聊天机器人和实时通知场景。
关于流式插件的相关注意事项如下:
配置流式插件,你的业务接口需要实现 Server-Sent Events (SSE) 传输协议,并遵守扣子编程插件所定义的数据协议规范。
数据结构定义说明如下:
说明
data 是数据对象经过 JSON 序列化后得到的数据,实际流转时是 []byte 类型。在某些日志输出中,可能会看到这些数据被编码为 Base64 格式,这是正常现象。| 字段 | 类型 | 是否必选 | 生效维度 | 字段说明 |
|---|---|---|---|---|
|
id |
string |
必选 |
数据包维度 |
事件 ID。 事件的唯一标识符,用于跟踪流式传输中的事件。浏览器会自动记录最后一个接收到的事件 ID,并在发生断开连接时,将此 ID 放入 HTTP 头部的 |
| event | string | 必选 | 数据包维度 | 事件名。 |
| data | []byte | 必选 | 数据包维度 | 消息数据,将 JSON 数据序列化为字节切片([]byte),在编辑器中显示为 Base64 编码的字符串。 |
|
data.stream_id |
string |
必选 |
消息维度 |
消息 ID。 在流式调用过程中,相同的 |
|
data.output_mode |
Integer |
可选 |
消息维度 |
当前 message 的输出模式:
默认值为 0。 |
|
data.return_type |
Integer |
可选 |
消息维度 |
最后一条 message 输出目标:
默认值为 0,当 |
| data.content_type | Integer | 可选 | 数据包维度 | 本次数据包输出内容的类型,仅可传 0 表示文本,默认值为 0。 |
|
data.context_mode |
Integer |
可选 |
消息维度 |
下次对话时,是否将这条消息加入聊天上下文:
默认值为 0。 |
|
data.content |
string |
可选 |
数据包维度 |
业务接口返回内容 ,默认值为 nil。 在智能体中引用流式插件时,如果流式插件返回的任意一个事件包中 |
|
data.is_finish |
bool |
必选 |
流维度 |
整个流是否结束。 只需在最后一个业务数据包中设置 |
| data.is_last_msg | bool | 必选 | 消息维度 | 是否为最后一条消息。 |
| data.is_last_packet_in_msg | bool | 必选 | 数据包维度 | 是否为当前 message 的最后一个包。 |
| data.ext | map[string]string | 可选 | 数据包维度 | 扩展字段,默认值为 nil。 |
以下是一个流请求的数据包标识示例:
| message | 数据包维度 | |||
|---|---|---|---|---|
|
message 1 |
数据包 1 is_last_msg=false is_finish=false is_last_packet_in_msg=false |
数据包 2 is_last_msg=false is_finish=false is_last_packet_in_msg=false |
... |
数据包 End is_last_msg=false is_finish=false is_last_packet_in_msg=true |
|
message 2 |
数据包 1 is_last_msg=false is_finish=false is_last_packet_in_msg=false |
数据包 2 is_last_msg=false is_finish=false is_last_packet_in_msg=false |
... |
数据包 End is_last_msg=false is_finish=false is_last_packet_in_msg=true |
| ... | ... | ... | ... | ... |
|
message End |
数据包 1 is_last_msg=true is_finish=false is_last_packet_in_msg=false |
数据包 2 is_last_msg=true is_finish=false is_last_packet_in_msg=false |
... |
数据包 End is_last_msg=true is_finish=true is_last_packet_in_msg=true |
以下是一个数据包返回示例:
{
"id" : "xxxxx1",
"event": "play",
"data": {
"is_last_msg":false,
"is_finish":false,
"is_last_packet_in_msg":false,
"stream_id":"message1",
"context_mode": 0,
"output_mode": 0 ,
"return_type": 0 ,
"content_type": 0 ,
"content": "{插件输出内容}",
"ext":{
"example1":"{xxx}",
"example2":"1"
}
}
}
实现 SSE 协议时,HTTP 响应头需满足如下要求。
| 响应头(Response Header) | 取值(Value) | 说明 |
|---|---|---|
| Content-Type | text/event-stream | 告知客户端该响应为事件流,用于区别普通的 HTTP 响应。 |
| Connection | keep-alive | SSE 是长连接,需保持连接状态,防止客户端会误判数据传输已完成。 |
| Transfer-Encoding | chunked | 采用分块传输编码,支持数据的流式推送。 |
按照 SSE 的数据包协议进行返回,确保数据格式符合以下示例。
用 CURL 验证格式:

用 Postman 验证格式:

你已经创建了一个插件,API 接口已经实现 SSE 传输协议,并且 API 接口遵守扣子编程插件所定义的数据协议规范,详情请参考快速搭建智能体列表查询插件。

operationId下添加x-runMode: Streaming,以开启该接口的流式输出模式。info:
description: stream output demo
title: Stream Demo
version: v1
openapi: 3.0.1
paths:
/your/stream/api:
post:
operationId: stream
x-runMode: Streaming
requestBody:
content:
application/json:
schema:
type: object
responses:
"200":
content:
application/json:
schema:
type: object
description: empty response
default:
description: ""
summary: stream demo
servers:
- url: https://www.demo.com
配置完成后,你可以调试插件。如果插件输出结果符合预期,你就可以发布插件。
你可以在智能体或工作流中使用流式插件,详情可参考使用插件。
注意
在工作流中使用流式插件,请注意:
