Browse Source

feat: Allow FIM chat requests without messages

RedwindA 5 months ago
parent
commit
69e1542fc9
2 changed files with 13 additions and 1 deletions
  1. 10 0
      relay/channel/siliconflow/adaptor.go
  2. 3 1
      relay/helper/valid_request.go

+ 10 - 0
relay/channel/siliconflow/adaptor.go

@@ -61,6 +61,16 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *rel
 }
 
 func (a *Adaptor) ConvertOpenAIRequest(c *gin.Context, info *relaycommon.RelayInfo, request *dto.GeneralOpenAIRequest) (any, error) {
+	// SiliconFlow requires messages array for FIM requests, even if client doesn't send it
+	if (request.Prefix != nil || request.Suffix != nil) && len(request.Messages) == 0 {
+		// Add an empty user message to satisfy SiliconFlow's requirement
+		request.Messages = []dto.Message{
+			{
+				Role:    "user",
+				Content: "",
+			},
+		}
+	}
 	return request, nil
 }
 

+ 3 - 1
relay/helper/valid_request.go

@@ -275,7 +275,9 @@ func GetAndValidateTextRequest(c *gin.Context, relayMode int) (*dto.GeneralOpenA
 			return nil, errors.New("field prompt is required")
 		}
 	case relayconstant.RelayModeChatCompletions:
-		if len(textRequest.Messages) == 0 {
+		// For FIM (Fill-in-the-middle) requests with prefix/suffix, messages is optional
+		// It will be filled by provider-specific adaptors if needed (e.g., SiliconFlow)。Or it is allowed by model vendor(s) (e.g., DeepSeek)
+		if len(textRequest.Messages) == 0 && textRequest.Prefix == nil && textRequest.Suffix == nil {
 			return nil, errors.New("field messages is required")
 		}
 	case relayconstant.RelayModeEmbeddings: