mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-11-07 08:52:26 +00:00
fix(openai): retry streamed capacity errors in pool mode
This commit is contained in:
1 parent
5a6143097d
commit
7d3bf86e55
2 files changed
+24
-3
No files matched your search
@@ -892,6 +892,15 @@ func openAIStreamFailedEventShouldFailover(payload []byte, message string) bool
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func openAIStreamFailedEventRetryableOnSameAccount(account *Account, payload []byte, message string) bool {
|
||||||
|
if account == nil || !account.IsPoolMode() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
semanticStatus := openAIStreamFailedEventSemanticStatus(payload, message)
|
||||||
|
return account.IsPoolModeRetryableStatus(semanticStatus) ||
|
||||||
|
isOpenAITransientProcessingError(http.StatusBadRequest, message, payload)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *OpenAIGatewayService) recordOpenAIStreamUpstreamError(
|
func (s *OpenAIGatewayService) recordOpenAIStreamUpstreamError(
|
||||||
c *gin.Context,
|
c *gin.Context,
|
||||||
account *Account,
|
account *Account,
|
||||||
@@ -954,8 +963,9 @@ func (s *OpenAIGatewayService) newOpenAIStreamFailoverError(
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
return &UpstreamFailoverError{
|
return &UpstreamFailoverError{
|
||||||
StatusCode: http.StatusBadGateway,
|
StatusCode: http.StatusBadGateway,
|
||||||
ResponseBody: body,
|
ResponseBody: body,
|
||||||
|
RetryableOnSameAccount: openAIStreamFailedEventRetryableOnSameAccount(account, payload, message),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1474,6 +1474,7 @@ func TestOpenAIStreamingResponseFailedBeforeOutputReturnsFailover(t *testing.T)
|
|||||||
var failoverErr *UpstreamFailoverError
|
var failoverErr *UpstreamFailoverError
|
||||||
require.ErrorAs(t, err, &failoverErr)
|
require.ErrorAs(t, err, &failoverErr)
|
||||||
require.Equal(t, http.StatusBadGateway, failoverErr.StatusCode)
|
require.Equal(t, http.StatusBadGateway, failoverErr.StatusCode)
|
||||||
|
require.False(t, failoverErr.RetryableOnSameAccount)
|
||||||
require.Contains(t, string(failoverErr.ResponseBody), "An error occurred while processing your request")
|
require.Contains(t, string(failoverErr.ResponseBody), "An error occurred while processing your request")
|
||||||
require.False(t, c.Writer.Written())
|
require.False(t, c.Writer.Written())
|
||||||
require.Empty(t, rec.Body.String())
|
require.Empty(t, rec.Body.String())
|
||||||
@@ -1510,11 +1511,21 @@ func TestOpenAIStreamingResponseFailedBeforeOutputCapacityErrorReturnsFailover(t
|
|||||||
Header: http.Header{"X-Request-Id": []string{"rid-capacity-failed"}},
|
Header: http.Header{"X-Request-Id": []string{"rid-capacity-failed"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := svc.handleStreamingResponse(c.Request.Context(), resp, c, &Account{ID: 1, Platform: PlatformOpenAI, Name: "acc"}, time.Now(), "model", "model")
|
account := &Account{
|
||||||
|
ID: 1,
|
||||||
|
Platform: PlatformOpenAI,
|
||||||
|
Type: AccountTypeAPIKey,
|
||||||
|
Name: "pool-account",
|
||||||
|
Credentials: map[string]any{
|
||||||
|
"pool_mode": true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
_, err := svc.handleStreamingResponse(c.Request.Context(), resp, c, account, time.Now(), "model", "model")
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
var failoverErr *UpstreamFailoverError
|
var failoverErr *UpstreamFailoverError
|
||||||
require.ErrorAs(t, err, &failoverErr)
|
require.ErrorAs(t, err, &failoverErr)
|
||||||
require.Equal(t, http.StatusBadGateway, failoverErr.StatusCode)
|
require.Equal(t, http.StatusBadGateway, failoverErr.StatusCode)
|
||||||
|
require.True(t, failoverErr.RetryableOnSameAccount)
|
||||||
require.Contains(t, string(failoverErr.ResponseBody), "Selected model is at capacity")
|
require.Contains(t, string(failoverErr.ResponseBody), "Selected model is at capacity")
|
||||||
require.False(t, c.Writer.Written())
|
require.False(t, c.Writer.Written())
|
||||||
require.Empty(t, rec.Body.String())
|
require.Empty(t, rec.Body.String())
|
||||||
|
|||||||
Reference in new issue
Block a user