
    jr'                         d Z ddlmZmZ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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  G d de      Zy)zW
Translate from OpenAI's `/v1/chat/completions` to Perplexity's `/v1/chat/completions`
    )AnyListOptionalTupleN)verbose_loggerget_secret_str)AllMessageValues)UsagePromptTokensDetailsWrapper)Logging)OpenAIGPTConfig)ModelResponse)ChatCompletionAnnotation)#ChatCompletionAnnotationURLCitationc                       e Zd Zedee   fd       Zdee   dee   deee   ee   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edee   dee   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returnc                      y)N
perplexity )selfs    /Users/manta/Documents/Projects/TheRoad-I1/backend/.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   sK     c~.CDcHc 445423 	
 ((r   modelc                    g d}	 t        j                  || j                        r|j                  d       	 t        j                  || j                        r|j                  d       |S # t        $ r"}t        j                  d|        Y d}~[d}~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: Nweb_search_optionsz-Error checking if model supports web search: )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    
	U))1I1I #))*<=	V**1I1I #))*>? "!  	U  #OPQs!STT	U  	V  #PQRPS!TUU!!	Vs.   2A- 2B -	B6BB	C$CCNraw_responsemodel_responselogging_objrequest_datamessagesoptional_paramslitellm_paramsencoding	json_modec                    t         |   |||||||||	|
|      }	 |j                         }| j                  ||       | j	                  ||       |S # t
        $ r#}t        j                  d|        Y d }~|S d }~ww xY w)N)r$   r;   r<   r=   r>   r?   r@   rA   rB   r   rC   z3Error extracting Perplexity-specific usage fields: )supertransform_responsejson%_enhance_usage_with_perplexity_fields_add_citations_as_annotationsr5   r   r6   )r   r$   r;   r<   r=   r>   r?   r@   rA   rB   r   rC   raw_response_jsonr9   	__class__s                 r   rF   z'PerplexityChatConfig.transform_responseK   s     3%)#%+) 4 
	\ , 1 1 366 1 ..~?PQ   	\  #VWXVY!Z[[	\s   4A 	A?A::A?rJ   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      '3<xCM"9s   ##      num_search_queriessearch_queriescitation_tokens)
hasattrrM   r   getsummaxprompt_tokens_detailsr   setattrweb_search_requests)	r   r<   rJ   rM   rQ   r\   total_citation_charsperplexity_usagerZ   s	            r   rH   z:PerplexityChatConfig._enhance_usage_with_perplexity_fieldst   su    ~w/>3G3G3O#("#$N  $$ &))+r:	 $' '3<' $  $a'"%a)=)B"C -00"= .112FG%!2!6!67K!L%!1!5!56F!G%!2!6!67G!H Q*/AA/E**2.H.J+ "0/B "-2Dq2HBT++? 3I- 0F*r   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   messagerQ   search_resultsurltitlecontent z	\[(\d+)\]rX   )ri   rj   start_index	end_indexurl_citation)typero   annotations)choicesr]   rg   r^   
isinstancedictgetattrrelistfinditer	enumeraterT   intgroupstartendr4   rq   extendrb   )r   r<   rJ   choicerg   rq   rQ   rh   url_to_titleresultrk   rv   citation_patterncitation_matchescitation_number_to_urlirV   matchcitation_numberri   rj   ro   
annotations                          r   rI   z2PerplexityChatConfig._add_citations_as_annotations   s    %%  ''*vy)V^^-C.. &))+r:	*../?D $F&$'EVO6@Q.4WoVE]+ %
 '9b1 	',<g FG "$$Y/KAx(C(08&q1u- 0
 &E!%++a.1O"88,_=$((b1 "#(;;=!&	E +$08

 "":.' &, 7M2g6I6I6Q&(#&&{3 NK;N$4nE r   )NN)__name__
__module____qualname__propertyr   rT   r   r   r#   rw   r:   httpxResponser   LiteLLMLoggingObjrt   r   r
   r   boolrF   rH   rI   __classcell__)rK   s   @r   r   r      sH   Xc]  	) 	)08	)	x}hsm+	,	)%" %" %"d "&$('' nn' &	'
 '' ' '(' ' ' ' #' D>' 
'R8U+8U@D8U	8UtMF+MF@DMF	MFr   r   )__doc__typingr   r   r   r   r   r2   litellm._loggingr   litellm.secret_managers.mainr	   litellm.types.llms.openair
   litellm.types.utilsr   r   *litellm.litellm_core_utils.litellm_loggingr   r   +litellm.llms.openai.chat.gpt_transformationr   r   r   r   r   r   r   r   <module>r      sC    . -   + 7 6 A S G - > IgF? gFr   