43 lines
1.2 KiB
Go
43 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
|
|
}
|