
    h+                        d dl Z d dlZd dlmZ d dlmZmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZ d dlmZ  G d d      Z G d de      Z G d de      Z G d de      Z y)    N)datetime)AnyDictOptional)STREAM_SSE_DONE_STRING)run_async_function)Logging)executor)BaseResponsesAPIConfig)ResponsesAPIRequestUtils)OutputTextDeltaEventResponseCompletedEventResponsesAPIResponseResponsesAPIStreamEventsResponsesAPIStreamingResponse)CustomStreamWrapperc                   x    e Zd ZdZ	 	 ddej
                  dededede	e
eef      de	e   fd	Zd
e	e   fdZd Zy)!BaseResponsesAPIStreamingIteratorz
    Base class for streaming iterators that process responses from the Responses API.

    This class contains shared logic for both synchronous and asynchronous iterators.
    Nresponsemodelresponses_api_provider_configlogging_objlitellm_metadatacustom_llm_providerc                     || _         || _        || _        d| _        || _        d | _        t        j                         | _        || _	        || _
        y )NF)r   r   r   finishedr   completed_responser   now
start_timer   r   )selfr   r   r   r   r   r   s          `/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/responses/streaming_iterator.py__init__z*BaseResponsesAPIStreamingIterator.__init__   sP     !
&-J*KO",,. !1#6     returnc                 >   |syt        j                  |      }|y|t        k(  rd| _        y	 t	        j
                  |      }t        |t              r| j                  j                  | j                  || j                        }t        |dd      }|r9t        j                  || j                  | j                         }t#        |d|       |r4|j$                  t&        j(                  k(  r|| _        | j-                          |S y# t        j.                  $ r Y yw xY w)z.Process a single chunk of data from the streamNT)r   parsed_chunkr   r   )responses_api_responser   r   )r   _strip_sse_data_from_chunkr   r   jsonloads
isinstancedictr   transform_streaming_responser   r   getattrr   /_update_responses_api_response_id_with_model_idr   r   setattrtyper   RESPONSE_COMPLETEDr   "_handle_logging_completed_responseJSONDecodeError)r    chunkr&   openai_responses_api_chunkresponse_objectr   s         r!   _process_chunkz0BaseResponsesAPIStreamingIterator._process_chunk4   s&    $>>uE= ** DM&	::e,L ,-66SS"jj%1$($4$4 T  + #**DjRV"W"7gg/>)-)>)>,0,D,D H
 6
HM /277/BBC /ID+;;=11## 		s   CD DDc                      y)z8Base implementation - should be overridden by subclassesN r    s    r!   r3   zDBaseResponsesAPIStreamingIterator._handle_logging_completed_responsek   s    r#   NN)__name__
__module____qualname____doc__httpxResponsestrr   LiteLLMLoggingObjr   r   r   r"   r   r8   r3   r:   r#   r!   r   r      s{     6:-17..7 7 (>	7
 '7 #4S>27 &c]7*5x0M'N 5nr#   r   c                        e Zd ZdZ	 	 ddej
                  dededede	e
eef      de	e   f fdZd	 Zd
efdZd Z xZS )ResponsesAPIStreamingIteratorzS
    Async iterator for processing streaming responses from the Responses API.
    r   r   r   r   r   r   c                 X    t         |   ||||||       |j                         | _        y N)superr"   aiter_linesstream_iteratorr    r   r   r   r   r   r   	__class__s          r!   r"   z&ResponsesAPIStreamingIterator.__init__u   s7     	)	
  (335r#   c                     | S rH   r:   r;   s    r!   	__aiter__z'ResponsesAPIStreamingIterator.__aiter__       r#   r$   c                 $  K   	 	 	 | j                   j                          d {   }| j	                  |      }| j                  rt        ||S K7 ,# t        $ r d| _        t        w xY w# t
        j                  $ r}d| _        |d }~ww xY wwNT)rK   	__anext__StopAsyncIterationr   r8   rA   	HTTPErrorr    r5   resultes       r!   rS   z'ResponsesAPIStreamingIterator.__anext__   s     	-"&"6"6"@"@"BBE
 ,,U3==,,'!M  C) -$(DM,,-  	 DMG	sT   BA, A AA &A, BA, A A))A, ,B?	BBBc                 \   t        j                  | j                  j                  | j                  | j
                  t        j                         d             t        j                  | j                  j                  | j                  d| j
                  t        j                                y)z7Handle logging for completed responses in async contextN)rW   r   end_time	cache_hitrW   r[   r   rZ   )asynciocreate_taskr   async_success_handlerr   r   r   r   r
   submitsuccess_handlerr;   s    r!   r3   z@ResponsesAPIStreamingIterator._handle_logging_completed_response   s~    22..??!	 3 	
 	,,**\\^	
r#   r<   )r=   r>   r?   r@   rA   rB   rC   r   rD   r   r   r   r"   rO   r   rS   r3   __classcell__rM   s   @r!   rF   rF   p   s{     6:-16..6 6 (>	6
 '6 #4S>26 &c]6&!> .
r#   rF   c                   ~     e Zd ZdZ	 	 ddej
                  dededede	e
eef      de	e   f fdZd	 Zd
 Zd Z xZS )!SyncResponsesAPIStreamingIteratorzY
    Synchronous iterator for processing streaming responses from the Responses API.
    r   r   r   r   r   r   c                 X    t         |   ||||||       |j                         | _        y rH   )rI   r"   
iter_linesrK   rL   s          r!   r"   z*SyncResponsesAPIStreamingIterator.__init__   s7     	)	
  (224r#   c                     | S rH   r:   r;   s    r!   __iter__z*SyncResponsesAPIStreamingIterator.__iter__   rP   r#   c                     	 	 	 t        | j                        }| j	                  |      }| j                  rt        ||S ># t        $ r d| _        t        w xY w# t
        j                  $ r}d| _        |d }~ww xY wrR   )nextrK   StopIterationr   r8   rA   rU   rV   s       r!   __next__z*SyncResponsesAPIStreamingIterator.__next__   s    	( !5!56E
 ,,U3=='''!M  % ($(DM''(  	 DMG	s3   A A &A  A AA A<.	A77A<c                 @   t        | j                  j                  | j                  | j                  t        j                         d       t        j                  | j                  j                  | j                  d| j                  t        j                                y)z6Handle logging for completed responses in sync contextN)async_functionrW   r   rZ   r[   r\   )
r   r   r_   r   r   r   r   r
   r`   ra   r;   s    r!   r3   zDSyncResponsesAPIStreamingIterator._handle_logging_completed_response   sn    ++AA**\\^	
 	,,**\\^	
r#   r<   )r=   r>   r?   r@   rA   rB   rC   r   rD   r   r   r   r"   ri   rm   r3   rb   rc   s   @r!   re   re      ss     6:-15..5 5 (>	5
 '5 #4S>25 &c]5&.
r#   re   c                        e Zd ZdZdZ	 	 ddej                  dedede	de
eeef      de
e   f fd	Zd
 ZdefdZd ZdefdZdedefdZ xZS )!MockResponsesAPIStreamingIteratoru   
    Mock iterator—fake a stream by slicing the full response text into
    5 char deltas, then emit a completed event.

    Models like o1-pro don't support streaming, so we fake it.
       r   r   r   r   r   r   c           
         t         |   ||||||       | j                  j                  | j                  ||      }| j                  |      }t        dt        |      | j                        D 	cg c]:  }	t        t        j                  ||	|	| j                  z    |j                  dd      < }
}	|
t        t        j                  |      gz   | _        d| _        y c c}	w )N)r   r   r   r   r   r   )r   raw_responser   r   )r1   deltaitem_idoutput_indexcontent_index)r1   r   )rI   r"   r   transform_response_api_responser   _collect_textrangelen
CHUNK_SIZEr   r   OUTPUT_TEXT_DELTAidr   r2   _events_idx)r    r   r   r   r   r   r   transformed	full_textideltasrM   s              r!   r"   z*MockResponsesAPIStreamingIterator.__init__  s     	*G#- 3 	 	
 ..NNjj%' O  	 &&{3	 1c)ndoo>	
  !-??A$78#	
 	
 "-@@$!
 
 	%	
s   2?Cc                     | S rH   r:   r;   s    r!   rO   z+MockResponsesAPIStreamingIterator.__aiter__6  rP   r#   r$   c                    K   | j                   t        | j                        k\  rt        | j                  | j                      }| xj                   dz  c_         |S wN   )r   r|   r   rT   r    evts     r!   rS   z+MockResponsesAPIStreamingIterator.__anext__9  sE     99DLL))$$ll499%		Q	
s   AAc                     | S rH   r:   r;   s    r!   ri   z*MockResponsesAPIStreamingIterator.__iter__@  rP   r#   c                     | j                   t        | j                        k\  rt        | j                  | j                      }| xj                   dz  c_         |S r   )r   r|   r   rl   r   s     r!   rm   z*MockResponsesAPIStreamingIterator.__next__C  sA    99DLL))ll499%		Q	
r#   respc                     d}|j                   D ]6  }t        |dd       }|dk(  st        |dg       D ]  }||j                  z  } 8 |S )N r1   messagecontent)outputr.   text)r    r   outout_item	item_typecs         r!   rz   z/MockResponsesAPIStreamingIterator._collect_textJ  sR    H&$7II% 9b9A166MC : $
 
r#   r<   )r=   r>   r?   r@   r}   rA   rB   rC   r   rD   r   r   r   r"   rO   r   rS   ri   rm   r   rz   rb   rc   s   @r!   rq   rq      s     J 6:-1/../ / (>	/
 '/ #4S>2/ &c]/b!> 7 "6 3 r#   rq   )!r]   r)   r   typingr   r   r   rA   litellm.constantsr   #litellm.litellm_core_utils.asyncifyr   *litellm.litellm_core_utils.litellm_loggingr	   rD   /litellm.litellm_core_utils.thread_pool_executorr
   .litellm.llms.base_llm.responses.transformationr   litellm.responses.utilsr   litellm.types.llms.openair   r   r   r   r   litellm.utilsr   r   rF   re   rq   r:   r#   r!   <module>r      st       & &  4 B S D Q <  .U UpC
$E C
LB
(I B
JV(I Vr#   