Files

86 lines
2.1 KiB
Go

package constant
import (
"errors"
"strings"
)
// 错误分类常量
const (
ErrorCategoryRateLimit = "rate_limit"
ErrorCategoryAuthError = "auth_error"
ErrorCategoryTimeout = "timeout"
ErrorCategoryUpstreamError = "upstream_error"
ErrorCategoryServerError = "server_error"
ErrorCategoryNetworkError = "network_error"
ErrorCategoryUnknown = "unknown"
)
// ClassifyError 将 RelayError 映射到标准错误分类
func ClassifyError(err error) string {
if err == nil {
return ErrorCategoryUnknown
}
var relayErr *RelayError
if errors.As(err, &relayErr) {
return classifyRelayError(relayErr)
}
return classifyRawError(err)
}
func classifyRelayError(err *RelayError) string {
switch err.StatusCode {
case 429:
return ErrorCategoryRateLimit
case 401, 403:
return ErrorCategoryAuthError
case 504:
return ErrorCategoryTimeout
case 500, 502, 503:
return ErrorCategoryServerError
case 400, 422:
return ErrorCategoryUpstreamError
default:
return classifyByType(err.Type)
}
}
func classifyByType(errType string) string {
switch errType {
case "rate_limit_error":
return ErrorCategoryRateLimit
case "auth_error":
return ErrorCategoryAuthError
case "insufficient_quota":
return ErrorCategoryUpstreamError
case "model_gone":
return ErrorCategoryUpstreamError
case "channel_error":
return ErrorCategoryServerError
case "upstream_error":
return ErrorCategoryUpstreamError
case "request_error":
return ErrorCategoryUpstreamError
default:
return ErrorCategoryUnknown
}
}
func classifyRawError(err error) string {
msg := err.Error()
switch {
case strings.Contains(msg, "deadline exceeded"), strings.Contains(msg, "context deadline"):
return ErrorCategoryTimeout
case strings.Contains(msg, "connection refused"), strings.Contains(msg, "connection reset"),
strings.Contains(msg, "DNS"), strings.Contains(msg, "no such host"),
strings.Contains(msg, "TLS handshake"), strings.Contains(msg, "certificate"):
return ErrorCategoryNetworkError
case strings.Contains(msg, "timeout"), strings.Contains(msg, "i/o timeout"):
return ErrorCategoryTimeout
default:
return ErrorCategoryUnknown
}
}