o
    ưi                     @  s   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	 d	eZdddZdddZG dd dZG dd dZG dd dZG dd deZdS )    )annotationsN)AsyncIteratorIteratorOptional)
BaseConfigBaseLLMException)OpenAIChatCompletionChunk   )BaseLLMHTTPHandlerc                      s   e Zd Zd fddZ  ZS )GenAIHubOrchestrationErrorstatus_codeintmessagestrc                   s    t  j||d || _|| _d S )N)r   r   )super__init__r   r   )selfr   r   	__class__ T/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/sap/chat/handler.pyr      s   
z#GenAIHubOrchestrationError.__init__)r   r   r   r   )__name__
__module____qualname__r   __classcell__r   r   r   r   r      s    r   returnr   c                   C  s   t t S N)r   timer   r   r   r   _now_ts   s   r   chunkr   boolc                 C  s>   z| j pg D ]}|jdur W dS qW dS  ty   Y dS w )zKOpenAI-shaped chunk is terminal if any choice has a non-None finish_reason.NTF)choicesfinish_reason	Exception)r   chr   r   r   _is_terminal_chunk"   s   
r%   c                   @  s,   e Zd ZdZedddZedd	d
ZdS )_StreamParserzANormalize orchestration streaming events into OpenAI-like chunks.evtdictr   #Optional[OpenAIChatCompletionChunk]c              
   C  s~   |  dpi }|sdS t| dp|  dpd| dpd| dp*|  dp*t | d	p0d
dd | dp9g D dS )z[
        Accepts orchestration_result shape and maps it to an OpenAI-like *chunk*.
        orchestration_resultNidZ
request_idzstream-chunkobjectchat.completion.chunkcreatedmodelunknownc                 S  s0   g | ]}| d d| dpi | ddqS )indexr   deltar"   )r1   r2   r"   get.0cr   r   r   
<listcomp>?   s    
z<_StreamParser._from_orchestration_result.<locals>.<listcomp>r!   )r+   r,   r.   r/   r!   )r4   r   model_validater   )r'   Zorcr   r   r   _from_orchestration_result0   s   z(_StreamParser._from_orchestration_result	event_objc                 C  s|   d| v sd| v rt t| d| v r&| d pi }d|vr!d|d< t|S d| v r/t| S d| v r<d| v r<t| S dS )	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errorZfinal_resultr,   r-   r*   r!   N)
ValueErrorjsondumpsr   r9   r&   r:   )r;   frr   r   r   to_openai_chunkJ   s   


z_StreamParser.to_openai_chunkN)r'   r(   r   r)   )r;   r(   r   r)   )r   r   r   __doc__staticmethodr:   rB   r   r   r   r   r&   -   s    r&   c                   @  s>   e Zd ZdZ		ddd	d
ZdddZdddZdddZdS )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].
    data: [DONE]responser   event_prefixr   	final_msgc                 C  s"   || _ || _|| _|| _d| _d S NF)_resp_iter_prefix_final_doner   rH   rI   rJ   r   r   r   r   v   
   
zSAPStreamIterator.__init__r   #Iterator[OpenAIChatCompletionChunk]c                 C     | S r   r   r   r   r   r   __iter__      zSAPStreamIterator.__iter__r   c                 C  s   | j rt| jD ]b}|pd }|sq|| jr"|t| jd  n|}|| jkr/|   tzt	
|}W n	 ty?   Y qw zt|}W n tyY } z|   |d }~ww |d u r_qt|rg|   |  S |   t)N )rP   StopIterationrM   strip
startswithrN   lenrO   _safe_closer?   loadsr#   r&   rB   r>   r%   r   rawlinepayloadobjr   er   r   r   __next__   s<   
 
zSAPStreamIterator.__next__Nonec                 C  s   | j rd S d| _ d S NTrP   rU   r   r   r   r]      s   
zSAPStreamIterator._safe_closeNrF   rG   )rH   r   rI   r   rJ   r   )r   rS   )r   r   )r   rf   )r   r   r   rC   r   rV   re   r]   r   r   r   r   rE   p   s    

'rE   c                   @  s8   e Zd ZdZ		ddd	d
Zdd Zdd Zdd ZdS )AsyncSAPStreamIteratorFrF   rG   rH   r   rI   r   rJ   c                 C  s"   || _ || _|| _d | _d| _d S rK   )rL   rN   rO   
_line_iterrP   rQ   r   r   r   r      rR   zAsyncSAPStreamIterator.__init__c                 C  rT   r   r   rU   r   r   r   	__aiter__   rW   z AsyncSAPStreamIterator.__aiter__c              
     sH  | j rt| jd u r| j| _	 z
| j I d H }W n ttjtfy.   |  I d H  tw |p2d	 }|s8q|
| jrG|t| jd  n|}|| jkrW|  I d H  tzt|}W n	 tyg   Y qw zt|}W n ty } z|  I d H  tdt|d }~ww |d u rqtdd |jpg D r|  I d H  |S )NTrX   i  c                 s  s    | ]}|j d uV  qd S r   )r"   r5   r   r   r   	<genexpr>   s    z3AsyncSAPStreamIterator.__anext__.<locals>.<genexpr>)rP   StopAsyncIterationrk   rL   	__anext__httpx	ReadErrorOSError_acloserZ   r[   rN   r\   rO   r?   r^   r#   r&   rB   r>   r   r   anyr!   r_   r   r   r   ro      sJ   
 
z AsyncSAPStreamIterator.__anext__c                   s   | j rd S d| _ d S rg   rh   rU   r   r   r   rs      s   
zAsyncSAPStreamIterator._acloseNri   )rH   r   rI   r   rJ   r   )r   r   r   Zsync_streamr   rl   ro   rs   r   r   r   r   rj      s    -rj   c                   @  s   e Zd Zd
ddZd	S )GenAIHubOrchestrationdatar(   provider_configr   fake_streamr    c                 C  s@   | di  dd d urd|d d d< |S ddi|d d< |S )NconfigstreamTenabledr3   )r   rv   rw   rx   r   r   r   !_add_stream_param_to_request_body   s
   z7GenAIHubOrchestration._add_stream_param_to_request_bodyN)rv   r(   rw   r   rx   r    )r   r   r   r|   r   r   r   r   ru      s    ru   )r   r   )r   r   r   r    )
__future__r   r?   r   typingr   r   r   rp   Z)litellm.llms.base_llm.chat.transformationr   r   Zlitellm.types.llms.openair   Zcustom_httpx.llm_http_handlerr
   r   r   r%   r&   rE   rj   ru   r   r   r   r   <module>   s    

CCI