Ë
    uPêjPª ã            
      óZ  — U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
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mZ d dlZd dlmZ d d	lmZ d dlZd d
l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/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= d dl>m?Z? er'd dl@mAZA d dlBmCZCmDZDmEZE  G d„ de«      ZF G d„ deCe«      ZG G d„ de«      ZH ed¬ «      d!„ «       ZIdnd"„ZJdod#„ZKdpd$„ZLdqd%„ZMdrd&„ZNdsd'„ZOdtd(„ZP ei d)d*“d+d,“d-d,“d.d/“d0d1“d2d1“d3d1“d4d1“d5d1“d6d1“d7d1“d8d1“d9d1“d:d1“d;d1“d<d1“d=d1“d1d1d1d1d1d1d>œ¥«      ZQd?eRd@<   dudA„ZSdvdB„ZTdwdC„ZU G dD„ dE«      ZV	 	 	 	 	 	 dxdF„ZW G dG„ dHeV«      ZX G dI„ dJeV«      ZY G dK„ dLeV«      ZZ G dM„ dNeV«      Z[e G dO„ dPe«      «       Z\e G dQ„ dRe«      «       Z]dydS„Z^	 	 	 	 	 	 dzdT„Z_	 	 	 	 	 	 	 	 	 	 d{dU„Z`	 	 	 	 	 	 	 	 	 	 	 	 	 	 d|dV„Za	 	 	 	 	 	 	 	 d}dW„Zbd dXlcmdZd dYZedZeRd[<   d\ZfdZeRd]<   d~d^„Zg	 	 	 	 	 	 	 	 	 	 dd_„Zhg d`¢ZidZeRda<    ejh db£«      ZkdZeRdc<    G dd„ de«      Zl eI«       jÚ                  jÜ                   eI«       jÚ                  jÞ                  z  ZpdfeRdg<    ejh dh£«      ZqdfeRdi<   djZrdZeRdk<    G dl„ dm«      Zsy)€é    )ÚannotationsN)Ú	AwaitableÚCallableÚMappingÚSequence)Údatetime)Ú	lru_cache)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚProtocolÚruntime_checkable)Ú
SSEDecoder)ÚTypeIs)Ú&LITELLM_MAX_STREAMING_DURATION_SECONDSÚSTREAM_SSE_DONE_STRING)ÚMidStreamFallbackErrorÚRateLimitError)Úrun_async_function)Úprocess_response_headers)ÚLogging)Úget_api_base)Úupdate_response_metadata)Úexecutor)ÚBaseResponsesAPIConfig)ÚResponseAPILoggingUtilsÚResponsesAPIRequestUtils)ÚPART_UNION_TYPESÚResponseAPIUsageÚResponsesAPIResponseÚResponsesAPIStreamEventsÚResponsesAPIStreamingResponse)Ú	CallTypes)Ú'async_post_call_success_deployment_hook)ÚUserAPIKeyAuth)ÚPresidioGuardrailCallbackÚResponsesBackendWebSocketÚResponsesClientWebSocketc                  ó0   — e Zd ZU dZded<   	 	 	 	 	 	 dd„Zy)Ú_StreamCachingHandlerzRThe ``_llm_caching_handler`` attached to a logging object, as this module uses it.úCallable[..., object]Úoriginal_functionc                 ó   — y ©N© )Úselfr.   Úkwargss      úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/responses/streaming_iterator.pyÚ_should_store_result_in_cachez3_StreamCachingHandler._should_store_result_in_cache9   s   € àó    N)r.   r-   r3   úMapping[str, object]ÚreturnÚbool)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r5   r1   r6   r4   r,   r,   4   s(   … Ù`à0Ó0ð	Ø%:ð	ØDXð	àô	r6   r,   c                  ó   — e Zd ZdZdd„Zy)ÚPiiUnmaskingGuardrailCallbackz}Guardrail callback that can also reverse its own masking, selected by
        ``llm_http_handler`` on exactly this attribute.c                 ó   — y r0   r1   )r2   ÚtextÚ
pii_tokenss      r4   Ú_unmask_pii_textz.PiiUnmaskingGuardrailCallback._unmask_pii_textA   ó   � r6   N)rB   ÚstrrC   zMapping[str, str]r8   rF   )r:   r;   r<   r=   rD   r1   r6   r4   r@   r@   =   s   „ ñ	;ô 	Yr6   r@   c                  ó(   — e Zd Z	 	 	 	 	 	 	 	 	 	 dd„Zy)ÚProjectQuotaCallbackc              ƒ  ó   K  — y ­wr0   r1   )r2   Úuser_api_key_dictÚrequested_modelÚestimated_input_tokensÚestimated_output_tokenss        r4   Ú(enforce_project_io_token_quota_for_framez=ProjectQuotaCallback.enforce_project_io_token_quota_for_frameE   s   è ø€ ð ùs   ‚N)
rJ   úUserAPIKeyAuth | NonerK   ú
str | NonerL   ÚintrM   rQ   r8   ÚNone)r:   r;   r<   rN   r1   r6   r4   rH   rH   D   s7   „ ðà0ðð $ðð !$ð	ð
 "%ðð 
ôr6   rH   é   )Úmaxsizec                 ó   — ddl m}  | S )Nr   )Úopenai)Úlitellm.types.llmsrV   )Úopenai_typess    r4   Ú_get_openai_response_typesrY   N   s   € å9àÐr6   c                ó"   — t        | t        «      S r0   )Ú
isinstanceÚdict©Úvalues    r4   Ú_is_json_objectr_   U   ó   € Ü�eœTÓ"Ð"r6   c                ó"   — t        | t        «      S r0   )r[   Úlistr]   s    r4   Ú_is_json_arrayrc   Y   r`   r6   c                ó\   — t        | «      xr  t        d„ | j                  «       D «       «      S )Nc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr0   )r[   rF   )Ú.0Úitems     r4   ú	<genexpr>z"_is_str_mapping.<locals>.<genexpr>^   s   è ø€ Ò)[ÀD¬*°T¼3×*?Ñ)[ùs   ‚)r_   ÚallÚvaluesr]   s    r4   Ú_is_str_mappingrk   ]   s#   € Ü˜5Ó!Ò[¤cÑ)[ÈEÏLÉLËNÔ)[Ó&[Ð[r6   c                ó,   — t        j                  | «      S )z;Parse a JSON payload that the caller consumes as an object.©ÚjsonÚloads©Úpayloads    r4   Ú_load_json_objectrr   a   ó   € ä�:‰:�gÓÐr6   c                ó,   — t        j                  | «      S )zEParse a JSON payload whose top-level shape the caller narrows itself.rm   rp   s    r4   Ú_load_json_valueru   f   rs   r6   c                ó�   — | r| j                  d«      nd }t        |«      r|j                  d«      nd }t        |t        «      r|S d S )NÚ
model_infoÚid)Úgetr_   r[   rF   )Úlitellm_metadatarw   Úmodel_ids      r4   Ú_model_id_from_metadatar|   k   sC   € Ù>NÐ(×,Ñ,¨\Ô:ÐTX€JÜ.=¸jÔ.I�j—n‘n TÔ*Èt€HÜ! (¬CÔ0ˆ8Ð:°dÐ:r6   c               óz   — | j                  «       ry | j                  «       }|�t        j                  d||«       y y )Nz%s failed: %s)Ú	cancelledÚ	exceptionÚverbose_loggerÚerror)ÚtaskÚ	task_namer   s      r4   Ú_log_background_task_failurer„   q   s8   € Ø‡~�~ÔØØ—~‘~Ó'€IØÐÜ×Ñ˜_¨i¸ÕCð r6   Úserver_erroréô  Úrate_limit_exceededé­  Úinsufficient_quotaÚvector_store_timeoutiø  Úinvalid_prompti�  Úinvalid_imageÚinvalid_image_formatÚinvalid_base64_imageÚinvalid_image_urlÚimage_too_largeÚimage_too_smallÚimage_parse_errorÚimage_content_policy_violationÚinvalid_image_modeÚimage_file_too_largeÚunsupported_image_media_typeÚempty_image_file)Úfailed_to_download_imageÚimage_file_not_foundÚinvalid_request_errorÚcontext_length_exceededÚcontent_policy_violationÚmodel_not_foundzFinal[Mapping[str, int]]Ú_ERROR_CODE_HTTP_STATUSc                óX  — t        | «      r4| j                  d«      }| j                  d«      }| j                  d«      }n0| �(t        | dd «      }t        | dd «      }t        | dd «      }nd }d }d }|�t        |«      nd}t	        |t        «      r|nd }t	        |t        «      r|nd }|||fS )NÚmessageÚtypeÚcodezResponse API in-stream error)r_   ry   ÚgetattrrF   r[   )Ú	error_objÚraw_messageÚraw_typeÚraw_coder    Ú
error_typer¢   s          r4   Ú_error_event_fieldsr©   –   s²   € Ü�yÔ!Ø—m‘m IÓ.ˆØ—=‘= Ó(ˆØ—=‘= Ó(‰Ø	Ð	Ü˜i¨°DÓ9ˆÜ˜9 f¨dÓ3ˆÜ˜9 f¨dÓ3‰àˆØˆØˆØ)4Ð)@”S˜Ô%ÐFd€GÜ$.¨x¼Ô$=™À4€JÜ(¨´3Ô7‘(¸T€DØ�J Ð$Ð$r6   c                óv   — t        d„ || fD «       «      }t        d„ |D «       «      ryt        d„ |D «       d«      S )Nc              3  ó&   K  — | ]	  }|€Œ|–— Œ y ­wr0   r1   ©rf   Úfields     r4   rh   z0_status_code_for_error_fields.<locals>.<genexpr>ª   s   è ø€ Ò[ EÈÑIZœ%Ñ[ùs   ‚Šc              3  óL   K  — | ]  }|j                  d «      xs |dk(  –— Œ y­w)Ú
rate_limitr‰   N)Ú
startswithr¬   s     r4   rh   z0_status_code_for_error_fields.<locals>.<genexpr>«   s)   è ø€ Ò
_Èuˆ5×Ñ˜LÓ)ÒJ¨UÐ6JÑ-JÓJÑ
_ùs   ‚"$rˆ   c              3  ó@   K  — | ]  }|t         v sŒt         |   –— Œ y ­wr0   )rž   r¬   s     r4   rh   z0_status_code_for_error_fields.<locals>.<genexpr>®   s   è ø€ Ò`¨E¸uÔH_Ò?_Ô	  Õ	'Ñ`ùs   ‚�r†   )ÚtupleÚanyÚnext)r¨   Ú
error_codeÚfieldss      r4   Ú_status_code_for_error_fieldsr·   ©   sA   € ÜÑ[¨j¸*Ð-EÔ[Ó[€FÜ
Ñ
_ÐX^Ô
_Ô_ØÜÙ`°VÔ`Øóð r6   c                ó�   — t        | t        j                  «      ryt        | dd «      }t        |t        «       xs |dk\  xs |dk(  S )NTÚstatus_coder†   rˆ   )r[   ÚlitellmÚContentPolicyViolationErrorr£   rQ   )Úmapped_exceptionr¹   s     r4   Ú_mid_stream_fallback_eligibler½   ³   sJ   € ÜÐ"¤G×$GÑ$GÔHØÜ Ð!1°=À$ÓG€KÜ˜+¤sÓ+Ð+ÒW¨{¸cÑ/AÒWÀ[ÐTWÑEWÐWr6   c                  ó¼   — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zd„ Zd„ Z	dd	„Z
dd
„Zdd„Zdd„Zdd„Z	 	 	 	 dd„Z	 	 	 	 dd„Zdd„Zd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.
    Nc	                óf  — || _         || _        || _        d| _        || _        d | _        t        |dt        j                  «       «      | _	        d| _
        d| _        d| _        d| _        d| _        d | _        d| _        t#        j"                  «       | _        || _        || _        |xs i | _        || _        t/        |xs d| j                  j0                  j3                  di «      ¬«      }	t5        |«      |	|dœ| _        t9        | j                   j:                  xs i «      | j6                  d<   y )	NFÚ
start_timeÚ TÚlitellm_params)ÚmodelÚoptional_params)r{   Úapi_baseÚcustom_llm_providerÚadditional_headers)ÚresponserÄ   Úlogging_objÚfinishedÚresponses_api_provider_configÚcompleted_responser£   r   ÚnowrÁ   Ú_failure_handledÚ_yielded_first_chunkÚ_generated_contentÚ_completed_response_cachedÚ_completed_response_loggedÚ_completed_response_cache_hitÚ*_persist_completed_response_before_loggingÚtimeÚ_stream_created_timerz   rÇ   Úrequest_dataÚ	call_typer   Úmodel_call_detailsry   r|   Ú_hidden_paramsr   Úheaders)
r2   rÉ   rÄ   rÌ   rÊ   rz   rÇ   rØ   rÙ   Ú	_api_bases
             r4   Ú__init__z*BaseResponsesAPIStreamingIterator.__init__Á   s*  € ð !ˆŒØˆŒ
Ø&ˆÔØˆŒØ-JˆÔ*ØHLˆÔÜ! +¨|¼X¿\¹\»^ÓLˆŒØ %ˆÔØ$)ˆÔ!Ø"$ˆÔØ*/ˆÔ'Ø*/ˆÔ'Ø:>ˆÔ*Ø:>ˆÔ7Ü+/¯9©9«;ˆÔ!ð !1ˆÔØ#6ˆÔ Ø/;Ò/A¸rˆÔØ%.ˆŒô (Ø’+˜2Ø ×,Ñ,×?Ñ?×CÑCÐDTÐVXÓYô
ˆ	ô
 0Ð0@ÓAØ!Ø#6ñ2
ˆÔô
 5MØ�M‰M×!Ñ!Ò' Ró5
ˆ×ÑÐ0Ò1r6   c                óæ   — t         €yt        j                  «       | j                  z
  }|t         kD  r@t        j                  dt         › d|d›d�| j
                  xs d| j                  xs d¬«      ‚y)zXRaise litellm.Timeout if the stream has exceeded LITELLM_MAX_STREAMING_DURATION_SECONDS.Nz*Stream exceeded max streaming duration of zs (elapsed z.1fzs)rÂ   )r    rÄ   Úllm_provider)r   rÖ   r×   rº   ÚTimeoutrÄ   rÇ   )r2   Úelapseds     r4   Ú_check_max_streaming_durationz?BaseResponsesAPIStreamingIterator._check_max_streaming_durationñ   s„   € ä1Ð9ØÜŸ™› t×'@Ñ'@Ñ@ˆØÔ;Ò;Ü—/‘/ØDÔEkÐDlÐlwÐxð  ADð  xEð  EGð  HØ—j‘jÒ& BØ!×5Ñ5Ò;¸ôð ð <r6   c                ól	  — |sy|t         k(  rd| _        y| j                  j                  €.| j                  j	                  t        j                  «       ¬«       	 t        |«      }t        |«      �rþ| j                  €t        d«      ‚| j                  j                  | j                  || j                  ¬«      }d|v rHt        |dd«      }|�9t        j                  || j                   | j"                  ¬«      }t%        |d|«       t        |dd«      }|t&        j(                  k(  r2t        |d	d«      }t+        |t,        «      r| xj.                  |z  c_        t1        | j                   «      }|t&        j2                  t&        j4                  fv r2t        |d
d«      }	|	�÷t        j6                  |	| j"                  |¬«       nÔ|t&        j8                  k(  r2t        |dd«      }
|
�²t        j6                  |
| j"                  |¬«       n�|t&        j:                  k(  r|t        |dd«      }|�mt+        |t<        «      r1t        j>                  |jA                  d«      | j"                  |«       n,t        j>                  t        |dd«      | j"                  |«       | j                   rÈ| j                   jA                  d«      r­tC        «       }t        |dd«      }||j&                  j2                  |j&                  j4                  fv rht        |d
d«      }|rYt        |dd«      }|rJt+        |t,        «      r:t1        | j                   «      }|r#t        jD                  ||«      }t%        |d|«       t        |dd«      }tC        «       }|rë||j&                  jF                  |j&                  jH                  |j&                  jJ                  fv r¨|| _&        tN        jP                  rV| j                  �Jt        |dd«      }|r;t        |dd«      }|�,	 | j                  jS                  |¬«      }|�t%        |d|«       ||j&                  jJ                  k(  r| jW                  «        |S | jY                  «        |S y# tT        $ r Y ŒIw xY w# tZ        j\                  $ r Y ytT        $ r}| j_                  |«       ‚ d}~ww xY w)z.Process a single chunk of data from the streamNT)Úcompletion_start_timezJresponses_api_provider_config is required to process live streaming chunks)rÄ   Úparsed_chunkrÊ   rÉ   )Úresponses_api_responserz   rÇ   r¡   Údeltarg   )rg   rÇ   r{   Ú
annotationÚpartr   Ú"encrypted_content_affinity_enabledÚencrypted_contentÚusage©ÚresultÚcost)0r   rË   rÊ   rå   Ú_update_completion_start_timer   rÎ   ru   r_   rÌ   Ú
ValueErrorÚtransform_streaming_responserÄ   r£   r   Ú/_update_responses_api_response_id_with_model_idrz   rÇ   Úsetattrr#   ÚOUTPUT_TEXT_DELTAr[   rF   rÑ   r|   ÚOUTPUT_ITEM_ADDEDÚOUTPUT_ITEM_DONEÚ#_encode_container_id_on_output_itemÚOUTPUT_TEXT_ANNOTATION_ADDEDÚCONTENT_PART_DONEr\   Ú$_encode_container_ids_in_annotationsry   rY   Ú%_wrap_encrypted_content_with_model_idÚRESPONSE_COMPLETEDÚRESPONSE_INCOMPLETEÚRESPONSE_FAILEDrÍ   rº   Úinclude_cost_in_streaming_usageÚ_response_cost_calculatorÚ	ExceptionÚ_handle_logging_failed_responseÚ"_handle_logging_completed_responsern   ÚJSONDecodeErrorÚ_handle_failure)r2   Úchunkræ   Úopenai_responses_api_chunkÚresponse_objectrÉ   Ú_event_typeÚ_deltaÚ_stream_model_idÚ_itemÚ_annotationÚ_partrX   Ú
event_typerg   rì   r{   Úwrapped_contentÚ_chunk_typeÚresponse_objÚ	usage_objrð   Úes                          r4   Ú_process_chunkz0BaseResponsesAPIStreamingIterator._process_chunký   sº  € áØð Ô*Ò*Ø ˆDŒMØà×Ñ×1Ñ1Ð9Ø×Ñ×:Ñ:ÔQY×Q]ÑQ]ÓQ_Ð:Ô`ðH	ä"2°5Ó"9ˆLô ˜|Õ,Ø×5Ñ5Ð=Ü$Ð%qÓrÐrØ48×4VÑ4V×4sÑ4sØŸ*™*Ø!-Ø $× 0Ñ 0ð 5tó 5Ð*ð  Ñ-ÜJQØ2°JÀóK�Oð 'Ð2Ü*B×*rÑ*rØ3BØ-1×-BÑ-BØ04×0HÑ0Hô+˜ô
  Ð :¸JÈÔQô &-Ð-GÈÐQUÓ%V�ØÔ":×"LÑ"LÒLÜ$+Ð,FÈÐQUÓ$V�FÜ! &¬#Ô.Ø×/Ò/°6Ñ9Õ/Ü*AÀ$×BWÑBWÓ*XÐ ØÜ,×>Ñ>Ü,×=Ñ=ð#ñ ô $+Ð+EÀvÈtÓ#T�EØÐ(Ü0×TÑTØ!&Ø04×0HÑ0HØ%5öð
 !Ô$<×$YÑ$YÒYÜ)0Ð1KÈ\Ð[_Ó)`�KØ"Ð.Ü0×TÑTØ!,Ø04×0HÑ0HØ%5öð
 !Ô$<×$NÑ$NÒNÜSZØ2°F¸DóT�Eð Ð(Ü% e¬TÔ2Ü4×YÑYØ %§	¡	¨-Ó 8Ø $× 8Ñ 8Ø 0õô 5×YÑYÜ '¨¨}¸dÓ CØ $× 8Ñ 8Ø 0ôð ×(Ò(¨T×-BÑ-B×-FÑ-FÐGkÔ-lÜ#=Ó#?�LÜ(/Ð0JÈFÐTXÓ(Y�JØ!Ø$×=Ñ=×OÑOØ$×=Ñ=×NÑNð&ñ ô 6=Ð=WÐY_ÐaeÓ5f˜ÙÜ7>¸tÐEXÐZ^Ó7_Ð-Ù0´ZÐ@QÔSVÔ5WÜ2IÈ$×J_ÑJ_Ó2` Ù#+ä(@×(fÑ(fØ,=¸xó)*ð %4ô
 %,¨DÐ2EÀÔ$Wô &-Ð-GÈÐQUÓ%V�Ü9Ó;�Ù-°+Ø ×9Ñ9×LÑLØ ×9Ñ9×MÑMØ ×9Ñ9×IÑIðBñ 3ð
 /I�DÔ+ä×>Ò>À4×CSÑCSÐC_ÜKRØ6¸
ÀDóL˜ñ (ÜHOÐP\Ð^eÐgkÓHl˜IØ(Ð4ð!)Ø@D×@PÑ@P×@jÑ@jØ/;ð Akó A& Dð (,Ð'7Ü(/°	¸6À4Ô(Hð
 # l×&KÑ&K×&[Ñ&[Ò[Ø×<Ñ<Ô>ð 2Ð1ð ×?Ñ?ÔAà1Ð1àøô (1ò !)á$(ð!)ûô ×#Ñ#ò 	áÜò 	ð × Ñ  Ô#Øûð		úsI   ÁN,Q? Ð+Q0 Ð2*Q? ÑQ? Ñ0	Q<Ñ9Q? Ñ;Q<Ñ<Q? Ñ?R3ÒR3ÒR.Ò.R3c          	     ó0  — | j                   ry d| _         | j                  r| j                  |¬«       | j                  }| j                  �St	        | j                  d«      r=	 t        | j                  «      j                  | j                  j                  «       «      }t        j                  «       }|rHt        j                  | j                  j                  || j                  || j                   d¬«      «       nzt#        | j                  j$                  || j                  || j                   ¬«       t'        j(                  | j                  j*                  || j                   | j                  |¬«       | j-                  |¬«       y # t        $ r Y Œöw xY w)NT©Úis_asyncÚ
model_dump)rÁ   Úend_timeÚ	cache_hitÚprefer_async_handlers)Úasync_functionrï   rÁ   r  r  )rï   r  rÁ   r  )r  )rÓ   rÕ   Ú$_persist_completed_response_to_cacherÍ   Úhasattrr¡   Úmodel_validater  r  r   rÎ   ÚasyncioÚcreate_taskrÊ   Údispatch_success_handlersrÁ   rÔ   r   Úasync_success_handlerr   ÚsubmitÚsuccess_handlerÚ_run_post_success_hooks)r2   r  Úlogging_responser  s       r4   Ú_log_completed_responsez9BaseResponsesAPIStreamingIterator._log_completed_response™  sd  € Ø×*Ò*ØØ*.ˆÔ'à×:Ò:Ø×5Ñ5¸xÐ5ÔHð  ×2Ñ2ÐØ×"Ñ"Ð.´7¸4×;RÑ;RÐT`Ô3aðÜ#'¨×(?Ñ(?Ó#@×#OÑ#OÐPT×PgÑPg×PrÑPrÓPtÓ#uÐ ô
 #Ÿ,™,›.ˆÙÜ×ÑØ× Ñ ×:Ñ:Ø$Ø#Ÿ™Ø%Ø"×@Ñ@Ø*.ð ;ó õô Ø#×/Ñ/×EÑEØ'ØŸ?™?Ø!Ø×<Ñ<õô �O‰OØ× Ñ ×0Ñ0Ø'Ø×<Ñ<ØŸ?™?Ø!õð 	×$Ñ$¨hÐ$Õ7øô= ò áðús   Á"<F	 Æ		FÆFc                 ó   — y)z8Base implementation - should be overridden by subclassesNr1   ©r2   s    r4   r  zDBaseResponsesAPIStreamingIterator._handle_logging_completed_responseÊ  rE   r6   c                óÒ   — | j                   rt        | j                   dd«      nd}|rt        |dd«      nd}| j                  |«       | j                  | j	                  |«      «       y)an  
        Handle logging for RESPONSE_FAILED events by routing to failure handlers.

        Unlike _handle_logging_completed_response (which calls success handlers),
        this constructs an exception from the response error and routes to
        async_failure_handler / failure_handler so logging integrations correctly
        record the call as failed.
        rÉ   Nr�   )rÍ   r£   Ú_record_failed_response_usager  Ú_map_error_event_exception)r2   r  Ú
error_infos      r4   r  zABaseResponsesAPIStreamingIterator._handle_logging_failed_responseÍ  sf   € ð CG×BYÒBYŒG�D×+Ñ+¨Z¸Ô>Ð_cð 	ñ EQœG L°'¸4Ô@ÐVZˆ
Ø×*Ñ*¨<Ô8Ø×Ñ˜T×<Ñ<¸ZÓHÕIr6   c                ón  — |�| j                   €y t        |dd «      }|€y 	 t        j                  |«      | j                   j                  d<   | j                   j                  |¬«      xs d| j                   j                  d<   y # t
        t        f$ r }t        j                  d|«       Y d }~y d }~ww xY w)Nrí   Úcombined_usage_objectz6could not record usage for failed responses stream: %srî   g        Úresponse_cost)
rÊ   r£   r   Ú+_transform_response_api_usage_to_chat_usagerÚ   Ú	TypeErrorrò   r€   Údebugr  )r2   r  r  Úusage_errors       r4   r/  z?BaseResponsesAPIStreamingIterator._record_failed_response_usageÝ  s½   € ØÐ 4×#3Ñ#3Ð#;ØÜ4;¸LÈ'ÐSWÓ4Xˆ	ØÐØð		ä'×SÑSÐT]Ó^ð ×Ñ×/Ñ/Ð0GÑHð ×Ñ×6Ñ6¸lÐ6ÓKÒRÈsð 	×Ñ×+Ñ+¨OÒ<øô œ:Ð&ò 	Ü× Ñ ØHØôô ûð	ús   ¡,B ÂB4ÂB/Â/B4c                ó  — ddl m} t        |«      \  }}}t        ||«      }|||dœ} ||d|› d|› d�|¬«      }	 t	        j
                  | j                  xs d| j                  xs d|i i ¬	«      S # t        $ r}	|	cY d }	~	S d }	~	ww xY w)
Nr   )ÚBaseLLMException)r    r¡   r¢   zError code: z - {'error': ú})r¹   r    ÚbodyrÂ   )rÄ   rÇ   Úoriginal_exceptionÚcompletion_kwargsÚextra_kwargs)	Ú)litellm.llms.base_llm.chat.transformationr:  r©   r·   rº   Úexception_typerÄ   rÇ   r  )
r2   r¤   r:  Úerror_messager¨   rµ   r¹   Ú
error_bodyÚprovider_exceptionr¼   s
             r4   r0  z<BaseResponsesAPIStreamingIterator._map_error_event_exceptionñ  s¥   € ÝNä0CÀIÓ0NÑ-ˆ�z :Ü:¸:ÀzÓRˆØ(5¸zÐS]Ñ^ˆ
Ù$4Ø#Ø" ; -¨~¸j¸\ÈÐLØô%
Ðð
		$Ü×)Ñ)Ø—j‘jÒ& BØ$(×$<Ñ$<Ò$BÀØ#5Ø"$Øôð øô ò 	$Ø#Õ#ûð	$ús   »5A1 Á1	BÁ:BÁ;BÂBc                óL  — t        |dd «      }|dvry |dk(  rt        t        |dd «      dd «      nt        |dd «      }| j                  |«      }t        |«      s|‚t        t	        |«      | j
                  xs d| j                  xs d|| j                  | j                   ¬«      ‚)Nr¡   )r�   úresponse.failedrF  rÉ   r�   rÂ   )r    rÄ   rà   r=  Úgenerated_contentÚis_pre_first_chunk)	r£   r0  r½   r   rF   rÄ   rÇ   rÑ   rÐ   )r2   rï   Ú
chunk_typer¤   r¼   s        r4   Ú_maybe_raise_for_error_eventz>BaseResponsesAPIStreamingIterator._maybe_raise_for_error_event  s¹   € Ü# F¨F°DÓ9ˆ
ØÐ9Ñ9Øð Ð.Ò.ô ”G˜F J°Ó5°wÀÔEä˜ ¨$Ó/ð 	ð #'×"AÑ"AÀ)Ó"LÐÜ,Ð-=Ô>Ø"Ð"Ü$ÜÐ(Ó)Ø—*‘*Ò" Ø×1Ñ1Ò7°RØ/Ø"×5Ñ5Ø#'×#<Ñ#<Ð<ô
ð 	
r6   c                óª   — t        «       }| j                  }t        ||j                  «      r|S t	        |dd «      }t        ||j                  «      r|S y )NrÉ   )rY   rÍ   r[   r"   r£   )r2   rX   rÍ   r  s       r4   Ú_get_completed_response_objectz@BaseResponsesAPIStreamingIterator._get_completed_response_object  sU   € Ü8Ó:ˆØ$(×$;Ñ$;ÐÜÐ(¨,×*KÑ*KÔLØ%Ð%ä%Ð&8¸*ÀdÓKˆÜ�l L×$EÑ$EÔFØÐàr6   c          	     ó\  ‡	‡
‡‡— | j                   ry | j                  }t        «       }t        |dd «      |j                  j
                  k7  ry | j                  «       }|€y t        | j                  dd «      Š‰€y t        ‰dd «      Št        ‰«      r‰j                  d«      dury ‰j                  «       Št        ‰dd «      }‰j                  dd «      }|€|}‰j                  d«      €‰j                  dd «       ‰j                  d	d «       |�|‰d<   ‰j                  ‰j                  ‰¬
«      sy t        j                  Š	‰	€y |j!                  «       Š
|r.ddlm}  |ˆ	ˆ
ˆˆfd„«      }|j'                  d„ «       d| _         y  ‰	j(                  ‰
fdt        ‰dd «      i‰¤Ž d| _         y )Nr¡   Ú_llm_caching_handlerÚrequest_kwargsÚstreamTÚpreset_cache_keyÚ	cache_keyÚmetadatarÇ   )r.   r3   r   )Úcreate_cache_write_taskc            	     óD   •—  ‰ j                   ‰fdt        ‰dd «      i‰¤ŽS )NÚdynamic_cache_objectÚ
dual_cache)Úasync_add_cacher£   )ÚcacheÚcached_responseÚcaching_handlerrO  s   €€€€r4   ú<lambda>zXBaseResponsesAPIStreamingIterator._persist_completed_response_to_cache.<locals>.<lambda>X  s4   ø€ Ð-˜×-Ñ-Ø#ñä)0°À,ÐPTÓ)Uðð %ñ€ r6   c                ó   — t        | d¬«      S )NzResponses stream cache write)rƒ   )r„   )r‚   s    r4   r\  zXBaseResponsesAPIStreamingIterator._persist_completed_response_to_cache.<locals>.<lambda>_  s   € Ô9ØØ<ô€ r6   rV  rW  )rÒ   rÍ   rY   r£   r#   rþ   rL  rÊ   r_   ry   ÚcopyÚpopr5   r.   rº   rY  Úmodel_dump_jsonÚlitellm.caching.caching_handlerrT  Úadd_done_callbackÚ	add_cache)r2   r  rÍ   rX   r  rQ  Úrequest_cache_keyrT  Úcache_write_taskrY  rZ  r[  rO  s            @@@@r4   r   zFBaseResponsesAPIStreamingIterator._persist_completed_response_to_cache*  sÖ  û€ Ø×*Ò*Øà$(×$;Ñ$;ÐÜ8Ó:ˆÜÐ% v¨tÓ4¸×8]Ñ8]×8pÑ8pÒpØà"×AÑAÓCˆØÐØä?FÀt×GWÑGWÐYoÐquÓ?vˆØÐ"Øä  Ð2BÀDÓIˆÜ˜~Ô.°.×2DÑ2DÀXÓ2NÐVZÑ2ZØØ'×,Ñ,Ó.ˆÜ" ?Ð4FÈÓMÐØ#1×#5Ñ#5°kÀ4Ó#HÐØÐ#Ø0ÐØ×Ñ˜jÓ)Ð1Ø×Ñ˜z¨4Ô0Ø×ÑÐ0°$Ô7ØÐ'Ø*:ˆN˜;Ñ'à×<Ñ<Ø-×?Ñ?Ø!ð =ô 
ð ä—}‘}ˆØˆ=Øà!-×!=Ñ!=Ó!?ˆÙÝOá&=öó'Ðð ×.Ñ.ñôð +/ˆÕ'ð ˆE�O‰OØñä%,¨_¸lÈDÓ%Qðð !òð +/ˆÕ'r6   c              ƒ  ó  K  — 	 d}| j                   �	 t        | j                   «      }|€!	 t        t        | j                  dd«      «      }| j                  xs t        | j                  di «      }t        t        dd«      xs g }d}|D ]2  }t        |d«      sŒd}|j                  |||¬«      ƒ d{  –—† }|€Œ1|}Œ4 |rt        |d	d«       |S # t        $ r d}Y Œ´w xY w# t
        $ r d}Y Œ¢w xY w7 Œ># t
        $ r |cY S w xY w­w)
za
        Allow callbacks to modify streaming chunks before returning (parity with chat).
        NrÙ   rÚ   Ú	callbacksFÚ)async_post_call_streaming_deployment_hookT)rØ   Úresponse_chunkrÙ   Ú_post_streaming_hooks_ran)rÙ   r%   rò   r£   rÊ   r  rØ   rº   r!  rh  rõ   )r2   r  Útyped_call_typerØ   rg  Ú	hooks_ranÚcallbackrï   s           r4   Ú$_call_post_streaming_deployment_hookzFBaseResponsesAPIStreamingIterator._call_post_streaming_deployment_hookm  s;  è ø€ ð	à04ˆOØ�~‰~Ð)ð+Ü&/°·±Ó&?�Oð Ð&ð+Ü&/´¸×8HÑ8HÈ+ÐW[Ó0\Ó&]�Oð #'×"3Ñ"3Ò"j´w¸t×?OÑ?OÐQeÐgiÓ7jˆLÜ&¤w°¸TÓBÒHÀbˆIØˆIØ%ò 	'�Ü˜8Ð%PÕQØ $�IØ#+×#UÑ#UØ%1Ø',Ø"1ð $Vó $÷ �Fð
 Ñ)Ø &™ð	'ñ Ü˜Ð:¸DÔAØˆLøô/ "ò +Ø&*’Oð+ûô
 !ò +Ø&*’Oð+úðùô ò 	ØŠLð	üs†   ‚D„C3 “C ¨C3 « C  ÁAC3 ÂC3 Â2C1Â3C3 Â:C3 ÃDÃCÃC3 ÃCÃC3 Ã C.Ã+C3 Ã-C.Ã.C3 Ã3DÃ>DÄ DÄDc              ƒ  ó@   K  — | j                  |«      ƒ d{  –—† S 7 Œ­w)zY
        Helper to invoke streaming deployment hooks explicitly (used in tests).
        N)rn  )r2   r  s     r4   Ú%call_post_streaming_hooks_for_testingzGBaseResponsesAPIStreamingIterator.call_post_streaming_hooks_for_testing”  s   è ø€ ð ×>Ñ>¸uÓE×EÐEÐEús   ‚—˜c                ój  — | j                   €yi }t        | j                  t        «      r|j	                  | j                  «       	 t        | j                  d«      r%|j	                  | j                  j                  «       d|vr+	 t        | j                  di «      j                  di «      |d<   	 t        | j                   | j                  | j                  || j                  |¬«       	 d}| j                  �	 t        | j                  «      }|€	 t        j"                  }	 t%        t&        || j                   |¬«       y# t        $ r Y ŒËw xY w# t        $ r i |d<   Y Œ°w xY w# t        $ r Y Œ…w xY w# t         $ r d}Y Œqw xY w# t        $ r d}Y Œ‚w xY w# t        $ r d}Y Œ€w xY w# t        $ r Y yw xY w)z^
        Run post-call deployment hooks and update metadata similar to chat pipeline.
        NrÚ   rÃ   )rï   rÊ   rÄ   r3   rÁ   r  )r  rØ   rÉ   rÙ   )rÍ   r[   rØ   r\   Úupdater!  rÊ   rÚ   r  r£   ry   r   rÄ   rÁ   rÙ   r%   rò   Ú	responsesr   r&   )r2   r  Úrequest_payloadrk  s       r4   r)  z9BaseResponsesAPIStreamingIterator._run_post_success_hooksœ  sË  € ð ×"Ñ"Ð*Øà46ˆÜ�d×'Ñ'¬Ô.Ø×"Ñ" 4×#4Ñ#4Ô5ð	Ü�t×'Ñ'Ð)=Ô>Ø×&Ñ& t×'7Ñ'7×'JÑ'JÔKð  ?Ñ2ð7Ü4;¸D×<LÑ<LÐNbÐdfÓ4g×4kÑ4kØ$ bó5�Ð 0Ñ1ð	Ü$Ø×.Ñ.Ø ×,Ñ,Ø—j‘jØ&ØŸ?™?Ø!õð	#Ø04ˆOØ�~‰~Ð)ð+Ü&/°·±Ó&?�Oð
 Ð"ð'Ü"+×"5Ñ"5�ð		äÜFØ,Ø×0Ñ0Ø)ö	øôQ ò 	Ùð	ûô ò 7Ø46�Ð 0Ó1ð7ûô ò 	áð	ûô "ò +Ø&*’Oð+ûäò 	#Ø"ŠOð	#ûô
 ò 'Ø"&’ð'ûô ò 	Ùð	úsŠ   Á;E Â*E Â19E$ Ã+F Ã:E3 ÄF Ä#F& Å	EÅEÅE!Å E!Å$	E0Å/E0Å3FÅ>F Æ FÆF ÆFÆFÆF#Æ"F#Æ&	F2Æ1F2c                ó¦  — | j                   ryd| _         t        j                  «       }	 t        | j                  j
                  ||| j                  t        j                  «       ¬«       	 t        j                  | j                  j                  ||| j                  t        j                  «       «       y# t        $ r Y ŒVw xY w# t        $ r Y yw xY w)z‰
        Trigger failure handlers before bubbling the exception.
        Only calls handlers once even if called multiple times.
        NT)r  r   Útraceback_exceptionrÁ   r  )rÏ   Ú	tracebackÚ
format_excr   rÊ   Úasync_failure_handlerrÁ   r   rÎ   r  r   r'  Úfailure_handler)r2   r   rv  s      r4   r  z1BaseResponsesAPIStreamingIterator._handle_failureÚ  s¶   € ð × Ò ØØ $ˆÔä%.×%9Ñ%9Ó%;Ðð		ÜØ#×/Ñ/×EÑEØ#Ø$7ØŸ?™?Ü!Ÿ™›õð		Ü�O‰OØ× Ñ ×0Ñ0ØØ#Ø—‘Ü—‘“õøô	 ò 	Ùð	ûô ò 	Ùð	ús%   ªA B5 Á+A	C Â5	CÃ CÃ	CÃC©NNNN)rÉ   úhttpx.ResponserÄ   rF   rÌ   zBaseResponsesAPIConfig | NonerÊ   ÚLiteLLMLoggingObjrz   údict[str, object] | NonerÇ   rP   rØ   r~  rÙ   rP   ©r8   rR   )r  rF   r8   ú$ResponsesAPIStreamingResponse | None)r  r9   r8   rR   )r  úResponsesAPIResponse | Noner8   rR   )r¤   Úobjectr8   r  )rï   r‚  r8   rR   )r8   r�  )r  r$   r8   r$   )r  r   )r   r  )r:   r;   r<   r=   rÞ   rã   r  r+  r  r  r/  r0  rJ  rL  r   rn  rp  r)  r  r1   r6   r4   r¿   r¿   º   sÜ   „ ñð 6:Ø*.Ø15Ø $ð.
à ð.
ð ð.
ð (Eð	.
ð
 'ð.
ð 3ð.
ð (ð.
ð /ð.
ð ó.
ó`
óZóx/8òbGòJó 
ó($ó,
ó.
óA/ðF%Ø2ð%à	&ó%ðNFØ2ðFà	&óFó<ô|r6   r¿   c              ƒ  óP   K  — t        | dd«      }|€|S  ||«      ƒ d{  –—† S 7 Œ­w)zg
    Module-level helper for tests to ensure hooks can be invoked even if the iterator is wrapped.
    rn  N)r£   )Úiteratorr  Úhook_fns      r4   rp  rp  ü  s6   è ø€ ô 	�Ð@À$ÓGð ð €ØˆÙ˜“×ÐÐús   ‚&Ÿ$ &c                  ó`   ‡ — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd„ Zdd„Zd„ Zˆ xZS )	ÚResponsesAPIStreamingIteratorzS
    Async iterator for processing streaming responses from the Responses API.
    c	           
     óŠ   •— t         ‰	| �  ||||||||«       t        «       j                  |j                  «       «      | _        y r0   )ÚsuperrÞ   r   Úaiter_bytesÚstream_iterator©
r2   rÉ   rÄ   rÌ   rÊ   rz   rÇ   rØ   rÙ   Ú	__class__s
            €r4   rÞ   z&ResponsesAPIStreamingIterator.__init__  sJ   ø€ ô 	‰ÑØØØ)ØØØØØô		
ô  *›|×7Ñ7¸×8LÑ8LÓ8NÓOˆÕr6   c                ó   — | S r0   r1   r-  s    r4   Ú	__aiter__z'ResponsesAPIStreamingIterator.__aiter__&  ó   € Øˆr6   c              ƒ  ó  K  — 	 | j                  «        	 	 | j                  j                  «       ƒ d {  –—† }| j                  «        | j                  |j                  «      }| j                  rt        ‚|�4| j                  |«       | j                  |¬«      ƒ d {  –—† }d| _	        |S Œ—7 Œx# t        $ r d| _        t        ‚w xY w7 Œ*# t        $ r ‚ t        j                  t        j                  f$ r1}d| _        | j                  €| j                  |«       ‚ t        |‚d }~wt        j                  $ r}d| _        | j                  |«       |‚d }~wt         $ r}d| _        | j                  |«       |‚d }~ww xY w­w)NT)r  )rã   r‹  Ú	__anext__ÚStopAsyncIterationrË   r  ÚdatarJ  rn  rÐ   ÚhttpxÚ	ReadErrorÚRemoteProtocolErrorrÍ   r  Ú	HTTPErrorr  ©r2   Ússerï   r  s       r4   r’  z'ResponsesAPIStreamingIterator.__anext__)  su  è ø€ ð+	Ø×.Ñ.Ô0Øð-Ø $× 4Ñ 4× >Ñ >Ó @×@�Cð
 ×2Ñ2Ô4Ø×,Ñ,¨S¯X©XÓ6�à—=’=Ü,Ð,ØÐ'Ø×5Ñ5°fÔ=ð $(×#LÑ#LØ$ð $Mó $÷ �Fð 15�DÔ-Ø!�Mð+ ð AùÜ)ò -Ø$(�D”MÜ,Ð,ð-úðùô "ò 	àÜ—‘¤×!:Ñ!:Ð;ò 	,Ø ˆDŒMØ×&Ñ&Ð.Ø×$Ñ$ QÔ'ØÜ$¨!Ð+ûÜ�‰ò 	à ˆDŒMØ× Ñ  Ô#ØˆGûÜò 	Ø ˆDŒMØ× Ñ  Ô#ØˆGûð	üsy   ‚F „C
 –B. ³B,´B. ¸A%C
 ÂCÂC
 Â*F Â+C
 Â,B. Â.CÃC
 Ã
,E=Ã6,D"Ä"E=Ä8EÅE=ÅE8Å8E=Å=F c                ó(   — | j                  d¬«       y)z7Handle logging for completed responses in async contextTr  N©r+  r-  s    r4   r  z@ResponsesAPIStreamingIterator._handle_logging_completed_responseW  s   € à×$Ñ$¨dÐ$Õ3r6   r{  ©rÉ   r|  rÄ   rF   rÌ   r   rÊ   r}  rz   r~  rÇ   rP   rØ   r~  rÙ   rP   ©r8   r$   )	r:   r;   r<   r=   rÞ   r�  r’  r  Ú__classcell__©r�  s   @r4   r‡  r‡  
  s‚   ø„ ñð 6:Ø*.Ø15Ø $ðPà ðPð ðPð (>ð	Pð
 'ðPð 3ðPð (ðPð /ðPð õPò.ó,ö\4r6   r‡  c                  ó^   ‡ — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )Ú!SyncResponsesAPIStreamingIteratorzY
    Synchronous iterator for processing streaming responses from the Responses API.
    c	           
     óŠ   •— t         ‰	| �  ||||||||«       t        «       j                  |j                  «       «      | _        y r0   )r‰  rÞ   r   Ú
iter_bytesr‹  rŒ  s
            €r4   rÞ   z*SyncResponsesAPIStreamingIterator.__init__a  sJ   ø€ ô 	‰ÑØØØ)ØØØØØô		
ô  *›|×6Ñ6°x×7JÑ7JÓ7LÓMˆÕr6   c                ó   — | S r0   r1   r-  s    r4   Ú__iter__z*SyncResponsesAPIStreamingIterator.__iter__x  r�  r6   c                óÔ  — 	 | j                  «        	 	 t        | j                  «      }| j                  «        | j                  |j                  «      }| j                  rt        ‚|�1| j                  |«       t        | j                  |¬«      }d| _
        |S Œ‡# t        $ r d| _        t        ‚w xY w# t        $ r ‚ t        j                  t        j                  f$ r1}d| _        | j                  €| j                  |«       ‚ t        |‚d }~wt        j                   $ r}d| _        | j                  |«       |‚d }~wt"        $ r}d| _        | j                  |«       |‚d }~ww xY w)NT)r  r  )rã   r´   r‹  ÚStopIterationrË   r  r”  rJ  r   rn  rÐ   r•  r–  r—  rÍ   r  r˜  r  r™  s       r4   Ú__next__z*SyncResponsesAPIStreamingIterator.__next__{  sW  € ð+	Ø×.Ñ.Ô0Øð(Ü˜t×3Ñ3Ó4�Cð
 ×2Ñ2Ô4Ø×,Ñ,¨S¯X©XÓ6�à—=’=Ü'Ð'ØÐ'Ø×5Ñ5°fÔ=ä/Ø'+×'PÑ'PØ$ô�Fð 15�DÔ-Ø!�Mð+ øô %ò (Ø$(�D”MÜ'Ð'ð(ûô( ò 	àÜ—‘¤×!:Ñ!:Ð;ò 	'Ø ˆDŒMØ×&Ñ&Ð.Ø×$Ñ$ QÔ'ØÜ QÐ&ûÜ�‰ò 	à ˆDŒMØ× Ñ  Ô#ØˆGûÜò 	Ø ˆDŒMØ× Ñ  Ô#ØˆGûð	úsL   ‚B4 ”B ©A/B4 ÂB4 ÂB1Â1B4 Â4,E'Ã ,DÄE'Ä"D<Ä<E'ÅE"Å"E'c                ó(   — | j                  d¬«       y)z6Handle logging for completed responses in sync contextFr  Nrœ  r-  s    r4   r  zDSyncResponsesAPIStreamingIterator._handle_logging_completed_response©  s   € à×$Ñ$¨eÐ$Õ4r6   r{  r�  )	r:   r;   r<   r=   rÞ   r¦  r©  r  rŸ  r   s   @r4   r¢  r¢  \  s‚   ø„ ñð 6:Ø*.Ø15Ø $ðNà ðNð ðNð (>ð	Nð
 'ðNð 3ðNð (ðNð /ðNð õNò.ò,ö\5r6   r¢  c                  ó€   ‡ — e Zd ZdZdZ	 	 	 	 d		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
ˆ fd„Z	 	 	 	 	 	 dd„Zd„ Zdd„Zd„ Z	d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.
    é   c	           
     ó¨   •— |j                  |||¬«      }	t        ‰
| �	  t        j                  d«      |d |||||¬«       | j                  |	|¬«       y )N)rÄ   Úraw_responserÊ   éÈ   ©rÉ   rÄ   rÌ   rÊ   rz   rÇ   rØ   rÙ   ©ÚtransformedrÊ   )Útransform_response_api_responser‰  rÞ   r•  ÚResponseÚ_set_events_from_response)r2   rÉ   rÄ   rÌ   rÊ   rz   rÇ   rØ   rÙ   r³  r�  s             €r4   rÞ   z*MockResponsesAPIStreamingIterator.__init__¸  sn   ø€ ð ;×ZÑZØØ!Ø#ð [ó 
ˆô
 	‰ÑÜ—^‘^ CÓ(ØØ*.Ø#Ø-Ø 3Ø%Øð 	ô 		
ð 	×&Ñ&°;ÈKÐ&ÕXr6   c                ót   — t        ||| j                  ¬«      | _        d| _        | j                  d   | _        y ©N)r³  rÊ   Ú
chunk_sizer   éÿÿÿÿ)Ú _build_synthetic_response_eventsÚ
CHUNK_SIZEÚ_eventsÚ_idxrÍ   ©r2   r³  rÊ   s      r4   r¶  z;MockResponsesAPIStreamingIterator._set_events_from_responseÔ  s8   € ô
 =]Ø#Ø#Ø—‘ô=
ˆŒð
 ˆŒ	Ø"&§,¡,¨rÑ"2ˆÕr6   c                ó   — | S r0   r1   r-  s    r4   r�  z+MockResponsesAPIStreamingIterator.__aiter__á  r�  r6   c              ƒ  óH  K  — | j                   t        | j                  «      k\  rt        ‚| j                  | j                      }| xj                   dz  c_         t	        «       }t        |dd «      |j                  j                  k(  r|| _        | j                  d¬«       |S ­w©NrS   r¡   Tr  ©
r¾  Úlenr½  r“  rY   r£   r#   rþ   rÍ   r+  ©r2   ÚevtrX   s      r4   r’  z+MockResponsesAPIStreamingIterator.__anext__ä  óƒ   è ø€ Ø�9‰9œ˜DŸL™LÓ)Ò)Ü$Ð$Ø—\‘\ $§)¡)Ñ,ˆØ�	Š	�Q‰�	Ü8Ó:ˆÜ�3˜ Ó%¨×)NÑ)N×)aÑ)aÒaØ&)ˆDÔ#Ø×(Ñ(°$Ð(Ô7Øˆ
ùó   ‚B B"c                ó   — | S r0   r1   r-  s    r4   r¦  z*MockResponsesAPIStreamingIterator.__iter__ï  r�  r6   c                ó@  — | j                   t        | j                  «      k\  rt        ‚| j                  | j                      }| xj                   dz  c_         t	        «       }t        |dd «      |j                  j                  k(  r|| _        | j                  d¬«       |S ©NrS   r¡   Fr  ©
r¾  rÄ  r½  r¨  rY   r£   r#   rþ   rÍ   r+  rÅ  s      r4   r©  z*MockResponsesAPIStreamingIterator.__next__ò  ó   € Ø�9‰9œ˜DŸL™LÓ)Ò)ÜÐØ—\‘\ $§)¡)Ñ,ˆØ�	Š	�Q‰�	Ü8Ó:ˆÜ�3˜ Ó%¨×)NÑ)N×)aÑ)aÒaØ&)ˆDÔ#Ø×(Ñ(°%Ð(Ô8Øˆ
r6   r{  r�  ©r³  r"   rÊ   r}  r8   rR   rž  )r:   r;   r<   r=   r¼  rÞ   r¶  r�  r’  r¦  r©  rŸ  r   s   @r4   r¬  r¬  ®  s®   ø„ ñð €Jð 6:Ø*.Ø15Ø $ðYà ðYð ðYð (>ð	Yð
 'ðYð 3ðYð (ðYð /ðYð õYð83à)ð3ð 'ð3ð 
ó	3òó	ò÷	r6   r¬  c                  óX   — e Zd Z	 	 d	 	 	 	 	 	 	 d	d„Z	 	 	 	 	 	 d
d„Zd„ Zdd„Zd„ Zdd„Zy)Ú#CachedResponsesAPIStreamingIteratorNc                óÚ   — t         j                  | t        j                  d«      t	        |dd«      d |d d||¬«	       d| _        d| _        g | _        d| _        | j                  ||¬	«       y )
Nr°  rÄ   rÂ   rZ  r±  TFr   r²  )
r¿   rÞ   r•  rµ  r£   rÔ   rÕ   r½  r¾  r¶  )r2   rÉ   rÊ   rØ   rÙ   s        r4   rÞ   z,CachedResponsesAPIStreamingIterator.__init__ÿ  sw   € ô 	*×2Ñ2ØÜ—^‘^ CÓ(Ü˜( G¨RÓ0Ø*.Ø#Ø!Ø 1Ø%Øð 	3ô 
	
ð .2ˆÔ*Ø:?ˆÔ7Ø<>ˆŒØˆŒ	Ø×&Ñ&°8ÈÐ&ÕUr6   c                ó|   — t        ||t        j                  ¬«      | _        d| _        | j                  d   | _        y r¸  )r»  r¬  r¼  r½  r¾  rÍ   r¿  s      r4   r¶  z=CachedResponsesAPIStreamingIterator._set_events_from_response  s9   € ô
 8Ø#Ø#Ü8×CÑCô
ˆŒð
 ˆŒ	Ø"&§,¡,¨rÑ"2ˆÕr6   c                ó   — | S r0   r1   r-  s    r4   r�  z-CachedResponsesAPIStreamingIterator.__aiter__$  r�  r6   c              ƒ  óH  K  — | j                   t        | j                  «      k\  rt        ‚| j                  | j                      }| xj                   dz  c_         t	        «       }t        |dd «      |j                  j                  k(  r|| _        | j                  d¬«       |S ­wrÂ  rÃ  rÅ  s      r4   r’  z-CachedResponsesAPIStreamingIterator.__anext__'  rÇ  rÈ  c                ó   — | S r0   r1   r-  s    r4   r¦  z,CachedResponsesAPIStreamingIterator.__iter__2  r�  r6   c                ó@  — | j                   t        | j                  «      k\  rt        ‚| j                  | j                      }| xj                   dz  c_         t	        «       }t        |dd «      |j                  j                  k(  r|| _        | j                  d¬«       |S rË  rÌ  rÅ  s      r4   r©  z,CachedResponsesAPIStreamingIterator.__next__5  rÍ  r6   )NN)rÉ   r"   rÊ   r}  rØ   r~  rÙ   rP   rÎ  rž  )	r:   r;   r<   rÞ   r¶  r�  r’  r¦  r©  r1   r6   r4   rÐ  rÐ  þ  so   „ ð
 26Ø $ðVà&ðVð 'ðVð /ð	Vð
 óVð03à)ð3ð 'ð3ð 
ó	3òó	òô	r6   rÐ  c                  ó   — e Zd Zddœdd„Zy)Ú_HasModelDump.©Úexclude_nonec                ó   — y r0   r1   ©r2   rÚ  s     r4   r  z_HasModelDump.model_dumpC  rE   r6   N)rÚ  r9   r8   údict[str, object])r:   r;   r<   r  r1   r6   r4   rØ  rØ  A  s   „ à14ÖOr6   rØ  c                  ó   — e Zd Zddœdd„Zy)Ú_HasModelDumpJson.rÙ  c                ó   — y r0   r1   rÜ  s     r4   r`  z!_HasModelDumpJson.model_dump_jsonH  rE   r6   N)rÚ  r9   r8   rF   )r:   r;   r<   r`  r1   r6   r4   rß  rß  F  s   „ à69ÖFr6   rß  c                ó`   — t        | t        «      r| j                  «       S t        | «      r| S i S r0   )r[   rØ  r  r_   )Úobjs    r4   Ú_dump_response_objectrã  K  s+   € Ü�#”}Ô%Ø�~‰~ÓÐÜ�sÔØˆ
Ø€Ir6   c                óÀ   — t        «       }|j                  ddg dœ¬«      }| |j                  j                  k(  r|j	                  | |¬«      S |j                  | |¬«      S )NTÚin_progress)ÚstatusÚoutput)Údeeprr  ©r¡   rÉ   )rY   Ú
model_copyr#   ÚRESPONSE_CREATEDÚResponseCreatedEventÚResponseInProgressEvent)r  r³  rX   Úin_progress_responses       r4   Ú_build_response_status_eventrï  S  sq   € ô 5Ó6€LØ"-×"8Ñ"8ØØ'°2Ñ6ð #9ó #Ðð �\×:Ñ:×KÑKÒKØ×0Ñ0°jÐK_Ð0Ó`Ð`Ø×/Ñ/°ZÐJ^Ð/Ó_Ð_r6   c                ó^  — t        «       }|j                  d«      }|dk(  rt|j                  dg «      xs g D �cg c]  } |j                  di |¤Ž‘Œ }}|j                  dt	        |j                  d«      xs d«      ||j                  d«      ¬«      }nk|dk(  r0|j                  dt	        |j                  d«      xs d«      ¬	«      }n6|d
k(  r0|j                  d
t	        |j                  d«      xs d«      ¬«      }ny |j                  |j                  j                  | |||¬«      S c c}w )Nr¡   Úoutput_textr   rB   rÂ   Úlogprobs)r¡   rB   r   rò  Úrefusal)r¡   ró  Úreasoning_textÚ	reasoning)r¡   rõ  ©r¡   Úitem_idÚoutput_indexÚcontent_indexrê   r1   )
rY   ry   ÚBaseLiteLLMOpenAIResponseObjectÚContentPartDonePartOutputTextrF   ÚContentPartDonePartRefusalÚ ContentPartDonePartReasoningTextÚContentPartDoneEventr#   rû   )	r÷  rø  rù  Úpart_payloadrX   Ú	part_typeré   r   rê   s	            r4   Ú_build_content_part_done_eventr  d  sZ  € ô 5Ó6€LØ#×'Ñ'¨Ó/€Ià�MÒ!ð +×.Ñ.¨}¸bÓAÒGÀRö
àð 9ˆL×8Ñ8ÑF¸:ÓFð
ˆð 
ð ×9Ñ9ØÜ�\×%Ñ% fÓ-Ò3°Ó4Ø#Ø!×%Ñ% jÓ1ð	 :ó 
‰ð 
�iÒ	Ø×6Ñ6ØÜ˜×(Ñ(¨Ó3Ò9°rÓ:ð 7ó 
‰ð 
Ð&Ò	&Ø×<Ñ<Ø!Ü˜,×*Ñ*¨;Ó7Ò=¸2Ó>ð =ó 
‰ð
 à×,Ñ,Ø×2Ñ2×DÑDØØ!Ø#Øð -ó ð ùò/
s   ¹D*c                óÞ  — t        «       }|j                  d«      }|dk(  �rt        |j                  d«      xs d«      }t        dt	        |«      |«      D ]A  }	| j                  |j                  |j                  j                  |||||	|	|z    ¬«      «       ŒC |j                  dg «      xs g }
t        |
«      D ]?  \  }}| j                  |j                  |j                  j                  |||||¬«      «       ŒA | j                  |j                  |j                  j                  ||||¬	«      «       y |d
k(  r²t        |j                  d
«      xs d«      }t        dt	        |«      |«      D ]A  }	| j                  |j                  |j                  j                  |||||	|	|z    ¬«      «       ŒC | j                  |j!                  |j                  j"                  ||||¬«      «       y y )Nr¡   rñ  rB   rÂ   r   )r¡   r÷  rø  rù  rè   r   )r¡   r÷  rø  rù  Úannotation_indexré   )r¡   r÷  rø  rù  rB   ró  )r¡   r÷  rø  rù  ró  )rY   ry   rF   ÚrangerÄ  ÚappendÚOutputTextDeltaEventr#   rö   Ú	enumerateÚOutputTextAnnotationAddedEventrú   ÚOutputTextDoneEventÚOUTPUT_TEXT_DONEÚRefusalDeltaEventÚREFUSAL_DELTAÚRefusalDoneEventÚREFUSAL_DONE)Úeventsr÷  rø  rù  rÿ  r¹  rX   r   rB   ÚiÚannotations_payloadr  ré   ró  s                 r4   Ú_add_text_like_part_eventsr  �  s  € ô 5Ó6€LØ#×'Ñ'¨Ó/€IØ�MÓ!Ü˜,×*Ñ*¨6Ó2Ò8°bÓ9ˆÜ�qœ#˜d›) ZÓ0ò 		ˆAØ�M‰MØ×1Ñ1Ø%×>Ñ>×PÑPØ#Ø!-Ø"/Ø˜q 1 z¡>Ð2ð 2ó õð		ð CO×BRÑBRÐS`ÐbdÓBeÒBkÐikÐÜ,5Ð6IÓ,Jò 
	Ñ(Ð˜jØ�M‰MØ×;Ñ;Ø%×>Ñ>×[Ñ[Ø#Ø!-Ø"/Ø%5Ø)ð <ó õ	ð
	ð 	�‰Ø×,Ñ,Ø!×:Ñ:×KÑKØØ)Ø+Øð -ó õ	
ð 
�iÒ	Ü˜\×-Ñ-¨iÓ8Ò>¸BÓ?ˆÜ�qœ#˜g›,¨
Ó3ò 		ˆAØ�M‰MØ×.Ñ.Ø%×>Ñ>×LÑLØ#Ø!-Ø"/Ø! ! a¨*¡nÐ5ð /ó õð		ð 	�‰Ø×)Ñ)Ø!×:Ñ:×GÑGØØ)Ø+Øð *ó õ	
ð 
 r6   c                ó&	  — t        «       }t        j                  r@|�>t        | d«      r| j                  nd }|�"	 |j                  | ¬«      }|�t        |d|«       t        |j                  j                  | «      t        |j                  j                  | «      g}d}t        | dg «      xs g }t        |«      D �]Ž  \  }	}
t        |
«      }t        |j!                  d«      xs | j"                  «      }|j!                  d«      }|j%                  |j'                  |j                  j(                  |	 |j*                  di |¤Ž¬«      «       |d	k(  r³|j!                  d
g «      xs g }t        |«      D ]�  \  }}t        |«      }|j%                  |j-                  |j                  j.                  ||	| |j*                  di |¤Ž¬«      «       t1        |||	|||¬«       t3        ||	||¬«      }|€Œ}|j%                  |«       Œ� �nø|dk(  r±t        |j!                  d«      xs d«      }t5        dt7        |«      |«      D ]@  }|j%                  |j9                  |j                  j:                  ||	||||z    ¬«      «       ŒB |j%                  |j=                  |j                  j>                  ||	|¬«      «       �nB|dk(  �r<|j!                  dg «      xs g }t        |«      D �]  \  }}t        |«      }t        |j!                  d«      xs d«      }t5        dt7        |«      |«      D ]A  }|j%                  |jA                  |j                  jB                  ||	|||||z    ¬«      «       ŒC |dz  }|j%                  |jE                  |j                  jF                  ||	|||¬«      «       |dz  }|j%                  |jI                  |j                  jJ                  ||	|| |j*                  di |¤Ž¬«      «       �Œ |dz  }|j%                  |jM                  |j                  jN                  |	| |j*                  di |¤Ž¬«      «       �Œ‘ |j%                  |jQ                  |j                  jR                  | ¬«      «       |S # t        $ r Y �Œ4w xY w)Nrí   rî   rð   r   rç  rx   r¡   )r¡   rø  rg   r    Úcontentrö  )r  r÷  rø  rù  rÿ  r¹  )r÷  rø  rù  rÿ  Úfunction_callÚ	argumentsrÂ   )r¡   r÷  rø  rè   )r¡   r÷  rø  r  rõ  ÚsummaryrB   )r¡   r÷  rø  Úsummary_indexrè   rS   )r¡   r÷  rø  Úsequence_numberr  rB   )r¡   r÷  rø  r  r  rê   )r¡   rø  r  rg   ré  r1   )*rY   rº   r  r!  rí   r  rõ   r  rï  r#   rë  ÚRESPONSE_IN_PROGRESSr£   r  rã  rF   ry   rx   r  ÚOutputItemAddedEventr÷   rú  ÚContentPartAddedEventÚCONTENT_PART_ADDEDr  r  r  rÄ  ÚFunctionCallArgumentsDeltaEventÚFUNCTION_CALL_ARGUMENTS_DELTAÚFunctionCallArgumentsDoneEventÚFUNCTION_CALL_ARGUMENTS_DONEÚReasoningSummaryTextDeltaEventÚREASONING_SUMMARY_TEXT_DELTAÚReasoningSummaryTextDoneEventÚREASONING_SUMMARY_TEXT_DONEÚReasoningSummaryPartDoneEventÚREASONING_SUMMARY_PART_DONEÚOutputItemDoneEventrø   ÚResponseCompletedEventrþ   )r³  rÊ   r¹  rX   r  rð   r  r  Úoutput_itemsrø  Úoutput_itemÚoutput_item_payloadr÷  Ú	item_typeÚcontent_partsrù  rê   rÿ  Ú
done_eventr  r  Ú	summariesr  r  Úsummary_payloadÚsummary_texts                             r4   r»  r»  Ò  sí  € ô 5Ó6€LÜ×.Ò.°;Ð3JÜ07¸ÀWÔ0M˜;×,Ò,ÐSWˆ	ØÐ ðØ,7×,QÑ,QÐYdÐ,QÓ,e�ØÐ#Ü˜I v¨tÔ4ô
 	% \×%JÑ%J×%[Ñ%[Ð]hÓiÜ$ \×%JÑ%J×%_Ñ%_ÐalÓmð:€Fð
 €OÜ,3°KÀÈ2Ó,NÒ,TÐRT€LÜ%.¨|Ó%<ó k
Ñ!ˆ�kÜ3°KÓ@ÐÜÐ)×-Ñ-¨dÓ3ÒE°{·~±~ÓFˆØ'×+Ñ+¨FÓ3ˆ	à�‰Ø×-Ñ-Ø!×:Ñ:×LÑLØ)ØA�\×AÑAÑXÐDWÑXð .ó ô	
ð ˜	Ò!Ø.A×.EÑ.EÀiÐQSÓ.TÒ.ZÐXZˆMÜ'0°Ó'?ò .Ñ#�˜tÜ4°TÓ:�Ø—‘Ø ×6Ñ6Ø)×BÑB×UÑUØ 'Ø%1Ø&3ØI˜\×IÑIÑYÈLÑYð 7ó ôô +Ø!Ø#Ø!-Ø"/Ø!-Ø)õô <Ø#Ø!-Ø"/Ø!-ô	�
ð Ñ)Ø—M‘M *Õ-ò5.ð6 ˜/Ò)ÜÐ/×3Ñ3°KÓ@ÒFÀBÓGˆIÜ˜1œc )›n¨jÓ9ò �Ø—‘Ø ×@Ñ@Ø)×BÑB×`Ñ`Ø 'Ø%1Ø'¨¨A°
©NÐ;ð	 Aó õðð �M‰MØ×;Ñ;Ø%×>Ñ>×[Ñ[Ø#Ø!-Ø'ð	 <ó öð ˜+Ó%Ø*=×*AÑ*AÀ)ÈRÓ*PÒ*VÐTVˆIÜ*3°IÓ*>ó "Ñ&�˜wÜ"7¸Ó"@�Ü" ?×#6Ñ#6°vÓ#>Ò#DÀ"ÓE�Ü˜q¤# lÓ"3°ZÓ@ò 	�AØ—M‘MØ$×CÑCØ!-×!FÑ!F×!cÑ!cØ$+Ø)5Ø*7Ø".¨q°1°z±>Ð"Bð Dó õð	ð   1Ñ$�Ø—‘Ø ×>Ñ>Ø)×BÑB×^Ñ^Ø 'Ø%1Ø(7Ø&3Ø)ð ?ó ô	ð   1Ñ$�Ø—‘Ø ×>Ñ>Ø)×BÑB×^Ñ^Ø 'Ø%1Ø(7Ø&3ØI˜\×IÑIÑ\ÈOÑ\ð ?ó ö	ð3"ðH 	˜1ÑˆØ�‰Ø×,Ñ,Ø!×:Ñ:×KÑKØ)Ø /ØA�\×AÑAÑXÐDWÑXð	 -ó ö	
ðIk
ðZ ‡M�MØ×+Ñ+Ø×6Ñ6×IÑIØ ð 	,ó 	
ôð €Møô{ ò Úðús   º!R Ò	RÒR)r€   i   r   Ú!_FRAME_NO_MAX_OUTPUT_TOKENS_FLOORé   Ú_FRAME_CHARS_PER_TOKEN_ESTIMATEc                ó  — | j                  d«      }t        |«      r|r|n2t        | j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}«      }g }|j                  d«      |j                  d«      g}|rµ|j	                  «       }t        |t        «      r|j                  |«       n€t        |«      ru|D ]p  }t        |t        «      r|j                  |«       Œ%t        |«      sŒ1|j                  |j                  d«      «       |j                  |j                  d«      «       Œr |rŒµt        d„ |D «       «      }	|	rt        d|	t        z  «      nd	}
|j                  d
«      }|
t        |t        «      r|fS dfS c c}}w )a<  Extract a rough input-token count and any explicit max_output_tokens
    from a ``response.create`` frame, handling both wire shapes:
      flat:   {"type": "response.create", "input": ..., "max_output_tokens": ...}
      nested: {"type": "response.create", "response": {"input": ..., "max_output_tokens": ...}}
    rÉ   r¡   ÚinputÚinstructionsr  rB   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr0   )rÄ  )rf   rê   s     r4   rh   z7_extract_frame_quota_estimate_inputs.<locals>.<genexpr>�  s   è ø€ Ò>¨4œS ŸYÑ>ùs   ‚rS   r   Úmax_output_tokensN)ry   r_   r
   Úitemsr_  r[   rF   r  rc   ÚsumÚmaxr5  rQ   )Úmsg_objÚnestedÚkÚvÚparamsÚ
text_partsÚpendingr^   rg   Útotal_charsrL   r:  s               r4   Ú$_extract_frame_quota_estimate_inputsrF  q  se  € ð —K‘K 
Ó+€Fô ˜6Ô"¡vñ 	äØ%Ÿm™m›o×=‘d�a˜°°f³ˆQ�‰TÓ=ó
ð ð $&€Jà�
‰
�7ÓØ�
‰
�>Ó"ð$€Gñ Ø—‘“ˆÜ�eœSÔ!Ø×Ñ˜eÕ$Ü˜EÔ"Øò 5�Ü˜d¤CÔ(Ø×%Ñ% dÕ+Ü$ TÕ*Ø—N‘N 4§8¡8¨IÓ#6Ô7Ø—N‘N 4§8¡8¨FÓ#3Õ4ð5ò ô Ñ>°:Ô>Ó>€KÙ^i¤C¨¨;Ô:YÑ+YÔ$ZÐopÐà%Ÿz™zÐ*=Ó>ÐØ!¼
ÐCTÔVYÔ8ZÐ#4ÐdÐdÐ`dÐdÐdùó/ >s   ¹F 
ÁF 
c              ƒ  ó$  K  — | sy	 t        |«      }t	        |«      r|j                  d«      dk7  ryt        |«      \  }}|�|nt        }| D ]  }|j                  ||||¬«      ƒ d{  –—†  Œ! y# t        j                  t        f$ r Y yw xY w7 Œ&­w)zÒCharge one response.create frame's estimated tokens against every
    registered project ITPM/OTPM quota callback, in isolation from PII
    masking / logging so a malformed frame still reaches those callbacks.Nr¡   úresponse.create)rJ   rK   rL   rM   )	ru   rn   r  r6  r_   ry   rF  r3  rN   )	Úquota_callbacksrJ   rÄ   r¥   r>  rL   Úexplicit_max_output_tokensrM   rm  s	            r4   Ú_enforce_frame_project_quotarK  –  s½   è ø€ ñ ØðÜ)¨+Ó6ˆô ˜7Ô# w§{¡{°6Ó':Ð>OÒ'OØÜ9]Ð^eÓ9fÑ6ÐÐ6à&@Ð&LÑ"ÔRsð ð $ò 
ˆØ×?Ñ?Ø/Ø!Ø#9Ø$;ð	 @ó 
÷ 	
ñ 	
ñ
øô × Ñ ¤)Ð,ò Ùðúð	
ús4   ‚B‡A/ ’ABÁ'BÁ(BÁ/BÂBÂ
BÂB)úresponse.createdúresponse.completedrF  zresponse.incompleter�   ÚRESPONSES_WS_LOGGED_EVENT_TYPES>   rB   Ú
input_textrñ  Ú&RESPONSES_WS_MASKABLE_TEXT_BLOCK_TYPESc                  óÞ   — e Zd ZdZ	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd	„Z
dd
„Zdd„Z eh d£«      Z eh d£«      Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚResponsesWebSocketStreamingaì  
    Manages bidirectional WebSocket forwarding for the Responses API
    WebSocket mode (wss://.../v1/responses).

    Unlike the Realtime API, the Responses API WebSocket mode:
    - Uses response.create as the client-to-server event
    - Streams back the same events as the HTTP streaming Responses API
    - Supports previous_response_id for incremental continuation
    - Supports generate: false for warmup
    - One response at a time per connection (sequential, no multiplexing)
    Nc                óÞ   — || _         || _        || _        || _        |xs i | _        g | _        g | _        || _        |xs g | _        |xs g | _	        |	rt        |	«      nd| _        |
| _        y )Nr1   )Ú	websocketÚ
backend_wsrÊ   rJ   rØ   ÚmessagesÚinput_messagesÚfirst_messageÚguardrail_callbacksÚoutput_guardrail_callbacksr²   rI  Úauthorized_model)r2   rT  rU  rÊ   rJ   rØ   rX  rY  rZ  rI  r[  s              r4   rÞ   z$ResponsesWebSocketStreaming.__init__Ì  s~   € ð #ˆŒØ$ˆŒØ&ˆÔØ!2ˆÔØ/;Ò/A¸rˆÔØ13ˆŒØ79ˆÔØ*ˆÔØH[ÒHaÐ_aˆÔ ØKeÒKkÐikˆÔ'Ù[jÄÀÔAWÐprˆÔð -=ˆÕr6   c                ó0   — |j                  d«      t        v S )Nr¡   )ry   rN  )r2   Ú	event_objs     r4   Ú_should_store_eventz/ResponsesWebSocketStreaming._should_store_eventè  s   € Ø�}‰}˜VÓ$Ô(GÐGÐGr6   c                ó  — t        |t        «      r|j                  d«      }t        |t        «      r	 t	        |«      }n|}| j                  |«      r| j                  j                  |«       y y # t
        j                  t        f$ r Y y w xY w)Núutf-8)r[   ÚbytesÚdecoderF   rr   rn   r  r6  r^  rV  r  )r2   Úeventr]  s      r4   Ú_store_eventz(ResponsesWebSocketStreaming._store_eventë  s~   € Ü�eœUÔ#Ø—L‘L Ó)ˆEÜ�eœSÔ!ðÜ-¨eÓ4‘	ð ˆIà×#Ñ# IÔ.Ø�M‰M× Ñ  Õ+ð /øô ×(Ñ(¬)Ð4ò Ùðús   ³A/ Á/BÂ
Bc                ó2  — 	 t        |t        «      rt        |«      }nt        |«      r|}ny|j	                  d«      dk7  ry|j	                  dg «      }t        |t        «      r| j
                  j                  d|dœ«       yt        |«      ræ|D ]à  }t        |«      sŒ|j	                  d«      dk(  sŒ$|j	                  d«      dk(  sŒ9|j	                  d	g «      }t        |t        «      r| j
                  j                  d|dœ«       Œzt        |«      sŒ†|D ]V  }t        |«      sŒ|j	                  d«      d
k(  sŒ$|j	                  dd«      }|sŒ9| j
                  j                  d|dœ«       ŒX Œâ yy# t        j                  t        t        f$ r Y yw xY w)z<Extract user input content from response.create for logging.Nr¡   rH  r7  Úuser)Úroler  r    rg  r  rO  rB   rÂ   )r[   rF   rr   r_   ry   rW  r  rc   rn   r  ÚAttributeErrorr6  )r2   r    r>  Úinput_itemsrg   r  ÚcrB   s           r4   Ú _collect_input_from_client_eventz<ResponsesWebSocketStreaming._collect_input_from_client_eventù  sr  € ð	Ü˜'¤3Ô'Ü+¨GÓ4‘Ü  Ô)Ø!‘àà�{‰{˜6Ó"Ð&7Ò7Øà!(§¡¨W°bÓ!9ˆKÜ˜+¤sÔ+Ø×#Ñ#×*Ñ*°FÀ{Ñ+SÔTØä˜kÔ*Ø'ò f�DÜ*¨4Ô0Ø Ø—x‘x Ó'¨9Ó4¸¿¹À&Ó9IÈVÓ9SØ"&§(¡(¨9°bÓ"9˜Ü% g¬sÔ3Ø ×/Ñ/×6Ñ6ÀÐSZÑ7[Õ\Ü+¨GÕ4Ø%,ò f Ü#2°1Õ#5¸!¿%¹%À»-È<Ó:WØ+,¯5©5°¸Ó+< DÚ'+Ø(,×(;Ñ(;×(BÑ(BÈFÐ_cÑCdÕ(eñ	fñfð +øô ×$Ñ$¤n´iÐ@ò 	Ùð	úsH   ‚*E5 ­E5 ÁA E5 Â0E5 Â4E5 Ã	AE5 ÄE5 Ä'E5 Ä<E5 Å"E5 Å5FÆFc                óz   — | j                  |«       | j                  r| j                  j                  |d¬«       y y )NrÂ   )r7  Úapi_key)rk  rÊ   Úpre_call)r2   r    s     r4   Ú_store_inputz(ResponsesWebSocketStreaming._store_input  s7   € Ø×-Ñ-¨gÔ6Ø×ÒØ×Ñ×%Ñ%¨G¸RÐ%Õ@ð r6   c              ƒ  ó  K  — | j                   sy | j                  r#| j                  | j                   j                  d<   | j                  r;t	        j
                  | j                   j                  | j                  d¬«      «       y y ­w)NrV  T)r  )rÊ   rW  rÚ   rV  r#  r$  r%  r-  s    r4   Ú_log_messagesz)ResponsesWebSocketStreaming._log_messages!  sl   è ø€ Ø×ÒØØ×ÒØ>B×>QÑ>QˆD×Ñ×/Ñ/°
Ñ;Ø�=Š=Ü×Ñ × 0Ñ 0× JÑ JÈ4Ï=É=ÐptÐ JÓ uÕvð ùs   ‚BBc              ƒ  óÚ  K  — ddl }	 	 	 | j                  j                  d¬«      ƒ d{  –—† }t	        |t
        «      r|j                  d«      }n|}| j                  r:	 t        |«      }|j                  d«      }|| j                  v s|| j                  v rŒ�| j                  |«      }| j                  |«      ƒ d{  –—† }| j!                  |«       | j"                  j%                  |«      ƒ d{  –—†  Œî7 ŒÍ# t        $ r& | j                  j                  «       ƒ d{  –—†7  }Y Œùw xY w# t        j                  t        f$ r d}Y ŒÍw xY w7 ŒŽ7 Œ\# |j&                  j(                  $ r }t+        j,                  d|«       Y d}~n/d}~wt.        $ r }t+        j0                  d|«       Y d}~nd}~ww xY w| j3                  «       ƒ d{  –—†7   y# | j3                  «       ƒ d{  –—†7   w xY w­w)	z4Forward events from backend WebSocket to the client.r   NF)rb  r`  r¡   z*Responses WS backend connection closed: %sz+Error in responses WS backend_to_client: %s)Ú
websocketsrU  Úrecvr6  r[   ra  rb  rZ  rr   ry   rn   r  Ú_DELTA_EVENT_TYPESÚ_OUTPUT_DONE_EVENT_TYPESÚ_unmask_response_eventÚ_mask_response_completedrd  rT  Ú	send_textÚ
exceptionsÚConnectionClosedr€   r7  r  r   rq  )	r2   rs  r¯  Úresponse_strÚ_evt_payloadÚ	_evt_typeÚunmasked_strÚoutput_masked_strr  s	            r4   Úbackend_to_clientz-ResponsesWebSocketStreaming.backend_to_client)  sÀ  è ø€ ãð+	'Øð@Ø)-¯©×)=Ñ)=ÀUÐ)=Ó)K×#K�Lô ˜l¬EÔ2Ø#/×#6Ñ#6°wÓ#?‘Là#/�Lð ×2Ò2ð)Ü=NÈ|Ó=\˜Ø$0×$4Ñ$4°VÓ$<˜	ð ! D×$;Ñ$;Ñ;¸yÈD×LiÑLiÑ?iØ à#×:Ñ:¸<ÓH�Ø*.×*GÑ*GÈÓ*U×$UÐ!ð ×!Ñ!Ð"3Ô4à—n‘n×.Ñ.Ð/@ÓA×AÐAðG à#KùÜ ò @Ø)-¯©×)=Ñ)=Ó)?×#?Ð#?’Lð@ûô( !×0Ñ0´)Ð<ò )Ø$(š	ð)úð %Vøð Bùà×$Ñ$×5Ñ5ò 	RÜ× Ñ Ð!MÈq×QÑQûÜò 	WÜ×$Ñ$Ð%RÐTU×VÑVûð	Wúð ×$Ñ$Ó&×&Ò&ø�$×$Ñ$Ó&×&Ò&üså   ‚G+ˆE ŠC9 ©C7ªC9 ®0E ÁD+ Á;AE Â=EÂ>3E Ã1EÃ2E Ã7C9 Ã9&D(ÄD"Ä D(Ä%E Ä'D(Ä(E Ä+E	ÅE ÅE	Å	E ÅE ÅF0Å)FÅ?G ÆF0ÆF+Æ&G Æ+F0Æ0G Æ3G+ÇG	ÇG+ÇG(Ç!G$Ç"G(Ç(G+c                ój  — | j                   syd}|j                  d«      }t        |«      rX|j                  d«      | j                   k7  r| j                   |d<   d}d|v r#|d   | j                   k7  r| j                   |d<   d}|S |j                  d«      | j                   k7  r| j                   |d<   d}|S )a“  
        Overwrite any ``model`` field in a ``response.create`` frame with the
        connection-authorized model to prevent deployment-substitution attacks.

        Handles both shapes:
          flat:   ``{"type": "response.create", "model": "...", ...}``
          nested: ``{"type": "response.create", "response": {"model": "...", ...}}``

        Returns True if the object was modified.
        FrÉ   rÄ   T)r[  ry   r_   )r2   r>  Úmodifiedr?  s       r4   Ú_enforce_authorized_modelz5ResponsesWebSocketStreaming._enforce_authorized_modelZ  s¿   € ð ×$Ò$ØØˆØŸ™ JÓ/ˆÜ˜6Ô"Ø�z‰z˜'Ó" d×&;Ñ&;Ò;Ø"&×"7Ñ"7��w‘Ø�Ø˜'Ñ! g¨gÑ&6¸$×:OÑ:OÒ&OØ#'×#8Ñ#8�˜Ñ Ø�ð ˆð �[‰[˜Ó! T×%:Ñ%:Ò:Ø#×4Ñ4ˆG�GÑØˆHØˆr6   c              ƒ  ój  K  — 	 t        |«      }|j	                  d«      dk7  r|S | j                  |«      }| j                  s|rt        j                  |«      S |S d| j                  vri | j                  d<   |}t        | j                  «      }|D �]Ý  }|j                  | j                  «      }|j	                  d«      }t        |«      r|nd}	g }
||	fD ]O  }|€Œd|v r|
j                  |df«       t        |j	                  d«      t        «      sŒ=|
j                  |df«       ŒQ |
D �]A  \  }}||   }t        |t        «      r-|j                  |d|| j                  ¬	«      ƒ d{  –—† ||<   d}ŒIt!        |«      sŒU|D ]è  }t        |«      sŒd
D ]Õ  }|j	                  |«      }t        |t        «      r-|j                  |d|| j                  ¬	«      ƒ d{  –—† ||<   d}ŒQt!        |«      sŒ]|D ]t  }t        |«      sŒ|j	                  d«      }|j	                  d«      t"        v sŒ8t        |t        «      sŒI|j                  |d|| j                  ¬	«      ƒ d{  –—† |d<   d}Œv Œ× Œê �ŒD �Œà |rt        j                  |«      S |S # t        j                  t        f$ r |cY S w xY w7 �ŒD7 ŒÖ7 ŒT­w)ae  
        Enforce the authorized model and apply Presidio PII masking to a
        ``response.create`` message before it is forwarded to the upstream
        provider.

        - Overwrites any ``model`` field with the connection-authorized model
          to prevent deployment-substitution attacks (always applied).
        - Walks the ``input`` and ``instructions`` fields, calls ``check_pii``
          on every text block, and stores the resulting ``pii_tokens`` map in
          ``self.request_data["metadata"]`` for later unmasking.

        Non-``response.create`` messages are returned unchanged.
        r¡   rH  rS  rÉ   Nr7  r8  T©rB   Úoutput_parse_piiÚpresidio_configrØ   )r  rç  rB   )rr   rn   r  r6  ry   r„  rY  ÚdumpsrØ   r²   Ú'get_presidio_settings_from_request_datar_   r  r[   rF   Ú	check_piirc   rP  )r2   r    r>  Úmodel_modifiedrƒ  Úguardrail_cbsÚcbrˆ  Únested_candidateÚnested_responseÚtext_containersÚ	containerÚkeyÚfield_valuerg   Ú
item_fieldr^   ÚblockÚ
block_texts                      r4   Ú_mask_response_createz1ResponsesWebSocketStreaming._mask_response_createu  sñ  è ø€ ð	Ü.¨wÓ7ˆGð �;‰;�vÓÐ"3Ò3ØˆNð !%× >Ñ >¸wÓ Gˆà×'Ò'Ù*8”4—:‘:˜gÓ&ÐE¸gÐEà˜T×.Ñ.Ñ.Ø,.ˆD×Ñ˜jÑ)à!ˆÜFKÈD×LdÑLdÓFeˆØó :	8ˆBØ ×HÑHÈ×IZÑIZÓ[ˆOð  'Ÿ{™{¨:Ó6ÐÜ2AÐBRÔ2SÑ.ÐY]ˆOØCEˆOØ% Ð7ò H�	ØÐ$ØØ˜iÑ'Ø#×*Ñ*¨I°wÐ+?Ô@Ü˜iŸm™m¨NÓ;¼SÕAØ#×*Ñ*¨I°~Ð+FÕGðHð #2ó (8‘�	˜3Ø'¨™n�ä˜k¬3Ô/Ø+-¯<©<Ø(Ø)-Ø(7Ø%)×%6Ñ%6ð	 ,8ó ,÷ &�I˜c‘Nð  $‘Hä# KÕ0Ø +ò 8˜Ü.¨tÔ4Ø$Ø*?ò 8˜JØ$(§H¡H¨ZÓ$8˜EÜ)¨%´Ô5Ø9;¿¹Ø).Ø59Ø4CØ15×1BÑ1Bð	 :Fó :"÷ 4"  ZÑ 0ð ,0¡Ü!/°Õ!6Ø-2ò !8 EÜ+:¸5Ô+AØ(0Ø16·±¸6Ó1B JØ',§y¡y°Ó'8Ô<bÒ'bÔgqØ(2´Cõh&ð ?A¿l¹lØ1;Ø=AØ<KØ9=×9JÑ9Jð	 ?Kó ?*÷ 9*¨¨f©ð 48©ñ!8ñ8ò8ò(8ð%:	8ñx '/Œt�z‰z˜'Ó"Ð;°GÐ;øô[ ×$Ñ$¤iÐ0ò 	ØŠNð	úðN&ùð4"øð9*úsx   ‚J3„J �DJ3ÄAJ3Å(J,Å)J3Å?AJ3ÇJ/ÇJ3Ç/9J3È)J3È:"J3ÉJ1É.J3ÊJ)Ê&J3Ê(J)Ê)J3Ê/J3Ê1J3>   úresponse.refusal.deltaúresponse.output_text.deltaú%response.reasoning_summary_text.deltaú&response.function_call_arguments.delta>   úresponse.output_item.doneúresponse.output_text.doneúresponse.content_part.doneú$response.reasoning_summary_part.doneú$response.reasoning_summary_text.doneú%response.function_call_arguments.donec                óÔ  — | j                   s|S | j                  j                  d«      }t        |«      r|j                  d«      nd}t	        |«      r|ni }|s|S 	 t        |«      }| j                   d   }|j                  d«      }|dk(  rÛd}|j                  d«      }	t        |	«      s|S |	j                  d	«      }
t        |
«      r|
ng D ]  }t        |«      sŒ|j                  d
«      }t        |«      sŒ,|D ]O  }t        |«      sŒ|j                  d«      }t        |t        «      sŒ1|j                  ||«      }||k7  sŒI||d<   d}ŒQ Œ� |rt        j                  |«      S |S || j                  v rR|j                  d«      }t        |t        «      r1|j                  ||«      }||k7  r||d<   t        j                  |«      S |S # t        j                  t        f$ r |cY S w xY w)a/  
        Apply Presidio PII unmasking to backend events before forwarding to
        the client.

        Handles two shapes:
        - ``response.completed``: walks ``response.output[*].content[*].text``
        - streaming delta events (``response.output_text.delta``, etc.):
          replaces tokens in the ``delta`` field

        Uses the ``pii_tokens`` map stored during ``_mask_response_create`` to
        replace every token (e.g. ``<EMAIL_ADDRESS_1>``) with the original
        value.  Events with no stored tokens are returned unchanged.
        rS  rC   Nr   r¡   rM  FrÉ   rç  r  rB   Trè   )rY  rØ   ry   r_   rk   rr   rn   r  r6  rc   r[   rF   rD   r‰  ru  )r2   r|  rS  Úraw_pii_tokensrC   Úevt_objrŽ  r  rƒ  r  r*  r+  r  Úcontent_blockrB   Úunmaskedrè   s                    r4   rw  z2ResponsesWebSocketStreaming._unmask_response_eventí  s  € ð ×'Ò'ØÐà×+Ñ+×/Ñ/°
Ó;ˆÜ>MÈhÔ>W §¡¨\Ô :Ð]aˆÜAPÐQ_ÔA`©~Ðfhˆ
ÙØÐð	 Ü.¨|Ó<ˆGð ×,Ñ,¨QÑ/ˆØ#ŸK™K¨Ó/ˆ
àÐ-Ò-ØˆHØ")§+¡+¨jÓ"9ˆLÜ" <Ô0Ø#Ð#Ø".×"2Ñ"2°8Ó"<ˆLÜ/=¸lÔ/K™|ÐQSò ,�Ü& {Ô3ØØ%Ÿ/™/¨)Ó4�Ü% gÔ.ØØ%,ò 
,�MÜ*¨=Ô9Ø Ø(×,Ñ,¨VÓ4�DÜ! $¬Õ,Ø#%×#6Ñ#6Ø  *ó$˜ð $ tÓ+Ø4<˜M¨&Ñ1Ø'+™Hñ
,ð,ñ" +3”4—:‘:˜gÓ&ÐD¸ÐDà˜×0Ñ0Ñ0Ø"Ÿ;™; wÓ/ˆEÜ˜%¤Ô%Ø×.Ñ.Ø˜:ó�ð ˜uÒ$Ø'/�G˜GÑ$ÜŸ:™: gÓ.Ð.àÐøôS ×$Ñ$¤iÐ0ò 	 ØÒð	 ús   ÁG	 Ç	G'Ç&G'c           	   ƒ  ó¬  K  — | j                   s|S 	 t        |«      }|j                  d«      dk7  r|S d}| j                   D �]Î  }|j                  | j                  «      }|j                  d«      }t        |«      sŒ<|j                  d«      }t        |«      r|ng D �]o  }t        |«      sŒ|j                  d«      }	t        |	t        «      r3|j                  |	d|| j                  ¬«      ƒ d{  –—† }
|
|	k7  r|
|d<   d	}|j                  d
«      }t        |«      ri|D ]d  }t        |«      sŒ|j                  d«      }t        |t        «      sŒ1|j                  |d|| j                  ¬«      ƒ d{  –—† }||k7  sŒ^||d<   d	}Œf |j                  d«      }t        |«      s�Œ|D ]d  }t        |«      sŒ|j                  d«      }t        |t        «      sŒ1|j                  |d|| j                  ¬«      ƒ d{  –—† }||k7  sŒ^||d<   d	}Œf �Œr �ŒÑ |rt        j                  |«      S |S # t        j                  t        f$ r |cY S w xY w7 �Œ]7 ŒÝ7 ŒX­w)an  
        Apply Presidio output masking (apply_to_output=True) to the
        ``response.completed`` event before it is forwarded to the client.

        Walks ``response.output[*].content[*].text`` and masks every text block,
        as well as ``response.output[*].arguments`` on function-call items and
        ``response.output[*].summary[*].text`` on reasoning items. Delta and
        ``*.done`` events are suppressed upstream in ``backend_to_client`` when
        output masking is active, so only the authoritative full-output view
        reaches this method; events of other types are returned unchanged.
        r¡   rM  FrÉ   rç  r  r†  NTr  rB   r  )rZ  rr   rn   r  r6  ry   rŠ  rØ   r_   rc   r[   rF   r‹  r‰  )r2   r|  r¥  rƒ  rŽ  rˆ  r  r*  r+  r  Úmasked_argsr  Úsummary_blockr2  Úmasked_summaryr  r¦  rB   Úmaskeds                      r4   rx  z4ResponsesWebSocketStreaming._mask_response_completed1  s…  è ø€ ð ×.Ò.ØÐð	 Ü3DÀ\Ó3RˆGð �;‰;�vÓÐ"6Ò6ØÐàˆØ×1Ñ1ó 4	,ˆBØ ×HÑHÈ×IZÑIZÓ[ˆOØ"Ÿ;™; zÓ2ˆLÜ" <Ô0ØØ'×+Ñ+¨HÓ5ˆLÜ/=¸lÔ/K™|ÐQSó .,�Ü& {Ô3ØØ'ŸO™O¨KÓ8�	Ü˜i¬Ô-Ø(*¯©Ø&Ø).Ø(7Ø%)×%6Ñ%6ð	 )5ó )÷ #�Kð # iÒ/Ø3>˜ KÑ0Ø#'˜Ø%Ÿ/™/¨)Ó4�Ü! 'Ô*Ø)0ò 0˜Ü.¨}Ô=Ø$Ø'4×'8Ñ'8¸Ó'@˜Ü% l´CÕ8Ø35·<±<Ø%1Ø16Ø0?Ø-1×->Ñ->ð	 4@ó 4÷ .˜Nð  .°Ó=Ø8F ¨fÑ 5Ø+/¡ð0ð &Ÿ/™/¨)Ó4�Ü% gÔ.ÙØ%,ò ,�MÜ*¨=Ô9Ø Ø(×,Ñ,¨VÓ4�DÜ! $¬Õ,Ø')§|¡|Ø!%Ø-2Ø,;Ø)-×):Ñ):ð	 (4ó (÷ "˜ð " T›>Ø4:˜M¨&Ñ1Ø'+™Hò,òC.,ð4	,ñl '/Œt�z‰z˜'Ó"Ð@°LÐ@øô{ ×$Ñ$¤iÐ0ò 	 ØÒð	 úð$#ùð .øð""úsr   ‚I’H, �CIÃ0IÃ1AIÅ"IÅ2I
Å3	IÅ=AIÇ"IÇ9I
Ç:	IÈ(IÈ,I
ÉIÉ	I
É
IÉIÉIc           
   ƒ  óT  K  — 	 t        | j                  | j                  | j                  |«      ƒ d{  –—†  y7 Œ# t        $ ra}	 | j
                  j                  t        j                  ddt        |«      dœdœ«      «      ƒ d{  –—†7   n# t        $ r Y nw xY wY d}~yd}~ww xY w­w)a  Run the per-frame project quota check.

        On rejection, sends an ``error`` event to the client and reports that
        the frame must be dropped instead of forwarded, so the connection
        stays open for the client to retry once the window resets.
        Nr�   r‡   ©r¡   r    ©r¡   r�   FT)rK  rI  rJ   r[  r   rT  ry  rn   r‰  rF   r  )r2   r    r  s      r4   Ú_enforce_or_reject_framez4ResponsesWebSocketStreaming._enforce_or_reject_frame�  s¯   è ø€ ð	Ü.Ø×$Ñ$ d×&<Ñ&<¸d×>SÑ>SÐU\ó÷ ð ð& ð'ùô ò 	ðØ—n‘n×.Ñ.Ü—J‘Jà$+à(=Ü+.¨q«6ñ&ñóó
÷ 
ò 
øô ò Ùðúäûð	üsb   ‚B(„/; ³9´; ¸B(¹; »	B%ÁA BÂBÂBÂB Â	BÂB ÂBÂB ÂB(Â B%Â%B(c              ƒ  óè  K  — 	 | j                   �‹| j                  | j                   «      ƒ d{  –—† rh| j                  | j                   «      ƒ d{  –—† }| j                  |«       | j	                  |«       | j
                  j                  |«      ƒ d{  –—†  	 | j                  j                  «       ƒ d{  –—† }| j                  |«      ƒ d{  –—† sŒ=| j                  |«      ƒ d{  –—† }| j                  |«       | j	                  |«       | j
                  j                  |«      ƒ d{  –—†  Œ›7 �Œ	7 Œè7 Œ¥7 Œ„7 Œm7 ŒU7 Œ# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)z6Forward response.create events from client to backend.Nz(Responses WS client_to_backend ended: %s)rX  r°  r˜  ro  rd  rU  ÚsendrT  Úreceive_textr  r€   r7  )r2   Úmasked_firstr    r¬  r  s        r4   Úclient_to_backendz-ResponsesWebSocketStreaming.client_to_backendž  sC  è ø€ ð	PØ×!Ñ!Ð-¸×8UÑ8UÐVZ×VhÑVhÓ8i×2iÐ2iØ,0×,FÑ,FÀt×GYÑGYÓ,Z×&Z�Ø×!Ñ! ,Ô/Ø×!Ñ! ,Ô/Ø—o‘o×*Ñ*¨<Ó8×8Ð8àØ $§¡× ;Ñ ;Ó =×=�Ø!×:Ñ:¸7ÓC×CÐCØØ#×9Ñ9¸'ÓB×B�Ø×!Ñ! &Ô)Ø×!Ñ! &Ô)Ø—o‘o×*Ñ*¨6Ó2×2Ð2ð ð 3jùØ&Zøð 9øð >øØCøàBøð 3ùäò 	PÜ× Ñ Ð!KÈQ×OÑOûð	Püs    ‚E2„*E ®D7¯"E ÁD:ÁAE ÂD<Â"E Â9D>Â:E ÃE ÃE Ã,EÃ-AE Ä1EÄ2E Ä:E Ä<E Ä>E Å E ÅE ÅE Å	E/ÅE*Å%E2Å*E/Å/E2c              ƒ  ó–  K  — t        j                  | j                  «       «      }	 | j                  «       ƒ d{  –—†  |j                  «       s|j                  «        	 |ƒ d{  –—†  	 | j                  j                  «       ƒ d{  –—†  y7 ŒS# t        $ r Y Œ\w xY w7 Œ9# t         j                  $ r Y ŒLw xY w7 Œ1# t        $ r Y yw xY w# |j                  «       s6|j                  «        	 |ƒ d{  –—†7   n# t         j                  $ r Y nw xY w	 | j                  j                  «       ƒ d{  –—†7   w # t        $ r Y w w xY wxY w­w)z,Run both forwarding directions concurrently.N)
r#  r$  r�  rµ  r  ÚdoneÚcancelÚCancelledErrorrU  Úclose)r2   Úforward_tasks     r4   Úbidirectional_forwardz1ResponsesWebSocketStreaming.bidirectional_forward³  s0  è ø€ ä%×1Ñ1°$×2HÑ2HÓ2JÓKˆð	Ø×(Ñ(Ó*×*Ð*ð  ×$Ñ$Ô&Ø×#Ñ#Ô%ðØ&×&Ð&ðØ—o‘o×+Ñ+Ó-×-Ñ-ð +ùÜò 	Ùð	úð 'ùÜ×-Ñ-ò Ùðúð .ùÜò Ùðûð  ×$Ñ$Ô&Ø×#Ñ#Ô%ðØ&×&Ò&øÜ×-Ñ-ò ÙðúðØ—o‘o×+Ñ+Ó-×-Ò-øÜò Ùðÿs	  ‚$E	§B ºB»B ¿ E	Á B! Á%BÁ&B! Á+B< ÂB:Â	B< ÂE	ÂB Â	BÂC ÂBÂC ÂB! Â!B7Â4E	Â6B7Â7E	Â:B< Â<	CÃE	ÃCÃE	Ã!EÃ-C9Ã2C5Ã3C9Ã8EÃ9DÄEÄDÄEÄD7Ä0D3Ä1D7Ä6EÄ7	EÅ EÅEÅEÅE	)NNNNNNN)rT  r*   rU  r)   rÊ   r}  rJ   rO   rØ   r~  rX  rP   rY  z*list[PiiUnmaskingGuardrailCallback] | NonerZ  z&list[PresidioGuardrailCallback] | NonerI  ú%Sequence[ProjectQuotaCallback] | Noner[  rP   )r]  r7   r8   r9   )rc  zstr | bytes | dict[str, object]r8   rR   )r    r‚  r8   rR   r  ©r>  rÝ  r8   r9   )r    rF   r8   rF   )r|  rF   r8   rF   )r    rF   r8   r9   )r:   r;   r<   r=   rÞ   r^  rd  rk  ro  rq  r�  r„  r˜  Ú	frozensetru  rv  rw  rx  r°  rµ  r¼  r1   r6   r4   rR  rR  ¿  sù   „ ñ
ð" 48Ø15Ø$(ØJNØMQØAEØ'+ð=à+ð=ð .ð=ð 'ð	=ð
 1ð=ð /ð=ð "ð=ð Hð=ð %Kð=ð ?ð=ð %ó=ó8Hó,ó!óFAó
wó/'óbó6]<ñ@ #ò	
óÐñ  )ò	
ó	 ÐóBóHNAó`ó:Pô*r6   rR  zFinal[frozenset[str]]Ú_RESPONSE_CREATE_PARAMS>   Ú
aresponsesÚlitellm_call_idrJ   Úlitellm_logging_objÚ_aresponses_websocketÚ_MANAGED_WS_SKIP_KWARGSÚresp_warmup_Ú_WARMUP_RESPONSE_ID_PREFIXc                  ó¨  — e Zd ZdZ	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Zddd„Zd d„Zd!d„Z	ed"d„«       Z
e	 	 	 	 d#d	„«       Zed$d
„«       Zd%d„Zed&d„«       Zed'd„«       Zed(d„«       Zd(d„Zd)d„Zed*d„«       Z	 	 	 	 	 	 	 	 	 	 d+d„Zed,d„«       Zd-d„Zd.d/d„Zed0d„«       Zd1d„Z	 	 	 	 	 	 	 	 d2d„Zd3d„Zd4d„Zy)5Ú ManagedResponsesWebSocketHandleraô  
    Handles Responses API WebSocket mode for providers that do not expose a
    native ``wss://`` responses endpoint.

    Instead of proxying to a provider WebSocket, this handler:
    - Listens for ``response.create`` events from the client
    - Makes HTTP streaming calls via ``litellm.aresponses(stream=True)``
    - Serialises and forwards every streaming event back over the WebSocket
    - Supports ``previous_response_id`` for multi-turn conversations via
      in-memory session tracking (avoids async DB-write timing issues)
    - Supports sequential requests over a single persistent connection

    This makes every provider that LiteLLM can reach over HTTP available on
    the WebSocket transport without any provider-specific changes.
    Nc                óì  — || _         || _        || _        || _        |xs i | _        | j                  j                  d«      xs | j                  j                  d«      | _        || _        || _        || _	        |	| _
        | j                  |«      xs |	| _        |
| _        |rt        |«      nd| _        |j!                  «       D ��ci c]  \  }}|t"        vsŒ||“Œ c}}| _        i | _        y c c}}w )NÚmodel_groupÚdeployment_model_namer1   )rT  rÄ   rÊ   rJ   rz   ry   rË  rm  rÆ   ÚtimeoutrÇ   Ú_resolve_providerÚ_connection_providerrX  r²   rI  r;  rÅ  r?  Ú_session_history)r2   rT  rÄ   rÊ   rJ   rz   rm  rÆ   rÍ  rÇ   rX  rI  r3   r@  rA  s                  r4   rÞ   z)ManagedResponsesWebSocketHandler.__init__î  só   € ð #ˆŒØˆŒ
Ø&ˆÔØ!2ˆÔØ0@Ò0FÀBˆÔØ'+×'<Ñ'<×'@Ñ'@ÀÓ'Oò (
ÐSW×ShÑSh×SlÑSlØ#óT
ˆÔð ˆŒØ ˆŒØˆŒØ#6ˆÔ Ø$(×$:Ñ$:¸5Ó$AÒ$XÐEXˆÔ!Ø*ˆÔÙ[jÄÀÔAWÐprˆÔàAGÇÁÃ×/t¹¸¸AÐSTÔ\sÒSs°°1±Ó/tˆÔð
 EGˆÕùó 0us   Ã	C0ÃC0c                óž  — 	 t        | t        «      r| j                  d¬«      S t        | t        «      r+t	        j
                  | j                  d¬«      t        ¬«      S t        | «      rt	        j
                  | t        ¬«      S t	        j
                  t        | «      «      S # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)zHSerialize a streaming chunk to a JSON string for WebSocket transmission.TrÙ  )Údefaultz1ManagedResponsesWS: failed to serialize chunk: %sN)r[   rß  r`  rØ  rn   r‰  r  rF   r_   r  r€   r7  )r  Úexcs     r4   Ú_serialize_chunkz1ManagedResponsesWebSocketHandler._serialize_chunk  s    € ð
	Ü˜%Ô!2Ô3Ø×,Ñ,¸$Ð,Ó?Ð?Ü˜%¤Ô/Ü—z‘z %×"2Ñ"2ÀÐ"2Ó"EÌsÔSÐSÜ˜uÔ%Ü—z‘z %´Ô5Ð5Ü—:‘:œc %›jÓ)Ð)øÜò 	Ü× Ñ Ð!TÐVYÔZÜûð	ús(   ‚!B# ¤:B# Á%B# ÂB# Â#	CÂ,CÃCc              ƒ  ó¨   K  — 	 | j                   j                  t        j                  d||dœdœ«      «      ƒ d {  –—†  y 7 Œ# t        $ r Y y w xY w­w)Nr�   r®  r¯  )rT  ry  rn   r‰  r  )r2   r    r¨   s      r4   Ú_send_errorz,ManagedResponsesWebSocketHandler._send_error'  sQ   è ø€ ð	Ø—.‘.×*Ñ*Ü—
‘
 G¸zÐV]Ñ6^Ñ_Ó`ó÷ ò ùô ò 	Ùð	üs8   ‚A„7A »A¼A Á AÁA Á	AÁAÁAÁAc                óš   — t        j                  |«      }|j                  d|«      }t        | j                  j                  |g «      «      S )zä
        Return accumulated message history for *previous_response_id*.

        The key is the *decoded* response ID (the raw provider response ID before
        LiteLLM base64-encodes it into the ``resp_...`` format).
        Úresponse_id)r   Ú!_decode_responses_api_response_idry   rb   rÐ  )r2   Úprevious_response_idÚdecodedÚraw_ids       r4   Ú_get_history_messagesz6ManagedResponsesWebSocketHandler._get_history_messages/  sD   € ô 2×SÑSÐThÓiˆØŸ™ MÐ3GÓHˆÜ�D×)Ñ)×-Ñ-¨f°bÓ9Ó:Ð:r6   c                ó"   — || j                   |<   y)uâ   
        Store the complete accumulated message history for *response_id*.

        Replaces any prior value â€” callers are responsible for passing the full
        history (prior turns + current input + new output).
        N)rÐ  )r2   rØ  rV  s      r4   Ú_store_historyz/ManagedResponsesWebSocketHandler._store_history:  s   € ð .6ˆ×Ñ˜kÒ*r6   c                óÞ   — | j                  di «      }t        |«      r|j                  d«      nd}t        |t        «      r|nd}|syt	        j
                  |«      }|j                  d|«      S )zœ
        Pull the raw (decoded) response ID out of a ``response.completed`` event.
        Returns *None* if the event doesn't contain a usable ID.
        rÉ   rx   NrØ  )ry   r_   r[   rF   r   rÙ  )Úcompleted_eventÚresp_objrÜ  Ú
encoded_idrÛ  s        r4   Ú_extract_response_idz5ManagedResponsesWebSocketHandler._extract_response_idC  se   € ð *×-Ñ-¨j¸"Ó=ˆÜ.=¸hÔ.G˜Ÿ™ TÔ*ÈTˆÜ2<¸VÄSÔ2I©Ètˆ
ÙØÜ1×SÑSÐT^Ó_ˆØ�{‰{˜=¨*Ó5Ð5r6   c                ó<  — | j                  di «      }t        |t        «      sg S g }|j                  dg «      xs g D ]×  }t        |t        «      sŒ|j                  d«      }|j                  dd«      }|dk(  r…|j                  d«      xs g }|D �cg c]7  }t        |t        «      r%|j                  d«      dv r|j                  d	d
«      ‘Œ9 }}d
j                  |«      }	|	sŒ§|j	                  d|d|	dœgdœ«       ŒÁ|dk(  sŒÇ|j	                  |«       ŒÙ |S c c}w )z�
        Convert the output items in a ``response.completed`` event into
        Responses API message dicts suitable for the next turn's ``input``.
        rÉ   rç  r¡   rg  Ú	assistantr    r  )rñ  rB   rB   rÂ   rñ  ©r¡   rB   ©r¡   rg  r  r  )ry   r[   r\   Újoinr  )
rá  râ  rV  rg   r-  rg  r.  ÚprC  rB   s
             r4   Ú_extract_output_messagesz9ManagedResponsesWebSocketHandler._extract_output_messagesQ  s*  € ð *×-Ñ-¨j¸"Ó=ˆÜ˜(¤DÔ)ØˆIØ35ˆØ—L‘L ¨2Ó.Ò4°"ò 	&ˆDÜ˜d¤DÔ)ØØŸ™ Ó(ˆIØ—8‘8˜F KÓ0ˆDØ˜IÒ%Ø $§¡¨Ó 3Ò 9°r�ð +öàÜ! !¤TÔ*¨q¯u©u°V«}Ð@WÑ/Wð —E‘E˜& "Õ%ð�
ð ð
 —w‘w˜zÓ*�ÚØ—O‘Oà$-Ø$(Ø1>ÈÑ(MÐ'Nñõð ˜oÓ-Ø—‘ Õ%ð-	&ð. ˆùò!s   Â<Dc                ó”   — t        | t        «      rddd| dœgdœgS t        | «      r| D �cg c]  }t        |«      sŒ|‘Œ c}S g S c c}w )z€
        Normalise the ``input`` field of a ``response.create`` event to a list
        of Responses API message dicts.
        r    rf  rO  rç  rè  )r[   rF   rc   r_   )Ú	input_valrg   s     r4   Ú_input_to_messagesz3ManagedResponsesWebSocketHandler._input_to_messagesv  s]   € ô �i¤Ô%ð &Ø"Ø)5¸yÑ IÐJñðð ô ˜)Ô$Ø%.ÖH˜T´/À$Õ2G’DÒHÐHØˆ	ùò Is
   «A¼Ac              ƒ  ó¸   K  — 	 t        |«      }|j	                  d«      dk7  ry|S # t        j                  $ r | j                  dd«      ƒ d{  –—†7   Y yw xY w­w)zOParse raw WS text; return the message dict or None (JSON error / ignored type).z%Invalid JSON in response.create eventrš   Nr¡   rH  )rr   rn   r  rÖ  ry   )r2   r¥   r>  s      r4   Ú_parse_messagez/ManagedResponsesWebSocketHandler._parse_messageŒ  sb   è ø€ ð	Ü.¨{Ó;ˆGð �;‰;�vÓÐ"3Ò3àØˆøô ×#Ñ#ò 	Ø×"Ñ"Ð#JÐLcÓd×dÑdÙð	üs1   ‚A„& �A¦(AÁAÁAÁAÁAÁAc                ól   — | j                  d«      }t        |«      r|r|n| }|j                  d«      du S )z?Return True for a response.create whose generate flag is false.rÉ   ÚgenerateF)ry   r_   )r>  r?  Úsources      r4   Ú_is_warmup_framez1ManagedResponsesWebSocketHandler._is_warmup_frame˜  s6   € ð  Ÿ™ JÓ/ˆÜ"1°&Ô"9¹f™È'ˆØ�z‰z˜*Ó%¨Ð.Ð.r6   c                ó’   — | syt        j                  | «      }|j                  d| «      }t        |«      j	                  t
        «      S )zHReturn True for synthetic warmup IDs that only exist on this connection.FrØ  )r   rÙ  ry   rF   r°   rÇ  )rØ  rÛ  rÜ  s      r4   Ú_is_warmup_response_idz7ManagedResponsesWebSocketHandler._is_warmup_response_idŸ  sA   € ñ ØÜ1×SÑSÐT_Ó`ˆØŸ™ M°;Ó?ˆÜ�6‹{×%Ñ%Ô&@ÓAÐAr6   c                ó¢   — | j                  d«      }t        |«      r|r|S | j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}S c c}}w )NrÉ   r¡   )ry   r_   r;  )r>  r?  r@  rA  s       r4   Ú_warmup_source_paramsz6ManagedResponsesWebSocketHandler._warmup_source_params¨  sG   € àŸ™ JÓ/ˆÜ˜6Ô"¡vØˆMØ!(§¡£×@™˜˜A°A¸³K��1‘Ó@Ð@ùÓ@s   ´AÁAc           
     ó  — | j                  |«      }|j                  d«      xs | j                  xs | j                  }t        › t        j                  «       j                  › �dt        t        j                  «       «      d|g ddddœdœS )z@Build a minimal completed Responses API object for a warmup ack.rÄ   rÉ   Ú	completedr   )Úinput_tokensÚoutput_tokensÚtotal_tokens)rx   r‚  Ú
created_atræ  rÄ   rç  rí   )
rø  ry   rË  rÄ   rÇ  ÚuuidÚuuid4ÚhexrQ   rÖ   )r2   r>  ró  Ú
wire_models       r4   Ú_build_warmup_responsez7ManagedResponsesWebSocketHandler._build_warmup_response¯  s€   € à×2Ñ2°7Ó;ˆØ"ŸJ™J wÓ/ÒQ°4×3CÑ3CÒQÀtÇzÁzˆ
ä/Ð0´·±³×1AÑ1AÐ0BÐCØ ÜœdŸi™i›kÓ*Ø!ØØà !Ø!"Ø !ññ
ð 	
r6   c              ƒ  óÊ   K  — | j                  |«      }dD ]G  \  }}|i |¥d|i¥dœ}| j                  |«      }|€Œ%| j                  j                  |«      ƒ d{  –—†  ŒI y7 Œ­w)a?  
        Acknowledge a generate=false prewarm without calling the provider.

        Codex blocks on the warmup turn until it receives response.created and
        response.completed over the WebSocket. Managed HTTP providers cannot
        honor an empty-input warmup, so we synthesize the completion locally.
        ))rL  rå  )rM  rú  ræ  ré  N)r  rÔ  rT  ry  )r2   r>  rÉ   r  ræ  rc  Ú
serializeds          r4   Ú_send_warmup_ackz1ManagedResponsesWebSocketHandler._send_warmup_ackÁ  s�   è ø€ ð ×5Ñ5°gÓ>ˆð#
ò 	7ÑˆJ˜ð
 #Ø:˜xÐ:¨°6Ñ:ñˆEð ×.Ñ.¨uÓ5ˆJØÐ!ØØ—.‘.×*Ñ*¨:Ó6×6Ñ6ñ	7ð 7ús   ‚AA#ÁA!ÁA#c                óî   — | j                  d«      }t        |«      r|r|n)| j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}}t        D �ci c]  }||v r||   �|||   “Œ c}S c c}}w c c}w )zþ
        Extract Responses API params from the event, handling both wire formats:
          Nested: {"type": "response.create", "response": {"input": [...], ...}}
          Flat:   {"type": "response.create", "input": [...], "model": "...", ...}
        rÉ   r¡   )ry   r_   r;  rÀ  )r>  r?  r@  rA  Úresponse_paramsÚparams         r4   Ú_build_base_call_kwargsz8ManagedResponsesWebSocketHandler._build_base_call_kwargs×  s�   € ð  Ÿ™ JÓ/ˆä% fÔ-±&‰FÐPW×P]ÑP]ÓP_×>oÉÈÈ1ÐcdÐhnÓcn¸qÀ!¹tÓ>oð 	ô
 1ö
àØ˜Ñ'¨O¸EÑ,BÐ,Nð �? 5Ñ)Ñ)ò
ð 	
ùó ?pùò
s   ´A,ÁA,ÁA2c                óæ   — |sy| j                  |«      rt        j                  d|«       y|r)||z   |d<   t        j                  dt        |«      |«       yt        j                  d|«       ||d<   y)zHPrepend in-memory turn history, or fall back to DB-based reconstruction.NzEManagedResponsesWS: ignoring synthetic warmup previous_response_id=%sr7  zMManagedResponsesWS: prepended %d history messages for previous_response_id=%szuManagedResponsesWS: no in-memory history for previous_response_id=%s; falling back to DB-based session reconstructionrÚ  )rö  r€   r7  rÄ  )r2   Úcall_kwargsrÚ  Úcurrent_messagesÚprior_historys        r4   Ú_apply_historyz/ManagedResponsesWebSocketHandler._apply_historyè  sˆ   € ñ $ØØ×&Ñ&Ð';Ô<Ü× Ñ ØWØ$ôð ÙØ#0Ð3CÑ#CˆK˜Ñ Ü× Ñ Ø_Ü�MÓ"Ø$õô × Ñ ðBà$ôð 3GˆKÐ.Ò/r6   c                óT   — | sy	 ddl m}  || ¬«      \  }}}}|S # t        $ r Y yw xY w)zEResolve the LLM provider for a model string, or None if unresolvable.Nr   )Úget_llm_provider©rÄ   )rº   r  r  )rÄ   r  Ú_Úproviders       r4   rÎ  z2ManagedResponsesWebSocketHandler._resolve_provider		  s<   € ñ Øð	Ý0á 0°uÔ =ÑˆAˆx˜˜AØˆOøÜò 	Ùð	ús   … ›	'¦'c                ól   — |�|| j                   k(  ry| j                  |«      }|€y|| j                  k(  S )zHReturn True if model uses the same LLM provider as the connection model.TF)rÄ   rÎ  rÏ  )r2   rÄ   Úevent_providers      r4   Ú_same_providerz/ManagedResponsesWebSocketHandler._same_provider	  s?   € àˆ=˜E T§Z¡ZÒ/ØØ $× 6Ñ 6°uÓ =ˆØÐ!ØØ ×!:Ñ!:Ñ:Ð:r6   c                óH  — | j                   �| j                   |d<   | j                  �| j                  |d<   | j                  �| j                  |d<   | j                  � | j	                  |«      r| j                  |d<   | j
                  rt        | j
                  «      |d<   yy)zBInject connection-level credentials and metadata into call_kwargs.Nrm  rÆ   rÍ  rÇ   rz   )rm  rÆ   rÍ  rÇ   r  rz   r\   )r2   r  rÄ   s      r4   Ú_inject_credentialsz4ManagedResponsesWebSocketHandler._inject_credentials	  sš   € à�<‰<Ð#Ø%)§\¡\ˆK˜	Ñ"Ø�=‰=Ð$Ø&*§m¡mˆK˜
Ñ#Ø�<‰<Ð#Ø%)§\¡\ˆK˜	Ñ"ð ×#Ñ#Ð/°D×4GÑ4GÈÔ4NØ15×1IÑ1IˆKÐ-Ñ.Ø× Ò Ü.2°4×3HÑ3HÓ.IˆKÐ*Ò+ð !r6   c                ó¦  — | j                  d«      xs i j                  d«      xs i }t        |t        «      syt        |j                  d«      xs i «      }| j                  d«      |d<   | j                  d«      |d<   ||d<   dD ]  }|| v sŒ| |   €Œ| |   ||<   Œ i |¥d|i¥}d| vri | d<   || d   d<   | j                  d	i «       || d	   d<   y)
zGUpdate proxy_server_request body so spend logs record the full request.rz   Úproxy_server_requestNr<  r7  ÚstorerÄ   )ÚtoolsÚtool_choicer8  rS  rÃ   )ry   r[   r\   Ú
setdefault)r  rÄ   r  r<  r@  s        r4   Ú_update_proxy_requestz6ManagedResponsesWebSocketHandler._update_proxy_request1	  s
  € ð !,§¡Ð0BÓ CÒ IÀr×NÑNÐOeÓfÒlÐjlÐÜÐ.´Ô5ØÜÐ/×3Ñ3°FÓ;ÒA¸rÓBˆØ#Ÿ™¨Ó0ˆˆW‰Ø#Ÿ™¨Ó0ˆˆW‰ØˆˆW‰ØEò 	)ˆAØ�KÒ K°¡NÑ$>Ø% a™.��Q’ð	)ð  FÐ"6ÐE¸ÀÑEÐØ [Ñ0Ø.0ˆKÐ*Ñ+ØBVˆÐ&Ñ'Ð(>Ñ?Ø×ÑÐ/°Ô4Ø@TˆÐ$Ñ%Ð&<Ò=r6   c              ƒ  óô  K  — d}t        j                  dd|i|¤Žƒ d{  –—† }|2 3 d{  –—† }|€Œt        |dd«      xs# t        |t        «      r|j                  d«      nd}| j                  |«      }|€ŒR|dk(  r|€	 t        |«      }	 | j                  j                  |«      ƒ d{  –—†  ŒŠ7 Œ�7 Œ‡# t        $ r Y Œ4w xY w7 Œ# t        $ r$}t        j                  d|«       |cY d}~c S d}~ww xY w6 |S ­w)a>  
        Stream ``litellm.aresponses`` and forward every chunk over the WebSocket.

        Captures the ``response.completed`` event type from the chunk object
        directly (before serialization) to avoid a redundant JSON round-trip on
        every chunk.  Returns the completed event dict, or ``None``.
        NrÄ   r¡   rM  z5ManagedResponsesWS: error sending chunk to client: %sr1   )rº   rÁ  r£   r[   r\   ry   rÔ  rr   r  rT  ry  r€   r7  )	r2   rÄ   r  rá  Ústream_responser  rI  r  Úsend_excs	            r4   Ú_stream_and_forwardz4ManagedResponsesWebSocketHandler._stream_and_forwardE	  s  è ø€ ð ð 	ô (/×'9Ñ'9Ñ'UÀÐ'UÈÑ'U×!UˆØ*÷ 	'ð 	'�%Øˆ}Øä  ¨°Ó5ÒqÌzÐZ_ÔaeÔOf¸%¿)¹)ÀFÔ:KÐlpˆJØ×.Ñ.¨uÓ5ˆJØÐ!ØØÐ1Ò1°oÐ6MðÜ&7¸
Ó&C�Oð'Ø—n‘n×.Ñ.¨zÓ:×:Ñ:ð "Vøð	'ùô !ò Ùðúð ;ùÜò 'Ü×$Ñ$Ð%\Ð^fÔgØ&×&ûð'úð +ð$ ÐùsŠ   ‚C8ŸB0 C8¦C5ªB2«C5®AC8Â B4ÂCÂ*CÂ+CÂ/C8Â2C5Â4	C Â=C8Â?C Ã C8ÃCÃ	C2ÃC-Ã%C2Ã&C8Ã-C2Ã2C8c                óÈ   — |€y| j                  |«      }|sy| j                  |«      }||z   |z   }| j                  ||«       t        j                  dt        |«      |«       y)zMStore this turn in in-memory history for future previous_response_id lookups.Nz9ManagedResponsesWS: stored %d messages for response_id=%s)rä  rë  rß  r€   r7  rÄ  )r2   rá  r  r  Únew_response_idÚoutput_msgsÚall_messagess          r4   Ú_save_turn_historyz3ManagedResponsesWebSocketHandler._save_turn_historye	  so   € ð Ð"ØØ!%×!:Ñ!:¸?Ó!KˆÙØØ!×:Ñ:¸?ÓKˆØ+Ð.>Ñ>ÀÑLˆØ×Ñ˜O¨\Ô:Ü×ÑØGÜ�ÓØõ	
r6   c              ƒ  óè  K  — | j                  |«      ƒ d{  –—† }|€y| j                  |«      r	 | j                  |«      ƒ d{  –—†  y	 t        | j                  | j                  | j                  xs | j                  |«      ƒ d{  –—†  | j                  |«      }d|d<   |j                  dd«      }|�|| j                  k(  r| j                  n|}|j                  dd«      }| j!                  |j#                  d	«      «      }	|r| j%                  |«      ng }
| j'                  |||	|
«       | j)                  ||¬
«       | j+                  ||xs | j                  xs |«       |j-                  | j.                  «       	 | j1                  ||«      ƒ d{  –—† }| j5                  ||
|	«       y7 �Œš7 �Œo# t        $ r }t	        j
                  d|«       Y d}~yd}~ww xY w7 �ŒZ# t        $ r/}| j                  t        |«      d¬«      ƒ d{  –—†7   Y d}~yd}~ww xY w7 Œˆ# t        $ rC}t	        j2                  d|«       | j                  t        |«      «      ƒ d{  –—†7   Y d}~yd}~ww xY w­w)añ  
        Parse one ``response.create`` event, call ``litellm.aresponses(stream=True)``,
        and forward every streaming event to the client.

        Multi-turn support via in-memory session history
        ------------------------------------------------
        When ``previous_response_id`` is present in the event:
        1. Look up the accumulated message history in ``self._session_history``
           (keyed by the decoded provider response ID).
        2. Prepend those messages to the current ``input`` so the model has full
           conversation context.
        3. After the stream completes, extract the new response ID and output
           messages from ``response.completed`` and store them in
           ``self._session_history`` for the next turn.

        This in-memory approach avoids the async DB-write race condition that
        occurs when spend logs haven't been committed by the time the second
        ``response.create`` arrives over the same WebSocket connection.
        Nz0ManagedResponsesWS: error sending warmup ack: %sr‡   )r¨   TrP  rÄ   rÚ  r7  r  z8ManagedResponsesWS: error processing response.create: %s)rð  rô  r  r  r€   r7  rK  rI  rJ   rË  rÄ   r   rÖ  rF   r
  r_  rî  ry   rÝ  r  r  r   rr  r?  r$  r   r)  )r2   r¥   r>  rÓ  r  r  rK   rÄ   rÚ  r  r  rá  s               r4   Ú_process_response_createz9ManagedResponsesWebSocketHandler._process_response_create~	  sh  è ø€ ð(  $×2Ñ2°;Ó?×?ˆØˆ?Øð × Ñ  Ô)ð^Ø×+Ñ+¨GÓ4×4Ð4ð ð	Ü.Ø×$Ñ$ d×&<Ñ&<¸d×>NÑ>NÒ>\ÐRV×R\ÑR\Ð^ió÷ ð ð "×9Ñ9¸'ÓBˆØ $ˆ�HÑð .9¯_©_¸WÀdÓ-Kˆà)Ð1°_È×HXÑHXÒ5XˆD�JŠJÐ^mð 	ð 3>·/±/ÐBXÐZ^Ó2_ÐØ"&×"9Ñ"9¸+¿/¹/È'Ó:RÓ"SÐñ Th˜t×9Ñ9Ð:NÔOÐmoˆà×Ñ˜KÐ)=Ð?OÐQ^Ô_Ø× Ñ  °EÐ Ô:Ø×"Ñ" ;°Ò0\À4×CSÑCSÒ0\ÐW\Ô]Ø×Ñ˜4×,Ñ,Ô-ð	Ø+/×+CÑ+CÀEÈ;Ó+W×%WˆOð 	×Ñ °Ð@PÕQðk @ùð 5úÜò ^Ü×$Ñ$Ð%WÐY\×]Ð]Øûð^úð
úô ò 	Ø×"Ñ"¤3 q£6Ð6KÐ"ÓL×LÑLÜûð	úð8 &XùÜò 	Ü×$Ñ$Ð%_ÐadÔeØ×"Ñ"¤3 s£8Ó,×,Ñ,Üûð	üsÛ   ‚I2—F1˜I2±F7 ÁF4ÁF7 Á
I2Á=G& Â	G#Â
G& ÂC4I2ÆH# ÆH!ÆH# ÆI2Æ4F7 Æ7	G Ç GÇI2ÇG Ç I2Ç#G& Ç&	HÇ/HÈHÈHÈI2ÈHÈI2È!H# È#	I/È,3I*ÉI"É I*É%I2É*I/É/I2c              ƒ  óÜ  K  — 	 | j                   �#| j                  | j                   «      ƒ d{  –—†  	 	 | j                  j                  «       ƒ d{  –—† }| j                  |«      ƒ d{  –—†  Œ=7 ŒB7 Œ # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w7 Œ5# t        $ r=}t        j                  d|«       | j                  d|› �«      ƒ d{  –—†7   Y d}~yd}~ww xY w­w)zŒ
        Main loop: accept ``response.create`` events sequentially and handle
        each one before waiting for the next message.
        Nz+ManagedResponsesWS: client disconnected: %sz(ManagedResponsesWS: unexpected error: %szInternal server error: )	rX  r+  rT  r³  r  r€   r7  r   rÖ  )r2   r    rÓ  s      r4   Úrunz$ManagedResponsesWebSocketHandler.runÍ	  sà   è ø€ ð
	DØ×!Ñ!Ð-Ø×3Ñ3°D×4FÑ4FÓG×GÐGàðØ$(§N¡N×$?Ñ$?Ó$A×A�Gð
 ×3Ñ3°GÓ<×<Ð<ð ð Høð BùÜ ò Ü"×(Ñ(Ð)VÐX[Ô\Üûðúð =ùäò 	DÜ×$Ñ$Ð%OÐQTÔUØ×"Ñ"Ð%<¸S¸EÐ#BÓC×CÖCûð	Düs‹   ‚C,„*B# ®A1¯B# µA5 ÁA3ÁA5 ÁB# Á+B!Á,B# Á3A5 Á5	BÁ>BÂB# ÂC,ÂBÂB# Â#	C)Â,-C$ÃCÃC$ÃC,Ã$C)Ã)C,)NNNNNNNN)rT  r*   rÄ   rF   rÊ   r}  rJ   rO   rz   zdict[str, Any] | Nonerm  rP   rÆ   rP   rÍ  zfloat | NonerÇ   rP   rX  rP   rI  r½  r3   r‚  r8   rR   )r  r   r8   rP   )r…   )r    rF   r¨   rF   r8   rR   )rÚ  rF   r8   úlist[dict[str, object]])rØ  rF   rV  r.  r8   rR   )rá  rÝ  r8   rP   )rá  rÝ  r8   r.  )rí  r‚  r8   r.  )r¥   rF   r8   r~  r¾  )rØ  rP   r8   r9   )r>  rÝ  r8   rÝ  )r>  rÝ  r8   rR   )r>  rÝ  r8   údict[str, Any])
r  rÝ  rÚ  rP   r  r.  r  r.  r8   rR   )rÄ   rP   r8   rP   )rÄ   rP   r8   r9   r0   )r  rÝ  rÄ   rP   r8   rR   )r  r/  rÄ   rF   r8   rR   )rÄ   rF   r  r/  r8   r~  )rá  r~  r  r.  r  r.  r8   rR   )r¥   rF   r8   rR   r  )r:   r;   r<   r=   rÞ   ÚstaticmethodrÔ  rÖ  rÝ  rß  rä  rë  rî  rð  rô  rö  rø  r  r  r
  r  rÎ  r  r  r   r$  r)  r+  r-  r1   r6   r4   rÉ  rÉ  Ý  s8  „ ñð* 48Ø26Ø"Ø#Ø $Ø*.Ø$(ØAEð$Gà+ð$Gð ð$Gð 'ð	$Gð
 1ð$Gð 0ð$Gð ð$Gð ð$Gð ð$Gð (ð$Gð "ð$Gð ?ð$Gð ð$Gð 
ó$GðT òó ðôó	;ó6ð ò6ó ð6ð ð"Ø*ð"à	 ò"ó ð"ðH òó ðó*
ð ò/ó ð/ð òBó ðBð òAó ðAó
ó$7ð, ò
ó ð
ð Gà&ðGð )ðGð 2ð	Gð
 /ðGð 
óGðB ò
ó ð
ó;ôJð$ òUó ðUó&ð@
à1ð
ð /ð
ð 2ð	
ð
 
ó
ó2IRô^Dr6   rÉ  )r^   r‚  r8   zTypeIs[dict[str, object]])r^   r‚  r8   zTypeIs[list[object]])r^   r‚  r8   zTypeIs[dict[str, str]])rq   ústr | bytesr8   rÝ  )rq   r1  r8   r‚  )rz   r~  r8   rP   )r‚   zasyncio.Task[object]rƒ   rF   r8   rR   )r¤   r‚  r8   z"tuple[str, str | None, str | None])r¨   rP   rµ   rP   r8   rQ   )r¼   r  r8   r9   )r„  r‚  r  r$   r8   r$   )râ  r‚  r8   r/  )r  z3Literal['response.created', 'response.in_progress']r³  r"   r8   r$   )
r÷  rF   rø  rQ   rù  rQ   rÿ  r/  r8   r€  )r  ú#list[ResponsesAPIStreamingResponse]r÷  rF   rø  rQ   rù  rQ   rÿ  r/  r¹  rQ   r8   rR   )r³  r"   rÊ   r}  r¹  rQ   r8   r2  )r>  r7   r8   ztuple[int, int | None])
rI  zSequence[ProjectQuotaCallback]rJ   rO   rÄ   rP   r¥   rF   r8   rR   )tÚ
__future__r   r#  rn   rÖ   rw  rÿ  Úcollections.abcr   r   r   r   r   Ú	functoolsr	   Útypesr
   Útypingr   r   r   r   r   r   r•  Úopenai._streamingr   Útyping_extensionsr   rº   Úlitellm.constantsr   r   Úlitellm.exceptionsr   r   Ú#litellm.litellm_core_utils.asyncifyr   Ú'litellm.litellm_core_utils.core_helpersr   Ú*litellm.litellm_core_utils.litellm_loggingr   r}  Ú:litellm.litellm_core_utils.llm_response_utils.get_api_baser   Ú?litellm.litellm_core_utils.llm_response_utils.response_metadatar   Ú/litellm.litellm_core_utils.thread_pool_executorr   Ú.litellm.llms.base_llm.responses.transformationr   Úlitellm.responses.utilsr   r   Úlitellm.types.llms.openair    r!   r"   r#   r$   Úlitellm.types.utilsr%   Úlitellm.utilsr&   Úlitellm.proxy._typesr'   Ú+litellm.types.responses.streaming_websocketr(   r)   r*   r,   r@   rH   rY   r_   rc   rk   rr   ru   r|   r„   rž   r>   r©   r·   r½   r¿   rp  r‡  r¢  r¬  rÐ  rØ  rß  rã  rï  r  r  r»  Úlitellm._loggingr€   r3  r5  rF  rK  rN  r¿  rP  rR  ÚResponsesAPIRequestParamsÚ__required_keys__Ú__optional_keys__rÀ  rÅ  rÇ  rÉ  r1   r6   r4   ú<module>rM     sv  ðÞ "ã Û Û Û Û ß BÓ BÝ Ý Ý "ß R× Rã Ý (Ý $ã ÷÷ FÝ BÝ LÝ SÝ Sõõ EÝ Qß U÷õ õ *Ý AáÝ3÷ñ ô ô ôYÐ(AÀ8ô Yô˜8ô ñ �1Ôñó ðó#ó#ó\óó
ó
;óDñ 5EðØ˜ðà˜sðð 	˜cðð 	 ð	ð
 	˜#ðð 	˜ðð 	 ðð 	 ðð 	˜Sðð 	˜3ðð 	˜3ðð 	˜Sðð 	)¨#ðð 	˜cðð 	 ðð  	'¨ð!ð" 	˜Cð#ð$ %(Ø #Ø!$Ø#&Ø$'Øò/ó5Ð Ð1ó ó:%ó&óX÷ñ ðD Øð Ø:ð à"ó ôO4Ð$Eô O4ôdO5Ð(Iô O5ôdMÐ(Iô Mô`@Ð*Kô @ðF ôP�Hó Pó ðPð ôG˜ó Gó ðGóð`ðð`ð
 &ð`ð #ó`ð"(àð(ð ð(ð ð	(ð
 !ð(ð *ó(ðV@
à/ð@
ð ð@
ð ð	@
ð
 ð@
ð !ð@
ð ð@
ð 
ó@
ðFKà%ðKð #ðKð ð	Kð
 )óKõd ,ð
 ,0Ð ! 5Ó /ð
 *+Ð  Ó *ó"eðJ
Ø3ð
à,ð
ð ð
ð ð	
ð
 
ó
ò<*Ð  ó ñ 1:Ò:_Ó0`Ð &¨Ó `÷Eñ EñZ Ó ×:Ñ:×LÑLÙ Ó"×<Ñ<×NÑNñOð Ð.ó ñ
 2;òó2Ð Ð.ó ð %3Ð ˜EÓ 2÷DDò DDr6   