coo7 commited on
Commit
00493d3
·
verified ·
1 Parent(s): febc384

Update internal/monica/sse.go

Browse files
Files changed (1) hide show
  1. internal/monica/sse.go +59 -6
internal/monica/sse.go CHANGED
@@ -26,8 +26,19 @@ const (
26
 
27
  // SSEData 用于解析 Monica SSE json
28
  type SSEData struct {
 
 
 
 
 
 
 
 
29
  Text string `json:"text"`
30
- Finished bool `json:"finished"`
 
 
 
31
  }
32
 
33
  var sseDataPool = sync.Pool{
@@ -69,6 +80,7 @@ func StreamMonicaSSEToClient(model string, w io.Writer, r io.Reader) error {
69
  }
70
  }()
71
 
 
72
  for {
73
  line, err := reader.ReadString('\n')
74
  if err != nil {
@@ -99,7 +111,8 @@ func StreamMonicaSSEToClient(model string, w io.Writer, r io.Reader) error {
99
 
100
  // 将拆分后的文字写回
101
  var sseMsg types.ChatCompletionStreamResponse
102
- if sseObj.Finished {
 
103
  sseMsg = types.ChatCompletionStreamResponse{
104
  ID: "chatcmpl-" + chatId,
105
  Object: sseObject,
@@ -115,7 +128,48 @@ func StreamMonicaSSEToClient(model string, w io.Writer, r io.Reader) error {
115
  },
116
  },
117
  }
118
- } else {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  sseMsg = types.ChatCompletionStreamResponse{
120
  ID: "chatcmpl-" + chatId,
121
  Object: sseObject,
@@ -143,7 +197,6 @@ func StreamMonicaSSEToClient(model string, w io.Writer, r io.Reader) error {
143
 
144
  // 写入缓冲区
145
  if _, err := writer.WriteString(sb.String()); err != nil {
146
- sseDataPool.Put(sseObj)
147
  return fmt.Errorf("write error: %w", err)
148
  }
149
 
@@ -154,11 +207,11 @@ func StreamMonicaSSEToClient(model string, w io.Writer, r io.Reader) error {
154
  if f, ok := w.(http.Flusher); ok {
155
  f.Flush()
156
  }
157
- sseDataPool.Put(sseObj)
158
  return nil
159
  }
160
 
161
- // 将对象放回对象池
 
162
  sseDataPool.Put(sseObj)
163
  }
164
  }
 
26
 
27
  // SSEData 用于解析 Monica SSE json
28
  type SSEData struct {
29
+ Text string `json:"text"`
30
+ Finished bool `json:"finished"`
31
+ AgentStatus AgentStatus `json:"agent_status,omitempty"`
32
+ }
33
+
34
+ type AgentStatus struct {
35
+ UID string `json:"uid"`
36
+ Type string `json:"type"`
37
  Text string `json:"text"`
38
+ Metadata struct {
39
+ Title string `json:"title"`
40
+ ReasoningDetail string `json:"reasoning_detail"`
41
+ } `json:"metadata"`
42
  }
43
 
44
  var sseDataPool = sync.Pool{
 
80
  }
81
  }()
82
 
83
+ var thinkFlag bool
84
  for {
85
  line, err := reader.ReadString('\n')
86
  if err != nil {
 
111
 
112
  // 将拆分后的文字写回
113
  var sseMsg types.ChatCompletionStreamResponse
114
+ switch {
115
+ case sseObj.Finished:
116
  sseMsg = types.ChatCompletionStreamResponse{
117
  ID: "chatcmpl-" + chatId,
118
  Object: sseObject,
 
128
  },
129
  },
130
  }
131
+ case sseObj.AgentStatus.Type == "thinking":
132
+ thinkFlag = true
133
+ sseMsg = types.ChatCompletionStreamResponse{
134
+ ID: "chatcmpl-" + chatId,
135
+ Object: sseObject,
136
+ SystemFingerprint: fingerprint,
137
+ Created: now,
138
+ Model: model,
139
+ Choices: []types.ChatCompletionStreamChoice{
140
+ {
141
+ Index: 0,
142
+ Delta: openai.ChatCompletionStreamChoiceDelta{
143
+ Role: openai.ChatMessageRoleAssistant,
144
+ Content: `<think>`,
145
+ },
146
+ FinishReason: openai.FinishReasonNull,
147
+ },
148
+ },
149
+ }
150
+ case sseObj.AgentStatus.Type == "thinking_detail_stream":
151
+ sseMsg = types.ChatCompletionStreamResponse{
152
+ ID: "chatcmpl-" + chatId,
153
+ Object: sseObject,
154
+ SystemFingerprint: fingerprint,
155
+ Created: now,
156
+ Model: model,
157
+ Choices: []types.ChatCompletionStreamChoice{
158
+ {
159
+ Index: 0,
160
+ Delta: openai.ChatCompletionStreamChoiceDelta{
161
+ Role: openai.ChatMessageRoleAssistant,
162
+ Content: sseObj.AgentStatus.Metadata.ReasoningDetail,
163
+ },
164
+ FinishReason: openai.FinishReasonNull,
165
+ },
166
+ },
167
+ }
168
+ default:
169
+ if thinkFlag {
170
+ sseObj.Text = "</think>" + sseObj.Text
171
+ thinkFlag = false
172
+ }
173
  sseMsg = types.ChatCompletionStreamResponse{
174
  ID: "chatcmpl-" + chatId,
175
  Object: sseObject,
 
197
 
198
  // 写入缓冲区
199
  if _, err := writer.WriteString(sb.String()); err != nil {
 
200
  return fmt.Errorf("write error: %w", err)
201
  }
202
 
 
207
  if f, ok := w.(http.Flusher); ok {
208
  f.Flush()
209
  }
 
210
  return nil
211
  }
212
 
213
+ sseObj.AgentStatus.Type = ""
214
+ sseObj.Finished = false
215
  sseDataPool.Put(sseObj)
216
  }
217
  }