@@ -202,6 +202,83 @@ func (a *ConversationApi) GetMessageList(c *gin.Context) {
|
||||
commonResponse.OkWithData(resp, c)
|
||||
}
|
||||
|
||||
// RegenerateMessage
|
||||
// @Tags AppConversation
|
||||
// @Summary 重新生成最后一条 AI 回复
|
||||
// @Produce application/json
|
||||
// @Param id path int true "对话ID"
|
||||
// @Param stream query bool false "是否流式传输"
|
||||
// @Success 200 {object} commonResponse.Response{data=response.MessageResponse} "重新生成成功"
|
||||
// @Router /app/conversation/:id/regenerate [post]
|
||||
// @Security ApiKeyAuth
|
||||
func (a *ConversationApi) RegenerateMessage(c *gin.Context) {
|
||||
userID := common.GetAppUserID(c)
|
||||
conversationID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||||
if err != nil {
|
||||
commonResponse.FailWithMessage("无效的对话ID", c)
|
||||
return
|
||||
}
|
||||
|
||||
if c.Query("stream") == "true" {
|
||||
a.regenerateMessageStream(c, userID, uint(conversationID))
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := service.ServiceGroupApp.AppServiceGroup.ConversationService.RegenerateMessage(userID, uint(conversationID))
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("重新生成消息失败", zap.Error(err))
|
||||
commonResponse.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
commonResponse.OkWithData(resp, c)
|
||||
}
|
||||
|
||||
func (a *ConversationApi) regenerateMessageStream(c *gin.Context, userID, conversationID uint) {
|
||||
c.Header("Content-Type", "text/event-stream")
|
||||
c.Header("Cache-Control", "no-cache")
|
||||
c.Header("Connection", "keep-alive")
|
||||
c.Header("X-Accel-Buffering", "no")
|
||||
|
||||
streamChan := make(chan string, 100)
|
||||
errorChan := make(chan error, 1)
|
||||
doneChan := make(chan bool, 1)
|
||||
|
||||
go func() {
|
||||
if err := service.ServiceGroupApp.AppServiceGroup.ConversationService.RegenerateMessageStream(
|
||||
userID, conversationID, streamChan, doneChan,
|
||||
); err != nil {
|
||||
errorChan <- err
|
||||
}
|
||||
}()
|
||||
|
||||
flusher, ok := c.Writer.(http.Flusher)
|
||||
if !ok {
|
||||
commonResponse.FailWithMessage("不支持流式传输", c)
|
||||
return
|
||||
}
|
||||
|
||||
for {
|
||||
select {
|
||||
case chunk := <-streamChan:
|
||||
c.Writer.Write([]byte("event: message\n"))
|
||||
c.Writer.Write([]byte(fmt.Sprintf("data: %s\n\n", chunk)))
|
||||
flusher.Flush()
|
||||
case err := <-errorChan:
|
||||
c.Writer.Write([]byte("event: error\n"))
|
||||
c.Writer.Write([]byte(fmt.Sprintf("data: %s\n\n", err.Error())))
|
||||
flusher.Flush()
|
||||
return
|
||||
case <-doneChan:
|
||||
c.Writer.Write([]byte("event: done\n"))
|
||||
c.Writer.Write([]byte("data: \n\n"))
|
||||
flusher.Flush()
|
||||
return
|
||||
case <-c.Request.Context().Done():
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SendMessage
|
||||
// @Tags AppConversation
|
||||
// @Summary 发送消息
|
||||
|
||||
Reference in New Issue
Block a user