|
@@ -34,6 +34,44 @@ func normalizeChatImageURLToString(v any) any {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func convertChatResponseFormatToResponsesText(reqFormat *dto.ResponseFormat) json.RawMessage {
|
|
|
|
|
+ if reqFormat == nil || strings.TrimSpace(reqFormat.Type) == "" {
|
|
|
|
|
+ return nil
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ format := map[string]any{
|
|
|
|
|
+ "type": reqFormat.Type,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if reqFormat.Type == "json_schema" && len(reqFormat.JsonSchema) > 0 {
|
|
|
|
|
+ var chatSchema map[string]any
|
|
|
|
|
+ if err := common.Unmarshal(reqFormat.JsonSchema, &chatSchema); err == nil {
|
|
|
|
|
+ for key, value := range chatSchema {
|
|
|
|
|
+ if key == "type" {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ format[key] = value
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if nested, ok := format["json_schema"].(map[string]any); ok {
|
|
|
|
|
+ for key, value := range nested {
|
|
|
|
|
+ if _, exists := format[key]; !exists {
|
|
|
|
|
+ format[key] = value
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ delete(format, "json_schema")
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ format["json_schema"] = reqFormat.JsonSchema
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ textRaw, _ := common.Marshal(map[string]any{
|
|
|
|
|
+ "format": format,
|
|
|
|
|
+ })
|
|
|
|
|
+ return textRaw
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func ChatCompletionsRequestToResponsesRequest(req *dto.GeneralOpenAIRequest) (*dto.OpenAIResponsesRequest, error) {
|
|
func ChatCompletionsRequestToResponsesRequest(req *dto.GeneralOpenAIRequest) (*dto.OpenAIResponsesRequest, error) {
|
|
|
if req == nil {
|
|
if req == nil {
|
|
|
return nil, errors.New("request is nil")
|
|
return nil, errors.New("request is nil")
|
|
@@ -312,17 +350,16 @@ func ChatCompletionsRequestToResponsesRequest(req *dto.GeneralOpenAIRequest) (*d
|
|
|
parallelToolCallsRaw, _ = common.Marshal(*req.ParallelTooCalls)
|
|
parallelToolCallsRaw, _ = common.Marshal(*req.ParallelTooCalls)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- var textRaw json.RawMessage
|
|
|
|
|
- if req.ResponseFormat != nil && req.ResponseFormat.Type != "" {
|
|
|
|
|
- textRaw, _ = common.Marshal(map[string]any{
|
|
|
|
|
- "format": req.ResponseFormat,
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ textRaw := convertChatResponseFormatToResponsesText(req.ResponseFormat)
|
|
|
|
|
|
|
|
maxOutputTokens := req.MaxTokens
|
|
maxOutputTokens := req.MaxTokens
|
|
|
if req.MaxCompletionTokens > maxOutputTokens {
|
|
if req.MaxCompletionTokens > maxOutputTokens {
|
|
|
maxOutputTokens = req.MaxCompletionTokens
|
|
maxOutputTokens = req.MaxCompletionTokens
|
|
|
}
|
|
}
|
|
|
|
|
+ // OpenAI Responses API rejects max_output_tokens < 16 when explicitly provided.
|
|
|
|
|
+ //if maxOutputTokens > 0 && maxOutputTokens < 16 {
|
|
|
|
|
+ // maxOutputTokens = 16
|
|
|
|
|
+ //}
|
|
|
|
|
|
|
|
var topP *float64
|
|
var topP *float64
|
|
|
if req.TopP != 0 {
|
|
if req.TopP != 0 {
|