// Package apierror 提供 API 错误类型定义,供 api 和 retry 包共享. // // 这避免了 api 包和 retry 包之间的循环依赖. package apierror import "time" // ErrorCategory 是 API 错误的语义分类枚举. type ErrorCategory int const ( ErrUnknown ErrorCategory = iota ErrAborted ErrTimeout ErrRateLimit ErrOverloaded ErrPromptTooLong ErrMediaTooLarge ErrRequestTooLarge ErrInvalidRequest ErrAuthentication ErrModelNotFound ErrBilling ErrServerError ErrConnection ErrSSL ErrToolMismatch ErrUnexpectedTool ErrDuplicateToolID ErrInvalidModel ErrContentPolicy ) // String 返回分类的分析用字符串(Datadog tag 等). func (c ErrorCategory) String() string { switch c { case ErrUnknown: return "unknown" case ErrAborted: return "aborted" case ErrTimeout: return "api_timeout" case ErrRateLimit: return "rate_limit" case ErrOverloaded: return "server_overload" case ErrPromptTooLong: return "prompt_too_long" case ErrMediaTooLarge: return "media_too_large" case ErrRequestTooLarge: return "request_too_large" case ErrInvalidRequest: return "invalid_request" case ErrAuthentication: return "auth_error" case ErrModelNotFound: return "model_not_found" case ErrBilling: return "billing_error" case ErrServerError: return "server_error" case ErrConnection: return "connection_error" case ErrSSL: return "ssl_cert_error" case ErrToolMismatch: return "tool_use_mismatch" case ErrUnexpectedTool: return "unexpected_tool_result" case ErrDuplicateToolID: return "duplicate_tool_use_id" case ErrInvalidModel: return "invalid_model" case ErrContentPolicy: return "content_policy" default: return "unknown" } } // IsRetryableByDefault 返回该分类是否默认可重试. func (c ErrorCategory) IsRetryableByDefault() bool { switch c { case ErrTimeout, ErrOverloaded, ErrServerError, ErrConnection: return true default: return false } } // RetryInfo 封装重试建议,由 ErrorClassifier 在分类时一次性填充. type RetryInfo struct { Retryable bool After time.Duration MaxRetries int ServerSaid *bool }