Ë
    uPêj  ã                   ó`   — d Z ddlZddlZddlmZ ddlZddlmZ ddlm	Z	m
Z
mZ  G d„ d«      Zy)zj
SSE Stream Iterator for LangGraph.

Handles Server-Sent Events (SSE) streaming responses from LangGraph.
é    N)ÚFinal)Úverbose_logger)ÚDeltaÚModelResponseStreamÚStreamingChoicesc                   óÀ   — e Zd ZdZdej
                  defd„Zd„ Zd„ Z	dede
d	z  fd
„Zde
d	z  fd„Zde
d	z  fd„Zde
d	z  fd„Zdede
fd„Zde
fd„Zde
fd„Zde
fd„Zy	)ÚLangGraphSSEStreamIteratora  
    Iterator for LangGraph SSE streaming responses.
    Supports both sync and async iteration.

    LangGraph stream format with stream_mode="messages-tuple":
    Each SSE event is a tuple: (event_type, data)
    Common event types: "messages", "metadata"
    ÚresponseÚmodelc                 óJ   — || _         || _        d| _        d | _        d | _        y )NF)r
   r   ÚfinishedÚline_iteratorÚasync_line_iterator)Úselfr
   r   s      úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/langgraph/chat/sse_iterator.pyÚ__init__z#LangGraphSSEStreamIterator.__init__   s'   € Ø ˆŒØˆŒ
ØˆŒØ!ˆÔØ#'ˆÕ ó    c                 óD   — | j                   j                  «       | _        | S )zInitialize sync iteration.)r
   Ú
iter_linesr   ©r   s    r   Ú__iter__z#LangGraphSSEStreamIterator.__iter__"   s   € à!Ÿ]™]×5Ñ5Ó7ˆÔØˆr   c                 óD   — | j                   j                  «       | _        | S )zInitialize async iteration.)r
   Úaiter_linesr   r   s    r   Ú	__aiter__z$LangGraphSSEStreamIterator.__aiter__'   s   € à#'§=¡=×#<Ñ#<Ó#>ˆÔ Øˆr   ÚlineÚreturnNc                 ó*  — |j                  «       }|sy|j                  d«      r=|dd j                  «       }|sy	 t        j                  |«      }| j	                  |«      S y# t        j
                  $ r t        j                  d|dd «       Y yw xY w)zÅ
        Parse a single SSE line and return a ModelResponse chunk if applicable.

        LangGraph SSE format can vary:
        - data: [...] (tuple format)
        - event: ...
data: ...
        Nzdata:é   zSkipping non-JSON SSE line: %séd   )ÚstripÚ
startswithÚjsonÚloadsÚ_process_dataÚJSONDecodeErrorr   Údebug)r   r   Újson_strÚdatas       r   Ú_parse_sse_linez*LangGraphSSEStreamIterator._parse_sse_line,   s•   € ð �z‰z‹|ˆÙØð �?‰?˜7Ô#Ø" 1 2˜hŸn™nÓ.ˆHÙØðÜ"Ÿj™j¨Ó2�Ø×)Ñ)¨$Ó/Ð/ð
 øô	 ×'Ñ'ò Ü×$Ñ$Ð%EÀtÈDÈSÀzÔRÙðús   ¼%A# Á#,BÂBc                 óÜ  — t        |t        «      rEt        |«      dk\  r7|d   }|d   }|dk(  r| j                  |«      S |dk(  r| j	                  |«      S yt        |t
        «      r‡d|v r!| j                  |j                  dd«      «      S d|v r^|j                  dg «      }|rJ|d   }t        |t
        «      r5|j                  d	«      d
k(  r!| j                  |j                  dd«      «      S y)zr
        Process parsed data from SSE stream.

        LangGraph uses tuple format: [event_type, payload]
        é   r   é   ÚmessagesÚmetadataÚcontentÚ éÿÿÿÿÚtypeÚaiN)Ú
isinstanceÚlistÚlenÚ_process_messages_eventÚ_process_metadata_eventÚdictÚ_create_content_chunkÚget)r   r(   Ú
event_typeÚpayloadr-   Úlast_msgs         r   r$   z(LangGraphSSEStreamIterator._process_dataG   sï   € ô �dœDÔ!¤c¨$£i°1¢nØ $ Q¡ˆJØ! !™WˆGà˜ZÒ'Ø×3Ñ3°GÓ<Ð<Ø˜zÒ)à×3Ñ3°GÓ<Ð<ð ô ˜œdÔ#Ø˜DÑ Ø×1Ñ1°$·(±(¸9ÀbÓ2IÓJÐJØ˜tÑ#Ø"&§(¡(¨:°rÓ":�ÙØ&.¨r¡l�HÜ! (¬DÔ1°h·l±lÀ6Ó6JÈdÒ6RØ#×9Ñ9¸(¿,¹,ÀyÐRTÓ:UÓVÐVàr   c                 óÆ  — t        |t        «      rÑ|D ]Ì  }t        |t        «      rkt        |«      dk\  r]|d   }t        |t        «      sŒ7|j	                  dd«      }|j	                  dd«      }|dk(  r|s	|dk(  sŒh|sŒk| j                  |«      c S t        |t        «      sŒ�|j	                  dd«      }|j	                  dd«      }|dv sŒ¸|sŒ»| j                  |«      c S  y	)
zv
        Process a messages event from the stream.

        payload format: [[message_object, metadata], ...]
        r,   r   r2   r0   r/   r3   ÚAIMessageChunk)r3   r@   N)r4   r5   r6   r9   r;   r:   )r   r=   ÚitemÚmsgÚmsg_typer/   s         r   r7   z2LangGraphSSEStreamIterator._process_messages_evente   sÙ   € ô �gœtÔ$Øò C�Ü˜d¤DÔ)¬c°$«i¸1ªnØ˜q™'�CÜ! #¤tÕ,Ø#&§7¡7¨6°2Ó#6˜Ø"%§'¡'¨)°RÓ"8˜ð $ tÒ+±¸8ÐGWÓ;WÒ\cØ#'×#=Ñ#=¸gÓ#FÒFÜ ¤dÕ+Ø#Ÿx™x¨°Ó3�HØ"Ÿh™h y°"Ó5�GØÐ#;Ò;ÂØ#×9Ñ9¸'ÓBÒBðCð  r   c                 óZ   — t        |t        «      rd|v rd| _        | j                  «       S y)zS
        Process a metadata event, which may signal the end of the stream.
        Úrun_idTN)r4   r9   r   Ú_create_final_chunk)r   r=   s     r   r8   z2LangGraphSSEStreamIterator._process_metadata_event~   s/   € ô �gœtÔ$à˜7Ñ"Ø $�”Ø×/Ñ/Ó1Ð1Ør   Útextc                 ó    — t        dt        j                  «       › �d| j                  d¬«      }t	        ddt        |d¬«      ¬«      g|_        |S )	z0Create a ModelResponseStream chunk with content.ú	chatcmpl-r   úchat.completion.chunk©ÚidÚcreatedr   ÚobjectNÚ	assistant)r/   Úrole©Úfinish_reasonÚindexÚdelta©r   ÚuuidÚuuid4r   r   r   Úchoices)r   rG   Úchunks      r   r:   z0LangGraphSSEStreamIterator._create_content_chunk‰   sS   € ä*Øœ4Ÿ:™:›<˜.Ð)ØØ—*‘*Ø*ô	
ˆô Ø"ØÜ D¨{Ô;ôð
ˆŒð ˆr   c                 óš   — t        dt        j                  «       › �d| j                  d¬«      }t	        ddt        «       ¬«      g|_        |S )z<Create a final ModelResponseStream chunk with finish_reason.rI   r   rJ   rK   ÚstoprQ   rU   )r   rY   s     r   rF   z.LangGraphSSEStreamIterator._create_final_chunkœ   sN   € ä*Øœ4Ÿ:™:›<˜.Ð)ØØ—*‘*Ø*ô	
ˆô Ø$ØÜ“gôð
ˆŒð ˆr   c                 ó–  — 	 | j                   €t        ‚| j                   D ]  }| j                  |«      }|€Œ|c S  | j                  sd| _        | j	                  «       S t        ‚# t        $ r ‚ t
        j                  $ r t        ‚t
        j                  $ r t        ‚t        $ r!}t        j                  d|«       t        ‚d}~ww xY w)zASync iteration - parse SSE events and yield ModelResponse chunks.NTú!Error in LangGraph SSE stream: %s)r   ÚStopIterationr)   r   rF   ÚhttpxÚStreamConsumedÚStreamClosedÚ	Exceptionr   Úerror©r   r   ÚresultÚes       r   Ú__next__z#LangGraphSSEStreamIterator.__next__¯   sÈ   € ð	 Ø×!Ñ!Ð)Ü#Ð#à×*Ñ*ò "�Ø×-Ñ-¨dÓ3�ØÑ%Ø!’Mð"ð —=’=Ø $�”Ø×/Ñ/Ó1Ð1äÐøäò 	ØÜ×#Ñ#ò 	 ÜÐÜ×!Ñ!ò 	 ÜÐÜò 	 Ü× Ñ Ð!DÀaÔHÜÐûð	 ús(   ‚4A% ·A% »#A% ÁA% Á%ACÂ'CÃCc              ƒ   ó®  K  — 	 | j                   €t        ‚| j                   2 3 d{  –—† }| j                  |«      }|€Œ|c S 7 Œ6 | j                  sd| _        | j	                  «       S t        ‚# t        $ r ‚ t
        j                  $ r t        ‚t
        j                  $ r t        ‚t        $ r!}t        j                  d|«       t        ‚d}~ww xY w­w)zBAsync iteration - parse SSE events and yield ModelResponse chunks.NTr]   )r   ÚStopAsyncIterationr)   r   rF   r_   r`   ra   rb   r   rc   rd   s       r   Ú	__anext__z$LangGraphSSEStreamIterator.__anext__Ë   sÔ   è ø€ ð	%Ø×'Ñ'Ð/Ü(Ð(à"×6Ñ6÷ "ð "�dØ×-Ñ-¨dÓ3�ØÑ%Ø!’Mð"øÐ6ð —=’=Ø $�”Ø×/Ñ/Ó1Ð1ä$Ð$øä!ò 	ØÜ×#Ñ#ò 	%Ü$Ð$Ü×!Ñ!ò 	%Ü$Ð$Üò 	%Ü× Ñ Ð!DÀaÔHÜ$Ð$ûð	%üsZ   ‚C„A/ ¢A¦A§AªA/ ¿A/ ÁCÁAÁ#A/ Á(CÁ)A/ Á/ACÂ1CÃCÃC)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r_   ÚResponseÚstrr   r   r   r   r)   r$   r7   r8   r:   rF   rg   rj   © r   r   r	   r	      s²   „ ñð( §¡ð (¸ó (òò
ð
 Cð Ð,?À$Ñ,Fó ð6Ð%8¸4Ñ%?ó ð<Ð2EÈÑ2Ló ð2	Ð2EÈÑ2Ló 	ð¨#ð Ð2Eó ð&Ð%8ó ð& Ð-ó  ð8%Ð!4ô %r   r	   )rn   r"   rV   Útypingr   r_   Úlitellm._loggingr   Úlitellm.types.utilsr   r   r   r	   rq   r   r   ú<module>ru      s-   ðñó Û Ý ã å +ß LÑ L÷T%ò T%r   