o
    ưi`7                     @   s   d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ d	ed
edededededefddZdS )a  
Background Streaming Task for Polling Via Cache Feature

Handles streaming responses from LLM providers and updates Redis cache
with partial results for polling.

Follows OpenAI Response Streaming format:
https://platform.openai.com/docs/api-reference/responses-streaming
    N)Any)RequestResponse)verbose_proxy_logger)UserAPIKeyAuth)ProxyBaseLLMRequestProcessing)ResponsePollingHandler
polling_iddatapolling_handlerrequestfastapi_responseuser_api_key_dictgeneral_settingsc           4         s4  zt d  jddI dH  d|d< |dd t|d}|jdUi d	|d
|d|ddd|	d|d|d|d|
ddd|d|d|d|d|d|I dH }i i }d}d}d}d}d}d}d}d}d}d}d}d}d} d}!d}"d}#dt  d dVdt	ddf fdd}$t
|d r|j2 z3 dH W }%t|%tr|%d!}%t|%tr|%d"r|%d#d  }&|&d$kr nzt|&}'|'d%d&}(|(d'kr|'d(i })|)d)}*|*r|)|*< dni|(d*kr)|'d+}*|'d,i }+|*r'|*v r'd-|* vrg |* d-< |* d- |+ dn7|(d.kr|'d+}*|'d/d0},|'d1d&}-|*r|*v r|*|,f}.|.|vrTd&||.< ||.  |-7  < d-|* v r|* d- }/|,t|/k rt|/|, tr||. |/|, d2< dn|(d3kr|'d+}*|'d,i }+|'d/d0},|*r|*v rd-|* v r|* d- }/|,t|/k r|+|/|,< dn|(d4kr|'d(i })|)d)}*|*r|)|*< dn|(d5krjddI dH  nz|(d6kr`|'d7i }0|0d8}|0d9}|0d:}|0d;}|0d}|0d<}|0d=}|0d>}|0d?}|0d@}|0d2}|0dA}|0dB} |0dC}!|0dD}"|0dE}#dF|0v r`|0dFg }1|1D ]})|)d)}*|*r\|)|*< qNd|$ I dH  W q tjy }2 zt dG|2  W Y d}2~2qd}2~2ww q6 |$ddHI dH  jdUi dIdJdKd8|d9|d:|d;|d|d<|d=|d>|d?|d@|d2|dA|dB| dC|!dD|"dE|#I dH  t dL dMt  W dS  ty }2 z0t dN dOt|2  d0dl}3t |3  jdPdQt|2dRdSdTI dH  W Y d}2~2dS d}2~2ww )Wa;  
    Background task to stream response and update cache
    
    Follows OpenAI Response Streaming format:
    https://platform.openai.com/docs/api-reference/responses-streaming
    
    Processes streaming events and builds Response object:
    https://platform.openai.com/docs/api-reference/responses/object
    z"Starting background streaming for Zin_progress)r	   statusNTstream
background)r
   r   r   r   Z
route_typeZ
aresponsesproxy_logging_obj
llm_routerr   proxy_configselect_data_generatormodel
user_modeluser_temperatureuser_request_timeoutuser_max_tokensuser_api_baseversionFg333333?forcereturnc                    sV   t   }r'| s|  kr)t }j|dI dH  d|dS dS dS )z>Flush accumulated state to Redis if interval elapsed or forced)r	   outputNF)asyncioget_event_looptimelistvaluesupdate_state)r   current_timeZoutput_listZUPDATE_INTERVALZlast_update_timeZoutput_itemsr   r	   Zstate_dirty j/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/response_polling/background_streaming.pyflush_state_if_neededr   s   z8background_streaming_task.<locals>.flush_state_if_neededbody_iteratorzutf-8zdata:    z[DONE]type zresponse.output_item.addeditemidzresponse.content_part.addeditem_idpartcontentzresponse.output_text.deltacontent_indexr   deltatextzresponse.content_part.donezresponse.output_item.donezresponse.in_progresszresponse.completedresponseusageZ	reasoningZtool_choiceZtoolsZinstructionsZtemperatureZtop_pZmax_output_tokensZprevious_response_idZ
truncationZparallel_tool_callsuserstoreZincomplete_detailsr    z!Failed to parse streaming chunk: )r   r	   r   	completedz#Completed background streaming for z, output_items=z'Error in background streaming task for z: failedZinternal_errorZbackground_streaming_error)r.   messagecode)r	   r   errorr)   )F)r   infor&   popr   Zbase_process_llm_requestr!   r"   r#   boolhasattrr,   
isinstancebytesdecodestr
startswithstripjsonloadsgetappendlendictJSONDecodeErrorwarning	Exceptionr@   	traceback
format_exc)4r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	processorr8   Zaccumulated_textZ
usage_dataZreasoning_dataZtool_choice_dataZ
tools_dataZ
model_dataZinstructions_dataZtemperature_dataZ
top_p_dataZmax_output_tokens_dataZprevious_response_id_dataZ	text_dataZtruncation_dataZparallel_tool_calls_data	user_dataZ
store_dataZincomplete_details_datar+   chunkZ
chunk_dataeventZ
event_typer0   r2   Zcontent_partr5   r6   keyZcontent_listZresponse_dataZfinal_outputerT   r)   r(   r*   background_streaming_task   s  

	

"
































 
	


r\   )__doc__r!   rK   typingr   Zfastapir   r   Zlitellm._loggingr   Z$litellm.proxy.auth.user_api_key_authr   Z'litellm.proxy.common_request_processingr   Z.litellm.proxy.response_polling.polling_handlerr   rH   rP   r\   r)   r)   r)   r*   <module>   s0    	