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 顯示,提供“停止生成”和“複製”,已停止、生成中斷有相應提示。
