Skip to main content

1、App Server 请求大模型生成内容: App Server 向大模型发起流式生成请求,携带 prompt 和上下文信息。大模型持续返回分段内容,每个片段包含实际内容以及是否结束的标识。

2、App Server 逐段发送: 根据大模型返回结果,App Server 调用 IM ServerSendStream 接口,将每个分片发送给 IM Server,每次调用后返回分片发送结果。

3、IM 推送初始消息: App Server 调用 SendStream 接口, seq = 1is_finished = falseIM Server 向客户端推送 jg:streamtext 类型的消息。客户端在消息监听中会收到这条流式消息。

4、客户端接收片段并追加: IM Server 循环向客户端推送新内容片段。客户端每次收到片段时触发 append 事件,将内容追加到消息中,同时会返回 jg:streamtextmessageId

5、推送完成通: 大模型生成完成后,App Server 需要将 seq = 最后一段的序号is_finished = true ,调用 SendStream 接口,IM Server 会向客户端推送生成完成通知。客户端触发 complete 事件。


以下特殊情况业务层无需特殊处理

1、断网重连: SDK 会自动将断网期间未收到的 新增片段 收取完整通知给业务层处理

2、开始生成后杀进程或关闭浏览器: 用户再上线后依然能收到完整的生成内容或者是 正在生成的片段

3、用户生成内容多设备自动同步: 例如用户 A 在 iOS 端生成的内容,在 Web 端登录依然可以看到,如果是生成中支持同步更新

4、生成内容超时时间: App Server 开始发送流消息后,默认超过 10 分钟 没有设置 is_finished = true 会自动完成,可能会出现内容完整的情况

5、获取历史消息: 用户生成完的消息,通过各端获取历史消息接口直接可以获取,并且是拼接完整的消息内容,业务层可按照消息类型直接展示

JIM.getInstance().getMessageManager().addListener("main", new IMessageManager.IMessageListener() {
/// 接收消息的回调
@Override
public void onMessageReceive(Message message) {
MessageContent content = message.getContent();
if (content instanceof StreamTextMessage) {
Log.d("TAG", "stream message did receive, content is " + ((StreamTextMessage) content).getContent());
}
}
}

JIM.getInstance().getMessageManager().addStreamMessageListener("main", new IMessageManager.IStreamMessageListener() {
@Override
public void onStreamTextMessageAppend(String messageId, String content) {
// messageId: 对应的流式消息的消息 id
// content: 分片追加的内容,开发者可以在界面上把 content 追加到 StreamTextMessage 的 content 尾部
}

@Override
public void onStreamTextMessageComplete(Message message) {
// message: 完整的流式消息对象
}
});