
    Ig                     ^   d dl Z d dlmZ d dlmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ ddd	d
ddddZdefdZdedeeef   fdZdddedee   deeef   fdZ e j(                   ee            deddfd       Z e
       dddedee   dedeeeeee   f   f   fd       ZddgZy)    N)util)AnyListOptionalTupleUnion)beta)
Embeddings)Runnablelangchain_openailangchain_awslangchain_coherelangchain_google_vertexailangchain_huggingfacelangchain_mistralai)azure_openaibedrockcoheregoogle_vertexaihuggingface	mistralaiopenaireturnc                  V    dj                  d t        j                         D              S )z3Get formatted list of providers and their packages.
c              3   R   K   | ]  \  }}d | d|j                  dd        ! yw)z  - z: _-N)replace).0ppkgs      V/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain/embeddings/base.py	<genexpr>z%_get_provider_list.<locals>.<genexpr>   s2      063$qcCKKS)*+s   %')join_SUPPORTED_PROVIDERSitems     r#   _get_provider_listr*      s)    99 :N:T:T:V  r)   
model_namec                 "   d| vrt         }t        d|  d|       | j                  dd      \  }}|j                         j	                         }|j	                         }|t         vrt        d| dt                      |st        d      ||fS )a  Parse a model string into provider and model name components.

    The model string should be in the format 'provider:model-name', where provider
    is one of the supported providers.

    Args:
        model_name: A model string in the format 'provider:model-name'

    Returns:
        A tuple of (provider, model_name)

    .. code-block:: python

        _parse_model_string("openai:text-embedding-3-small")
        # Returns: ("openai", "text-embedding-3-small")

        _parse_model_string("bedrock:amazon.titan-embed-text-v1")
        # Returns: ("bedrock", "amazon.titan-embed-text-v1")

    Raises:
        ValueError: If the model string is not in the correct format or
            the provider is unsupported
    :zInvalid model format 'z'.
Model name must be in format 'provider:model-name'
Example valid model strings:
  - openai:text-embedding-3-small
  - bedrock:amazon.titan-embed-text-v1
  - cohere:embed-english-v3.0
Supported providers:    
Provider 'E' is not supported.
Supported providers and their required packages:
Model name cannot be empty)r&   
ValueErrorsplitlowerstripr*   )r+   	providersprovidermodels       r#   _parse_model_stringr9      s    0 *(	$ZL 1$ %.;0
 	
 !&&sA.OHe~~%%'HKKME++
 #A!#$&
 	

 566U?r)   r7   r8   r7   c                    | j                         st        d      |d| v rt        |       \  }}n|}| }|st        }t        d|       |t        vrt        d| dt	                      ||fS )Nr1   r-   zMust specify either:
1. A model string in format 'provider:model-name'
   Example: 'openai:text-embedding-3-small'
2. Or explicitly set provider from: r/   r0   )r5   r2   r9   r&   r*   )r8   r7   r+   r6   s       r#   _infer_model_and_providerr<   N   s     ;;=566C5L259*
(	3 k	
 	
 ++
 #A!#$&
 	

 Zr)   )maxsizer"   c                 R    t        j                  |       st        d|  d|  d      y)z Check if a package is installed.zCould not import z5 python package. Please install it with `pip install `N)r   	find_specImportError)r"   s    r#   
_check_pkgrB   l   s:     >>#u %336%q:
 	
 r)   kwargsc                   | s1t         j                         }t        ddj                  |             t	        | |      \  }}t         |   }t        |       |dk(  rddlm}  |dd|i|S |dk(  rdd	lm}  |dd|i|S |d
k(  rddl	m
}  |dd|i|S |dk(  rddlm}	  |	dd|i|S |dk(  rddlm}
  |
dd|i|S |dk(  rddlm}  |dd|i|S |dk(  rddlm}  |dd|i|S t        d| dt'                      )a  Initialize an embeddings model from a model name and optional provider.

    **Note:** Must have the integration package corresponding to the model provider
    installed.

    Args:
        model: Name of the model to use. Can be either:
            - A model string like "openai:text-embedding-3-small"
            - Just the model name if provider is specified
        provider: Optional explicit provider name. If not specified,
            will attempt to parse from the model string. Supported providers
            and their required packages:

            {_get_provider_list()}

        **kwargs: Additional model-specific parameters passed to the embedding model.
            These vary by provider, see the provider-specific documentation for details.

    Returns:
        An Embeddings instance that can generate embeddings for text.

    Raises:
        ValueError: If the model provider is not supported or cannot be determined
        ImportError: If the required provider package is not installed

    .. dropdown:: Example Usage
        :open:

        .. code-block:: python

            # Using a model string
            model = init_embeddings("openai:text-embedding-3-small")
            model.embed_query("Hello, world!")

            # Using explicit provider
            model = init_embeddings(
                model="text-embedding-3-small",
                provider="openai"
            )
            model.embed_documents(["Hello, world!", "Goodbye, world!"])

            # With additional parameters
            model = init_embeddings(
                "openai:text-embedding-3-small",
                api_key="sk-..."
            )

    .. versionadded:: 0.3.9
    z2Must specify model name. Supported providers are: z, r:   r   r   )OpenAIEmbeddingsr8   r   )AzureOpenAIEmbeddingsr   )VertexAIEmbeddingsr   )BedrockEmbeddingsmodel_idr   )CohereEmbeddingsr   )MistralAIEmbeddingsr   )HuggingFaceEmbeddingsr+   r/   r0   r(   )r&   keysr2   r%   r<   rB   r   rE   rF   r   rG   r   rH   r   rJ   r   rK   r   rL   r*   )r8   r7   rC   r6   r+   r"   rE   rF   rG   rH   rJ   rK   rL   s                r#   init_embeddingsrN   v   s[   p (--/	((,		)(<'=?
 	

 5UXNHj
x
(CsO85;j;F;;	^	#:$@:@@@	&	&@!=
=f==	Y	3 ?*???	X	5;j;F;;	[	 ;">>v>>	]	"?$E
EfEE
 #A!#$&
 	
r)   rN   r
   )	functools	importlibr   typingr   r   r   r   r   langchain_core._apir	   langchain_core.embeddingsr
   langchain_core.runnablesr   r&   strr*   r9   r<   	lru_cachelenrB   floatrN   __all__r(   r)   r#   <module>rZ      s7     4 4 $ 0 - ' 2*&  C 0C 0E#s(O 0h .2  %c] 
38_ < S!567
C 
D 
 8
  #c
c
 smc
 	c

 :xT%[ 0112c
 c
N r)   