Ë
    uPêj#  ã                  óä   — d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	Z	d dl
mZmZ d dlmZ ddlmZ  G d	„ d
e«      Zdd„Zdd„Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ de«      Zy)é    )ÚannotationsN)ÚAsyncIteratorÚIterator)ÚFinal)Ú
BaseConfigÚBaseLLMException)ÚOpenAIChatCompletionChunké   )ÚBaseLLMHTTPHandlerc                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )ÚGenAIHubOrchestrationErrorc                óD   •— t         ‰| �  ||¬«       || _        || _        y )N)Ústatus_codeÚmessage)ÚsuperÚ__init__r   r   )Úselfr   r   Ú	__class__s      €úb/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/sap/chat/handler.pyr   z#GenAIHubOrchestrationError.__init__   s$   ø€ Ü‰Ñ [¸'ÐÔBØ&ˆÔØˆ�ó    )r   Úintr   Ústr)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__)r   s   @r   r   r      s   ø„ ÷ñ r   r   c                 ó<   — t        t        j                  «       «      S ©N)r   Útime© r   r   Ú_now_tsr!      s   € ÜŒt�y‰y‹{ÓÐr   c                ól   — 	 | j                   xs g D ]  }|j                  €Œ y 	 y# t        $ r Y yw xY w)zKOpenAI-shaped chunk is terminal if any choice has a non-None finish_reason.TF)ÚchoicesÚfinish_reasonÚ	Exception)ÚchunkÚchs     r   Ú_is_terminal_chunkr(   #   sJ   € ðØ—-‘-Ò% 2ò 	ˆBØ×ÑÑ+Ùñ	ð
 øô ò ØØðús   ‚' ¢' ¤' §	3²3c                  ó4   — e Zd ZdZedd„«       Zedd„«       Zy)Ú_StreamParserzANormalize orchestration streaming events into OpenAI-like chunks.c                ó  — | j                  d«      xs i }|syt        j                  |j                  d«      xs | j                  d«      xs d|j                  d«      xs d|j                  d«      xs | j                  d«      xs
 t        «       |j                  d	«      xs d
|j                  d«      xs g D �cg c]:  }|j                  dd«      |j                  d«      xs i |j                  d«      dœ‘Œ< c}dœ«      S c c}w )z[
        Accepts orchestration_result shape and maps it to an OpenAI-like *chunk*.
        Úorchestration_resultNÚidÚ
request_idzstream-chunkÚobjectúchat.completion.chunkÚcreatedÚmodelÚunknownr#   Úindexr   Údeltar$   )r4   r5   r$   )r-   r/   r1   r2   r#   )Úgetr	   Úmodel_validater!   )ÚevtÚorcÚcs      r   Ú_from_orchestration_resultz(_StreamParser._from_orchestration_result1   sñ   € ð
 —W‘WÐ3Ó4Ò:¸ˆÙØä(×7Ñ7à—g‘g˜d“mÒN s§w¡w¨|Ó'<ÒNÀØŸ'™' (Ó+ÒFÐ/FØŸ7™7 9Ó-ÒP°·±¸Ó1CÒPÄwÃyØŸ™ Ó)Ò6¨Yð "Ÿg™g iÓ0Ò6°Böð ð	 "#§¡ w°Ó!2Ø!"§¡ w£Ò!5°2Ø)*¯©¨Ó)?óòñó
ð 	
ùòs   Â=?Dc                ó  — d| v sd| v rt        t        j                  | «      «      ‚d| v r'| d   xs i }d|vrd|d<   t        j                  |«      S d| v rt
        j                  | «      S d| v rd| v rt        j                  | «      S y)	aX  
        Accepts:
          - {"final_result": <openai-style CHUNK>}   (IMPORTANT: this is just another chunk, NOT terminal)
          - {"orchestration_result": {...}}          (map to chunk)
          - already-openai-shaped chunks
          - other events (ignored)
        Raises:
          - ValueError for in-stream error objects
        ÚcodeÚerrorÚfinal_resultr/   r0   r,   r#   N)Ú
ValueErrorÚjsonÚdumpsr	   r7   r*   r;   )Ú	event_objÚfrs     r   Úto_openai_chunkz_StreamParser.to_openai_chunkK   s¤   € ð �YÑ '¨YÑ"6ÜœTŸZ™Z¨	Ó2Ó3Ð3ð ˜YÑ&Ø! .Ñ1Ò7°RˆBà˜rÑ!Ø6��8‘Ü,×;Ñ;¸BÓ?Ð?ð " YÑ.Ü ×;Ñ;¸IÓFÐFð ˜	Ñ! h°)Ñ&;Ü,×;Ñ;¸IÓFÐFð r   N)r8   ÚdictÚreturnú OpenAIChatCompletionChunk | None)rC   rF   rG   rH   )r   r   r   Ú__doc__Ústaticmethodr;   rE   r    r   r   r*   r*   .   s+   „ ÙKàò
ó ð
ð2 òó ñr   r*   c                  ó@   — e Zd ZdZ	 	 d	 	 	 	 	 dd„Zd	d„Zd
d„Zdd„Zy)ÚSAPStreamIteratorz¸
    Sync iterator over an httpx streaming response that yields OpenAIChatCompletionChunk.
    Accepts both SSE `data: ...` and raw JSON lines. Closes on terminal chunk or [DONE].
    c                óJ   — || _         || _        || _        || _        d| _        y ©NF)Ú_respÚ_iterÚ_prefixÚ_finalÚ_done©r   ÚresponseÚevent_prefixÚ	final_msgs       r   r   zSAPStreamIterator.__init__w   s'   € ð ˆŒ
ØˆŒ
Ø#ˆŒØˆŒØˆ�
r   c                ó   — | S r   r    ©r   s    r   Ú__iter__zSAPStreamIterator.__iter__ƒ   ó   € Øˆr   c                ó   — | j                   rt        ‚| j                  D ]¦  }|xs dj                  «       }|sŒ|j	                  | j
                  «      }|| j                  k(  r| j                  «        t        ‚	 t        j                  |«      }	 t        j                  |«      }|€Œ‰t        |«      r| j                  «        |c S  | j                  «        t        ‚# t        $ r Y ŒÊw xY w# t        $ r}| j                  «        |‚d }~ww xY w)NÚ )rS   ÚStopIterationrP   ÚstripÚremoveprefixrQ   rR   Ú_safe_closerA   Úloadsr%   r*   rE   r@   r(   ©r   ÚrawÚlineÚpayloadÚobjr&   Úes          r   Ú__next__zSAPStreamIterator.__next__†   s  € Ø�:Š:ÜÐà—:‘:ò 	ˆCØ’I˜2×$Ñ$Ó&ˆDÙØà×'Ñ'¨¯©Ó5ˆGØ˜$Ÿ+™+Ò%Ø× Ñ Ô"Ü#Ð#ðÜ—j‘j Ó)�ðÜ%×5Ñ5°cÓ:�ð
 ˆ}Øô " %Ô(Ø× Ñ Ô"àŠLð9	ð< 	×ÑÔÜÐøô' ò Ùðûô
 ò Ø× Ñ Ô"Ø�ûðús*   Á:CÂC-Ã	C*Ã)C*Ã-	DÃ6DÄDc                ó,   — | j                   ry d| _         y ©NT©rS   rY   s    r   ra   zSAPStreamIterator._safe_close«   s   € Ø�:Š:ØàˆD�Jr   N©zdata: z[DONE])rU   r   rV   r   rW   r   )rG   z#Iterator[OpenAIChatCompletionChunk])rG   r	   )rG   ÚNone)r   r   r   rI   r   rZ   ri   ra   r    r   r   rL   rL   q   s@   „ ñð %Ø!ð	
àð
ð ð
ð ó	
óó#ôJr   rL   c                  ó:   — e Zd ZdZ	 	 d	 	 	 	 	 dd„Zd„ Zd„ Zd„ Zy)	ÚAsyncSAPStreamIteratorFc                óJ   — || _         || _        || _        d | _        d| _        y rN   )rO   rQ   rR   Ú
_line_iterrS   rT   s       r   r   zAsyncSAPStreamIterator.__init__µ   s'   € ð ˆŒ
Ø#ˆŒØˆŒØˆŒØˆ�
r   c                ó   — | S r   r    rY   s    r   Ú	__aiter__z AsyncSAPStreamIterator.__aiter__Á   r[   r   c              ƒ  ól  K  — | j                   rt        ‚| j                  €| j                  | _        	 	 | j                  j	                  «       ƒ d {  –—† }|xs dj                  «       }|sŒ;|j                  | j                  «      }|| j                  k(  r| j                  «       ƒ d {  –—†  t        ‚	 t        j                  |«      }	 t         j#                  |«      }|€Œ²t+        d„ |j,                  xs g D «       «      r| j                  «       ƒ d {  –—†  |S 7 ŒÌ# t        t
        j                  t        f$ r  | j                  «       ƒ d {  –—†7   t        ‚w xY w7 Œ¶# t        $ r Y �Œ=w xY w# t$        $ r3}| j                  «       ƒ d {  –—†7   t'        dt)        |«      «      ‚d }~ww xY w7 Œš­w)Nr]   iö  c              3  ó8   K  — | ]  }|j                   d u–— Œ y ­wr   )r$   )Ú.0r:   s     r   ú	<genexpr>z3AsyncSAPStreamIterator.__anext__.<locals>.<genexpr>ê   s   è ø€ ÒN°1�1—?‘?¨$Ô.ÑNùs   ‚)rS   ÚStopAsyncIterationrr   rO   Ú	__anext__ÚhttpxÚ	ReadErrorÚOSErrorÚ_acloser_   r`   rQ   rR   rA   rb   r%   r*   rE   r@   r   r   Úanyr#   rc   s          r   rz   z AsyncSAPStreamIterator.__anext__Ä   sy  è ø€ Ø�:Š:Ü$Ð$à�?‰?Ð"Ø"Ÿj™jˆDŒOàð)Ø ŸO™O×5Ñ5Ó7×7�ð
 ’I˜2×$Ñ$Ó&ˆDÙØð ×'Ñ'¨¯©Ó5ˆGØ˜$Ÿ+™+Ò%Ø—l‘l“n×$Ð$Ü(Ð(ðÜ—j‘j Ó)�ð>Ü%×5Ñ5°cÓ:�ð
 ˆ}Øô ÑN¸¿¹Ò9LÈ"ÔNÔNØ—l‘l“n×$Ð$àˆLðA 8ùÜ&¬¯©¼ÐAò )Ø—l‘l“n×$Ñ$Ü(Ð(ð)úð %ùô ò Úðûô
 ò >Ø—l‘l“n×$Ñ$Ü0°´c¸!³fÓ=Ð=ûð>úð %ús¡   ‚1F4´D  ÁDÁD  ÁAF4Â*E!Â+
F4Â6E# ÃE3 Ã!6F4ÄF2ÄF4ÄD  Ä 1EÅEÅEÅF4Å#	E0Å,F4Å/E0Å0F4Å3	F/Å<F*ÆFÆF*Æ*F/Æ/F4c              ƒ  ó4   K  — | j                   ry d| _         y ­wrk   rl   rY   s    r   r~   zAsyncSAPStreamIterator._acloseï   s   è ø€ Ø�:Š:ØàˆD�Jùs   ‚Nrm   )rU   r   rV   r   rW   r   )r   r   r   Úsync_streamr   rt   rz   r~   r    r   r   rp   rp   ²   s@   „ Ø€Kð
 %Ø!ð	
àð
ð ð
ð ó	
òò)óVr   rp   c                  ó   — e Zd Zdd„Zy)ÚGenAIHubOrchestrationc                óx   — |j                  di «      j                  dd «      �d|d   d   d<   |S ddi|d   d<   |S )NÚconfigÚstreamTÚenabled)r6   )r   ÚdataÚprovider_configÚfake_streams       r   Ú!_add_stream_param_to_request_bodyz7GenAIHubOrchestration._add_stream_param_to_request_bodyú   sT   € Ø�8‰8�H˜bÓ!×%Ñ% h°Ó5ÐAØ26ˆD�‰N˜8Ñ$ YÑ/ð ˆð )2°4Ð'8ˆD�‰N˜8Ñ$Øˆr   N)rˆ   rF   r‰   r   rŠ   Úbool)r   r   r   r‹   r    r   r   rƒ   rƒ   ù   s   „ ôr   rƒ   )rG   r   )r&   r	   rG   rŒ   )Ú
__future__r   rA   r   Úcollections.abcr   r   Útypingr   r{   Ú)litellm.llms.base_llm.chat.transformationr   r   Úlitellm.types.llms.openair	   Úcustom_httpx.llm_http_handlerr   r   r!   r(   r*   rL   rp   rƒ   r    r   r   ú<module>r“      sg   ðÝ "ã Û ß 3Ý ã ç RÝ ?å ?ôÐ!1ô óó÷=ñ =÷F>ñ >÷BAñ AôNÐ.õ r   