@@ -757,8 +757,10 @@ func (ps *ProxyServer) HandleProxy(c *gin.Context) {
757757 // direct API calls that should preserve their original query parameters.
758758 // Also check /v1beta/messages for Gemini CC conversion (path may be rewritten to /v1beta/messages)
759759 if isCCSupportEnabled (group ) && (strings .HasSuffix (c .Request .URL .Path , "/v1/messages" ) || strings .HasSuffix (c .Request .URL .Path , "/v1beta/messages" )) {
760- // Handle Codex channel CC support (Claude -> Codex/Responses API)
761- if group .ChannelType == "codex" {
760+ // Handle channel-specific CC support conversions
761+ switch group .ChannelType {
762+ case "codex" :
763+ // Handle Codex channel CC support (Claude -> Codex/Responses API)
762764 convertedBody , converted , ccErr := ps .applyCodexCCRequestConversion (c , group , finalBodyBytes )
763765 if ccErr != nil {
764766 logrus .WithError (ccErr ).WithFields (logrus.Fields {
@@ -784,7 +786,7 @@ func (ps *ProxyServer) HandleProxy(c *gin.Context) {
784786 "new_path" : c .Request .URL .Path ,
785787 }).Debug ("Codex CC support: converted Claude request to Codex format" )
786788 }
787- } else if group . ChannelType == "gemini" {
789+ case "gemini" :
788790 // Handle Gemini channel CC support (Claude -> Gemini API)
789791 convertedBody , converted , ccErr := ps .applyGeminiCCRequestConversion (c , group , finalBodyBytes )
790792 if ccErr != nil {
@@ -809,7 +811,7 @@ func (ps *ProxyServer) HandleProxy(c *gin.Context) {
809811 "new_path" : c .Request .URL .Path ,
810812 }).Debug ("Gemini CC support: converted Claude request to Gemini format" )
811813 }
812- } else {
814+ default :
813815 // Handle OpenAI channel CC support (Claude -> OpenAI Chat Completions)
814816 convertedBody , converted , ccErr := ps .applyCCRequestConversionDirect (c , group , finalBodyBytes )
815817 if ccErr != nil {
@@ -1377,8 +1379,10 @@ func (ps *ProxyServer) executeRequestWithAggregateRetry(
13771379 isMessagesEndpoint := strings .HasSuffix (c .Request .URL .Path , "/v1/messages" ) ||
13781380 strings .HasSuffix (c .Request .URL .Path , "/v1beta/messages" )
13791381 if isCCSupportEnabled (group ) && isMessagesEndpoint {
1380- // Handle Codex channel CC support (Claude -> Codex/Responses API)
1381- if group .ChannelType == "codex" {
1382+ // Handle channel-specific CC support conversions
1383+ switch group .ChannelType {
1384+ case "codex" :
1385+ // Handle Codex channel CC support (Claude -> Codex/Responses API)
13821386 // Sanitize query parameters for Codex CC (remove Claude-specific params like beta=true)
13831387 // This is needed even if path wasn't /claude/ since Anthropic aggregate may send directly to /v1/messages
13841388 sanitizeCCQueryParams (c .Request .URL )
@@ -1440,7 +1444,7 @@ func (ps *ProxyServer) executeRequestWithAggregateRetry(
14401444 "new_path" : c .Request .URL .Path ,
14411445 }).Debug ("Codex CC support: converted Claude request for sub-group" )
14421446 }
1443- } else if group . ChannelType == "gemini" {
1447+ case "gemini" :
14441448 // Handle Gemini channel CC support (Claude -> Gemini API)
14451449 sanitizeCCQueryParams (c .Request .URL )
14461450
@@ -1469,7 +1473,7 @@ func (ps *ProxyServer) executeRequestWithAggregateRetry(
14691473 "new_path" : c .Request .URL .Path ,
14701474 }).Debug ("Gemini CC support: converted Claude request for sub-group" )
14711475 }
1472- } else {
1476+ default :
14731477 // Handle OpenAI channel CC support (Claude -> OpenAI Chat Completions)
14741478 convertedBody , converted , ccErr := ps .applyCCRequestConversionDirect (c , group , finalBodyBytes )
14751479 if ccErr != nil {
@@ -2198,7 +2202,7 @@ func (ps *ProxyServer) logRequest(
21982202 // This ensures that failed sub-group attempts are reflected in health scores,
21992203 // even when the overall aggregate request succeeds via retry to another sub-group.
22002204 if ps .dynamicWeightManager != nil {
2201- ps .recordDynamicWeightMetrics (c , originalGroup , group , logEntry .IsSuccess )
2205+ ps .recordDynamicWeightMetrics (c , originalGroup , group , logEntry .IsSuccess , statusCode )
22022206 }
22032207}
22042208
@@ -2209,23 +2213,30 @@ func (ps *ProxyServer) logRequest(
22092213// or unavailable, it can add tail latency or reduce throughput. The current implementation
22102214// prioritizes simplicity and correctness. For production deployments with strict latency SLAs,
22112215// consider async/buffering and ensure strict client timeouts in the store implementation.
2212- func (ps * ProxyServer ) recordDynamicWeightMetrics (c * gin.Context , originalGroup , group * models.Group , isSuccess bool ) {
2216+ func (ps * ProxyServer ) recordDynamicWeightMetrics (c * gin.Context , originalGroup , group * models.Group , isSuccess bool , statusCode int ) {
22132217 if ps .dynamicWeightManager == nil {
22142218 return
22152219 }
22162220
2221+ // Determine if this is a rate limit error (429)
2222+ // Rate limit errors receive lighter penalties as they indicate temporary throttling
2223+ // rather than service unavailability
2224+ isRateLimit := ! isSuccess && statusCode == 429
2225+
22172226 // Record sub-group metrics for aggregate groups
22182227 if originalGroup != nil && originalGroup .GroupType == "aggregate" && originalGroup .ID != group .ID {
22192228 if isSuccess {
22202229 ps .dynamicWeightManager .RecordSubGroupSuccess (originalGroup .ID , group .ID )
22212230 } else {
2222- ps .dynamicWeightManager .RecordSubGroupFailure (originalGroup .ID , group .ID )
2231+ ps .dynamicWeightManager .RecordSubGroupFailure (originalGroup .ID , group .ID , isRateLimit )
22232232 }
22242233
22252234 logrus .WithFields (logrus.Fields {
22262235 "aggregate_group_id" : originalGroup .ID ,
22272236 "sub_group_id" : group .ID ,
22282237 "is_success" : isSuccess ,
2238+ "is_rate_limit" : isRateLimit ,
2239+ "status_code" : statusCode ,
22292240 }).Debug ("Recorded dynamic weight metrics for sub-group" )
22302241 }
22312242
@@ -2235,12 +2246,14 @@ func (ps *ProxyServer) recordDynamicWeightMetrics(c *gin.Context, originalGroup,
22352246 if isSuccess {
22362247 ps .dynamicWeightManager .RecordGroupSuccess (group .ID )
22372248 } else {
2238- ps .dynamicWeightManager .RecordGroupFailure (group .ID )
2249+ ps .dynamicWeightManager .RecordGroupFailure (group .ID , isRateLimit )
22392250 }
22402251
22412252 logrus .WithFields (logrus.Fields {
2242- "group_id" : group .ID ,
2243- "is_success" : isSuccess ,
2253+ "group_id" : group .ID ,
2254+ "is_success" : isSuccess ,
2255+ "is_rate_limit" : isRateLimit ,
2256+ "status_code" : statusCode ,
22442257 }).Debug ("Recorded dynamic weight metrics for standard group" )
22452258 }
22462259
@@ -2264,15 +2277,17 @@ func (ps *ProxyServer) recordDynamicWeightMetrics(c *gin.Context, originalGroup,
22642277 if isSuccess {
22652278 ps .dynamicWeightManager .RecordModelRedirectSuccess (group .ID , originalModelStr , targetModel )
22662279 } else {
2267- ps .dynamicWeightManager .RecordModelRedirectFailure (group .ID , originalModelStr , targetModel )
2280+ ps .dynamicWeightManager .RecordModelRedirectFailure (group .ID , originalModelStr , targetModel , isRateLimit )
22682281 }
22692282
22702283 logrus .WithFields (logrus.Fields {
2271- "group_id" : group .ID ,
2272- "source_model" : originalModelStr ,
2273- "target_model" : targetModel ,
2274- "target_index" : targetIdxInt ,
2275- "is_success" : isSuccess ,
2284+ "group_id" : group .ID ,
2285+ "source_model" : originalModelStr ,
2286+ "target_model" : targetModel ,
2287+ "target_index" : targetIdxInt ,
2288+ "is_success" : isSuccess ,
2289+ "is_rate_limit" : isRateLimit ,
2290+ "status_code" : statusCode ,
22762291 }).Debug ("Recorded dynamic weight metrics for model redirect" )
22772292 }
22782293 }
0 commit comments