o
    ưi                     @   s   d Z ddlZddl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 ddlmZ ddlmZ ddlmZmZ dd	lmZmZ G d
d deZG dd deZdS )ao  
Perplexity AI Embedding API

Docs: https://docs.perplexity.ai/api-reference/embeddings-post

Supports models:
  - pplx-embed-v1-0.6b  (1024 dims, 32 K context)
  - pplx-embed-v1-4b    (2560 dims, 32 K context)

Perplexity returns embeddings as base64-encoded signed int8 values by default.
This module decodes them into float arrays for OpenAI-compatible responses.
    N)AnyDictListOptionalUnion)Logging)BaseLLMException)BaseEmbeddingConfigget_secret_str)AllEmbeddingInputValuesAllMessageValues)EmbeddingResponseUsagec                	       s8   e Zd Zi fdededeeejf f fddZ	  Z
S )PerplexityEmbeddingErrorstatus_codemessageheadersc                    sD   || _ || _tjddd| _tj|| jd| _t j|||d d S )NPOST'https://api.perplexity.ai/v1/embeddings)methodurl)r   request)r   r   r   )	r   r   httpxRequestr   Responseresponsesuper__init__)selfr   r   r   	__class__ g/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/perplexity/embedding/transformation.pyr      s   
z!PerplexityEmbeddingError.__init__)__name__
__module____qualname__intstrr   dictr   Headersr   __classcell__r"   r"   r    r#   r      s    r   c                   @   sV  e Zd ZdZd(ddZ	d)dee dee ded	ed
edee defddZ	dede
fddZded	edededef
ddZ		d*dededee d	ed
edee dee defddZdeded	ededef
ddZededee fddZdi i i fdedejded edee d!ed	ed
edefd"d#Zd$ed%edeeejf defd&d'ZdS )+PerplexityEmbeddingConfigzM
    Reference: https://docs.perplexity.ai/api-reference/embeddings-post
    returnNc                 C   s   d S Nr"   )r   r"   r"   r#   r   5   s   z"PerplexityEmbeddingConfig.__init__api_baseapi_keymodeloptional_paramslitellm_paramsstreamc                 C   s    |r| ds| d}|S dS )Nz/embeddingsz/v1/embeddingsr   )endswith)r   r/   r0   r1   r2   r3   r4   r"   r"   r#   get_complete_url8   s
   	

z*PerplexityEmbeddingConfig.get_complete_urlc                 C   s   ddgS N
dimensionsZencoding_formatr"   )r   r1   r"   r"   r#   get_supported_openai_paramsG   s   z5PerplexityEmbeddingConfig.get_supported_openai_paramsnon_default_paramsdrop_paramsc                 C   s8   |  D ]\}}|dkr||d< q|dkr||d< q|S r7   )items)r   r:   r2   r1   r;   kvr"   r"   r#   map_openai_paramsM   s   
z+PerplexityEmbeddingConfig.map_openai_paramsr   messagesc                 C   s(   |d u rt dpt d}d| ddS )NZPERPLEXITYAI_API_KEYZPERPLEXITY_API_KEYzBearer zapplication/json)AuthorizationzContent-Typer
   )r   r   r1   r@   r2   r3   r0   r/   r"   r"   r#   validate_environment[   s   

z.PerplexityEmbeddingConfig.validate_environmentinputc                 C   s   ||d|S )N)r1   rC   r"   )r   r1   rC   r2   r   r"   r"   r#   transform_embedding_requestn   s
   z5PerplexityEmbeddingConfig.transform_embedding_requestembedding_valuec                 C   sN   t | tr| S t | tr%t| }t|}t| d|}dd |D S | S )a  
        Decode a Perplexity embedding into a list of floats.

        Perplexity returns base64-encoded signed int8 values by default.
        If the value is already a list of numbers (e.g. from a mock or
        future float format), it is returned as-is.
        bc                 S   s   g | ]}t |d  qS )g     _@)float).0r>   r"   r"   r#   
<listcomp>   s    zFPerplexityEmbeddingConfig._decode_base64_embedding.<locals>.<listcomp>)
isinstancelistr(   base64	b64decodelenstructunpack)rE   Z	raw_bytescountZint8_valuesr"   r"   r#   _decode_base64_embedding{   s   
	

z2PerplexityEmbeddingConfig._decode_base64_embeddingraw_responsemodel_responselogging_objrequest_datac	                 C   s   z|  }	W n ty   t|j|jdw |	d||_|	dd|_|	dg }
g }|
D ]}t|}| 	|d|d< |
| q.||_|	di }t|dd	pY|d
d	|d
d	d}||_|S )N)r   r   r1   objectrK   dataZ	embeddingusageprompt_tokensr   total_tokens)rZ   r[   )json	Exceptionr   textr   getr1   rW   r)   rR   appendrX   r   rY   )r   r1   rS   rT   rU   r0   rV   r2   r3   Zraw_response_jsonraw_dataZdecoded_dataitemZdecoded_itemZ
usage_datarY   r"   r"   r#   transform_embedding_response   s4   

z6PerplexityEmbeddingConfig.transform_embedding_responseerror_messager   c                 C   s   t |||dS )N)r   r   r   )r   )r   rd   r   r   r"   r"   r#   get_error_class   s   z)PerplexityEmbeddingConfig.get_error_class)r-   Nr.   )NN) r$   r%   r&   __doc__r   r   r(   r)   boolr6   rK   r9   r?   r   r   rB   r   rD   staticmethodr   rG   rR   r   r   r   LiteLLMLoggingObjrc   r'   r   r*   r   re   r"   r"   r"   r#   r,   0   s    



	

	

(r,   )rf   rL   rO   typingr   r   r   r   r   r   Z*litellm.litellm_core_utils.litellm_loggingr   ri   Z)litellm.llms.base_llm.chat.transformationr   Z.litellm.llms.base_llm.embedding.transformationr	   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   r   Zlitellm.types.utilsr   r   r   r,   r"   r"   r"   r#   <module>   s    