Ë
    uPêj¡<  ã                   ó  — d dl mZ d dlmZ d dlmZmZ d dlZd dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z"  G d„ de«      Z# G d„ d«      Z$y)é    )Ú	Coroutine)Údatetime)ÚFinalÚProtocolN)Úverbose_proxy_logger)ÚLogging)ÚGLOBAL_LOGGING_WORKER)Ú&PassThroughEndpointLoggingResultValues)ÚProxyBaseLLMRequestProcessing)Úsplit_complete_sse_frames)ÚEndpointType)Ú!StandardPassThroughResponseObjecté   )Ú"AnthropicPassthroughLoggingHandler)ÚGeminiPassthroughLoggingHandler)ÚOpenAIPassthroughLoggingHandler)ÚVertexPassthroughLoggingHandler)ÚPassThroughEndpointLoggingc                   óD   — e Zd Zdedededededede	e
   ded	ed
   fd„Zy)ÚRouteStreamingLoggingÚlitellm_logging_objÚpassthrough_success_handler_objÚ	url_routeÚrequest_bodyÚendpoint_typeÚ
start_timeÚ	raw_bytesÚend_timeÚreturn)NNNc                 ó   — y ©N© )	Úselfr   r   r   r   r   r   r   r   s	            ú{/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/pass_through_endpoints/streaming_handler.pyÚ__call__zRouteStreamingLogging.__call__!   s   € ð '*ó    N)Ú__name__Ú
__module__Ú__qualname__ÚLiteLLMLoggingObjr   ÚstrÚdictr   r   ÚlistÚbytesr   r%   r"   r&   r$   r   r       sl   „ ð*ð /ð*ð *Dð	*ð
 ð*ð ð*ð $ð*ð ð*ð ˜‘;ð*ð ð*ð 
Ð#Ñ	$ô*r&   r   c                   ój  — e Zd Zededdfd„«       Ze	 ddej                  dedz  dede	de
d	ed
ededz  fd„«       Ze	 dded	ed
edede	de
dee   de
dedz  fd„«       Zeded	ed
edede	de
dee   de
dedz  deeef   fd„«       Zededz  d
ede	dededz  f
d„«       Zedee   dee   fd„«       Zy)ÚPassThroughStreamingHandlerr   r   Nc                 óf   — | j                   €%| j                  t        j                  «       ¬«       y y )N)Úcompletion_start_time)r2   Ú_update_completion_start_timer   Únow)r   s    r$   Ú_stamp_first_chunk_if_neededz8PassThroughStreamingHandler._stamp_first_chunk_if_needed0   s.   € à×4Ñ4Ð<Ø×=Ñ=ÔT\×T`ÑT`ÓTbÐ=Õcð =r&   Úresponser   r   r   r   r   Úroute_streaming_loggingc                ó6  K  — |xs t         j                  }g }	d}
t         j                  ||||¬«      }t        t	        t
        dd«      «      xrP t        |«      xrC |t        j                  t        j                  fv xs |t        j                  k(  xr
 d|v xs d|v }	 |sE| j                  «       2 3 d {  –—† }|	j                  |«       t         j                  |«       |­–— Œ5|€J ‚|}d}| j                  «       2 3 d {  –—† }|	j                  |«       t         j                  |«       t        ||z   «      \  }}|sŒCt        j                  |||«      ­–— Œ^7 Œ¦6 n
7 Œ]6 |r|­–— n(# t         $ r}t#        j$                  d|«       ‚ d }~ww xY w|
s}|	rz| j&                  dk  rjd	}
	 t)        j*                   |||||xs i |||	t-        j.                  «       ¬
«      ¬«       y # t         $ r }t#        j$                  d|«       Y d }~y d }~ww xY wy y y # |
s}|	rz| j&                  dk  rjd	}
	 t)        j*                   |||||xs i |||	t-        j.                  «       ¬
«      ¬«       w # t         $ r }t#        j$                  d|«       Y d }~w d }~ww xY ww w w xY w­w)NF)r   r   r   r   Úinclude_cost_in_streaming_usageÚstreamRawPredictÚ
rawPredictr&   zError in chunk_processor: %si�  T)r   r   r   r   r   r   r   r   )Úasync_coroutinez,Error scheduling chunk_processor logging: %s)r0   Ú#_route_streaming_logging_to_handlerÚ!_extract_model_for_cost_injectionÚboolÚgetattrÚlitellmr   Ú	ANTHROPICÚOPENAIÚ	VERTEX_AIÚaiter_bytesÚappendr5   r   r   Ú"_process_chunk_with_cost_injectionÚ	Exceptionr   ÚerrorÚstatus_coder	   Úensure_initialized_and_enqueuer   r4   )r6   r   r   r   r   r   r   r7   Ú resolved_route_streaming_loggingr   Úlogging_scheduledÚ
model_nameÚcost_injection_activeÚchunkÚresolved_model_nameÚpendingÚcomplete_framesÚes                     r$   Úchunk_processorz+PassThroughStreamingHandler.chunk_processor5   sÝ  è ø€ ð $ÒfÔ'B×'fÑ'fð 	)ð )+ˆ	Ø!ÐÜ7×YÑYØ%ØØ'Ø 3ð	 Zó 
ˆ
ô ”œÐ"CÀUÓKÓLò Ü�ZÓ òð ¤,×"8Ñ"8¼,×:MÑ:MÐ!NÐNò à!¤\×%;Ñ%;Ñ;ò WØ+¨yÐ8ÒU¸LÈIÐ<Uð 	ð5	bÙ(à#+×#7Ñ#7Ó#9÷  ð  ˜%Ø×$Ñ$ UÔ+Ü/×LÑLÐM`ÔaØ”Kð
 "Ð-Ð-Ð-Ø2<Ð#Ø�Ø#+×#7Ñ#7Ó#9÷ 	ð 	˜%Ø×$Ñ$ UÔ+Ü/×LÑLÐM`ÔaÜ/HØ %™ó0Ñ,�O Wò 'Ü;×^Ñ^Ø+Ð-@ÐBUóô ð% øÑ#9ð	øÐ#9ñ Ø!“MùÜò 	Ü ×&Ñ&Ð'EÀqÔIØûð	úñ %©°x×7KÑ7KÈcÒ7QØ$(Ð!ðbÜ)×HÑHÙ(HØ0CØ<[Ø&/Ø)5Ò);¸Ø*7Ø'1Ø&/Ü%-§\¡\£^ô	)öøô !ò bÜ(×.Ñ.Ð/]Ð_`×aÑaûðbúð 8R¨Ð$øÑ$©°x×7KÑ7KÈcÒ7QØ$(Ð!ðbÜ)×HÑHÙ(HØ0CØ<[Ø&/Ø)5Ò);¸Ø*7Ø'1Ø&/Ü%-§\¡\£^ô	)öøô !ò bÜ(×.Ñ.Ð/]Ð_`×aÑaûðbúð 8R¨Ð$üsß   ‚BJÂ!E- Â3E Â7EÂ8E Â;AE- Ä E$ÄE"ÄE$Ä:E- ÅE- ÅE Å E- Å"E$Å$E- Å,H Å-	FÅ6FÆFÆH ÆJÆ+:G& Ç%JÇ&	HÇ/H
ÈJÈ
HÈJÈJÈ,:I'É&JÉ'	JÉ0JÊJÊJÊJÊJr   r   Úmodelc	              ƒ   ó"  K  — 	 t         j                  | ||||||||¬«	      \  }	}
 | j                  d|	||| j                  j	                  d«      du ddœ|
¤Žƒ d{  –—†  y7 Œ# t
        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)z³
        Route the logging for the collected chunks to the appropriate handler

        Supported endpoint types:
        - Anthropic
        - Vertex AI
        - OpenAI
        )	r   r   r   r   r   r   r   r   rV   Ú	cache_hitT)Úresultr   r   rX   Úprefer_async_handlersNz0Error in _route_streaming_logging_to_handler: %sr"   )r0   Ú!_build_passthrough_logging_resultÚdispatch_success_handlersÚmodel_call_detailsÚgetrH   r   rI   )r   r   r   r   r   r   r   r   rV   Ú standard_logging_response_objectÚkwargsrT   s               r$   r=   z?PassThroughStreamingHandler._route_streaming_logging_to_handler’   sÃ   è ø€ ð(	^ô ,×MÑMØ$7Ø0OØ#Ø)Ø+Ø%Ø#Ø!Øð Nó 
ñØ0Øð  @Ð%×?Ñ?ð Ø7Ø%Ø!Ø-×@Ñ@×DÑDÀ[ÓQÐUYÐYØ&*ñð ñ÷ ò ùô ò 	^Ü ×&Ñ&Ð'YÐ[\×]Ñ]ûð	^üsA   ‚B„AA# ÁA!ÁA# Á BÁ!A# Á#	BÁ,BÂBÂBÂBc	                 ó8  — t         j                  |«      }	d}
i }|t        j                  k(  r(t	        j
                  | ||||||	|¬«      }|d   }
|d   }n²|t        j                  k(  r)t        j                  | ||||||	||¬«	      }|d   }
|d   }nv|t        j                  k(  r)t        j                  | ||||||	||¬«	      }|d   }
|d   }n:|t        j                  k(  r't        j                  | ||||||	|¬«      }|d   }
|d   }|
€t        d|	› �¬«      }
|
|fS )as  
        Synchronous, CPU-bound reconstruction of the standard logging payload
        from collected raw SSE bytes. Extracted from
        _route_streaming_logging_to_handler so the per-endpoint dispatch can
        be unit-tested in isolation. Still invoked synchronously on the event
        loop; an off-loop dispatch is a future change, not part of this PR.
        N)r   r   r   r   r   r   Ú
all_chunksr   rY   r`   )	r   r   r   r   r   r   rb   r   rV   z8cannot parse chunks to standard response object. Chunks=)r6   )r0   Ú_convert_raw_bytes_to_str_linesr   rB   r   Ú*_handle_logging_anthropic_collected_chunksrD   r   Ú'_handle_logging_vertex_collected_chunksÚGEMINIr   Ú'_handle_logging_gemini_collected_chunksrC   r   Ú'_handle_logging_openai_collected_chunksr   )r   r   r   r   r   r   r   r   rV   rb   r_   r`   Ú,anthropic_passthrough_logging_handler_resultÚ)vertex_passthrough_logging_handler_resultÚ)gemini_passthrough_logging_handler_resultÚ)openai_passthrough_logging_handler_results                   r$   r[   z=PassThroughStreamingHandler._build_passthrough_logging_resultÄ   sŸ  € ô& 8×WÑWÐXaÓbˆ
ØZ^Ð(ØˆØœL×2Ñ2Ò2ä2×]Ñ]Ø(;Ø4SØ'Ø!-Ø"/Ø)Ø)Ø%ô	ð 9ð 0\Ð\dÑ/eÐ,ØAÀ(ÑK‰FØœl×4Ñ4Ò4ä/×WÑWØ(;Ø4SØ'Ø!-Ø"/Ø)Ø)Ø%Øô
ð 6ð 0YÐYaÑ/bÐ,Ø>¸xÑH‰FØœl×1Ñ1Ò1ä/×WÑWØ(;Ø4SØ'Ø!-Ø"/Ø)Ø)Ø%Øô
ð 6ð :¸(ÑCð -ð :¸(ÑCñ ð œl×1Ñ1Ò1ä/×WÑWØ(;Ø4SØ'Ø!-Ø"/Ø)Ø)Ø%ô	ð 6ð 0YÐYaÑ/bÐ,Ø>¸xÑHˆFà+Ð3Ü/PØSÐT^ÐS_Ð`ô0Ð,ð 0°Ð7Ð7r&   c                 óê   — | r| j                  d«      }|r|S t        |d«      r|j                  j                  d«      }|r|S |t        j                  k(  rt        j                  |«      }|r|dk7  r|S y)zM
        Extract model name for cost injection from various sources.
        rV   r]   ÚunknownN)r^   Úhasattrr]   r   rD   r   Úextract_model_from_url)r   r   r   r   rV   s        r$   r>   z=PassThroughStreamingHandler._extract_model_for_cost_injection#  s}   € ñ Ø ×$Ñ$ WÓ-ˆEÙØ�ô Ð&Ð(<Ô=Ø'×:Ñ:×>Ñ>¸wÓGˆEÙØ�ð œL×2Ñ2Ò2Ü3×JÑJÈ9ÓUˆEÙ˜ )Ò+Ø�àr&   c                 óÎ   — dj                  | «      j                  dd¬«      }|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|S c c}w )a  
        Converts a list of raw bytes into a list of string lines, similar to aiter_lines()

        Args:
            raw_bytes: List of bytes chunks from aiter.bytes()

        Returns:
            List of string lines, with each line being a complete data: {} chunk
        r&   zutf-8Úreplace)Úerrorsú
)ÚjoinÚdecodeÚsplitÚstrip)r   Úcombined_strÚlineÚliness       r$   rc   z;PassThroughStreamingHandler._convert_raw_bytes_to_str_linesA  s[   € ð "Ÿh™h yÓ1×8Ñ8¸ÈÐ8ÓSˆð 2>×1CÑ1CÀDÓ1IÖZ¨ÈTÏZÉZÍ\˜Ÿ
™
�ÐZˆÐZàˆùò [s   ¶A"ÁA"r!   )r'   r(   r)   Ústaticmethodr*   r5   ÚhttpxÚResponser,   r   r   r   r+   r   rU   r-   r.   r=   Útupler
   r[   r>   rc   r"   r&   r$   r0   r0   /   s=  „ ØðdÐ:Kð dÐPTò dó ðdð ð AEñZbØ—.‘.ðZbà˜T‘kðZbð /ðZbð $ð	Zbð
 ðZbð *DðZbð ðZbð "7¸Ñ!=òZbó ðZbðx ð !ñ/^Ø.ð/^à)Cð/^ð ð/^ð ð	/^ð
 $ð/^ð ð/^ð ˜‘;ð/^ð ð/^ð �T‰zò/^ó ð/^ðb ð\8Ø.ð\8à)Cð\8ð ð\8ð ð	\8ð
 $ð\8ð ð\8ð ˜‘;ð\8ð ð\8ð �T‰zð\8ð 
Ð5°tÐ;Ñ	<ò\8ó ð\8ð| ðØ˜T‘kðàðð $ðð /ð	ð
 
ˆt‰òó ðð: ð°4¸±;ð À4ÈÁ9ò ó ñr&   r0   )%Úcollections.abcr   r   Útypingr   r   r}   rA   Úlitellm._loggingr   Ú*litellm.litellm_core_utils.litellm_loggingr   r*   Ú)litellm.litellm_core_utils.logging_workerr	   Úlitellm.proxy._typesr
   Ú'litellm.proxy.common_request_processingr   Ú(litellm.proxy.common_utils.sse_keepaliver   Ú:litellm.types.passthrough_endpoints.pass_through_endpointsr   Úlitellm.types.utilsr   Ú;llm_provider_handlers.anthropic_passthrough_logging_handlerr   Ú8llm_provider_handlers.gemini_passthrough_logging_handlerr   Ú8llm_provider_handlers.openai_passthrough_logging_handlerr   Ú8llm_provider_handlers.vertex_passthrough_logging_handlerr   Úsuccess_handlerr   r   r0   r"   r&   r$   ú<module>r�      s]   ðÝ %Ý ß "ã ã Ý 1Ý SÝ KÝ GÝ QÝ NÝ SÝ Aõõõõõ 8ô*˜Hô *÷eò er&   