Ë
    tPêjìD  ã                   óV  — d Z ddlZddlZddlmZ ddlmZmZmZ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d
lmZ ddlmZ ddlmZ erddlmZ ddlmZ ddlm Z   G d„ ded¬«      Z! G d„ ded¬«      Z"de#dededededddddd d!e$dz  d"e$dz  d#e%dz  d$e#dz  d%e#dz  fd&„Z&y)'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)ÚSequence)ÚTYPE_CHECKINGÚFinalÚ	TypedDictÚcast)ÚRequestÚResponse)ÚStreamingResponse)ÚReadOnly)Úverbose_proxy_logger)ÚUserAPIKeyAuth)ÚProxyBaseLLMRequestProcessing)ÚResponsePollingHandler)ÚResponsesAPIStatus)ÚProxyConfig)ÚProxyLogging)ÚRouterc                   ó   — e Zd ZU ee   ed<   y)Ú_StreamContentPartÚtextN)Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ__annotations__© ó    úx/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/response_polling/background_streaming.pyr   r       s   … Ø
�3‰-Ôr   r   F)Útotalc                   ó:   — e Zd ZU ee   ed<   eeedz        ed<   y)Ú_StreamOutputItemÚidNÚcontent)r   r   r   r   r   r   r   r   r   r   r   r!   r!   $   s"   … Ø�‰ÓØ�hÐ1°DÑ8Ñ9Ñ:Ô:r   r!   Ú
polling_idÚpolling_handlerÚrequestÚfastapi_responseÚuser_api_key_dictÚ
llm_routerzRouter | NoneÚproxy_configr   Úproxy_logging_objr   Úuser_temperatureÚuser_request_timeoutÚuser_max_tokensÚuser_api_baseÚversionc              ƒ   óæ  ‡ ‡‡;‡<‡=‡>‡?‡@‡AK  — 	 t        j                  d‰ «       ‰j                  ‰ d¬«      ƒ d{  –—†  d|d<   |j                  dd«       t	        |¬«      }|j                  |||d	|	||||
d||||||d¬
«      ƒ d{  –—† }i Š@i }d}d}d}d}d}d}d}d}d}d}d}d}d} d}!d}"d}#dŠAt        j                  «       j                  «       Š?dŠ;d}$d}%dddddœ}&dMdt        ddfˆ;ˆ?ˆ@ˆˆ ˆAfd„}'t        |d«      st        j                  d‰ «       t        |d«      �r¯|j                  2 3 d{  –—† }(t        |(t        «      r|(j                  d«      }(t        |(t         «      sŒ;|(j#                  d«      sŒM|(dd j%                  «       })|)dk(  r �n*	 t'        j(                  |)«      }*|*j+                  dd«      }+|+dk(  r/|*j+                  di «      },|,j+                  d«      }-|-�rÆ|,‰@|-<   dŠA�n½|+d k(  rV|*j+                  d!«      }-|*j+                  d"i «      Š=|-�r’|-‰@v �r�‰@|-   }.i |.¥d#g |.j+                  d#d$«      ¢‰=‘­i¥}/|/‰@|-<   dŠA�nb|+d%k(  rÉ|*j+                  d!«      }-|*j+                  d&d'«      Š<|*j+                  d(d«      }0|-�r%|-‰@v �r |-‰<f}1|1|vrd||1<   ||1xx   |0z  cc<   ‰@|-   }.|.j+                  d#d$«      }2‰<t-        |2«      k  rI|2‰<   }3t        |3t.        «      r4i |3¥d)||1   i¥Š>i |.¥d#t1        ˆ<ˆ>fd*„t3        |2«      D «       «      i¥}4|4‰@|-<   dŠA�n”|+d+k(  r�|*j+                  d!«      }-|*j+                  d"i «      Š=|*j+                  d&d'«      Š<|-�rW|-‰@v �rR‰@|-   }.|.j+                  d#d$«      }2‰<t-        |2«      k  r)i |.¥d#t1        ˆ<ˆ=fd,„t3        |2«      D «       «      i¥}5|5‰@|-<   dŠA�n |+d-k(  r/|*j+                  di «      },|,j+                  d«      }-|-�rÕ|,‰@|-<   dŠA�nÌ|+d.k(  r‰j                  ‰ d¬«      ƒ d{  –—†  �nª|+dv �r¥|*j+                  d/i «      }6t5        t6        |6j+                  d0|&j+                  |+d«      «      «      }$|+d1k(  s|+d2k(  r|6j+                  d3«      }%|6j+                  d4«      }|6j+                  d5«      }|6j+                  d6«      }|6j+                  d7«      }|6j+                  d8«      }|6j+                  d9«      }|6j+                  d:«      }|6j+                  d;«      }|6j+                  d<«      }|6j+                  d=«      }|6j+                  d)«      }|6j+                  d>«      }|6j+                  d?«      } |6j+                  d@«      }!|6j+                  dA«      }"|6j+                  dB«      }#dC|6v r4|6j+                  dCg «      }7|7D ]  },|,j+                  d«      }-|-sŒ|,‰@|-<   Œ dŠA |'«       ƒ d{  –—†  �Œ’ |'d¬E«      ƒ d{  –—†  |$xs d}9‰j                  ‰ |9||%|||||||||||| |!|"|#¬F«      ƒ d{  –—†  t        j                  dG‰ |9|%|#t-        ‰@«      «       y7 �Œï7 �Œ¥7 �Œû7 �Œ27 Œy# t&        j8                  $ r!}8t        j                  dD|8«       Y d}8~8�Œ6d}8~8ww xY w6 Œ®7 Œ¡7 Œq# t:        $ rr}8t        j<                  dH‰ |8«       d'dl}:t        j<                  |:jA                  «       «       ‰j                  ‰ ddIt!        |8«      dJdKœ¬L«      ƒ d{  –—†7   Y d}8~8yd}8~8ww xY w­w)Na3  
    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 %sÚin_progress)r$   ÚstatusNTÚstreamÚ
background)ÚdataÚ
aresponses)r&   r'   r(   Ú
route_typer+   r)   Úgeneral_settingsr*   Úselect_data_generatorÚmodelÚ
user_modelr,   r-   r.   r/   r0   Úskip_pre_call_logicFg333333Ã?Ú	completedÚfailedÚ
incompleteÚ	cancelled)zresponse.completedúresponse.failedúresponse.incompletezresponse.cancelledÚforceÚreturnc              “   óâ   •K  — t        j                  «       j                  «       }‰rD| s|‰z
  ‰k\  r9t        ‰j	                  «       «      }‰j                  ‰|¬«      ƒ d{  –—†  dŠ|Šyyy7 Œ­w)z>Flush accumulated state to Redis if interval elapsed or forced)r$   ÚoutputNF)ÚasyncioÚget_event_loopÚtimeÚlistÚvaluesÚupdate_state)	rD   Úcurrent_timeÚoutput_listÚUPDATE_INTERVALÚlast_update_timeÚoutput_itemsr%   r$   Ústate_dirtys	      €€€€€€r   Úflush_state_if_neededz8background_streaming_task.<locals>.flush_state_if_needed•   s‚   øè ø€ ô #*×"8Ñ"8Ó":×"?Ñ"?Ó"AˆLÙ¡¨,Ð9IÑ*IÈoÒ)]ä%)¨,×*=Ñ*=Ó*?Ó%@�Ø%×2Ñ2Ø)Ø&ð 3ó ÷ ð ð $�Ø#/Ñ ð *^ˆ{ðús   ƒAA/Á!A-Á"A/Úbody_iteratorzwbackground_streaming_task: response for %s has no body_iterator; this may indicate a misconfiguration or provider errorzutf-8zdata: é   z[DONE]ÚtypeÚ zresponse.output_item.addedÚitemr"   zresponse.content_part.addedÚitem_idÚpartr#   r   zresponse.output_text.deltaÚcontent_indexr   Údeltar   c              3   ó6   •K  — | ]  \  }}|‰k(  r‰n|–— Œ y ­w©Nr   )Ú.0ÚindexÚentryr\   Ú
delta_parts      €€r   ú	<genexpr>z,background_streaming_task.<locals>.<genexpr>í   s+   øè ø€ ò =.á4@°E¸5ð ?DÀ}Ò>T±
ÐZ_Ó0_ñ=.ùó   ƒzresponse.content_part.donec              3   ó6   •K  — | ]  \  }}|‰k(  r‰n|–— Œ y ­wr_   r   )r`   ra   rb   r\   Úcontent_parts      €€r   rd   z,background_streaming_task.<locals>.<genexpr>  s+   øè ø€ ò 9*á0<°°uð =BÀ]Ò<R©LÐX]Ó,]ñ9*ùre   zresponse.output_item.donezresponse.in_progressÚresponser3   rB   rC   ÚerrorÚusageÚ	reasoningÚtool_choiceÚtoolsr;   ÚinstructionsÚtemperatureÚtop_pÚmax_output_tokensÚprevious_response_idÚ
truncationÚparallel_tool_callsÚuserÚstoreÚincomplete_detailsrG   z#Failed to parse streaming chunk: %s)rD   )r$   r3   rj   ri   rk   rl   rm   r;   rn   ro   rp   rq   rr   r   rs   rt   ru   rv   rw   zaFinished background streaming for %s, status=%s, error=%s, incomplete_details=%s, output_items=%sz-Error in background streaming task for %s: %sÚinternal_errorÚbackground_streaming_error)rW   ÚmessageÚcode)r$   r3   ri   )F)!r   ÚinforM   Úpopr   Úbase_process_llm_requestrH   rI   rJ   ÚboolÚhasattrÚwarningrU   Ú
isinstanceÚbytesÚdecoder   Ú
startswithÚstripÚjsonÚloadsÚgetÚlenÚdictÚtupleÚ	enumerater   r   ÚJSONDecodeErrorÚ	Exceptionri   Ú	tracebackÚ
format_exc)Br$   r6   r%   r&   r'   r(   r9   r)   r*   r+   r:   r<   r,   r-   r.   r/   r0   Ú	processorrh   Úaccumulated_textÚ
usage_dataÚreasoning_dataÚtool_choice_dataÚ
tools_dataÚ
model_dataÚinstructions_dataÚtemperature_dataÚ
top_p_dataÚmax_output_tokens_dataÚprevious_response_id_dataÚ	text_dataÚtruncation_dataÚparallel_tool_calls_dataÚ	user_dataÚ
store_dataÚincomplete_details_dataÚterminal_statusÚterminal_errorÚ_event_to_statusrT   ÚchunkÚ
chunk_dataÚeventÚ
event_typerY   rZ   Úcurrent_itemÚappended_itemr]   ÚkeyÚcontent_listÚcontent_entryÚ
delta_itemÚfinalized_itemÚresponse_dataÚfinal_outputÚeÚfinal_statusr�   rP   r\   rg   rc   rQ   rR   rS   sB   ` `                                                        @@@@@@@r   Úbackground_streaming_taskr¶   )   sp  ÿøè ø€ ð:
Ü×!Ñ!Ð"HÈ*ÔUð ×*Ñ*Ø!Ø ð +ó 
÷ 	
ð 	
ð ˆˆX‰Ø�‰�˜tÔ$ô 9¸dÔCˆ	ð
 4=×3UÑ3UØØ-Ø/Ø#Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'ØØ $ð# 4Vó 4
÷ .
ˆð, =?ˆà>@Ðð ˆ
ØˆØÐØˆ
Øˆ
Ø ÐØÐØˆ
Ø!%ÐØ$(Ð!Øˆ	ØˆØ#'Ð Øˆ	Øˆ
Ø"&ÐàˆÜ"×1Ñ1Ó3×8Ñ8Ó:ÐØ!&ˆð ð 	ð ˆà"-Ø'Ø#/Ø"-ñ	#
Ðñ	0¬tð 	0À÷ 	0ò 	0ô  �x Ô1Ü ×(Ñ(ð JØôô
 �8˜_Õ-Ø'×5Ñ5÷ d_ð d_�eä˜e¤UÔ+Ø!ŸL™L¨Ó1�Eä˜e¤SÕ)¨e×.>Ñ.>¸xÕ.HØ!& q r §¡Ó!2�JØ! XÒ-ÚðZ_Ü $§
¡
¨:Ó 6˜Ø%*§Y¡Y¨v°rÓ%:˜
ð &Ð)EÒEà#(§9¡9¨V°RÓ#8˜DØ&*§h¡h¨t£n˜GÚ&Ø8< ¨WÑ 5Ø.2¢à'Ð+HÒHà&+§i¡i°	Ó&:˜GØ+0¯9©9°V¸RÓ+@˜Lâ&¨7°lÒ+Bà/;¸GÑ/D ðD"Ø&2ðD"à$-Ð/_°×1AÑ1AÀ)ÈRÓ1PÐ/_ÐR^Ñ/_ñD" ð 9F ¨WÑ 5Ø.2¢à'Ð+GÒGð ',§i¡i°	Ó&:˜GØ16·±¸?ÈAÓ1N˜MØ$)§I¡I¨g°rÓ$:˜Eâ&¨7°lÒ+Bà'.°Ð&> Ø#&Ð.>Ñ#>Ø<>Ð$4°SÑ$9Ø 0°Ó 5¸Ñ >Ó 5ð 0<¸GÑ/D ØT`×TdÑTdÐenÐprÓTs Ø#0´3°|Ó3DÒ#Dà4@ÀÑ4O MÜ'1°-ÄÔ'FðJ*Ø.;ðJ*à,2Ð4DÀSÑ4IñJ*¨
ðI*Ø.:ðI*à,5´uô =.äDMÈlÓD[ô=.ó 8.ñI*¨
ð AK¨°WÑ(=Ø.2¢à'Ð+GÒGà&+§i¡i°	Ó&:˜GØ+0¯9©9°V¸RÓ+@˜LØ,1¯I©I°oÀqÓ,I˜Mâ&¨7°lÒ+Bà/;¸GÑ/D Ø/;×/?Ñ/?À	È2Ó/N Ø#0´3°|Ó3DÒ#DðI&Ø*6ðI&à(1´5ô 9*ä@IÈ,Ó@Wô9*ó 4*ñI& Nð =K L°Ñ$9Ø.2¢à'Ð+FÒFà#(§9¡9¨V°RÓ#8˜DØ&*§h¡h¨t£n˜GÚ&Ø8< ¨WÑ 5Ø.2¢à'Ð+AÒAð #2×">Ñ">Ø+5Ø'4ð #?ó #÷ ò ð
 (ð ,ò ð -2¯I©I°jÀ"Ó,E˜MÜ.2Ü 2Ø -× 1Ñ 1Ø$,Ø$4×$8Ñ$8¸À[Ó$Qó!"ó/˜Oð  *Ð->Ò>À*ÐPeÒBeØ1>×1BÑ1BÀ7Ó1K ð *7×):Ñ):¸7Ó)C˜JØ-:×->Ñ->¸{Ó-K˜NØ/<×/@Ñ/@ÀÓ/OÐ,Ø)6×):Ñ):¸7Ó)C˜Jð *7×):Ñ):¸7Ó)C˜JØ0=×0AÑ0AÀ.Ó0QÐ-Ø/<×/@Ñ/@ÀÓ/OÐ,Ø)6×):Ñ):¸7Ó)C˜JØ5B×5FÑ5FÐGZÓ5[Ð2Ø8E×8IÑ8IÐJ`Ó8aÐ5Ø(5×(9Ñ(9¸&Ó(A˜IØ.;×.?Ñ.?ÀÓ.M˜OØ7D×7HÑ7HÐI^Ó7_Ð4Ø(5×(9Ñ(9¸&Ó(A˜IØ)6×):Ñ):¸7Ó)C˜JØ6C×6GÑ6GÐH\Ó6]Ð3ð  (¨=Ñ8Ø/<×/@Ñ/@ÀÈ2Ó/N Ø,8ò !E DØ.2¯h©h°t«n GÚ'.Ø@D¨°WÒ(=ð!Eð /3 ñ 4Ó5×5Ò5ñ (¨dÔ3×3Ð3ð .Ò<°ˆà×*Ñ*Ø!ØØØ Ø$Ø(ØØØ*Ø(ØØ4Ø!:ØØ&Ø 8ØØØ6ð' +ó 
÷ 	
ð 	
ô, 	×!Ñ!ØoØØØØ#Ü�Óõ	
ðI		
ùð.
ùðfd_ùðRùðp 6ùä×/Ñ/ò _Ü,×4Ñ4Ð5ZÐ\]×^Ò^ûð_úðG  6øðN 4øð
	
ùô> ò 
Ü×"Ñ"Ð#RÐT^Ð`aÔbÛä×"Ñ" 9×#7Ñ#7Ó#9Ô:à×*Ñ*Ø!Øà(Ü˜q›6Ø4ñð +ó 
÷ 	
ö 	
ûð
üs  ‹[1�,Y3 ¹X(ºAY3 ÂX+ÂB(Y3 Ä/Y-Ä3X.Ä4Y-Ä72Y3 Å*Y3 Å<Y3 ÆI'X6Ï?X1Ð F&X6Ö'X6Ö:X4Ö;X6Ö?Y3 ×Y/×1Y3 ×?Y1Ø 'Y3 Ø'[1Ø(Y3 Ø+Y3 Ø.Y-Ø1X6Ø4X6Ø6Y*Ù	Y%ÙY3 Ù%Y*Ù*Y3 Ù/Y3 Ù1Y3 Ù3	[.Ù<A"[)Û[!Û[)Û$[1Û)[.Û.[1)'Ú__doc__rH   r‡   Úcollections.abcr   Útypingr   r   r   r   Úfastapir   r	   Úfastapi.responsesr
   Útyping_extensionsr   Úlitellm._loggingr   Ú$litellm.proxy.auth.user_api_key_authr   Ú'litellm.proxy.common_request_processingr   Ú.litellm.proxy.response_polling.polling_handlerr   Úlitellm.types.llms.openair   Úlitellm.proxy.proxy_serverr   Úlitellm.proxy.utilsr   Úlitellm.routerr   r   r!   r   ÚfloatÚintr¶   r   r   r   ú<module>rÇ      s  ðñó Û Ý $ß 8Ó 8ç %Ý /Ý &å 1Ý ?Ý QÝ QÝ 8áÝ6Ý0Ý%ô˜¨%õ ô;˜	¨õ ;ð
\
Øð\
ð ,ð\
ð ð	\
ð
 ð\
ð &ð\
ð  ð\
ð  ð\
ð &ð\
ð ˜d‘lð\
ð   $™,ð\
ð ˜4‘Zð\
ð  ˜‘:ð!\
ð" �4‰Zô#\
r   