
    h                     8   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y)    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                  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      W/var/www/html/eduruby.in/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         }d|  d| }t        |      | j                  dd      \  }}|j                         j	                         }|j	                         }|t         vrd| dt                }t        |      |sd}t        |      ||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msgprovidermodels        r"   _parse_model_stringr9      s    0 *(	$ZL 1$ %.;0 	 o &&sA.OHe~~%%'HKKME++
 #A!#$& 	
 o*oU?r(   r7   r8   r7   c                    | j                         sd}t        |      |d| v rt        |       \  }}n| }|st        }d| }t        |      |t        vrd| dt	                }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   r9   r%   r)   )r8   r7   r6   r*   r5   s        r"   _infer_model_and_providerr<   Q   s    
 ;;=*oC5L259*
(	3 k	 	 o++
 #A!#$& 	
 oZr(   )maxsizer!   c                 V    t        j                  |       sd|  d|  d}t        |      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!   r6   s     r"   
_check_pkgrB   s   s?     >>#u %336%q: 	 # r(   kwargsc                :   | s3t         j                         }ddj                  |       }t        |      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 d| dt+                }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   )OllamaEmbeddingsr.   r/   r'   )r%   keysr$   r1   r<   rB   r	   rE   rF   r   rG   r
   rH   r   rJ   r   rK   r   rL   r   rM   r)   )r8   r7   rC   r5   r6   r*   r!   rE   rF   rG   rH   rJ   rK   rL   rM   s                  r"   init_embeddingsrO   ~   sy   n (--/	@9AU@VW 	 o4UXNHj
x
(CsO85;j;F;;>!:$@:@@@$$@!=
=f==93 ?*???85;j;F;;;;">>v>>= ?$E
EfEE85;j;F;;
XJ =
 	" 
 S/r(   r   rO   )	functools	importlibr   typingr   r   r   langchain_core.embeddingsr   langchain_core.runnablesr   r%   strr)   tupler9   r<   	lru_cachelenrB   listfloatrO   __all__r'   r(   r"   <module>r\      s*     ' ' 0 - ' 2*&  	 C 3C 3E#s(O 3r #   sm  38_	 D S!567C D  8 #gg smg 	g
 :xT%[ 0112gV r(   