Ë
    uPêj&  ã                   ó¢   — d Z ddlmZmZ ddl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mZ dd	lmZmZmZ erddlZ G d
„ de«      Zy)zW
Translate from OpenAI's `/v1/chat/completions` to Perplexity's `/v1/chat/completions`
é    )ÚTYPE_CHECKINGÚFinalN)Úverbose_logger)ÚLogging)ÚOpenAIGPTConfig©Úget_secret_str)ÚAllMessageValuesÚChatCompletionAnnotationÚ#ChatCompletionAnnotationURLCitation)ÚModelResponseÚPromptTokensDetailsWrapperÚUsagec                   ó  ‡ — e Zd Zededz  fd„«       Zdedz  dedz  deedz  edz  f   fd„Zdedefd„Z		 	 dded	e
j                  d
edededee   dededddedz  dedz  defˆ fd„Zd
ededdfd„Zd
ededdfd„Zˆ xZS )ÚPerplexityChatConfigÚreturnNc                  ó   — y)NÚ
perplexity© )Úselfs    úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/perplexity/chat/transformation.pyÚcustom_llm_providerz(PerplexityChatConfig.custom_llm_provider   s   € àó    Úapi_baseÚapi_keyc                 óh   — |xs t        d«      xs d}|xs t        d«      xs t        d«      }||fS )NÚPERPLEXITY_API_BASEzhttps://api.perplexity.aiÚPERPLEXITYAI_API_KEYÚPERPLEXITY_API_KEYr   )r   r   r   Údynamic_api_keys       r   Ú$_get_openai_compatible_provider_infoz9PerplexityChatConfig._get_openai_compatible_provider_info   s@   € ð Òcœ~Ð.CÓDÒcÐHcˆØ!Òs¤^Ð4JÓ%KÒsÌ~Ð^rÓOsˆØ˜Ð(Ð(r   Úmodelc                 óŒ  — g d¢}	 t        j                  || j                  ¬«      r|j                  d«       	 t        j                  || j                  ¬«      r|j                  d«       |S # t        $ r }t        j                  d|«       Y d}~ŒYd}~ww xY w# t        $ r!}t        j                  d|«       Y d}~|S d}~ww xY w)zã
        Perplexity supports a subset of OpenAI params

        Ref: https://docs.perplexity.ai/api-reference/chat-completions

        Eg. Perplexity does not support tools, tool_choice, function_call, functions, etc.
        )
Úfrequency_penaltyÚ
max_tokensÚmax_completion_tokensÚpresence_penaltyÚresponse_formatÚstreamÚtemperatureÚtop_pÚmax_retriesÚextra_headers)r"   r   Úreasoning_effortz.Error checking if model supports reasoning: %sNÚweb_search_optionsz/Error checking if model supports web search: %s)ÚlitellmÚsupports_reasoningr   ÚappendÚ	Exceptionr   ÚdebugÚsupports_web_search)r   r"   Úbase_openai_paramsÚes       r   Úget_supported_openai_paramsz0PerplexityChatConfig.get_supported_openai_params!   s¿   € ò%
Ðð	VÜ×)Ñ)°È4×KcÑKcÕdØ"×)Ñ)Ð*<Ô=ð	WÜ×*Ñ*°ÈD×LdÑLdÕeØ"×)Ñ)Ð*>Ô?ð "Ð!øô ò 	VÜ× Ñ Ð!QÐST×UÑUûð	Vûô ò 	WÜ× Ñ Ð!RÐTU×VÐVà!Ð!ûð	Wús.   †2A- ¹2B Á-	BÁ6BÂBÂ	CÂ"B>Â>CÚraw_responseÚmodel_responseÚlogging_objÚrequest_dataÚmessagesÚoptional_paramsÚlitellm_paramsÚencodingztiktoken.Encoding | NoneÚ	json_modec                 ó   •— t         ‰| �  |||||||||	|
|¬«      }	 |j                  «       }| j                  ||«       | j	                  ||«       |S # t
        $ r!}t        j                  d|«       Y d }~|S d }~ww xY w)N)r"   r9   r:   r;   r<   r=   r>   r?   r@   r   rA   z5Error extracting Perplexity-specific usage fields: %s)ÚsuperÚtransform_responseÚjsonÚ%_enhance_usage_with_perplexity_fieldsÚ_add_citations_as_annotationsr3   r   r4   )r   r"   r9   r:   r;   r<   r=   r>   r?   r@   r   rA   Úraw_response_jsonr7   Ú	__class__s                 €r   rD   z'PerplexityChatConfig.transform_responseD   s¨   ø€ ô ™Ñ3ØØ%Ø)Ø#Ø%ØØ+Ø)ØØØð 4ó 
ˆð	]Ø'3×'8Ñ'8Ó':ÐØ×6Ñ6°~ÐGXÔYØ×.Ñ.¨~Ð?PÔQð Ðøô ò 	]Ü× Ñ Ð!XÐZ[×\Ð\àÐûð	]ús   �4A Á	A=ÁA8Á8A=rH   c                 óL  — t        |d«      r|j                  €t        ddd¬«      |_        |j                  }|j                  dg «      }d}|r&t	        d„ |D «       «      }|dkD  rt        d|dz  «      }|j                  di «      }|j                  d	«      }|€|j                  d	«      }|€|j                  d
«      }|€|j                  d
«      }|dkD  s|�N|dkD  rH|j                  €t        «       |_        |dkD  rt        |d|«       |�|dkD  r||j                  _	        yyyyy)z¡
        Extract citation tokens and search queries from Perplexity API response
        and add them to the usage object using standard LiteLLM fields.
        ÚusageNr   )Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚ	citationsc              3   óJ   K  — | ]  }|sŒt        t        |«      «      –— Œ y ­w)N)ÚlenÚstr)Ú.0Úcitations     r   ú	<genexpr>zMPerplexityChatConfig._enhance_usage_with_perplexity_fields.<locals>.<genexpr>|   s   è ø€ Ò-gÀXÒ^f¬c´#°h³-×.@Ñ-gùs   ‚#Š#é   é   Únum_search_queriesÚsearch_queriesÚcitation_tokens)
ÚhasattrrK   r   ÚgetÚsumÚmaxÚprompt_tokens_detailsr   ÚsetattrÚweb_search_requests)	r   r:   rH   rK   rO   rZ   Útotal_citation_charsÚperplexity_usagerX   s	            r   rF   z:PerplexityChatConfig._enhance_usage_with_perplexity_fieldsk   si  € ô
 �~ wÔ/°>×3GÑ3GÐ3Oä#(°qÈAÐ\]Ô#^ˆNÔ à%×+Ñ+ˆð -×0Ñ0°¸bÓAˆ	ØˆÙô +.Ñ-gÐQZÔ-gÓ*gÐ à# aÒ'Ü"% aÐ)=ÀÑ)BÓ"C�ð #4×"7Ñ"7¸ÀÓ"DÐð .×1Ñ1Ð2FÓGÐØÐ%Ø!2×!6Ñ!6Ð7KÓ!LÐØÐ%Ø!1×!5Ñ!5Ð6FÓ!GÐØÐ%Ø!2×!6Ñ!6Ð7GÓ!HÐð ˜QÒÐ#5Ð#AÐFXÐ[\ÒF\Ø×*Ñ*Ð2Ü.HÓ.J�Ô+ð  Ò"Ü˜Ð0°/ÔBð "Ð-Ð2DÀqÒ2HØBT�×+Ñ+Õ?ð 3IÐ-ð G]Ð#Ar   c                 ó�  — |j                   sy|j                   d   }t        |d«      r|j                  €y|j                  }g }|j                  dg «      }|j                  dg «      }i }|D ](  }	t	        |	t
        «      sŒd|	v sŒd|	v sŒ|	d   ||	d   <   Œ* t        |dd	«      }
|
syddl}d
}t        |j                  ||
«      «      }i }t        |«      D ]  \  }}t	        |t        «      sŒ|||dz   <   Œ  |D ]q  }t        |j                  d«      «      }||v sŒ"||   }|j                  |d	«      }|||j                  «       |j                  «       dœ}d|dœ}|j!                  |«       Œs |r:t        |d«      r|j"                  €g |_        |j"                  j%                  |«       |rt'        |d|«       |rt'        |d|«       yy)zœ
        Extract citations and search_results from Perplexity API response
        and add them as ChatCompletionAnnotation objects to the message.
        Nr   ÚmessagerO   Úsearch_resultsÚurlÚtitleÚcontentÚ z	\[(\d+)\]rV   )rg   rh   Ústart_indexÚ	end_indexÚurl_citation)Útyperm   Úannotations)Úchoicesr[   re   r\   Ú
isinstanceÚdictÚgetattrÚreÚlistÚfinditerÚ	enumeraterR   ÚintÚgroupÚstartÚendr2   ro   Úextendr`   )r   r:   rH   Úchoicere   ro   rO   rf   Úurl_to_titleÚresultri   rt   Úcitation_patternÚcitation_matchesÚcitation_number_to_urlÚirT   ÚmatchÚcitation_numberrg   rh   rm   Ú
annotations                          r   rG   z2PerplexityChatConfig._add_citations_as_annotations›   s  € ð
 ×%Ò%Øð '×.Ñ.¨qÑ1ˆÜ�v˜yÔ)¨V¯^©^Ð-CØàŸ™ˆØˆð -×0Ñ0°¸bÓAˆ	Ø 1× 5Ñ 5Ð6FÈÓ Kˆð !ˆØ$ò 	>ˆFÜ˜&¤$Õ'¨E°VªOÀÈ6Ò@QØ.4°W©o�˜V E™]Ò+ð	>ô
 ! ¨)°RÓ8ˆÙØó 	à".ÐÜ"& r§{¡{Ð3CÀWÓ'MÓ"NÐð )+ÐÜ$ YÓ/ò 	9‰KˆAˆxÜ˜(¤CÕ(Ø08Ð& q¨1¡uÒ-ð	9ð
 &ò 	/ˆEÜ! %§+¡+¨a£.Ó1ˆOØÐ"8Ò8Ø,¨_Ñ=�Ø$×(Ñ(¨¨bÓ1�ð Ø"Ø#(§;¡;£=Ø!&§¡£ñ	E�ð +Ø$0ñ8�
ð
 ×"Ñ" :Õ.ð'	/ñ, Ü˜7 MÔ2°g×6IÑ6IÐ6QØ&(�Ô#Ø×Ñ×&Ñ& {Ô3ñ Ü�N K°Ô;ÙÜ�NÐ$4°nÕEð r   )NN)Ú__name__Ú
__module__Ú__qualname__ÚpropertyrR   r   Útupler!   ru   r8   ÚhttpxÚResponser   ÚLiteLLMLoggingObjrr   r
   ÚboolrD   rF   rG   Ú__classcell__)rI   s   @r   r   r      sF  ø„ Øð S¨4¡Zò ó ðð)Ø˜d™
ð)Ø-0°4©Zð)à	ˆs�T‰z˜3 ™:Ð%Ñ	&ó)ð!"°ð !"¸ó !"ð\ #Ø!%ñ%àð%ð —n‘nð%ð &ð	%ð
 'ð%ð ð%ð Ð'Ñ(ð%ð ð%ð ð%ð -ð%ð �t‘ð%ð ˜$‘;ð%ð 
õ%ðN.UÀMð .UÐfjð .UÐosó .Uð`KF¸Mð KFÐ^bð KFÐgk÷ KFr   r   )Ú__doc__Útypingr   r   rŒ   r0   Úlitellm._loggingr   Ú*litellm.litellm_core_utils.litellm_loggingr   rŽ   Ú+litellm.llms.openai.chat.gpt_transformationr   Úlitellm.secret_managers.mainr	   Úlitellm.types.llms.openair
   r   r   Úlitellm.types.utilsr   r   r   Útiktokenr   r   r   r   ú<module>rš      sC   ðñ÷ (ã ã Ý +Ý SÝ GÝ 7ß uÑ uß PÑ PáÛôQF˜?õ QFr   