(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Response)
| 211 | } |
| 212 | |
| 213 | func difyStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Response) (*dto.Usage, *types.NewAPIError) { |
| 214 | var responseText string |
| 215 | usage := &dto.Usage{} |
| 216 | var nodeToken int |
| 217 | helper.SetEventStreamHeaders(c) |
| 218 | helper.StreamScannerHandler(c, resp, info, func(data string) bool { |
| 219 | var difyResponse DifyChunkChatCompletionResponse |
| 220 | err := json.Unmarshal([]byte(data), &difyResponse) |
| 221 | if err != nil { |
| 222 | common.SysError("error unmarshalling stream response: " + err.Error()) |
| 223 | return true |
| 224 | } |
| 225 | var openaiResponse dto.ChatCompletionsStreamResponse |
| 226 | if difyResponse.Event == "message_end" { |
| 227 | usage = &difyResponse.MetaData.Usage |
| 228 | return false |
| 229 | } else if difyResponse.Event == "error" { |
| 230 | return false |
| 231 | } else { |
| 232 | openaiResponse = *streamResponseDify2OpenAI(difyResponse) |
| 233 | if len(openaiResponse.Choices) != 0 { |
| 234 | responseText += openaiResponse.Choices[0].Delta.GetContentString() |
| 235 | if openaiResponse.Choices[0].Delta.ReasoningContent != nil { |
| 236 | nodeToken += 1 |
| 237 | } |
| 238 | } |
| 239 | } |
| 240 | err = helper.ObjectData(c, openaiResponse) |
| 241 | if err != nil { |
| 242 | common.SysError(err.Error()) |
| 243 | } |
| 244 | return true |
| 245 | }) |
| 246 | helper.Done(c) |
| 247 | if usage.TotalTokens == 0 { |
| 248 | usage = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens) |
| 249 | } |
| 250 | usage.CompletionTokens += nodeToken |
| 251 | return usage, nil |
| 252 | } |
| 253 | |
| 254 | func difyHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Response) (*dto.Usage, *types.NewAPIError) { |
| 255 | var difyResponse DifyChatCompletionResponse |
no test coverage detected