67 lines
2.3 KiB
Go
67 lines
2.3 KiB
Go
package schemas
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"strings"
|
|
)
|
|
|
|
// ParseRealtimeClientSecretBody parses a realtime client-secret request body
|
|
// into a mutable raw JSON map while preserving unknown fields.
|
|
func ParseRealtimeClientSecretBody(raw json.RawMessage) (map[string]json.RawMessage, *BifrostError) {
|
|
var root map[string]json.RawMessage
|
|
if err := Unmarshal(raw, &root); err != nil {
|
|
return nil, NewRealtimeClientSecretBodyError(400, "invalid_request_error", "invalid JSON body", err)
|
|
}
|
|
return root, nil
|
|
}
|
|
|
|
// ExtractRealtimeClientSecretModel extracts the model from either session.model
|
|
// or the legacy top-level model field.
|
|
func ExtractRealtimeClientSecretModel(root map[string]json.RawMessage) (string, *BifrostError) {
|
|
if sessionJSON, ok := root["session"]; ok && len(sessionJSON) > 0 && !bytes.Equal(sessionJSON, []byte("null")) {
|
|
var session map[string]json.RawMessage
|
|
if err := Unmarshal(sessionJSON, &session); err != nil {
|
|
return "", NewRealtimeClientSecretBodyError(400, "invalid_request_error", "session must be an object", err)
|
|
}
|
|
if modelJSON, ok := session["model"]; ok {
|
|
var sessionModel string
|
|
if err := Unmarshal(modelJSON, &sessionModel); err != nil {
|
|
return "", NewRealtimeClientSecretBodyError(400, "invalid_request_error", "session.model must be a string", err)
|
|
}
|
|
if strings.TrimSpace(sessionModel) != "" {
|
|
return strings.TrimSpace(sessionModel), nil
|
|
}
|
|
}
|
|
}
|
|
|
|
if modelJSON, ok := root["model"]; ok {
|
|
var model string
|
|
if err := Unmarshal(modelJSON, &model); err != nil {
|
|
return "", NewRealtimeClientSecretBodyError(400, "invalid_request_error", "model must be a string", err)
|
|
}
|
|
if strings.TrimSpace(model) != "" {
|
|
return strings.TrimSpace(model), nil
|
|
}
|
|
}
|
|
|
|
return "", NewRealtimeClientSecretBodyError(400, "invalid_request_error", "session.model or model is required", nil)
|
|
}
|
|
|
|
// NewRealtimeClientSecretBodyError builds a standard invalid-request style error
|
|
// for HTTP realtime client-secret request parsing/validation.
|
|
func NewRealtimeClientSecretBodyError(status int, errorType, message string, err error) *BifrostError {
|
|
return &BifrostError{
|
|
IsBifrostError: false,
|
|
StatusCode: Ptr(status),
|
|
Error: &ErrorField{
|
|
Type: Ptr(errorType),
|
|
Message: message,
|
|
Error: err,
|
|
},
|
|
ExtraFields: BifrostErrorExtraFields{
|
|
RequestType: RealtimeRequest,
|
|
},
|
|
}
|
|
}
|