({
error,
model,
messageCount,
messageTokens,
durationMs,
durationMsIncludingRetries,
attempt,
requestId,
clientRequestId,
didFallBackToNonStreaming,
promptCategory,
headers,
queryTracking,
querySource,
llmSpan,
fastMode,
previousRequestId,
}: {
error: unknown
model: string
messageCount: number
messageTokens?: number
durationMs: number
durationMsIncludingRetries: number
attempt: number
requestId?: string | null
/** Client-generated ID sent as x-client-request-id header (survives timeouts) */
clientRequestId?: string
didFallBackToNonStreaming?: boolean
promptCategory?: string
headers?: globalThis.Headers
queryTracking?: QueryChainTracking
querySource?: string
/** The span from startLLMRequestSpan - pass this to correctly match responses to requests */
llmSpan?: Span
fastMode?: boolean
previousRequestId?: string | null
})
| 233 | } |
| 234 | |
| 235 | export function logAPIError({ |
| 236 | error, |
| 237 | model, |
| 238 | messageCount, |
| 239 | messageTokens, |
| 240 | durationMs, |
| 241 | durationMsIncludingRetries, |
| 242 | attempt, |
| 243 | requestId, |
| 244 | clientRequestId, |
| 245 | didFallBackToNonStreaming, |
| 246 | promptCategory, |
| 247 | headers, |
| 248 | queryTracking, |
| 249 | querySource, |
| 250 | llmSpan, |
| 251 | fastMode, |
| 252 | previousRequestId, |
| 253 | }: { |
| 254 | error: unknown |
| 255 | model: string |
| 256 | messageCount: number |
| 257 | messageTokens?: number |
| 258 | durationMs: number |
| 259 | durationMsIncludingRetries: number |
| 260 | attempt: number |
| 261 | requestId?: string | null |
| 262 | /** Client-generated ID sent as x-client-request-id header (survives timeouts) */ |
| 263 | clientRequestId?: string |
| 264 | didFallBackToNonStreaming?: boolean |
| 265 | promptCategory?: string |
| 266 | headers?: globalThis.Headers |
| 267 | queryTracking?: QueryChainTracking |
| 268 | querySource?: string |
| 269 | /** The span from startLLMRequestSpan - pass this to correctly match responses to requests */ |
| 270 | llmSpan?: Span |
| 271 | fastMode?: boolean |
| 272 | previousRequestId?: string | null |
| 273 | }): void { |
| 274 | const gateway = detectGateway({ |
| 275 | headers: |
| 276 | error instanceof APIError && error.headers ? error.headers : headers, |
| 277 | baseUrl: process.env.ANTHROPIC_BASE_URL, |
| 278 | }) |
| 279 | |
| 280 | const errStr = getErrorMessage(error) |
| 281 | const status = error instanceof APIError ? String(error.status) : undefined |
| 282 | const errorType = classifyAPIError(error) |
| 283 | |
| 284 | // Log detailed connection error info to debug logs (visible via --debug) |
| 285 | const connectionDetails = extractConnectionErrorDetails(error) |
| 286 | if (connectionDetails) { |
| 287 | const sslLabel = connectionDetails.isSSLError ? ' (SSL error)' : '' |
| 288 | logForDebugging( |
| 289 | `Connection error details: code=${connectionDetails.code}${sslLabel}, message=${connectionDetails.message}`, |
| 290 | { level: 'error' }, |
| 291 | ) |
| 292 | } |
no test coverage detected