Files
CLIProxyAPI/internal/translator/common/file_data.go
Luis Pater e47ffda75b feat(translator): normalize and extract OpenAI file content with MIME type
- Added `NormalizeOpenAIFileData` utility to parse and validate file content, ensuring proper MIME type handling and base64 extraction.
- Refactored translation logic to use normalized file data for Gemini, Antigravity, and Interactions processors.
- Introduced comprehensive unit tests for both valid and invalid file data scenarios across all translators.

Fixed: #4416
2026-07-19 18:29:05 +08:00

44 lines
1.2 KiB
Go

package common
import (
"path/filepath"
"strings"
"github.com/router-for-me/CLIProxyAPI/v7/internal/misc"
)
// NormalizeOpenAIFileData returns the MIME type and raw base64 payload for OpenAI file content.
func NormalizeOpenAIFileData(filename, fallbackMIMEType, fileData string) (mimeType, data string, ok bool) {
if fileData == "" {
return "", "", false
}
if fallbackMIMEType == "" {
ext := strings.ToLower(strings.TrimPrefix(filepath.Ext(filename), "."))
fallbackMIMEType = misc.MimeTypes[ext]
}
const dataURLPrefix = "data:"
if len(fileData) < len(dataURLPrefix) || !strings.EqualFold(fileData[:len(dataURLPrefix)], dataURLPrefix) {
if fallbackMIMEType == "" {
return "", "", false
}
return fallbackMIMEType, fileData, true
}
metadata, payload, found := strings.Cut(fileData[len(dataURLPrefix):], ",")
if !found || payload == "" {
return "", "", false
}
fields := strings.Split(metadata, ";")
mimeType = strings.TrimSpace(fields[0])
if mimeType == "" {
return "", "", false
}
for _, field := range fields[1:] {
if strings.EqualFold(strings.TrimSpace(field), "base64") {
return mimeType, payload, true
}
}
return "", "", false
}