@@ -466,7 +466,8 @@ async function handleResponse({
466466 logger : Logger
467467 insertMessage : InsertMessageBigqueryFn
468468} ) : Promise < StreamState > {
469- state = await handleStreamChunk ( { data, state, logger } )
469+ const model = 'model' in data ? data . model : undefined
470+ state = await handleStreamChunk ( { data, state, logger, userId, agentId, model } )
470471
471472 if ( 'error' in data || ! data . usage ) {
472473 // Stream not finished
@@ -512,13 +513,41 @@ async function handleStreamChunk({
512513 data,
513514 state,
514515 logger,
516+ userId,
517+ agentId,
518+ model,
515519} : {
516520 data : OpenRouterStreamChatCompletionChunk
517521 state : StreamState
518522 logger : Logger
523+ userId : string
524+ agentId : string
525+ model : string | undefined
519526} ) : Promise < StreamState > {
520527 if ( 'error' in data ) {
521- logger . warn ( { streamChunk : data } , 'Received error from OpenRouter' )
528+ // Log detailed error information for stream errors (e.g., Forbidden from Anthropic)
529+ const errorData = data . error as {
530+ code ?: string | number | null
531+ type ?: string | null
532+ message : string
533+ param ?: unknown
534+ metadata ?: { raw ?: string ; provider_name ?: string }
535+ }
536+ logger . error (
537+ {
538+ userId,
539+ agentId,
540+ model,
541+ errorCode : errorData . code ,
542+ errorType : errorData . type ,
543+ errorMessage : errorData . message ,
544+ errorParam : errorData . param ,
545+ // Provider-specific error details (e.g., from Anthropic via OpenRouter)
546+ providerName : errorData . metadata ?. provider_name ,
547+ providerRawError : errorData . metadata ?. raw ,
548+ } ,
549+ 'Received error chunk in OpenRouter stream' ,
550+ )
522551 return state
523552 }
524553
0 commit comments