@@ -333,16 +333,15 @@ func (p *OpenAIProvider) ListModels(ctx context.Context) ([]Model, error) {
333333 // nothing more to do; parsing helper already returned results or an error
334334}
335335
336- func (p * OpenAIProvider ) SendMessage (messages []Message , stream bool , images []string , tools []OpenAITool ) (string , error ) {
337- provider := strings .ToLower (p .config .PROVIDER )
338-
339- // If images are provided, prepend a user message with OpenAI vision content blocks
336+ // buildRequestMessages returns a JSON-ready slice of chat messages. Regular
337+ // messages are forwarded as-is (their Content is a plain string). When image
338+ // URIs are supplied, a user message carrying the OpenAI-style content blocks
339+ // is prepended — that payload is assembled locally as a map so the public
340+ // Message type can keep a flat string content.
341+ func buildRequestMessages (messages []Message , images []string ) []interface {} {
342+ out := make ([]interface {}, 0 , len (messages )+ 1 )
340343 if len (images ) > 0 {
341- if provider == "deepseek" || provider == "mistral" {
342- return "" , fmt .Errorf ("images not supported by provider: %s" , p .GetName ())
343- }
344- fmt .Println ("sending images" )
345- var blocks []ContentBlock
344+ blocks := make ([]ContentBlock , 0 , len (images ))
346345 for _ , uri := range images {
347346 blocks = append (blocks , ContentBlock {
348347 Type : "image_url" ,
@@ -351,18 +350,30 @@ func (p *OpenAIProvider) SendMessage(messages []Message, stream bool, images []s
351350 }{URL : uri },
352351 })
353352 }
354- imageMessage := Message {Role : "user" , Content : blocks }
355- messages = append ([]Message {imageMessage }, messages ... )
353+ out = append (out , map [string ]interface {}{
354+ "role" : "user" ,
355+ "content" : blocks ,
356+ })
357+ }
358+ for _ , m := range messages {
359+ out = append (out , m )
360+ }
361+ return out
362+ }
363+
364+ func (p * OpenAIProvider ) SendMessage (messages []Message , stream bool , images []string , tools []OpenAITool ) (string , error ) {
365+ provider := strings .ToLower (p .config .PROVIDER )
366+
367+ if len (images ) > 0 && (provider == "deepseek" || provider == "mistral" ) {
368+ return "" , fmt .Errorf ("images not supported by provider: %s" , p .GetName ())
356369 }
357370
358371 // Mistral rejects empty assistant messages
359372 if provider == "mistral" {
360373 filtered := make ([]Message , 0 , len (messages ))
361374 for _ , msg := range messages {
362- if msg .Role == "assistant" {
363- if s , ok := msg .Content .(string ); ok && s == "" && len (msg .ToolCalls ) == 0 {
364- continue
365- }
375+ if msg .Role == "assistant" && msg .Content == "" && len (msg .ToolCalls ) == 0 {
376+ continue
366377 }
367378 filtered = append (filtered , msg )
368379 }
@@ -375,7 +386,7 @@ func (p *OpenAIProvider) SendMessage(messages []Message, stream bool, images []s
375386 }
376387 request := map [string ]interface {}{
377388 "model" : effectiveModel ,
378- "messages" : messages ,
389+ "messages" : buildRequestMessages ( messages , images ) ,
379390 }
380391
381392 // Add tools if provided
0 commit comments