
    ghD                     l   d dl Z d dlmZ d dlmZmZmZ d dlmZ d dl	m
Z
 d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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dS )    N)util)AnyOptionalUnion)
Embeddings)Runnablelangchain_openailangchain_awslangchain_coherelangchain_google_vertexailangchain_huggingfacelangchain_mistralailangchain_ollama)azure_openaibedrockcoheregoogle_vertexaihuggingface	mistralaiollamaopenaireturnc                  n    d                     d t                                          D                       S )z3Get formatted list of providers and their packages.
c              3   T   K   | ]#\  }}d | d|                     dd           V  $dS )z  - z: _-N)replace).0ppkgs      V/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain/embeddings/base.py	<genexpr>z%_get_provider_list.<locals>.<genexpr>   sV        063+q++CKKS))++         )join_SUPPORTED_PROVIDERSitems r$   r"   _get_provider_listr)      s@    99  :N:T:T:V:V     r$   
model_namec                 f   d| vrt           }t          d|  d|           |                     dd          \  }}|                                                                }|                                }|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_stringr8      s    0 *(	0Z 0 0 %.0 0
 
 	
 !&&sA..OHe~~%%''HKKMME+++& & &!##& &
 
 	

  75666U?r$   r6   r7   r6   c                   |                                  st          d          |d| v rt          |           \  }}n|}| }|st          }t          d|           |t          vr!t          d| dt	                                 ||fS )Nr0   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.   r/   )r4   r1   r8   r&   r)   )r7   r6   r*   r5   s       r"   _infer_model_and_providerr;   N   s     ;;== 75666C5LL2599**
 
(	 	 
 
 	
 +++& & &!##& &
 
 	

 Zr$   )maxsizer!   c                 Z    t          j        |           st          d|  d|  d          dS )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_pkgrA   l   sU     ># 
: : :36: : :
 
 	

 
r$   kwargsc                   | s>t                                           }t          dd                    |                     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 |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, r9   r   r   )OpenAIEmbeddingsr7   r   )AzureOpenAIEmbeddingsr   )VertexAIEmbeddingsr   )BedrockEmbeddingsmodel_idr   )CohereEmbeddingsr   )MistralAIEmbeddingsr   )HuggingFaceEmbeddingsr*   r   )OllamaEmbeddingsr.   r/   Nr(   )r&   keysr1   r%   r;   rA   r	   rD   rE   r   rF   r
   rG   r   rI   r   rJ   r   rK   r   rL   r)   )r7   r6   rB   r5   r*   r!   rD   rE   rF   rG   rI   rJ   rK   rL   s                 r"   init_embeddingsrN   v   st   n  
(--//	W9AUAUWW
 
 	
 5UXNNNHj
x
(CsOOO8555555;;j;F;;;	^	#	#::::::$$@@:@@@@	&	&	&@@@@@@!!==
=f===	Y		333333  ??*????	X		555555;;j;F;;;	[	 	 ;;;;;;"">>>v>>>	]	"	"??????$$EE
EfEEE	X		555555;;j;F;;;& & &!##& &
 
 	
r$   rN   r   )	functools	importlibr   typingr   r   r   langchain_core.embeddingsr   langchain_core.runnablesr   r&   strr)   tupler8   r;   	lru_cachelenrA   listfloatrN   __all__r(   r$   r"   <module>r[      s             ' ' ' ' ' ' ' ' ' ' 0 0 0 0 0 0 - - - - - - ' 2*&  	 	 C    0C 0E#s(O 0 0 0 0h .2      %c] 
38_       < SS!566777
C 
D 
 
 
 87
 #f
 f
 f
f
 smf
 	f

 :xT%[ 0112f
 f
 f
 f
T r$   