From dfe65da016dcde9664e7e3e542c1faffe3864767 Mon Sep 17 00:00:00 2001 From: virat-mankali Date: Sun, 8 Mar 2026 21:21:12 +0530 Subject: [PATCH] fix: resolve merge conflicts with main, adapt transcriber to interface --- pkg/agent/loop.go | 61 +++++++++++-------------- pkg/providers/openai_compat/provider.go | 1 + 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 9ade89206..345bcb962 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -624,50 +624,41 @@ func (al *AgentLoop) processMessage(ctx context.Context, msg bus.InboundMessage) // Transcribe any audio media refs before passing to the agent. userMessage := msg.Content + if al.transcriber != nil && len(msg.Media) > 0 && al.mediaStore != nil { - logger.DebugCF("agent", "Checking media for transcription", map[string]any{ - "media_count": len(msg.Media), - }) for _, ref := range msg.Media { localPath, meta, err := al.mediaStore.ResolveWithMeta(ref) if err != nil { - logger.WarnCF("agent", "Failed to resolve media ref for transcription", map[string]any{ - "ref": ref, "error": err.Error(), - }) continue } - if inferMediaType(meta.Filename, meta.ContentType) != "audio" { - logger.DebugCF("agent", "Skipping non-audio media", map[string]any{ - "ref": ref, "filename": meta.Filename, + + mediaType := inferMediaType(meta.Filename, meta.ContentType) + + // Handle audio transcription + if mediaType == "audio" { + logger.InfoCF("agent", "Transcribing audio", map[string]any{ + "ref": ref, "path": localPath, "filename": meta.Filename, }) - continue - } - logger.InfoCF("agent", "Transcribing audio", map[string]any{ - "ref": ref, "path": localPath, "filename": meta.Filename, - }) - result, err := al.transcriber.Transcribe(ctx, localPath) - if err != nil { - logger.WarnCF("agent", "Audio transcription failed", map[string]any{ - "ref": ref, "error": err.Error(), + result, err := al.transcriber.Transcribe(ctx, localPath) + if err != nil { + logger.WarnCF("agent", "Audio transcription failed", map[string]any{ + "ref": ref, "error": err.Error(), + }) + continue + } + logger.InfoCF("agent", "Transcribed audio", map[string]any{ + "ref": ref, "length": len(result.Text), }) - continue - } - logger.InfoCF("agent", "Transcribed audio", map[string]any{ - "ref": ref, "length": len(result.Text), - }) - // Replace the [voice]/[audio] placeholder with the actual transcript - userMessage = strings.NewReplacer("[voice]", "", "[audio]", "").Replace(userMessage) - userMessage = strings.TrimSpace(userMessage) - if userMessage != "" { - userMessage = userMessage + "\n\n[Voice transcript]: " + result.Text - } else { - userMessage = result.Text + // Replace the [voice]/[audio] placeholder with the actual transcript + userMessage = strings.NewReplacer("[voice]", "", "[audio]", "").Replace(userMessage) + userMessage = strings.TrimSpace(userMessage) + if userMessage != "" { + userMessage = userMessage + "\n\n[Voice transcript]: " + result.Text + } else { + userMessage = result.Text + } } } - } else if al.transcriber == nil && len(msg.Media) > 0 { - logger.WarnCF("agent", "Transcriber not configured, skipping media", map[string]any{ - "media_count": len(msg.Media), - }) } return al.runAgentLoop(ctx, agent, processOptions{ @@ -1759,3 +1750,5 @@ func extractParentPeer(msg bus.InboundMessage) *routing.RoutePeer { } return &routing.RoutePeer{Kind: parentKind, ID: parentID} } + + diff --git a/pkg/providers/openai_compat/provider.go b/pkg/providers/openai_compat/provider.go index 5c868626a..43e5e1cf8 100644 --- a/pkg/providers/openai_compat/provider.go +++ b/pkg/providers/openai_compat/provider.go @@ -364,6 +364,7 @@ func parseResponse(body io.Reader) (*LLMResponse, error) { // openaiMessage is the wire-format message for OpenAI-compatible APIs. // It mirrors protocoltypes.Message but omits SystemParts, which is an // internal field that would be unknown to third-party endpoints. +// Content can be either a string or an array of content blocks for multimodal messages. type openaiMessage struct { Role string `json:"role"` Content string `json:"content"`