| 315 | } |
| 316 | |
| 317 | func WithOpenAIError(openAIError OpenAIError, statusCode int, ops ...NewAPIErrorOptions) *NewAPIError { |
| 318 | code, ok := openAIError.Code.(string) |
| 319 | if !ok { |
| 320 | if openAIError.Code != nil { |
| 321 | code = fmt.Sprintf("%v", openAIError.Code) |
| 322 | } else { |
| 323 | code = "unknown_error" |
| 324 | } |
| 325 | } |
| 326 | if openAIError.Type == "" { |
| 327 | openAIError.Type = "upstream_error" |
| 328 | } |
| 329 | e := &NewAPIError{ |
| 330 | RelayError: openAIError, |
| 331 | errorType: ErrorTypeOpenAIError, |
| 332 | StatusCode: statusCode, |
| 333 | Err: errors.New(openAIError.Message), |
| 334 | errorCode: ErrorCode(code), |
| 335 | } |
| 336 | // OpenRouter |
| 337 | if len(openAIError.Metadata) > 0 { |
| 338 | openAIError.Message = fmt.Sprintf("%s (%s)", openAIError.Message, openAIError.Metadata) |
| 339 | e.Metadata = openAIError.Metadata |
| 340 | e.RelayError = openAIError |
| 341 | e.Err = errors.New(openAIError.Message) |
| 342 | } |
| 343 | for _, op := range ops { |
| 344 | op(e) |
| 345 | } |
| 346 | return e |
| 347 | } |
| 348 | |
| 349 | func WithClaudeError(claudeError ClaudeError, statusCode int, ops ...NewAPIErrorOptions) *NewAPIError { |
| 350 | if claudeError.Type == "" { |