Ë
    tPêjA   ã                   óŠ  — U d dl Z d dlZd dlZd dlmZmZmZ d dlmZ d dl	Z	d dl
mZ eZeed<   dZeed<   ej                  «       Zeed<   d	Zeed
<    ed„ eD «       «      Zeed<   dZeed<   dZeed<   deez  dz  dedz  fd„Zdedeez  dz  defd„Zefdeedf   deez  dz  dedeedf   fd„Zdeedf   dededeedf   fd„Zdedz  defd„Zdedeeef   fd„Z deedf   deez  dz  deeef   deedf   fd„Z!deedf   dedeedf   fd „Z"d!eeee#f      d"eez  dz  dedz  fd#„Z$d$eee#f   deez  dz  fd%„Z%y)&é    N)ÚAsyncGeneratorÚIterableÚMapping)ÚFinal)ÚSTREAM_SSE_KEEPALIVE_PING_CHUNKÚANTHROPIC_PING_SSE_CHUNKz: ping

ÚSSE_COMMENT_PINGÚSSE_COMMENT_PING_BYTES)s   

ó   

s   Ú_SSE_FRAME_DELIMITERSc              #   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)Úlen)Ú.0Ú	delimiters     úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/common_utils/sse_keepalive.pyú	<genexpr>r      s   è ø€ Ò$[¸	¤S¨§^Ñ$[ùó   ‚Ú_SSE_DELIMITER_LOOKBACKr   Ú_STREAM_START_TAILztext/event-streamÚ_SSE_MEDIA_TYPEÚping_interval_secondsÚreturnc                 ó„   — | €y 	 t        | «      }t        j                  |«      r|dk  ry |S # t        t        f$ r Y y w xY w)Nr   )ÚfloatÚ	TypeErrorÚ
ValueErrorÚmathÚisfinite)r   Úintervals     r   Úcoerce_keepalive_intervalr!      sP   € ØÐ$ØðÜÐ 5Ó6ˆô �=‰=˜Ô" h°!¢mØØ€Oøô	 ”zÐ"ò Ùðús   …- ­?¾?Úelapsed_secondsc                 ó.   — t        |«      }|duxr | |k\  S )a>  Whether a keepalive ping has already gone out, which flushes the response headers.

    A caller that discovers a failure after that point cannot raise its way to the client, since
    the status line is already on the wire. With pings disabled nothing flushes early, so a raise
    still carries its real status.
    N)r!   )r"   r   r    s      r   Úkeepalive_ping_has_firedr$   "   s$   € ô 0Ð0EÓF€HØ˜4ÐÒ? O°xÑ$?Ð?ó    ÚstreamÚ
ping_chunkc                 ó<   — t        |«      }|€| S t        | ||¬«      S )a—  Fill idle gaps in an SSE stream, including the one before its first chunk.

    ``ping_chunk`` is what gets written into those gaps. It defaults to Anthropic's
    own ``ping`` event because that is the protocol the first caller speaks; a
    stream carrying anything else wants ``SSE_COMMENT_PING``, which is a comment
    every conformant SSE client discards rather than a frame it has to understand.
    )r&   r   r'   )r!   Ú_keepalive_ping_stream)r&   r   r'   r    s       r   Ú$wrap_sse_stream_with_keepalive_pingsr*   -   s*   € ô 0Ð0EÓF€HØÐØˆÜ!¨ÀxÐ\fÔgÐgr%   c           	     ó”  K  — t        j                  | j                  «       «      }	 	 t        j                  |h|¬«      ƒ d {  –—†  |j	                  «       s|­–— Œ7	 |j                  «       ­–— t        j                  | j                  «       «      }Œn7 ŒR# t        $ r‘ Y |j                  «        t        j                  d¬«      5  t        j                  t        «      5  |ƒ d {  –—†7   d d d «       n# 1 sw Y   nxY w| j                  «       ƒ d {  –—†7   d d d «       y # 1 sw Y   y xY ww xY w# |j                  «        t        j                  d¬«      5  t        j                  t        «      5  |ƒ d {  –—†7   d d d «       n# 1 sw Y   nxY w| j                  «       ƒ d {  –—†7   d d d «       w # 1 sw Y   w xY wxY w­w©NT)Útimeout)Úshield)ÚasyncioÚensure_futureÚ	__anext__ÚwaitÚdoneÚresultÚStopAsyncIterationÚcancelÚanyioÚCancelScopeÚ
contextlibÚsuppressÚBaseExceptionÚaclose)r&   r   r'   Úpendings       r   r)   r)   ?   sm  è ø€ ô
 ×#Ñ#Ø×ÑÓó€Gð"ØÜ—,‘, ˜yÐ2GÔH×HÐHØ—<‘<”>Ø Ó ØðØ—n‘nÓ&Ó&ô ×+Ñ+¨F×,<Ñ,<Ó,>Ó?ˆGð ØHùô &ò Øð 	�‰ÔÜ×Ñ dÔ+ñ 	"Ü×$Ñ$¤]Ó3ñ Ø—‘÷÷ ñ úà—-‘-“/×!Ñ!÷	"÷ 	"ñ 	"úðûð 	�‰ÔÜ×Ñ dÔ+ñ 	"Ü×$Ñ$¤]Ó3ñ Ø—‘÷÷ ñ úà—-‘-“/×!Ñ!÷	"÷ 	"ñ 	"ÿsÜ   ‚$G§D5 ÁBÁD5 ÁB Á2%D5 Â	D2Â!D5 Â"&GÃD%Ã"C7Ã(C+Ã)C7Ã.	D%Ã7D 	Ã<D%ÄDÄD%Ä	GÄ%D.Ä*GÄ1D2Ä2D5 Ä5'GÅF9Å6F	Å<E?Å=F	Æ	F9ÆFÆF9Æ*F-
Æ+F9Æ0	GÆ9GÆ>GÇGÚcontent_typec                 ó~   — | d uxr8 | j                  dd«      d   j                  «       j                  «       t        k(  S )Nú;é   r   )ÚsplitÚstripÚlowerr   )r>   s    r   Úis_sse_content_typerE   Z   s<   € Ø˜tÐ#Òh¨×(:Ñ(:¸3ÀÓ(BÀ1Ñ(E×(KÑ(KÓ(M×(SÑ(SÓ(UÔYhÑ(hÐhr%   r=   c                 ó^   ‡ — t        ˆ fd„t        D «       d¬«      }|dk(  rd‰ fS ‰ d| ‰ |d fS )zGSplit buffered SSE bytes into ``(complete_frames, unterminated_tail)``.c              3   ób   •K  — | ]&  }|‰v sŒ‰j                  |«      t        |«      z   –— Œ( y ­wr   )Úrfindr   )r   r   r=   s     €r   r   z,split_complete_sse_frames.<locals>.<genexpr>a   s,   øè ø€ Òr°yÐ]fÐjqÒ]qˆ�‰�yÓ	!¤C¨	£NÕ	2Ñrùs   ƒ	/�"/r   )Údefaultr%   N)Úmaxr   )r=   Úboundary_ends   ` r   Úsplit_complete_sse_framesrL   ^   sF   ø€ äÛrÔDYÔrØô€Lð �qÒØ�Gˆ|ÐØ�=�LÐ! 7¨<¨=Ð#9Ð9Ð9r%   Úupstream_headersc                 ón   — t        |«      }|�t        |j                  d«      «      s| S t        | |¬«      S )aÚ  Fill upstream silence on a byte-relaying passthrough stream with SSE comments.

    Passthrough routes relay upstream bytes verbatim, so a model that thinks for
    longer than an intermediary's idle read timeout has its connection dropped
    before the first token. Only streams the upstream itself declares as
    ``text/event-stream`` are wrapped: a comment spliced into a binary transport
    (AWS event streams on ``/bedrock``, protobuf, NDJSON) would corrupt it.
    zcontent-type)r&   r   )r!   rE   ÚgetÚ_keepalive_ping_byte_stream)r&   r   rM   r    s       r   Ú/wrap_passthrough_sse_bytes_with_keepalive_pingsrQ   i   s;   € ô 0Ð0EÓF€HØÐÔ2Ð3C×3GÑ3GÈÓ3WÔXØˆÜ&¨fÈHÔUÐUr%   c           	     óô  K  — t        j                  | j                  «       «      }t        }	 	 t        j                  |f|¬«      ƒ d {  –—†  |j                  «       s|j                  t        «      r	t        ­–— ŒP	 |j                  «       }|r||z   t$         d  }|­–— t        j                  | j                  «       «      }Œ˜7 Œ|# t        $ r‘ Y |j                  «        t        j                  d¬«      5  t        j                  t         «      5  |ƒ d {  –—†7   d d d «       n# 1 sw Y   nxY w| j#                  «       ƒ d {  –—†7   d d d «       y # 1 sw Y   y xY ww xY w# |j                  «        t        j                  d¬«      5  t        j                  t         «      5  |ƒ d {  –—†7   d d d «       n# 1 sw Y   nxY w| j#                  «       ƒ d {  –—†7   d d d «       w # 1 sw Y   w xY wxY w­wr,   )r/   r0   r1   r   r2   r3   Úendswithr   r
   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   )r&   r   r=   Úrecent_tailÚchunks        r   rP   rP   |   s¢  è ø€ ô ×#Ñ#Ø×ÑÓó€Gô %€Kð"ØÜ—,‘, ˜zÐ3HÔI×IÐIØ—<‘<”>ð ×'Ñ'Ô(=Ô>Ü0Ó0ØðØ&Ÿ~™~Ó/�ñ Ø*¨UÑ2Ô5LÐ4LÐ4MÐN�Ø‹KÜ×+Ñ+¨F×,<Ñ,<Ó,>Ó?ˆGð! ØIùô &ò Øð 	�‰ÔÜ×Ñ dÔ+ñ 	"Ü×$Ñ$¤]Ó3ñ Ø—‘÷÷ ñ úà—-‘-“/×!Ñ!÷	"÷ 	"ñ 	"úðûð 	�‰ÔÜ×Ñ dÔ+ñ 	"Ü×$Ñ$¤]Ó3ñ Ø—‘÷÷ ñ úà—-‘-“/×!Ñ!÷	"÷ 	"ñ 	"ÿsÜ   ‚*G8­E% Á	CÁ
3E% Á>C Â9E% Ã	E"ÃE% Ã&G8Ã8EÄD'ÄDÄD'Ä	EÄ'D0	Ä,EÅE	ÅEÅ	G8ÅEÅG8Å!E"Å"E% Å%'G5ÆG)Æ&F;	Æ,F/Æ-F;	Æ2	G)Æ;GÇ G)ÇG
ÇG)Ç 	G5Ç)G2Ç.G5Ç5G8ÚdeploymentsÚglobal_intervalc                 ó”   — t        d„ | D «       «      }t        |«      dk(  rt        t        |«      «      nd}t	        |€|«      S |«      S )a,  The keepalive interval to use before the upstream has answered at all.

    No deployment has served the request yet, so a per-deployment
    ``keepalive_seconds`` is only trusted when every candidate under the requested
    model carries the same one, which is how the mid-stream engine treats its own
    model_name fallback. Otherwise the operator's global default applies.

    An explicit ``0`` survives as a disable, since coercion rejects it: that keeps
    an operator's documented hard disable working on this path too, rather than
    letting the global switch a deployment back on behind their back.

    A client-supplied value is deliberately not consulted. Opening the response
    early is an operator decision, and a request must not be able to enable it for
    a deployment that never did.
    c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   )Ú_keepalive_param)r   Ú
deployments     r   r   z2resolve_ttft_keepalive_interval.<locals>.<genexpr>µ   s   è ø€ Ò!]À:Ô"2°:×">Ñ!]ùr   rA   N)Ú	frozensetr   ÚnextÚiterr!   )rV   rW   Ú
configuredÚagreeds       r   Úresolve_ttft_keepalive_intervalra   ¢   sH   € ô& "Ñ!]ÐQ\Ô!]Ó]€JÜ.1°*«oÀÒ.B”Dœ˜jÓ)Ô*È€FÜ$¸¸ _ÓSÐSÈFÓSÐSr%   r[   c                 ó¦   — | j                  d«      }t        |t        «      sy |j                  d«      }t        |t        t        t
        f«      r|S d S )NÚlitellm_paramsÚkeepalive_seconds)rO   Ú
isinstancer   Úintr   Ústr)r[   ÚparamsÚvalues      r   rZ   rZ   º   sH   € Ø—N‘NÐ#3Ó4€FÜ�fœgÔ&ØØ—:‘:Ð1Ó2€EÜ˜u¤s¬E´3Ð&7Ô8ˆ5ÐB¸dÐBr%   )&r/   r9   r   Úcollections.abcr   r   r   Útypingr   r7   Úlitellm.constantsr   r   Ú__annotations__r	   Úencoder
   r   rJ   r   r   r   r   rg   r!   Úboolr$   r*   r)   rE   ÚbytesÚtuplerL   rQ   rP   Úobjectra   rZ   © r%   r   ú<module>rt      st  ðÜ Û Û ß =Ñ =Ý ã å =à"AÐ ˜%Ó AØ&Ð �%Ó &Ø 0× 7Ñ 7Ó 9Ð ˜Ó 9ð  ?Ð �uÓ >Ù!$Ñ$[ÐEZÔ$[Ó![Ð ˜Ó [Ø#Ð �EÓ #Ø,€�Ó ,ð	°U¸S±[À4Ñ5Gð 	ÈEÐTXÉLó 	ð@¨eð @ÈEÐTWÉKÐZ^ÑL^ð @Ðcgó @ð /ñhØ˜3 ˜9Ñ%ðhà  3™;¨Ñ-ðhð ðhð �C˜�IÑó	hð$"Ø˜3 ˜9Ñ%ð"à ð"ð ð"ð �C˜�IÑó	"ð6i c¨D¡jð i°Tó ið: uð :°°u¸e°|Ñ1Dó :ðVØ˜5 $˜;Ñ'ðVà  3™;¨Ñ-ðVð ˜c 3˜hÑ'ðVð �E˜4�KÑ ó	Vð&#"Ø˜5 $˜;Ñ'ð#"à ð#"ð �E˜4�KÑ ó#"ðLTØ˜' # v +Ñ.Ñ/ðTà˜S‘[ 4Ñ'ðTð ˆT�\óTð0C ¨¨f¨Ñ!5ð C¸%À#¹+ÈÑ:Lô Cr%   