Parcourir la source

Merge pull request #2876 from seefs001/fix/json_schema

fix: /v1/chat/completions -> /v1/responses json_schema
Calcium-Ion il y a 4 semaines
Parent
commit
f18aec5281
1 fichiers modifiés avec 43 ajouts et 6 suppressions
  1. 43 6
      service/openaicompat/chat_to_responses.go

+ 43 - 6
service/openaicompat/chat_to_responses.go

@@ -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) {
 	if req == nil {
 		return nil, errors.New("request is nil")
@@ -312,17 +350,16 @@ func ChatCompletionsRequestToResponsesRequest(req *dto.GeneralOpenAIRequest) (*d
 		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
 	if req.MaxCompletionTokens > maxOutputTokens {
 		maxOutputTokens = req.MaxCompletionTokens
 	}
+	// OpenAI Responses API rejects max_output_tokens < 16 when explicitly provided.
+	//if maxOutputTokens > 0 && maxOutputTokens < 16 {
+	//	maxOutputTokens = 16
+	//}
 
 	var topP *float64
 	if req.TopP != 0 {