Ë
    uPêjà†  ã                   ó²  — U d dl mZmZ d dlmZ d dlmZmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZmZ d dlZd dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dl ­ d dl!­ d dl"m#Z# d dl$m%Z% ddl&m'Z' dZ(ee)d<   er	d dl*m+Z, e,Z-neZ- ei «      Z.eee/e0f      e)d<   dZ1ee)d<    e2e%jf                  e%jh                  h«      Z5ee)d<    G d„ de«      Z6y)é    )ÚMappingÚSequence)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚFinalÚcastÚget_type_hintsN)ÚResponseReasoningItem)Ú	BaseModelÚValidationError)Úverbose_logger)Úprocess_response_headers)Ú_safe_convert_created_field©Úencode_url_path_segment)ÚBaseResponsesAPIConfig)Úis_gpt_reasoning_series_name)Úget_secret_str)Ú*)ÚGenericLiteLLMParams)ÚLlmProvidersé   )ÚOpenAIErroré   Ú*OPENAI_RESPONSES_API_MIN_MAX_OUTPUT_TOKENS)ÚLoggingÚ_NO_TOOL_UPDATE)zgpt-4zgpt-3.5z
chatgpt-4oÚo1Úo3Úo4Ú6_MODEL_FAMILIES_REJECTING_TOP_LEVEL_SCHEMA_COMBINATORSÚ._PROVIDERS_WITH_COMBINATOR_REJECTING_VALIDATORc                   ó  — e Zd Zedefd„«       Zdefd„Zede	defd„«       Z
ede	defd„«       Zede	de	dz  defd	„«       ZedCd
„«       Zde	defd„Zdede	dedefd„Zde	de	ez  dedededefd„Z	 dDde	de	ez  dee   dz  dee	ez  ee   dz  f   fd„Zde	dee   dz  dedee   dz  fd„Zededefd„«       Zede	defd„«       Zede	dede	fd„«       Zedee	ef   dee	ef   fd„«       Zede e   dee   fd„«       Z!de	ez  de	ez  fd„Z"d ee	e#f   dee	e#f   fd!„Z$de	d"e%jL                  d#e'de(fd$„Z)dede	dedz  defd%„Z*d&e	dz  dede	fd'„Z+de	d(ed#e'de,fd)„Z-ed*ee	   de(dz  fd+„«       Z.ed,e	de#fd-„«       Z/	 dDde	dz  d.edz  d/e	dz  defd0„Z0defd1„Z1d2e	d&e	dededee	ef   f
d3„Z2d"e%jL                  d#e'de3fd4„Z4d2e	d&e	dededee	ef   f
d5„Z5d"e%jL                  d#e'de(fd6„Z6	 	 	 	 	 dEd2e	d&e	deded7e	dz  d8e	dz  d9ee	   dz  d:e7d;e8d<   dee	ef   fd=„Z9d"e%jL                  d#e'defd>„Z:d2e	d&e	dededee	ef   f
d?„Z;d"e%jL                  d#e'de(fd@„Z<de	de	ez  ded&e	dededee	ef   fdA„Z=d"e%jL                  d#e'de(fdB„Z>y)FÚOpenAIResponsesAPIConfigÚreturnc                 ó"   — t         j                  S ©N)r   ÚOPENAI©Úselfs    úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/openai/responses/transformation.pyÚcustom_llm_providerz,OpenAIResponsesAPIConfig.custom_llm_provider)   s   € ä×"Ñ"Ð"ó    c                  ó   — y)NT© r*   s    r,   Úsupports_native_file_searchz4OpenAIResponsesAPIConfig.supports_native_file_search-   s   € Ør.   Úmodelc                 óf   — | j                  d«      }t        |«      dkD  r|d   dvryt        | «      S )zËReturn True only for actual OpenAI GPT-5 models.

        Excludes pass-through models from other providers that happen to
        reference gpt-5 in their name (e.g. perplexity/openai/gpt-5.2).
        ú/é   r   )ÚopenaiF)ÚsplitÚlenr   )r2   Úpartss     r,   Ú_is_gpt_5_modelz(OpenAIResponsesAPIConfig._is_gpt_5_model0   s6   € ð —{‘{ 3Ó'ˆÜˆu‹:˜Š>˜e A™h¨kÑ9ØÜ+¨EÓ2Ð2r.   c                 ó$   — ddl m}  || dd¬«      S )z:Return True if the model supports reasoning.effort='none'.r   )Ú_supports_factoryNÚsupports_none_reasoning_effort)r2   r-   Úkey)Úlitellm.utilsr<   )r2   r<   s     r,   Ú_supports_reasoning_effort_nonez8OpenAIResponsesAPIConfig._supports_reasoning_effort_none<   s   € õ 	4á ØØ $Ø0ô
ð 	
r.   ÚeffortNc                 ó2   — ddl m} |j                  | |«      S )aÀ  Whether this request's reasoning effort ends up as "none", the one condition
        under which a non-default temperature is accepted.

        Delegates to the chat-completions gpt-5 config so both surfaces answer from one
        rule: the Responses API reaches the same models over a different wire, and a second
        copy of the rule here is what let this surface keep forwarding temperature after the
        chat surface stopped.
        r   )ÚOpenAIGPT5Config)Ú-litellm.llms.openai.chat.gpt_5_transformationrC   Úeffort_resolves_to_none)r2   rA   rC   s      r,   Ú_effort_resolves_to_nonez1OpenAIResponsesAPIConfig._effort_resolves_to_noneG   s   € õ 	Sà×7Ñ7¸¸vÓFÐFr.   c                 óD   — t        | t        «      r| t        k  rt        S | S )a‹  Raise sub-minimum max_output_tokens up to the OpenAI Responses API minimum.

        OpenAI's Responses API rejects max_output_tokens below 16 for every model
        (not gpt-5 specific), so a client like Claude Code that sends a max_tokens=1
        warmup probe on model switch would otherwise 400. Values that are None or
        already at/above the minimum are returned unchanged.
        )Ú
isinstanceÚintr   )Úmax_output_tokenss    r,   Ú_enforce_min_max_output_tokensz7OpenAIResponsesAPIConfig._enforce_min_max_output_tokensU   s$   € ô Ð'¬Ô-Ð2CÔFpÒ2pÜ=Ð=Ø Ð r.   c                 ó€   — t        t        «      j                  «       }t        t	        g d¢t        |«      z   «      «      S )z?
        All OpenAI Responses API params are supported
        )Úinputr2   Úextra_headersÚextra_queryÚ
extra_bodyÚtimeout)r
   ÚResponsesAPIRequestParamsÚkeysÚlistÚset)r+   r2   Úsupported_paramss      r,   Úget_supported_openai_paramsz4OpenAIResponsesAPIConfig.get_supported_openai_paramsb   sC   € ô #1Ô1JÓ"K×"PÑ"PÓ"RÐÜÜòô Ð'Ó(ñ)ó
ó
ð 	
r.   Úresponse_api_optional_paramsÚdrop_paramsc                 ó  — t        |«      }d|v r#| j                  |j                  d«      «      |d<   | j                  |¬«      r¼|j                  d«      }|�©|dk7  r¤|j                  d«      xs i }t	        |t         «      r|j                  d«      nd}| j                  |¬«      }|r| j                  ||«      r	 |S |st        j                  r|j                  dd«       |S t        j                  |› d|› d	�d
¬«      ‚|S )a#  No mapping applied since inputs are in OpenAI spec already.

        GPT-5 models have restrictions on temperature (only temperature=1
        is accepted unless reasoning_effort='none' on models that support it).
        Apply the same validation used by the chat completions path.
        rJ   )r2   ÚtemperatureNr5   Ú	reasoningrA   z doesn't support temperature=zý while reasoning is active. Only temperature=1 is supported unless reasoning.effort resolves to 'none', either set explicitly on the request or declared as the model's default_reasoning_effort. To drop unsupported params set `litellm.drop_params = True`i�  ©ÚmessageÚstatus_code)ÚdictrK   Úgetr:   rH   r@   rF   ÚlitellmrY   ÚpopÚUnsupportedParamsError)	r+   rX   r2   rY   Úparamsr[   r\   rA   Úsupports_nones	            r,   Úmap_openai_paramsz*OpenAIResponsesAPIConfig.map_openai_paramsu   s  € ô Ð9Ó:ˆà &Ñ(Ø*.×*MÑ*MÈfÏjÉjÐYlÓNmÓ*nˆFÐ&Ñ'à×Ñ eÐÔ,Ø!'§¡¨MÓ!:ˆKØÐ&¨;¸!Ò+;Ø#)§:¡:¨kÓ#:Ò#@¸b�	Ü;EÀiÔQUÔ;V 	§¡¨hÔ 7Ð\`�Ø'+×'KÑ'KÐRWÐ'KÓ'X�Ù  T×%BÑ%BÀ5È&Ô%QØð ˆñ !¤G×$7Ò$7Ø—J‘J˜}¨dÔ3ð ˆô "×8Ñ8à$˜gÐ%BÀ;À-ð PZð Zð %(ô	ð 	ð ˆr.   rM   Ú$response_api_optional_request_paramsÚlitellm_paramsÚheadersc                 óÜ   — | j                  |«      }|j                  d«      }| j                  |||¬«      \  }}| j                  |||¬«      }|�||d<   t	        t        d||dœ|¤Ž«      }|S )ah  Strip Anthropic-only `cache_control` markers before sending to OpenAI.

        OpenAI's Responses API rejects unknown fields on input content blocks
        with HTTP 400 ("Unknown parameter: 'input[0].content[0].cache_control'").
        Chat Completions strips these in
        `remove_cache_control_flag_from_messages_and_tools`; mirror that here.
        Útools©r2   rM   rl   ©r2   rl   ri   ©r2   rM   r0   )Ú_validate_input_paramra   Ú.remove_cache_control_flag_from_input_and_toolsÚ+_flatten_tool_schema_combinators_for_openair`   rR   )	r+   r2   rM   rh   ri   rj   rl   Úsanitized_toolsÚfinal_request_paramss	            r,   Útransform_responses_api_requestz8OpenAIResponsesAPIConfig.transform_responses_api_requestž   s˜   € ð  ×*Ñ*¨5Ó1ˆØ4×8Ñ8¸ÓAˆØ×JÑJÐQVÐ^cÐkpÐJÓq‰ˆˆuØ!%×!QÑ!QØ˜u°^ð "Ró "
ˆð Ð&Ø<KÐ0°Ñ9Ü&*Ü%Ðg¨E¸ÑgÐBfÑgó'
Ðð $Ð#r.   rl   c                 óö   — ddl m} t        |t        «      r/|D ]*  }t        |t        «      sŒ |t        t        |«      d«       Œ, |�/|D ]*  }t        |t        «      sŒ |t        t        |«      d«       Œ, ||fS )a2  Sibling of `remove_cache_control_flag_from_messages_and_tools` on
        the chat path. Strips Anthropic-only `cache_control` markers from
        Responses API input content blocks and tools.

        `filter_value_from_dict` mutates each dict in place, so the same
        objects are returned.
        r   )Úfilter_value_from_dictÚcache_control)Ú8litellm.litellm_core_utils.prompt_templates.common_utilsrw   rH   rT   r`   r	   )r+   r2   rM   rl   rw   ÚitemÚtools          r,   rq   zGOpenAIResponsesAPIConfig.remove_cache_control_flag_from_input_and_tools¼   s   € õ 	
ô �eœTÔ"Øò N�Ü˜d¤DÕ)Ù*¬4´°dÓ+;¸_ÕMðNð ÐØò N�Ü˜d¤DÕ)Ù*¬4´°dÓ+;¸_ÕMðNð �eˆ|Ðr.   c                 óØ   — |�| j                   t        vr|S | j                  ||¬«      }| j                  |«      s|S |D �cg c]  }| j	                  |«      ‘Œ }}t        d|«      S c c}w )a  Flatten top-level schema combinators only where OpenAI's validator rejects them.

        OpenAI-compatible backends reusing this config (and the ChatGPT backend
        Codex talks to natively) accept them, and so do GPT-5 and later models,
        which also call tools better with the union intact. Codex wraps MCP tools
        inside namespace entries, so nested ``tools`` arrays are walked too.
        Azure OpenAI shares the validator but names deployments arbitrarily, so
        the router's declared ``model_info.base_model`` wins over the deployment
        name and an unrecognized name without one is left untouched.
        )r2   ri   z#list[ALL_RESPONSES_API_TOOL_PARAMS])r-   r#   Ú_combinator_gate_modelÚ%_rejects_top_level_schema_combinatorsÚ_flattened_tool_or_passthroughr	   )r+   r2   rl   ri   Ú
gate_modelr{   Ú	flatteneds          r,   rr   zDOpenAIResponsesAPIConfig._flatten_tool_schema_combinators_for_openaiÜ   s   € ð  ˆ=˜D×4Ñ4Ô<jÑjØˆLØ ×7Ñ7¸eÐTbÐ7Ócˆ
Ø×9Ñ9¸*ÔEØˆLàBGö
Ø:>ˆD×/Ñ/°Õ5ð
ˆ	ð 
ô Ð9¸9ÓEÐEùò
s   ÁA'r{   c                 óP   — t        | t        «      rt        j                  | «      S | S r(   ©rH   r`   r%   Ú_flattened_tool_entry)r{   s    r,   r   z7OpenAIResponsesAPIConfig._flattened_tool_or_passthroughö   s%   € äGQÐRVÔX\ÔG]Ô'×=Ñ=¸dÓCÐgÐcgÐgr.   c                 ó¢   — | j                  d«      d   }|j                  d«      r|j                  d«      d   n|}|j                  t        «      S )Nr4   éÿÿÿÿzft:ú:r5   )r7   Ú
startswithr"   )r2   Ú
bare_modelÚ
base_models      r,   r~   z>OpenAIResponsesAPIConfig._rejects_top_level_schema_combinatorsú   sL   € à!ŸK™K¨Ó,¨RÑ0ˆ
Ø8B×8MÑ8MÈeÔ8T˜J×,Ñ,¨SÓ1°!Ò4ÐZdˆ
Ø×$Ñ$Ô%[Ó\Ð\r.   c                 óŽ   — t        |dd «      }t        |t        «      r|j                  d«      nd }t        |t        «      r|r|S | S )NÚ
model_inforŠ   )ÚgetattrrH   r`   ra   Ústr)r2   ri   rŒ   rŠ   s       r,   r}   z/OpenAIResponsesAPIConfig._combinator_gate_model   sA   € ä$+¨N¸LÈ$Ó$Oˆ
ÜDNÈzÔ[_ÔD` J§N¡N°<Ô$@Ðfjˆ
Ü'¨
´CÔ8¹ZˆzÐRÈUÐRr.   Úentryc                 ó   — ddl m} | j                  d«      }| j                  d«      }t        |t        «      rt        d ||«      i«      nt        }t        |t        «      r t        dt        j                  |«      i«      nt        }i | ¥|¥|¥S )Nr   )Ú$flatten_top_level_schema_combinatorsÚ
parametersrl   )
ry   r‘   ra   rH   r`   r   r   rT   r%   Ú_flattened_nested_tools)r�   r‘   r’   Únested_toolsÚparameters_updateÚtools_updates         r,   r„   z.OpenAIResponsesAPIConfig._flattened_tool_entry  s—   € õ	
ð "ŸI™I lÓ3ˆ
Ø#Ÿi™i¨Ó0ˆô ˜*¤dÔ+ô ˜lÑ,PÐQ[Ó,\Ð]Ô^ä ð 	ô ˜,¬Ô-ô ˜gÔ'?×'WÑ'WÐXdÓ'eÐfÔgä ð 	ð
 >�%Ð=Ð,Ð=°Ð=Ð=r.   r”   c                 óv   — | D �cg c])  }t        |t        «      rt        j                  |«      n|‘Œ+ c}S c c}w r(   rƒ   )r”   rz   s     r,   r“   z0OpenAIResponsesAPIConfig._flattened_nested_tools  sB   € ð %ö
àô EOÈtÔUYÔDZÔ$×:Ñ:¸4Ô@Ð`dÑdò
ð 	
ùò 
s   ….6c                 óò  — t        |t        «      ræg }|D ]Ý  }t        |t        «      r"|j                  |j	                  d¬«      «       Œ5t        |t
        «      rˆ|j                  d«      dk(  rEt        j                  d|«       t        t
        t        t        f   |«      }| j                  |«      }nt        t
        t        t        f   |«      }|j                  |«       ŒÍ|j                  |«       Œß |S |S )zå
        Ensure all input fields if pydantic are converted to dict

        OpenAI API Fails when we try to JSON dumps specific input pydantic fields.
        This function ensures all input fields are converted to dict.
        T©Úexclude_noneÚtyper\   zHandling reasoning item: %s)rH   rT   r   ÚappendÚ
model_dumpr`   ra   r   Údebugr	   rŽ   r   Ú_handle_reasoning_item)r+   rM   Úvalidated_inputrz   Ú	dict_itemÚfiltered_items         r,   rp   z.OpenAIResponsesAPIConfig._validate_input_param%  sÔ   € ô �eœTÔ"Ø%'ˆOØò 1�ä˜d¤IÔ.Ø#×*Ñ*¨4¯?©?È¨?Ó+MÕNÜ ¤dÔ+à—x‘x Ó'¨;Ò6Ü&×,Ñ,Ð-JÈDÔQä$(¬¬c´3¨h©¸Ó$>˜	Ø(,×(CÑ(CÀIÓ(N™ô )-¬T´#´s°(©^¸TÓ(B˜Ø#×*Ñ*¨=Õ9à#×*Ñ*¨4Õ0ð!1ð" #Ð"àˆr.   rz   c                 óÞ  — |j                  d«      dk(  rz	 t        |«      }d|vrKt        |j                  dd«      «      dkD  r|j                  dd«      dd dz   n|j                  dd«      |d<   t        di |¤Ž}|j	                  d	¬
«      }|S |S # t
        $ rR}t        j                  d|«       |j                  «       D ��ci c]  \  }}|€|dvr||“Œ nc c}}w }}}|cY d}~S d}~ww xY w)a·  
        Handle reasoning items specifically to filter out status=None using OpenAI's model.
        Issue: https://github.com/BerriAI/litellm/issues/13484
        OpenAI API does not accept ReasoningItem(status=None), so we need to:
        1. Check if the item is a reasoning type
        2. Create a ResponseReasoningItem object with the item data
        3. Convert it back to dict with exclude_none=True to filter None values
        r›   r\   ÚsummaryÚreasoning_contentÚ éd   Nz...Tr™   zLFailed to create ResponseReasoningItem, falling back to manual filtering: %s>   ÚstatusÚcontentÚencrypted_contentr0   )	ra   r`   r8   r   r�   Ú	Exceptionr   rž   Úitems)	r+   rz   Ú	item_dataÚreasoning_itemÚdict_reasoning_itemÚeÚkÚvr¢   s	            r,   rŸ   z/OpenAIResponsesAPIConfig._handle_reasoning_itemC  s  € ð �8‰8�FÓ˜{Ò*ð%ä#'¨£:�	Ø IÑ-ô ˜yŸ}™}Ð-@À"ÓEÓFÈÒLð "Ÿ™Ð&9¸2Ó>¸tÀÐDÀuÒLà&Ÿ]™]Ð+>ÀÓCð ˜iÑ(ô )>Ñ(JÀ	Ñ(J�ð .<×-FÑ-FÐTXÐ-FÓ-YÐ#à*Ð*ð ˆøô ò %Ü×$Ñ$Ð%sÐuvÔwð !%§
¡
£÷(á˜˜1Ø�}¨Ð1[Ñ([ð �q‘Dñ(ùó (�ñ (ð
 %Õ$ûð%ús*   –A8B Â	C,Â)C'ÃCÃC'Ã!C,Ã'C,Úraw_responseÚlogging_objc                 ó   — 	 |j                  |j                  di i¬«       |j                  «       }t        |d   «      |d<   t        |j                  «      }t        |«      }	 t        j                  |«      }||j                  d<   ||j                  d<   |S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w# t        $ r. t        j                  d|«       t        j                  di |¤Ž}Y Œ„w xY w)	z=No transform applied since outputs are in OpenAI spec alreadyÚcomplete_input_dict©Úoriginal_responseÚadditional_argsÚ
created_atr]   úBError constructing ResponsesAPIResponse: %s, using model_constructÚadditional_headersrj   r0   ©Ú	post_callÚtextÚjsonr   r«   r   r_   r`   rj   r   ÚResponsesAPIResponseÚmodel_validater   rž   Úmodel_constructÚ_hidden_params)r+   r2   r³   r´   Úraw_response_jsonÚraw_response_headersÚprocessed_headersÚresponses           r,   Útransform_response_api_responsez8OpenAIResponsesAPIConfig.transform_response_api_responsei  s  € ð	_Ø×!Ñ!Ø".×"3Ñ"3Ø!6¸Ð ;ð "ô ð (4×'8Ñ'8Ó':ÐÜ.IÐJ[Ð\hÑJiÓ.jÐ˜lÑ+ô '+¨<×+?Ñ+?Ó&@ÐÜ#;Ð<PÓ#QÐð	QÜ+×:Ñ:Ð;LÓMˆHð 9Jˆ×ÑÐ 4Ñ5Ø-Aˆ×Ñ 	Ñ*Øˆøô ò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_ûô ò 	QÜ× Ñ ØTÐVgôô ,×;Ñ;ÑPÐ>OÑPŠHð		Qúó   ‚A B Á#C Â+CÃ4C=Ã<C=c                 óÐ   — |xs
 t        «       }|j                  xs/ t        j                  xs t        j                  xs t	        d«      }|j                  dd«       d|› �|d<   |S )NÚOPENAI_API_KEYzContent-Typezapplication/jsonzBearer ÚAuthorization)r   Úapi_keyrb   Ú
openai_keyr   Ú
setdefault)r+   rj   r2   ri   rÎ   s        r,   Úvalidate_environmentz-OpenAIResponsesAPIConfig.validate_environmentˆ  sb   € Ø'ÒAÔ+?Ó+AˆØ ×(Ñ(Òu¬G¯O©OÒu¼w×?QÑ?QÒuÔUcÐdtÓUuˆØ×Ñ˜>Ð+=Ô>Ø%,¨W¨IÐ#6ˆ�Ñ Øˆr.   Úapi_basec                 ó’   — |xs. t         j                  xs t        d«      xs t        d«      xs d}|j                  d«      }|› d�S )z;
        Get the endpoint for OpenAI responses API
        ÚOPENAI_BASE_URLÚOPENAI_API_BASEzhttps://api.openai.com/v1r4   z
/responses)rb   rÒ   r   Úrstrip)r+   rÒ   ri   s      r,   Úget_complete_urlz)OpenAIResponsesAPIConfig.get_complete_url�  s_   € ð ò +Ü×Ñò+äÐ/Ó0ò+ô Ð/Ó0ò+ð +ð 	ð —?‘? 3Ó'ˆà�˜:Ð&Ð&r.   Úparsed_chunkc                 ó  — t        j                  d|«       t        |j                  d«      «      }t        j                  |¬«      }	 |j                  d«      }t        |t        «      r2|j                  d«      €!t        |«      }t        |«      |d<   d|d   d<   	  |d	i |¤ŽS # t        $ r t        j                  d«       Y Œ)w xY w# t        $ r6 t        j                  d|j                  |«        |j                  d	i |¤ŽcY S w xY w)
zb
        Transform a parsed streaming response chunk into a ResponsesAPIStreamingResponse
        zRaw OpenAI Chunk=%sr›   )Ú
event_typeÚerrorÚcodeÚunknown_errorz-Failed to coalesce error.code in parsed_chunkzPPydantic validation failed for %s with chunk %s, falling back to model_constructr0   )r   rž   rŽ   ra   r%   Úget_event_model_classrH   r`   r«   r   Ú__name__rÃ   )r+   r2   rØ   r´   rÚ   Úevent_pydantic_modelÚ	error_objs          r,   Útransform_streaming_responsez5OpenAIResponsesAPIConfig.transform_streaming_response¤  s  € ô 	×ÑÐ2°LÔAÜ × 0Ñ 0°Ó 8Ó9ˆ
Ü&>×&TÑ&TÐ`jÐ&TÓ&kÐð	RØ+×/Ñ/°Ó8ˆIÜ˜)¤TÔ*¨y¯}©}¸VÓ/DÐ/LÜ# LÓ1�Ü(,¨Y«�˜WÑ%Ø0?�˜WÑ% fÑ-ð	HÙ'Ñ7¨,Ñ7Ð7øô	 ò 	RÜ× Ñ Ð!PÖQð	Rûô
 ò 	HÜ× Ñ ØbØ$×-Ñ-Øôð
 8Ð'×7Ñ7ÑG¸,ÑGÒGð	Hús%   ÁAB$ ÂC Â$CÃCÃ<DÄDÚ
all_chunksc                 óÊ   — t        | «      D ]F  }t        t        t        fD ]0  }	 |j	                  |j                  d«      «      j                  c c S  ŒH y # t        $ r Y ŒAw xY w)Nzdata: )ÚreversedÚResponseCompletedEventÚResponseIncompleteEventÚResponseFailedEventÚmodel_validate_jsonÚremoveprefixrÈ   Ú
ValueError)rã   Ú	chunk_strÚevent_models      r,   Ú*parse_terminal_response_from_stream_chunkszCOpenAIResponsesAPIConfig.parse_terminal_response_from_stream_chunksÅ  so   € ä! *Ó-ò 	ˆIÜ 6Ô8OÔQdÐeò �ðØ&×:Ñ:¸9×;QÑ;QÐRZÓ;[Ó\×eÑeÔeñð	ð øô "ò Ùðús   ¤)AÁ	A"Á!A"rÚ   c                 ó  — i t         j                  t        “t         j                  t        “t         j
                  t        “t         j                  t        “t         j                  t        “t         j                  t        “t         j                  t        “t         j                  t         “t         j"                  t$        “t         j&                  t(        “t         j*                  t,        “t         j.                  t0        “t         j2                  t4        “t         j6                  t8        “t         j:                  t<        “t         j>                  t@        “t         jB                  tD        “i t         jF                  tH        “t         jJ                  tL        “t         jN                  tP        “t         jR                  tT        “t         jV                  tX        “t         jZ                  t\        “t         j^                  t`        “t         jb                  td        “t         jf                  th        “t         jj                  tl        “t         jn                  tp        “t         jr                  tt        “t         jv                  tx        “t         jz                  t|        “t         j~                  t€        “t         j‚                  t„        “t         j†                  t„        “¥t         jˆ                  t„        i¥}|j‹                  t�        t         | «      «      }|st„        S |S )a8  
        Returns the appropriate event model class based on the event type.

        Args:
            event_type (str): The type of event from the response chunk

        Returns:
            Any: The corresponding event model class

        Raises:
            ValueError: If the event type is unknown
        )GÚResponsesAPIStreamEventsÚRESPONSE_CREATEDÚResponseCreatedEventÚRESPONSE_IN_PROGRESSÚResponseInProgressEventÚRESPONSE_COMPLETEDræ   ÚRESPONSE_FAILEDrè   ÚRESPONSE_INCOMPLETErç   ÚOUTPUT_ITEM_ADDEDÚOutputItemAddedEventÚOUTPUT_ITEM_DONEÚOutputItemDoneEventÚCONTENT_PART_ADDEDÚContentPartAddedEventÚCONTENT_PART_DONEÚContentPartDoneEventÚOUTPUT_TEXT_DELTAÚOutputTextDeltaEventÚOUTPUT_TEXT_ANNOTATION_ADDEDÚOutputTextAnnotationAddedEventÚOUTPUT_TEXT_DONEÚOutputTextDoneEventÚREFUSAL_DELTAÚRefusalDeltaEventÚREFUSAL_DONEÚRefusalDoneEventÚFUNCTION_CALL_ARGUMENTS_DELTAÚFunctionCallArgumentsDeltaEventÚFUNCTION_CALL_ARGUMENTS_DONEÚFunctionCallArgumentsDoneEventÚFILE_SEARCH_CALL_IN_PROGRESSÚFileSearchCallInProgressEventÚFILE_SEARCH_CALL_SEARCHINGÚFileSearchCallSearchingEventÚFILE_SEARCH_CALL_COMPLETEDÚFileSearchCallCompletedEventÚWEB_SEARCH_CALL_IN_PROGRESSÚWebSearchCallInProgressEventÚWEB_SEARCH_CALL_SEARCHINGÚWebSearchCallSearchingEventÚWEB_SEARCH_CALL_COMPLETEDÚWebSearchCallCompletedEventÚMCP_LIST_TOOLS_IN_PROGRESSÚMCPListToolsInProgressEventÚMCP_LIST_TOOLS_COMPLETEDÚMCPListToolsCompletedEventÚMCP_LIST_TOOLS_FAILEDÚMCPListToolsFailedEventÚMCP_CALL_IN_PROGRESSÚMCPCallInProgressEventÚMCP_CALL_ARGUMENTS_DELTAÚMCPCallArgumentsDeltaEventÚMCP_CALL_ARGUMENTS_DONEÚMCPCallArgumentsDoneEventÚMCP_CALL_COMPLETEDÚMCPCallCompletedEventÚMCP_CALL_FAILEDÚMCPCallFailedEventÚIMAGE_GENERATION_PARTIAL_IMAGEÚ ImageGenerationPartialImageEventÚERRORÚ
ErrorEventÚSHELL_CALL_IN_PROGRESSÚGenericEventÚSHELL_CALL_COMPLETEDÚSHELL_CALL_OUTPUTra   r	   )rÚ   Úevent_modelsÚmodel_classs      r,   rÞ   z.OpenAIResponsesAPIConfig.get_event_model_classÏ  sÌ  € ð%
Ü$×5Ñ5Ô7Kð%
ä$×9Ñ9Ô;Rð%
ô %×7Ñ7Ô9Oð%
ô %×4Ñ4Ô6Ið	%
ô
 %×8Ñ8Ô:Qð%
ô %×6Ñ6Ô8Lð%
ô %×5Ñ5Ô7Jð%
ô %×7Ñ7Ô9Nð%
ô %×6Ñ6Ô8Lð%
ô %×6Ñ6Ô8Lð%
ô %×AÑAÔCað%
ô %×5Ñ5Ô7Jð%
ô %×2Ñ2Ô4Eð%
ô %×1Ñ1Ô3Cð%
ô %×BÑBÔDcð%
ô  %×AÑAÔCað!%
ô" %×AÑAÔC`ñ#%
ô$ %×?Ñ?ÔA]ð%%
ô& %×?Ñ?ÔA]ð'%
ô( %×@Ñ@ÔB^ð)%
ô* %×>Ñ>Ô@[ð+%
ô, %×>Ñ>Ô@[ð-%
ô. %×?Ñ?ÔA\ð/%
ô0 %×=Ñ=Ô?Yð1%
ô2 %×:Ñ:Ô<Sð3%
ô4 %×9Ñ9Ô;Qð5%
ô6 %×=Ñ=Ô?Yð7%
ô8 %×<Ñ<Ô>Wð9%
ô: %×7Ñ7Ô9Nð;%
ô< %×4Ñ4Ô6Hð=%
ô> %×CÑCÔEeð?%
ô@ %×*Ñ*¬JðA%
ôD %×;Ñ;¼\ðE%
ôF %×9Ñ9¼<ñG%
ôH %×6Ñ6¼ñI%
ˆðN *×-Ñ-¬dÔ3KÈZÓ.XÓYˆÙÜÐàÐr.   Ústreamr-   c                 ó¸   — |dury|�'	 t         j                  j                  ||¬«      du ry	 yy# t        $ r }t	        j
                  d|«       Y d }~yd }~ww xY w)NTF)r2   r-   z8Error getting model info in OpenAIResponsesAPIConfig: %s)rb   ÚutilsÚsupports_native_streamingr«   r   rž   )r+   r2   r4  r-   r°   s        r,   Úshould_fake_streamz+OpenAIResponsesAPIConfig.should_fake_stream
  s}   € ð ˜ÑØØÐð
dä—M‘M×;Ñ;Ø#Ø,?ð <ó ð ñ	ð  ðñ øô ò dÜ×$Ñ$Ð%_Ðab×cÐcØûðdús   ‰#0 °	A¹AÁAc                  ó   — y)z2OpenAI supports native WebSocket for Responses APITr0   r*   s    r,   Úsupports_native_websocketz2OpenAIResponsesAPIConfig.supports_native_websocket   s   € àr.   Úresponse_idc                 ó6   — t        |d¬«      }|› d|› �}i }||fS )z®
        Transform the delete response API request into a URL and data

        OpenAI API expects the following request
        - DELETE /v1/responses/{response_id}
        r;  ©Ú
field_namer4   r   ©r+   r;  rÒ   ri   rj   Úencoded_response_idÚurlÚdatas           r,   Ú%transform_delete_response_api_requestz>OpenAIResponsesAPIConfig.transform_delete_response_api_request'  ó3   € ô &=¸[ÐUbÔ%cÐØ �z Ð#6Ð"7Ð8ˆØˆØ�DˆyÐr.   c                 ó–   — 	 |j                  «       }t        di |¤ŽS # t        $ r" t        |j                  |j                  ¬«      ‚w xY w)zX
        Transform the delete response API response into a DeleteResponseResult
        r]   r0   )rÀ   r«   r   r¿   r_   ÚDeleteResponseResult)r+   r³   r´   rÅ   s       r,   Ú&transform_delete_response_api_responsez?OpenAIResponsesAPIConfig.transform_delete_response_api_response9  sT   € ð	_Ø'3×'8Ñ'8Ó':Ðô $Ñ8Ð&7Ñ8Ð8øô ò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_ús	   ‚ �+Ac                 ó6   — t        |d¬«      }|› d|› �}i }||fS )z¨
        Transform the get response API request into a URL and data

        OpenAI API expects the following request
        - GET /v1/responses/{response_id}
        r;  r=  r4   r   r?  s           r,   Ú"transform_get_response_api_requestz;OpenAIResponsesAPIConfig.transform_get_response_api_requestJ  rD  r.   c                 ó*  — 	 |j                  «       }t        |j                  «      }t        |«      }t        j                  |«      }||j                  d<   ||j                  d<   |S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w)zU
        Transform the get response API response into a ResponsesAPIResponse
        r]   r¼   rj   ©rÀ   r«   r   r¿   r_   r`   rj   r   rÁ   rÂ   rÄ   ©r+   r³   r´   rÅ   rÆ   rÇ   rÈ   s          r,   Ú#transform_get_response_api_responsez<OpenAIResponsesAPIConfig.transform_get_response_api_response\  s™   € ð	_Ø'3×'8Ñ'8Ó':Ðô '+¨<×+?Ñ+?Ó&@ÐÜ#;Ð<PÓ#QÐÜ.×=Ñ=Ð>OÓPˆØ8Iˆ×ÑÐ 4Ñ5Ø-Aˆ×Ñ 	Ñ*àˆøô ò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_úó   ‚A' Á'+BÚafterÚbeforeÚincludeÚlimitÚorder)ÚascÚdescc
                 óœ   — t        |d¬«      }
|› d|
› d�}i }|�||d<   |�||d<   |rdj                  |«      |d<   |�||d	<   |	�|	|d
<   ||fS )Nr;  r=  r4   z/input_itemsrO  rP  ú,rQ  rR  rS  )r   Újoin)r+   r;  rÒ   ri   rj   rO  rP  rQ  rR  rS  r@  rA  re   s                r,   Ú"transform_list_input_items_requestz;OpenAIResponsesAPIConfig.transform_list_input_items_requests  sˆ   € ô &=¸[ÐUbÔ%cÐØ �z Ð#6Ð"7°|ÐDˆØ(*ˆØÐØ#ˆF�7‰OØÐØ%ˆF�8ÑÙØ #§¡¨Ó 1ˆF�9ÑØÐØ#ˆF�7‰OØÐØ#ˆF�7‰OØ�Fˆ{Ðr.   c                 ó€   — 	 |j                  «       S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w)Nr]   )rÀ   r«   r   r¿   r_   )r+   r³   r´   s      r,   Ú#transform_list_input_items_responsez<OpenAIResponsesAPIConfig.transform_list_input_items_responseŽ  sA   € ð
	_Ø×$Ñ$Ó&Ð&øÜò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_ús   ‚ ’+=c                 ó8   — t        |d¬«      }|› d|› d�}i }||fS )z³
        Transform the cancel response API request into a URL and data

        OpenAI API expects the following request
        - POST /v1/responses/{response_id}/cancel
        r;  r=  r4   z/cancelr   r?  s           r,   Ú%transform_cancel_response_api_requestz>OpenAIResponsesAPIConfig.transform_cancel_response_api_request›  s5   € ô &=¸[ÐUbÔ%cÐØ �z Ð#6Ð"7°wÐ?ˆØˆØ�DˆyÐr.   c                 ó*  — 	 |j                  «       }t        |j                  «      }t        |«      }t        j                  |«      }||j                  d<   ||j                  d<   |S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w)zX
        Transform the cancel response API response into a ResponsesAPIResponse
        r]   r¼   rj   rK  rL  s          r,   Ú&transform_cancel_response_api_responsez?OpenAIResponsesAPIConfig.transform_cancel_response_api_response­  s™   € ð	_Ø'3×'8Ñ'8Ó':Ðô '+¨<×+?Ñ+?Ó&@ÐÜ#;Ð<PÓ#QÐä.×=Ñ=Ð>OÓPˆØ8Iˆ×ÑÐ 4Ñ5Ø-Aˆ×Ñ 	Ñ*àˆøô ò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_úrN  c                 ó|  — t        j                  |«      }|j                  j                  d«      dz   }t	        |j                  |¬«      «      }	| j                  |«      }|j                  d«      }
| j                  |||
¬«      \  }}
| j                  ||
|¬«      }|�||d<   t        t        d||dœ|¤Ž«      }|	|fS )	z§
        Transform the compact response API request into a URL and data

        OpenAI API expects the following request
        - POST /v1/responses/compact
        r4   z/compact)Úpathrl   rm   rn   ro   r0   )ÚhttpxÚURLra  rÖ   rŽ   Ú	copy_withrp   ra   rq   rr   r`   rR   )r+   r2   rM   rh   rÒ   ri   rj   Ú
parsed_urlÚcompact_pathrA  rl   rs   rB  s                r,   Ú&transform_compact_response_api_requestz?OpenAIResponsesAPIConfig.transform_compact_response_api_requestÅ  sÖ   € ô  "ŸI™I hÓ/ˆ
Ø(Ÿo™o×4Ñ4°SÓ9¸JÑFˆÜ˜×-Ñ-°<Ð-Ó@ÓAˆà×*Ñ*¨5Ó1ˆØ4×8Ñ8¸ÓAˆØ×JÑJÐQVÐ^cÐkpÐJÓq‰ˆˆuØ!%×!QÑ!QØ˜u°^ð "Ró "
ˆð Ð&Ø<KÐ0°Ñ9ÜÔ4Ðv¸5ÈÑvÐQuÑvÓwˆà�DˆyÐr.   c                 ó   — 	 |j                  |j                  di i¬«       |j                  «       }t        |d   «      |d<   t        |j                  «      }t        |«      }	 t        j                  |«      }||j                  d<   ||j                  d<   |S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w# t        $ r. t        j                  d|«       t        j                  di |¤Ž}Y Œ„w xY w)	zY
        Transform the compact response API response into a ResponsesAPIResponse
        r¶   r·   rº   r]   r»   r¼   rj   r0   r½   rL  s          r,   Ú'transform_compact_response_api_responsez@OpenAIResponsesAPIConfig.transform_compact_response_api_responseå  s  € ð	_Ø×!Ñ!Ø".×"3Ñ"3Ø!6¸Ð ;ð "ô ð (4×'8Ñ'8Ó':ÐÜ.IÐJ[Ð\hÑJiÓ.jÐ˜lÑ+ô '+¨<×+?Ñ+?Ó&@ÐÜ#;Ð<PÓ#QÐð	QÜ+×:Ñ:Ð;LÓMˆHð 9Jˆ×ÑÐ 4Ñ5Ø-Aˆ×Ñ 	Ñ*àˆøô! ò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_ûô ò 	QÜ× Ñ ØTÐVgôô ,×;Ñ;ÑPÐ>OÑPŠHð		QúrÊ   )rJ   ú
int | Noner&   rj  r(   )NNNé   rU  )?rß   Ú
__module__Ú__qualname__Úpropertyr   r-   Úboolr1   ÚstaticmethodrŽ   r:   r@   rF   rK   rT   rW   Ú!ResponsesAPIOptionalRequestParamsr`   rg   ÚResponseInputParamr   ru   ÚALL_RESPONSES_API_TOOL_PARAMSÚtuplerq   rr   Úobjectr   r~   r}   r   r„   r   r“   rp   r   rŸ   rb  ÚResponseÚLiteLLMLoggingObjrÁ   rÉ   rÑ   r×   ÚResponsesAPIStreamingResponserâ   rî   rÞ   r8  r:  rC  rF  rG  rI  rM  rI   ÚLiteralrY  r[  r]  r_  rg  ri  r0   r.   r,   r%   r%   (   s¯  „ Øð# \ò #ó ð#ð¨Tó ð ð	3˜sð 	3 tò 	3ó ð	3ð ð
¨sð 
°tò 
ó ð
ð ðG¨ð G°S¸4±Zð GÀDò Gó ðGð ò
!ó ð
!ð
°ð 
¸ó 
ð&'à&Gð'ð ð'ð ð	'ð
 
ó'ðR$àð$ð Ð'Ñ'ð$ð /3ð	$ð
 -ð$ð ð$ð 
ó$ðD =Añ	àðð Ð'Ñ'ðð Ð1Ñ2°TÑ9ð	ð
 
ØÐ Ñ ØÐ*Ñ+¨dÑ2ð	4ñ
óð@FàðFð Ð1Ñ2°TÑ9ðFð -ð	Fð
 
Ð+Ñ	,¨tÑ	3óFð4 ðh¨Vð h¸ò hó ðhð ð]°Sð ]¸Tò ]ó ð]ð
 ðS cð SÐ;Oð SÐTWò Só ðSð
 ð>Ø�s˜F�{Ñ#ð>à	ˆc�6ˆkÑ	ò>ó ð>ð* ð
Ø˜vÑ&ð
à	ˆf‰ò
ó ð
ð¨3Ð1CÑ+Cð ÈÐN`ÑH`ó ð<$¨4°°S°©>ð $¸dÀ3ÈÀ8¹nó $ðLàðð —n‘nðð 'ð	ð
 
óð>¨Dð ¸ð ÐNbÐeiÑNið Ðnró ð'à˜‘*ð'ð ð'ð 
ó	'ð*HàðHð ðHð 'ð	Hð
 
'óHðB ð¸tÀC¹yð ÐMaÐdhÑMhò ó ðð ð8¨#ð 8°#ò 8ó ð8ð| +/ñ	à�T‰zðð �t‘ðð ! 4™Zð	ð
 
óð,¨4ó ðàðð ðð -ð	ð
 ðð 
ˆs�DˆyÑ	óð$9à—n‘nð9ð 'ð9ð 
ó	9ð"àðð ðð -ð	ð
 ðð 
ˆs�DˆyÑ	óð$à—n‘nðð 'ðð 
ó	ð: !Ø!Ø$(ØØ(.ñàðð ðð -ð	ð
 ðð �T‰zðð �d‘
ðð �c‘˜TÑ!ðð ðð �}Ñ%ðð 
ˆs�DˆyÑ	óð6_à—n‘nð_ð 'ð_ð 
ó	_ðàðð ðð -ð	ð
 ðð 
ˆs�DˆyÑ	óð$à—n‘nðð 'ðð 
ó	ð0àðð Ð'Ñ'ðð /3ð	ð
 ðð -ðð ðð 
ˆs�DˆyÑ	óð@à—n‘nðð 'ðð 
ô	r.   r%   )7Úcollections.abcr   r   Útypesr   Útypingr   r   r   r	   r
   rb  Úopenai.types.responsesr   Úpydanticr   r   rb   Úlitellm._loggingr   Ú'litellm.litellm_core_utils.core_helpersr   ÚFlitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser   Ú$litellm.litellm_core_utils.url_utilsr   Ú.litellm.llms.base_llm.responses.transformationr   rD   r   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.openaiÚlitellm.types.responses.mainÚlitellm.types.routerr   Úlitellm.types.utilsr   Úcommon_utilsr   r   Ú__annotations__Ú*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjrw  r   rŽ   ru  r"   Ú	frozensetÚAZUREr)   r#   r%   r0   r.   r,   ú<module>r�     s¿   ðß -Ð -Ý "ß BÕ Bã Ý 8ß /ã Ý +Ý Lõõ IÝ QÝ VÝ 7Ü 'Ü *Ý 5Ý ,å &à46Ð *¨EÓ 6áÝXà*ÑàÐá/?ÀÓ/C€��w˜s F˜{Ñ+Ñ,Ó CØ@tÐ 6¸Ó tÙ8AÀ<×CUÑCUÐWc×WjÑWjÐBkÓ8lÐ .°Ó lô\Ð5õ \r.   