
    R"h                        d dl Z d dlZd dlmZmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZ 	 d dlZ ej                          5   ej"                  de       de j&                  vrde j&                  d<   d dlZd	e_        d
e_        ddd       d dlmZ e j2                  j5                   ej6                         d      Z eed      e_         G d d      Z y# 1 sw Y   TxY w# e$ r  G d d      Z e       ZY /w xY w)    N)ThreadPoolExecutoras_completed)ListTupleUnionOptionalDictLiteral)Pathignore)categoryLITELLM_LOCAL_MODEL_COST_MAPTrueTF)Cachez.storm_local_cachedisk)disk_cache_dirtypec                       e Zd Zd Zy)LitellmPlaceholderc                     t        d      )Nz@The LiteLLM package is not installed. Run `pip install litellm`.)ImportError)self_s     8/var/www/html/sandstorm/storm/knowledge_storm/encoder.py__getattr__zLitellmPlaceholder.__getattr__   s    R     N)__name__
__module____qualname__r    r   r   r   r      s    	r   r   c            
           e Zd ZdZ	 	 	 	 ddee   dee   dee   dee   fdZdded	efd
Z	dde
eee   f   ded	ej                  fdZd Z	 dde
eee   f   ded	eej                  ef   fdZy)Encodera  
    A wrapper class for the LiteLLM embedding model, designed to handle embedding
    generation tasks efficiently. It supports parallel processing and local caching of
    embedding results for improved performance.

    The Encoder utilizes the LiteLLM library to interact with various embedding models,
    such as OpenAI and Azure embeddings. Users can specify the desired encoder type and
    provide relevant API credentials during initialization.

    Features:
        - Support for multiple embedding models (e.g., OpenAI, Azure).
        - Parallel processing for faster embedding generation.
        - Local disk caching to store and reuse embedding results.
        - Total token usage tracking for cost monitoring.

    Note:
        Refer to the LiteLLM documentation for details on supported embedding models:
        https://docs.litellm.ai/docs/embedding/supported_embedding
    Nencoder_typeapi_keyapi_baseapi_versionc                    d| _         i | _        d| _        |xs t        j                  d      }|st        d      |j                         dk(  r(d| _         d|xs t        j                  d      i| _        y|j                         d	k(  rXd
| _         |xs t        j                  d      |xs t        j                  d      |xs t        j                  d      d| _        yt        d| d      )a  
        Initializes the Encoder with the appropriate embedding model.

        Args:
            encoder_type (Optional[str]): Type of encoder ('openai', 'azure', etc.).
            api_key (Optional[str]): API key for the encoder service.
            api_base (Optional[str]): API base URL for the encoder service.
            api_version (Optional[str]): API version for the encoder service.
        Nr   ENCODER_API_TYPEz1ENCODER_API_TYPE environment variable is not set.openaiztext-embedding-3-smallr$   OPENAI_API_KEYazurezazure/text-embedding-3-smallAZURE_API_KEYAZURE_API_BASEAZURE_API_VERSION)r$   r%   r&   zUnsupported ENCODER_API_TYPE 'z5'. Supported types are 'openai', 'azure', 'together'.)embedding_model_namekargstotal_token_usageosgetenv
ValueErrorlower)r   r#   r$   r%   r&   s        r   __init__zEncoder.__init__9   s      %)!
!" $Dryy1C'DPQQ8+(@D%#W%K		:J0KLDJ!W,(FD%"@bii&@$C		2B(C*Lbii8K.LDJ 0>st r   resetreturnc                 0    | j                   }|rd| _         |S )z
        Retrieves the total token usage.

        Args:
            reset (bool): If True, resets the total token usage counter after retrieval.

        Returns:
            int: The total number of tokens used.
        r   )r1   )r   r7   token_usages      r   get_total_token_usagezEncoder.get_total_token_usagea   s      ,,%&D"r   textsmax_workersc                 (    | j                  ||      S )z
        Public method to get embeddings for the given texts.

        Args:
            texts (Union[str, List[str]]): A single text string or a list of text strings to embed.

        Returns:
            np.ndarray: The array of embeddings.
        r=   )_get_text_embeddings)r   r<   r=   s      r   encodezEncoder.encodep   s     ((K(HHr   c                     t        j                  d| j                  |dd| j                  }|j                  d   d   }|j                  di       j                  dd      }|||fS )NT)modelinputcachingr   	embeddingusagetotal_tokensr    )litellmrF   r/   r0   dataget)r   textresponserF   r:   s        r   _get_single_text_embeddingz"Encoder._get_single_text_embedding|   so    $$ 
++4
IM
 MM!$[1	ll7B/33NAFY++r   c                    t        t              r?| j                        \  }}}| xj                  |z  c_        t	        j
                  |      S g }d}t        |      5 }D 	ci c]  }	|j                  | j                  |	      |	! }
}	t        |
      D ]0  }	 |j                         \  }	}}|j                  |	||f       ||z  }2 	 ddd       |j                  fd       |D cg c]  }|d   	 }}| xj                  |z  c_        t	        j
                  |      S c c}	w # t        $ r&}t        d|
|           t        |       Y d}~d}~ww xY w# 1 sw Y   xY wc c}w )a?  
        Get text embeddings using OpenAI's text-embedding-3-small model.

        Args:
            texts (Union[str, List[str]]): A single text string or a list of text strings to embed.
            max_workers (int): The maximum number of workers for parallel processing.
            api_key (str): The API key for accessing OpenAI's services.
            embedding_cache (Optional[Dict[str, np.ndarray]]): A cache to store previously computed embeddings.

        Returns:
            Tuple[np.ndarray, int]: The 2D array of embeddings and the total token usage.
        r   r?   zAn error occurred for text: Nc                 ,    j                  | d         S )Nr   )index)xr<   s    r   <lambda>z.Encoder._get_text_embeddings.<locals>.<lambda>   s    ekk!A$&7 r   )key   )
isinstancestrrN   r1   nparrayr   submitr   resultappend	Exceptionprintsort)r   r<   r=   r   rF   tokens
embeddingsrH   executorrL   futuresfutureer[   s    `            r   r@   zEncoder._get_text_embeddings   sq   $ eS!#'#B#B5#I Ay&""f,"88I&&
K8 	H "  ? ?FLG 
 'w/ .4mmo+D)V%%tY&?@ F*L		  	78.89FfQi9
9,.xx
##' ! 88IJK!HH	 	" :sN   !E&$D$
E-D)E,E'$E)	E2EEEEE$)NNNN)F)   )r   r   r   __doc__r   rW   r6   boolintr;   r   r   rX   ndarrayrA   rN   r   r@   r    r   r   r"   r"   $   s    , '+!%"&%)&sm& #& 3-	&
 c]&P4 C 
IE#tCy.1 
I 
IBJJ 
I, .$S$s)^$.$ .$ 
rzz3		.$r   r"   )!r2   numpyrX   concurrent.futuresr   r   typingr   r   r   r   r	   r
   pathlibr   warningscatch_warningsfilterwarningsUserWarningenvironrI   drop_params	telemetrylitellm.caching.cachingr   pathjoinhomer   cacher   r   r"   r    r   r   <module>r{      s    	  ? > > #	 	 	 	" ";?);9?BJJ56"!" .WW\\)$))+/CDNfEGMN$ N$3" "  #  !"G#s*   C  ACAC  CC   C98C9