11package chat
22
33import (
4- "errors"
4+ "paperdebugger/internal/api/mapper"
5+ "paperdebugger/internal/models"
6+ "paperdebugger/internal/services"
57 chatv1 "paperdebugger/pkg/gen/api/chat/v1"
8+
9+ "go.mongodb.org/mongo-driver/v2/bson"
610)
711
812func (s * ChatServer ) sendStreamError (stream chatv1.ChatService_CreateConversationMessageStreamServer , err error ) error {
@@ -19,5 +23,60 @@ func (s *ChatServer) CreateConversationMessageStream(
1923 req * chatv1.CreateConversationMessageStreamRequest ,
2024 stream chatv1.ChatService_CreateConversationMessageStreamServer ,
2125) error {
22- return s .sendStreamError (stream , errors .New ("Due to some technical problem from LLM providers, we are trying to bring the service back. Please retry later." ))
26+ ctx := stream .Context ()
27+ ctx , conversation , err := s .prepare (
28+ ctx ,
29+ req .GetProjectId (),
30+ req .GetConversationId (),
31+ req .GetUserMessage (),
32+ req .GetUserSelectedText (),
33+ models .LanguageModel (req .GetLanguageModel ()),
34+ req .GetConversationType (),
35+ )
36+ if err != nil {
37+ return s .sendStreamError (stream , err )
38+ }
39+
40+ // 用法跟 ChatCompletion 一样,只是传递了 stream 参数
41+ openaiChatHistory , inappChatHistory , err := s .aiClient .ChatCompletionStream (ctx , stream , conversation .ID .Hex (), conversation .LanguageModel , conversation .OpenaiChatHistory )
42+ if err != nil {
43+ return s .sendStreamError (stream , err )
44+ }
45+
46+ // 附加消息到对话
47+ bsonMessages := make ([]bson.M , len (inappChatHistory ))
48+ for i := range inappChatHistory {
49+ bsonMsg , err := convertToBSON (& inappChatHistory [i ])
50+ if err != nil {
51+ return s .sendStreamError (stream , err )
52+ }
53+ bsonMessages [i ] = bsonMsg
54+ }
55+ conversation .InappChatHistory = append (conversation .InappChatHistory , bsonMessages ... )
56+ conversation .OpenaiChatHistory = openaiChatHistory
57+ if err := s .chatService .UpdateConversation (conversation ); err != nil {
58+ return s .sendStreamError (stream , err )
59+ }
60+
61+ if conversation .Title == services .DefaultConversationTitle {
62+ go func () {
63+ protoMessages := make ([]* chatv1.Message , len (conversation .InappChatHistory ))
64+ for i , bsonMsg := range conversation .InappChatHistory {
65+ protoMessages [i ] = mapper .BSONToChatMessage (bsonMsg )
66+ }
67+ title , err := s .aiClient .GetConversationTitle (ctx , protoMessages )
68+ if err != nil {
69+ s .logger .Error ("Failed to get conversation title" , "error" , err , "conversationID" , conversation .ID .Hex ())
70+ return
71+ }
72+ conversation .Title = title
73+ if err := s .chatService .UpdateConversation (conversation ); err != nil {
74+ s .logger .Error ("Failed to update conversation with new title" , "error" , err , "conversationID" , conversation .ID .Hex ())
75+ return
76+ }
77+ }()
78+ }
79+
80+ // The final conversation object is NOT returned
81+ return nil
2382}
0 commit comments