2025-05-02 13:59:46 +08:00
package relay
import (
"bytes"
"fmt"
"io"
"net/http"
"one-api/common"
"one-api/dto"
relaycommon "one-api/relay/common"
"one-api/relay/helper"
"one-api/service"
"one-api/setting/model_setting"
2025-07-10 15:02:40 +08:00
"one-api/types"
2025-05-02 13:59:46 +08:00
"strings"
"github.com/gin-gonic/gin"
)
2025-08-14 20:05:06 +08:00
func ResponsesHelper ( c * gin . Context , info * relaycommon . RelayInfo ) ( newAPIError * types . NewAPIError ) {
info . InitChannelMeta ( c )
2025-05-02 13:59:46 +08:00
2025-08-23 13:13:10 +08:00
responsesReq , ok := info . Request . ( * dto . OpenAIResponsesRequest )
2025-08-14 20:05:06 +08:00
if ! ok {
2025-08-23 13:34:56 +08:00
return types . NewErrorWithStatusCode ( fmt . Errorf ( "invalid request type, expected dto.OpenAIResponsesRequest, got %T" , info . Request ) , types . ErrorCodeInvalidRequest , http . StatusBadRequest , types . ErrOptionWithSkipRetry ( ) )
2025-05-02 13:59:46 +08:00
}
2025-05-05 00:40:16 +08:00
2025-08-23 13:13:10 +08:00
request , err := common . DeepCopy ( responsesReq )
if err != nil {
return types . NewError ( fmt . Errorf ( "failed to copy request to GeneralOpenAIRequest: %w" , err ) , types . ErrorCodeInvalidRequest , types . ErrOptionWithSkipRetry ( ) )
}
err = helper . ModelMappedHelper ( c , info , request )
2025-05-02 13:59:46 +08:00
if err != nil {
2025-07-30 22:35:31 +08:00
return types . NewError ( err , types . ErrorCodeChannelModelMappedError , types . ErrOptionWithSkipRetry ( ) )
2025-05-02 13:59:46 +08:00
}
2025-06-20 16:02:23 +08:00
2025-08-14 20:05:06 +08:00
adaptor := GetAdaptor ( info . ApiType )
2025-05-02 13:59:46 +08:00
if adaptor == nil {
2025-08-14 20:05:06 +08:00
return types . NewError ( fmt . Errorf ( "invalid api type: %d" , info . ApiType ) , types . ErrorCodeInvalidApiType , types . ErrOptionWithSkipRetry ( ) )
2025-05-02 13:59:46 +08:00
}
2025-08-14 20:05:06 +08:00
adaptor . Init ( info )
2025-05-02 13:59:46 +08:00
var requestBody io . Reader
if model_setting . GetGlobalSettings ( ) . PassThroughRequestEnabled {
body , err := common . GetRequestBody ( c )
if err != nil {
2025-07-30 22:35:31 +08:00
return types . NewError ( err , types . ErrorCodeReadRequestBodyFailed , types . ErrOptionWithSkipRetry ( ) )
2025-05-02 13:59:46 +08:00
}
requestBody = bytes . NewBuffer ( body )
} else {
2025-08-14 20:05:06 +08:00
convertedRequest , err := adaptor . ConvertOpenAIResponsesRequest ( c , info , * request )
2025-05-02 13:59:46 +08:00
if err != nil {
2025-07-30 22:35:31 +08:00
return types . NewError ( err , types . ErrorCodeConvertRequestFailed , types . ErrOptionWithSkipRetry ( ) )
2025-05-02 13:59:46 +08:00
}
2025-08-15 14:52:17 +08:00
jsonData , err := common . Marshal ( convertedRequest )
2025-05-02 13:59:46 +08:00
if err != nil {
2025-07-30 22:35:31 +08:00
return types . NewError ( err , types . ErrorCodeConvertRequestFailed , types . ErrOptionWithSkipRetry ( ) )
2025-05-02 13:59:46 +08:00
}
// apply param override
2025-08-14 20:05:06 +08:00
if len ( info . ParamOverride ) > 0 {
2025-08-16 11:27:47 +08:00
jsonData , err = relaycommon . ApplyParamOverride ( jsonData , info . ParamOverride )
2025-05-02 13:59:46 +08:00
if err != nil {
2025-07-30 22:35:31 +08:00
return types . NewError ( err , types . ErrorCodeChannelParamOverrideInvalid , types . ErrOptionWithSkipRetry ( ) )
2025-05-02 13:59:46 +08:00
}
}
if common . DebugEnabled {
println ( "requestBody: " , string ( jsonData ) )
}
requestBody = bytes . NewBuffer ( jsonData )
}
var httpResp * http . Response
2025-08-14 20:05:06 +08:00
resp , err := adaptor . DoRequest ( c , info , requestBody )
2025-05-02 13:59:46 +08:00
if err != nil {
2025-07-19 11:29:31 +08:00
return types . NewOpenAIError ( err , types . ErrorCodeDoRequestFailed , http . StatusInternalServerError )
2025-05-02 13:59:46 +08:00
}
statusCodeMappingStr := c . GetString ( "status_code_mapping" )
if resp != nil {
httpResp = resp . ( * http . Response )
if httpResp . StatusCode != http . StatusOK {
2025-07-10 15:02:40 +08:00
newAPIError = service . RelayErrorHandler ( httpResp , false )
2025-05-02 13:59:46 +08:00
// reset status code 重置状态码
2025-07-10 15:02:40 +08:00
service . ResetStatusCode ( newAPIError , statusCodeMappingStr )
return newAPIError
2025-05-02 13:59:46 +08:00
}
}
2025-08-14 20:05:06 +08:00
usage , newAPIError := adaptor . DoResponse ( c , httpResp , info )
2025-07-10 15:02:40 +08:00
if newAPIError != nil {
2025-05-02 13:59:46 +08:00
// reset status code 重置状态码
2025-07-10 15:02:40 +08:00
service . ResetStatusCode ( newAPIError , statusCodeMappingStr )
return newAPIError
2025-05-02 13:59:46 +08:00
}
2025-08-14 20:05:06 +08:00
if strings . HasPrefix ( info . OriginModelName , "gpt-4o-audio" ) {
service . PostAudioConsumeQuota ( c , info , usage . ( * dto . Usage ) , "" )
2025-05-02 13:59:46 +08:00
} else {
2025-08-14 20:05:06 +08:00
postConsumeQuota ( c , info , usage . ( * dto . Usage ) , "" )
2025-05-02 13:59:46 +08:00
}
return nil
}