(ctx context.Context, sseHandler *sse.SSEHandlerCh, message *uctypes.AIMessage, chatOpts uctypes.WaveChatOpts)
| 547 | } |
| 548 | |
| 549 | func WaveAIPostMessageWrap(ctx context.Context, sseHandler *sse.SSEHandlerCh, message *uctypes.AIMessage, chatOpts uctypes.WaveChatOpts) error { |
| 550 | startTime := time.Now() |
| 551 | |
| 552 | // Convert AIMessage to native chat message using backend |
| 553 | backend, err := GetBackendByAPIType(chatOpts.Config.APIType) |
| 554 | if err != nil { |
| 555 | return err |
| 556 | } |
| 557 | convertedMessage, err := backend.ConvertAIMessageToNativeChatMessage(*message) |
| 558 | if err != nil { |
| 559 | return fmt.Errorf("message conversion failed: %w", err) |
| 560 | } |
| 561 | |
| 562 | // Post message to chat store |
| 563 | if err := chatstore.DefaultChatStore.PostMessage(chatOpts.ChatId, &chatOpts.Config, convertedMessage); err != nil { |
| 564 | return fmt.Errorf("failed to store message: %w", err) |
| 565 | } |
| 566 | |
| 567 | metrics, err := RunAIChat(ctx, sseHandler, backend, chatOpts) |
| 568 | if metrics != nil { |
| 569 | metrics.RequestDuration = int(time.Since(startTime).Milliseconds()) |
| 570 | for _, part := range message.Parts { |
| 571 | if part.Type == uctypes.AIMessagePartTypeText { |
| 572 | metrics.TextLen += len(part.Text) |
| 573 | } else if part.Type == uctypes.AIMessagePartTypeFile { |
| 574 | mimeType := strings.ToLower(part.MimeType) |
| 575 | if strings.HasPrefix(mimeType, "image/") { |
| 576 | metrics.ImageCount++ |
| 577 | } else if mimeType == "application/pdf" { |
| 578 | metrics.PDFCount++ |
| 579 | } else { |
| 580 | metrics.TextDocCount++ |
| 581 | } |
| 582 | } |
| 583 | } |
| 584 | log.Printf("WaveAI call metrics: requests=%d tools=%d premium=%d proxy=%d images=%d pdfs=%d textdocs=%d textlen=%d duration=%dms error=%v\n", |
| 585 | metrics.RequestCount, metrics.ToolUseCount, metrics.PremiumReqCount, metrics.ProxyReqCount, |
| 586 | metrics.ImageCount, metrics.PDFCount, metrics.TextDocCount, metrics.TextLen, metrics.RequestDuration, metrics.HadError) |
| 587 | |
| 588 | sendAIMetricsTelemetry(ctx, metrics) |
| 589 | } |
| 590 | return err |
| 591 | } |
| 592 | |
| 593 | func sendAIMetricsTelemetry(ctx context.Context, metrics *uctypes.AIMetrics) { |
| 594 | event := telemetrydata.MakeTEvent("waveai:post", telemetrydata.TEventProps{ |
no test coverage detected