Ë
    uPêj  ã                   óŽ   — d 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mZ dd	lmZ dd
lmZ  G d„ de«      Zy)u…  
Perplexity Responses API â€” OpenAI-compatible.

The only provider quirks:
- cost returned as dict â†’ handled by ResponseAPIUsage.parse_cost validator
- preset models (preset/pro-search) â†’ handled by transform_responses_api_request
- HTTP 200 with status:"failed" â†’ raised as exception in transform_response_api_response

Ref: https://docs.perplexity.ai/api-reference/responses-post
é    )ÚAnyÚFinalN)ÚLogging)ÚBaseLLMException)ÚOpenAIResponsesAPIConfig)Úget_secret_str)ÚResponseInputParamÚResponsesAPIResponse)ÚGenericLiteLLMParams)ÚLlmProvidersc                   óô   ‡ — e Zd Zdedefd„Z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ez  deez  fd„Zdedeez  de	de
de	de	fˆ fd„Zdedej"                  dedefˆ fd„Zdefd„Zˆ xZS )ÚPerplexityResponsesConfigÚmodelÚreturnc                 ó
   — g d¢S )z<Ref: https://docs.perplexity.ai/api-reference/responses-post)Úmax_output_tokensÚstreamÚtemperatureÚtop_pÚtoolsÚ	reasoningÚinstructionsÚmodels© )Úselfr   s     úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/perplexity/responses/transformation.pyÚget_supported_openai_paramsz5PerplexityResponsesConfig.get_supported_openai_params   s   € ò	
ð 		
ó    c                 ó"   — t         j                  S )N)r   Ú
PERPLEXITY©r   s    r   Úcustom_llm_providerz-PerplexityResponsesConfig.custom_llm_provider'   s   € ä×&Ñ&Ð&r   ÚheadersÚlitellm_paramsNc                 ó‚   — |xs
 t        «       }|j                  xs t        d«      xs t        d«      }|rd|› �|d<   |S )NÚPERPLEXITYAI_API_KEYÚPERPLEXITY_API_KEYzBearer ÚAuthorization)r   Úapi_keyr   )r   r#   r   r$   r)   s        r   Úvalidate_environmentz.PerplexityResponsesConfig.validate_environment+   sP   € Ø'ÒAÔ+?Ó+Aˆà×"Ñ"Òt¤nÐ5KÓ&LÒtÔP^Ð_sÓPtð 	ñ Ø)0°°	Ð':ˆG�OÑ$Øˆr   Úapi_basec                 óP   — |xs t        d«      xs d}|j                  d«      › d�S )NÚPERPLEXITY_API_BASEzhttps://api.perplexity.aiú/z/v1/responses)r   Úrstrip)r   r+   r$   s      r   Úget_complete_urlz*PerplexityResponsesConfig.get_complete_url4   s/   € ØÒcœ~Ð.CÓDÒcÐHcˆØ—/‘/ #Ó&Ð' }Ð5Ð5r   Úinputc                 óî   — t        |t        «      r|S t        |t        «      rRg }|D ]I  }t        |t        «      r&d|vr"t        |«      }d|d<   |j	                  |«       Œ9|j	                  |«       ŒK |S |S )zEEnsure list input items have type='message' (required by Perplexity).ÚtypeÚmessage)Ú
isinstanceÚstrÚlistÚdictÚappend)r   r1   ÚresultÚitemÚnew_items        r   Ú_ensure_message_typez.PerplexityResponsesConfig._ensure_message_type8   sw   € ä�eœSÔ!ØˆLÜ�eœTÔ"Ø')ˆFØò (�Ü˜d¤DÔ)¨f¸DÑ.@Ü# D›z�HØ'0�H˜VÑ$Ø—M‘M (Õ+à—M‘M $Õ'ð(ð ˆMØˆr   Ú$response_api_optional_request_paramsc                 óÚ   •— | j                  |«      }|j                  d«      r5| j                  |«      }|t        d«      d |dœ}|j	                  |«       |S t
        ‰| �  |||||¬«      S )zQHandle preset/ model prefix: send as {"preset": name} instead of {"model": name}.zpreset/N)Úpresetr1   )r   r1   r>   r$   r#   )r=   Ú
startswithÚ_validate_input_paramÚlenÚupdateÚsuperÚtransform_responses_api_request)r   r   r1   r>   r$   r#   ÚdataÚ	__class__s          €r   rF   z9PerplexityResponsesConfig.transform_responses_api_requestH   s†   ø€ ð ×)Ñ)¨%Ó0ˆØ×Ñ˜IÔ&Ø×.Ñ.¨uÓ5ˆEà¤ I£Ð 0Ð1Øñ!ˆDð �K‰KÐ<Ô=ØˆKÜ‰wÑ6ØØØ1UØ)Øð 7ó 
ð 	
r   Úraw_responseÚlogging_objc                 ó&  •— 	 |j                  «       }t        |t        «      rM|j	                  d«      dk(  r9|j	                  di «      }t        |j                  |j	                  dd«      ¬«      ‚t        ‰| �!  |||¬«      S # t        $ r d}Y Œ|w xY w)	zMCheck for Perplexity's status:'failed' on HTTP 200 before delegating to base.NÚstatusÚfailedÚerrorr4   zUnknown Perplexity error)Ústatus_coder4   )r   rI   rJ   )	ÚjsonÚ	Exceptionr5   r8   Úgetr   rO   rE   Útransform_response_api_response)r   r   rI   rJ   Úraw_response_jsonrN   rH   s         €r   rS   z9PerplexityResponsesConfig.transform_response_api_responseb   s¨   ø€ ð	%Ø ,× 1Ñ 1Ó 3Ðô Ð'¬Ô.Ð3D×3HÑ3HÈÓ3RÐV^Ò3^Ø,×0Ñ0°¸"Ó=ˆEÜ"Ø(×4Ñ4ØŸ	™	 )Ð-GÓHôð ô
 ‰wÑ6ØØ%Ø#ð 7ó 
ð 	
øô ò 	%Ø $Òð	%ús   ƒB ÂBÂBc                  ó   — y)z>Perplexity does not support native WebSocket for Responses APIFr   r!   s    r   Úsupports_native_websocketz3PerplexityResponsesConfig.supports_native_websocket{   s   € àr   )Ú__name__Ú
__module__Ú__qualname__r6   r7   r   Úpropertyr   r"   r8   r   r*   r0   r	   r=   rF   ÚhttpxÚResponseÚLiteLLMLoggingObjr
   rS   ÚboolrV   Ú__classcell__)rH   s   @r   r   r      s  ø„ ð
°ð 
¸ó 
ð ð' \ò 'ó ð'ð¨Dð ¸ð ÐNbÐeiÑNið Ðnró ð6¨¨t©ð 6ÀTð 6Ècó 6ð¨#Ð0BÑ*Bð ÀsÐM_ÑG_ó ð 
àð
ð Ð'Ñ'ð
ð /3ð	
ð
 -ð
ð ð
ð 
õ
ð4
àð
ð —n‘nð
ð 'ð	
ð
 
õ
ð2¨4÷ r   r   )Ú__doc__Útypingr   r   r[   Ú*litellm.litellm_core_utils.litellm_loggingr   r]   Ú)litellm.llms.base_llm.chat.transformationr   Ú,litellm.llms.openai.responses.transformationr   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.openair	   r
   Úlitellm.types.routerr   Úlitellm.types.utilsr   r   r   r   r   ú<module>ri      s6   ðñ	÷ ã å SÝ FÝ QÝ 7ß NÝ 5Ý ,ôdÐ 8õ dr   