Go SDK AI 回复
用户和 AI 机器人单聊时,机器人的回复是一条 Type 为 ai 的消息,内容边生成边推送过来。cli.AI() 负责接收这些实时内容:按顺序拼接、断线后续传、重新连接时补发,回复结束后以消息正文为准。机器人和回复由你的服务端创建,见 AI 对话。
版本
AI 回复从 v1.0.2 起提供:go get github.com/DeepRespond-AI/deeprespond-im-go-sdk@v1.0.2。
AI 消息
用包级函数 im.BodyOf 解析消息正文:
go
body := im.BodyOf(msg) // 不是 ai 消息时为 nil
if body != nil {
fmt.Println(body.Status) // im.AIStreaming、im.AICompleted、im.AIStopped、im.AIFailed
fmt.Println(body.Parts) // 结束后的完整内容;生成中为空
}| 字段 | 说明 |
|---|---|
StreamID | 这条回复的流 ID,读取实时内容、停止生成时使用 |
Status | streaming 生成中,completed 已完成,stopped 已停止,failed 生成中断 |
Parts | 片段(AIPart):Type 为 text 的正文(Markdown),reasoning 思考过程,image、file 附件,tool 工具调用的进度(State 为 running、done、failed) |
Text | 正文去掉 Markdown 后的纯文本,最多 2000 个字符 |
FinishReason、Error | 结束原因;生成中断时 Error.Message 是要显示给用户的说明 |
片段的完整说明见 AI 消息。
跟踪生成中的内容
生成中的消息 Parts 为空,实时内容用 State 读取;OnAI 在开始、每次更新和结束时回调:
go
ai := cli.AI()
ai.OnAI(func(s im.AIStreamState) {
if s.Status == im.AIStreaming {
// s.Parts 是当前完整内容(不是增量)
redraw(s.StreamID, s.Parts)
return
}
// 回复结束:Parts 为空,消息随后(或已经)更新为最终内容,改读 im.BodyOf(msg)
})
parts := body.Parts
if body.Status == im.AIStreaming {
if s := ai.State(body.StreamID); s != nil {
parts = s.Parts
}
}- 回调在 SDK 内部的 goroutine 中执行,不要在回调中阻塞;回调中的 panic 会被恢复,不影响其他回调。
- 断线重连后,SDK 自动补齐正在生成的内容。
State返回副本;回复结束后返回nil,之后读取消息正文。
停止生成
go
stream, err := cli.AI().Stop(ctx, body.StreamID)
// stream.Status 为 stopped;已结束的回复返回当前状态,不报错只有接收回复的用户可以停止。停止后回复立即结束,已生成的内容保留,机器人的服务端会收到停止通知。需要从服务端读取一条回复的当前内容时用 Get(ctx, streamID);结束超过 10 分钟的返回 not_found,改为读取消息。
重新生成
平台没有单独的“重新生成”接口:再发一次被回复的问题,机器人的服务端会开始一条新的回复。
Demo
Go Demo 已显示 AI 回复:生成中的内容经桥推送到页面,按 Markdown 显示,提供“停止生成”和“复制”,已停止、生成中断有相应提示。
