feat: support text/ files

Carlos Alexandro Becker created

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Change summary

providers/anthropic/anthropic.go               | 19 +++++++++++--------
providers/openai/language_model_hooks.go       |  5 +++++
providers/openaicompat/language_model_hooks.go |  5 +++++
3 files changed, 21 insertions(+), 8 deletions(-)

Detailed changes

providers/anthropic/anthropic.go 🔗

@@ -547,16 +547,19 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl
 								continue
 							}
 							// TODO: handle other file types
-							if !strings.HasPrefix(file.MediaType, "image/") {
-								continue
+							if strings.HasPrefix(file.MediaType, "image/") {
+								base64Encoded := base64.StdEncoding.EncodeToString(file.Data)
+								imageBlock := anthropic.NewImageBlockBase64(file.MediaType, base64Encoded)
+								if cacheControl != nil {
+									imageBlock.OfImage.CacheControl = anthropic.NewCacheControlEphemeralParam()
+								}
+								anthropicContent = append(anthropicContent, imageBlock)
 							}
-
-							base64Encoded := base64.StdEncoding.EncodeToString(file.Data)
-							imageBlock := anthropic.NewImageBlockBase64(file.MediaType, base64Encoded)
-							if cacheControl != nil {
-								imageBlock.OfImage.CacheControl = anthropic.NewCacheControlEphemeralParam()
+							if strings.HasPrefix(file.MediaType, "text/") {
+								anthropicContent = append(anthropicContent, anthropic.NewDocumentBlock(anthropic.PlainTextSourceParam{
+									Data: string(file.Data),
+								}))
 							}
-							anthropicContent = append(anthropicContent, imageBlock)
 						}
 					}
 				} else if msg.Role == fantasy.MessageRoleTool {

providers/openai/language_model_hooks.go 🔗

@@ -359,6 +359,11 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio
 					}
 
 					switch {
+					case strings.HasPrefix(filePart.MediaType, "text/"):
+						base64Encoded := base64.StdEncoding.EncodeToString(filePart.Data)
+						content = append(content, openai.FileContentPart(openai.ChatCompletionContentPartFileFileParam{
+							FileData: param.NewOpt(base64Encoded),
+						}))
 					case strings.HasPrefix(filePart.MediaType, "image/"):
 						// Handle image files
 						base64Encoded := base64.StdEncoding.EncodeToString(filePart.Data)

providers/openaicompat/language_model_hooks.go 🔗

@@ -209,6 +209,11 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio
 					}
 
 					switch {
+					case strings.HasPrefix(filePart.MediaType, "text/"):
+						base64Encoded := base64.StdEncoding.EncodeToString(filePart.Data)
+						content = append(content, openaisdk.FileContentPart(openaisdk.ChatCompletionContentPartFileFileParam{
+							FileData: param.NewOpt(base64Encoded),
+						}))
 					case strings.HasPrefix(filePart.MediaType, "image/"):
 						// Handle image files
 						base64Encoded := base64.StdEncoding.EncodeToString(filePart.Data)