
    i                        d dl mZ d dlZd dlZd dlmZmZ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Optional)
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      n/Users/manta/Documents/Projects/TheRoad-I1/.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    tyy{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(   "   sH    --%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_result0   s    
 gg,-3(77ggdmNsww|'<N''(+F/F779-P1CPwy)6Y "ggi06B6 7	 "#w!2!"w!52)*)?
 7
 	
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_chunkJ   s     Y'Y"6TZZ	233 Y&>*0bBr!68,;;B?? "Y. ;;IFF 	!h)&;,;;IFF r   N)r8   dictreturn#Optional[OpenAIChatCompletionChunk])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__v   s'     

#
r   c                    | S r   r    r   s    r   __iter__zSAPStreamIterator.__iter__       r   c                T   | j                   rt        | j                  D ]  }|xs dj                         }|s|j	                  | j
                        r|t        | j
                        d  n|}|| 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
startswithrQ   lenrR   _safe_closerA   loadsr%   r*   rE   r@   r(   r   rawlinepayloadobjr&   es          r   __next__zSAPStreamIterator.__next__   s   ::::CI2$$&D .2__T\\-JS&()PT  $++%  "##jj)%55c:
 } "%(  "L= @ 	'  
    "s*   C8*D8	DD	D'D""D'c                ,    | j                   ry d| _         y NTrS   rY   s    r   rb   zSAPStreamIterator._safe_close   s    ::DJr   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   rj   rb   r    r   r   rL   rL   p   s@     %!	

 
 	
%N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                  K   | j                   rt        | j                  | j                  | _        	 	 | j                  j	                          d {   }|xs dj                         }|s;|j                  | j                        r|t        | j                        d  n|}|| 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 Ww 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     N9L11??$.9Ls   )rS   StopAsyncIterationrs   rO   	__anext__httpx	ReadErrorOSError_acloser_   r`   rQ   ra   rR   rA   rc   r%   r*   rE   r@   r   r   anyr#   rd   s          r   r{   z AsyncSAPStreamIterator.__anext__   s    ::$$??""jjDO) OO5577
 I2$$&D .2__T\\-JS&()PT  $++%lln$$((jj)>%55c:
 } N9L"9LNNlln$$LE 8&A )lln$$(() %  
  >lln$$0c!f==> %s   1GD: D8D: A.GE;
GE= &F ;6G1G2G8D: :1E8+E.,E88G=	F
G	F

G	G	G)F,*GG		Gc                4   K   | j                   ry d| _         y wrl   rm   rY   s    r   r   zAsyncSAPStreamIterator._aclose   s     ::DJs   Nrn   )rU   r   rV   r   rW   r   )r   r   r   sync_streamr   ru   r{   r   r    r   r   rq   rq      s@    K
 %!	

 
 	
+Zr   rq   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   sV     88Hb!%%h5A26DN8$Y/  )24'8DN8$r   N)r   rF   r   r   r   bool)r   r   r   r   r    r   r   r   r      s    +5DHr   r   )rG   r   )r&   r	   rG   r   )
__future__r   rA   r   typingr   r   r   r|   )litellm.llms.base_llm.chat.transformationr   r   litellm.types.llms.openair	   custom_httpx.llm_http_handlerr   r   r!   r(   r*   rL   rq   r   r    r   r   <module>r      si    "   4 4  R ? ?!1 = =F@ @FC CR. r   