Files
sub2api/backend/internal/pkg/apicompat/response_format.go
T

93 lines
1.9 KiB
Go
Raw Normal View History

package apicompat
import "encoding/json"
func chatResponseFormatToResponsesTextFormat(raw json.RawMessage) json.RawMessage {
raw = normalizedRawJSON(raw)
if len(raw) == 0 {
return nil
}
obj, ok := rawJSONObject(raw)
if !ok || rawString(obj["type"]) != "json_schema" {
return raw
}
schemaRaw := normalizedRawJSON(obj["json_schema"])
if len(schemaRaw) == 0 {
return raw
}
var schema map[string]json.RawMessage
if err := json.Unmarshal(schemaRaw, &schema); err != nil {
return raw
}
schema["type"] = rawJSONString("json_schema")
out, err := json.Marshal(schema)
if err != nil {
return raw
}
return out
}
func responsesTextFormatToChatResponseFormat(raw json.RawMessage) json.RawMessage {
raw = normalizedRawJSON(raw)
if len(raw) == 0 {
return nil
}
obj, ok := rawJSONObject(raw)
if !ok || rawString(obj["type"]) != "json_schema" {
return raw
}
if _, alreadyChatShape := obj["json_schema"]; alreadyChatShape {
return raw
}
schema := make(map[string]json.RawMessage, len(obj))
for key, value := range obj {
if key == "type" {
continue
}
schema[key] = value
}
if len(schema) == 0 {
return raw
}
schemaRaw, err := json.Marshal(schema)
if err != nil {
return raw
}
out, err := json.Marshal(map[string]json.RawMessage{
"type": rawJSONString("json_schema"),
"json_schema": schemaRaw,
})
if err != nil {
return raw
}
return out
}
func normalizedRawJSON(raw json.RawMessage) json.RawMessage {
raw = bytesTrimSpace(raw)
if len(raw) == 0 || string(raw) == "null" {
return nil
}
return append(json.RawMessage(nil), raw...)
}
func rawJSONObject(raw json.RawMessage) (map[string]json.RawMessage, bool) {
var obj map[string]json.RawMessage
if err := json.Unmarshal(raw, &obj); err != nil {
return nil, false
}
return obj, true
}
func rawJSONString(value string) json.RawMessage {
data, _ := json.Marshal(value)
return data
}