
    7|hs                    Z   d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZ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mZmZ d dlmZmZmZm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d d	l(m)Z)  ejT                  e+      Z,ddZ-ddZ.dddZ/ddZ0ddZ1 eddd       G d d
ee             Z2y)    )annotationsN)AnyCallableDictListLiteralMappingOptionalSequenceSetTupleUnioncast)
deprecated)
Embeddings)get_from_dict_or_envget_pydantic_field_namespre_init)	BaseModel
ConfigDictFieldmodel_validator)AsyncRetryingbefore_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponential)is_openai_v1OpenAIEmbeddingsc           
        dd l }t        dt        | j                        t	        d| j
                  | j                        t        |j                  j                        t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        t        t         j"                              S )Nr   T   
multiplierminmaxreraisestopwaitr   before_sleep)openair   r   max_retriesr   retry_min_secondsretry_max_secondsr   errorTimeoutAPIErrorAPIConnectionErrorRateLimitErrorServiceUnavailableErrorr   loggerloggingWARNING)
embeddingsr,   s     d/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/embeddings/openai.py_create_retry_decoratorr;   ,   s     
 6 67,,,,
 $FLL$8$89%fll&;&;<=%fll&E&EFG &fll&A&ABC &fll&J&JK	L &fgoo>     c           
        dd l }t        dt        | j                        t	        d| j
                  | j                        t        |j                  j                        t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        t        t         j"                              dfd}|S )Nr   Tr"   r#   r'   c                     d fd}|S )Nc                 f   K   2 3 d {   } | i | d {   c S 7 7 6 t        d      w)Nzthis is unreachable)AssertionError)argskwargs_async_retryingfuncs      r:   	wrapped_fz7_async_retry_decorator.<locals>.wrap.<locals>.wrapped_fb   sD     ) 3 3a!42622232 * !677s(   1%!%1#1%11)rA   r   rB   r   returnr    )rE   rF   rD   s   ` r:   wrapz$_async_retry_decorator.<locals>.wrapa   s    	8
 r<   )rE   r   rG   r   )r,   r   r   r-   r   r.   r/   r   r0   r1   r2   r3   r4   r5   r   r6   r7   r8   )r9   r,   rI   rD   s      @r:   _async_retry_decoratorrJ   G   s     #
 6 67,,,,
 $FLL$8$89%fll&;&;<=%fll&E&EFG &fll&A&ABC &fll&J&JK	L &fgoo>N$ Kr<   c                r    t        d | d   D              r!|sdd l}|j                  j                  d      | S )Nc              3  >   K   | ]  }t        |d          dk(    yw)	embeddingr"   N)len).0ds     r:   	<genexpr>z"_check_response.<locals>.<genexpr>n   s     
>3q~!#
>s   datar   z&OpenAI API returned an empty embedding)anyr,   r0   r2   )response
skip_emptyr,   s      r:   _check_responserV   m   s5    

>Xf-=
>>zll##$LMMOr<   c                     t               r  j                  j                  di |S t               }|d fd       } |di |S ))Use tenacity to retry the embedding call.c                 j     j                   j                  di | }t        |j                        S N)rU   rH   )clientcreaterV   rU   rB   rT   r9   s     r:   _embed_with_retryz+embed_with_retry.<locals>._embed_with_retry{   s1    +:$$++5f5xJ4I4IJJr<   rH   rB   r   rG   r   )r   r[   r\   r;   )r9   rB   retry_decoratorr^   s   `   r:   embed_with_retryra   u   sR    ~'z  ''1&11-j9OK K &v&&r<   c                    K   t               r$  j                  j                  di | d{   S t               d fd       } |di | d{   S 7 (7 w)rX   Nc                    K    j                   j                  di |  d {   }t        |j                        S 7 wrZ   )r[   acreaterV   rU   r]   s     r:   _async_embed_with_retryz7async_embed_with_retry.<locals>._async_embed_with_retry   s=     2**22<V<<xJ4I4IJJ =s    A?ArH   r_   )r   async_clientr\   rJ   )r9   rB   re   s   `  r:   async_embed_with_retryrg      sd      ~3Z,,33=f===J'K (K )26222 > 3s!   *AA#AAAAz0.0.9z1.0z!langchain_openai.OpenAIEmbeddings)sinceremovalalternative_importc                     e Zd ZU dZ edd      Zded<    edd      Zded<   dZd	ed
<   eZ	ded<    edd      Z
ded<   	  edd      Zded<   	 dZded<   dZded<   dZded<   	  edd      Zded<   	  edd      Zded<   	  e       Zded<   dZded<   d Zded!<   	 d"Zded#<   	  edd$      Zd%ed&<   	 dZded'<   dZd(ed)<   	 dZded*<   	 d+Zd(ed,<   	  ee-      Zd.ed/<   	 d+Zd(ed0<   	 dZd1ed2<   dZd3ed4<   d5Z ded6<   	 d7Z!ded8<   	 dZ"d9ed:<   	  e#dd;d<=      Z$ e%d>?      e&dJd@              Z'e(dKdA       Z)e*dLdB       Z+ddC	 	 	 	 	 	 	 dMdDZ,ddC	 	 	 	 	 	 	 dMdEZ-	 dN	 	 	 	 	 dOdFZ.	 dN	 	 	 	 	 dOdGZ/dPdHZ0dPdIZ1y)Qr    aj  OpenAI embedding models.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``OPENAI_API_KEY`` set with your API key or pass it
    as a named parameter to the constructor.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import OpenAIEmbeddings
            openai = OpenAIEmbeddings(openai_api_key="my-api-key")

    In order to use the library with Microsoft Azure endpoints, you need to set
    the OPENAI_API_TYPE, OPENAI_API_BASE, OPENAI_API_KEY and OPENAI_API_VERSION.
    The OPENAI_API_TYPE must be set to 'azure' and the others correspond to
    the properties of your endpoint.
    In addition, the deployment name must be passed as the model parameter.

    Example:
        .. code-block:: python

            import os

            os.environ["OPENAI_API_TYPE"] = "azure"
            os.environ["OPENAI_API_BASE"] = "https://<your-endpoint.openai.azure.com/"
            os.environ["OPENAI_API_KEY"] = "your AzureOpenAI key"
            os.environ["OPENAI_API_VERSION"] = "2023-05-15"
            os.environ["OPENAI_PROXY"] = "http://your-corporate-proxy:8080"

            from langchain_community.embeddings.openai import OpenAIEmbeddings
            embeddings = OpenAIEmbeddings(
                deployment="your-embeddings-deployment-name",
                model="your-embeddings-model-name",
                openai_api_base="https://your-endpoint.openai.azure.com/",
                openai_api_type="azure",
            )
            text = "This is a test query."
            query_result = embeddings.embed_query(text)

    NT)defaultexcluder   r[   rf   ztext-embedding-ada-002strmodelzOptional[str]
deploymentapi_version)rl   aliasopenai_api_versionbase_urlopenai_api_baseopenai_api_typeopenai_proxyi  intembedding_ctx_lengthapi_keyopenai_api_keyorganizationopenai_organizationzUnion[Literal['all'], Set[str]]allowed_specialallz.Union[Literal['all'], Set[str], Sequence[str]]disallowed_speciali  
chunk_size   r-   timeoutz0Optional[Union[float, Tuple[float, float], Any]]request_timeoutheadersbooltiktoken_enabledtiktoken_model_nameFshow_progress_bar)default_factoryDict[str, Any]model_kwargsrU   zUnion[Mapping[str, str], None]default_headersz!Union[Mapping[str, object], None]default_query   r.      r/   zUnion[Any, None]http_clientforbidrH   )populate_by_nameextraprotected_namespacesbefore)modec           
     `   t        |       }|j                  di       }t        |      D ]M  }||v rt        d| d      ||vst	        j
                  d| d| d| d       |j                  |      ||<   O |j                  |j                               }|rt        d| d	      ||d<   |S )
z>Build extra kwargs from additional params that were passed in.r   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r   getlist
ValueErrorwarningswarnpopintersectionkeys)clsvaluesall_required_field_namesr   
field_nameinvalid_model_kwargss         r:   build_extrazOpenAIEmbeddings.build_extra  s     $<C#@ 

>2.v, 		;JU" 6*5E!FGG!99!* .L !))34JN
 %+JJz$:j!		;  8DDUZZ\R23 4S T 
 "'~r<   c           	     N   t        |dd      |d<   |d   xs t        j                  d      |d<   t        |ddd      |d<   t        |d	d
d      |d	<   |d   dv rd}t        |d   d      |d<   nd}t        |dd|      |d<   |d   xs, t        j                  d      xs t        j                  d      |d<   	 ddl}t               r|d   dv rt        j                  d       |d   |d   |d   |d   |d   |d   |d   |d   d}|j                  d      s |j                  d i |j                  |d<   |j                  d      sD |j                  d i |j                  |d<   |S |j                  d      s|j                  |d<   |S 	 |S # t        $ r t        d      w xY w)!z?Validate that api key and python package exists in environment.r{   OPENAI_API_KEYru   OPENAI_API_BASErv   OPENAI_API_TYPE )rl   rw   OPENAI_PROXYazureazure_adazureadz
2023-05-15r   i   rs   OPENAI_API_VERSIONr}   OPENAI_ORG_IDOPENAI_ORGANIZATIONr   NzfIf you have openai>=1.0.0 installed and are using Azure, please use the `AzureOpenAIEmbeddings` class.r   r-   r   r   r   )rz   r|   rt   r   r-   r   r   r   r[   rf   TCould not import openai python package. Please install it with `pip install openai`.rH   )r   osgetenvr%   r,   r   r   r   r   OpenAIr9   AsyncOpenAI	EmbeddingImportError)r   r   default_api_versionr,   client_paramss        r:   validate_environmentz%OpenAIEmbeddings.validate_environment   s@    $8$&6$
  %++<$= %
B
 ! %9	%
 ! "6	"
~ #$(HH". $'vl';T#BF< "$';  '	(
#$ () 0yy)0yy./ 	$%
!	 ~+,0PPMMH
  &&67$*+@$A &'8 9%&78#)-#8'-.?'@%+O%<#)-#8	! zz(+'4v}}'E}'E'P'PF8$zz.1-?V-?-? .'. j >* 	 ZZ)#)#3#3x   A  	? 	s   ;F F$c           	        t               rd| j                  i| j                  }|S | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  d| j                  }| j                  dv r| j                  |d<   | j                  r#	 dd l}| j                  | j                  d|_        |S # t        $ r t        d      w xY w)Nro   )ro   r   r   rz   r|   api_baseapi_typerq   r   enginer   r   )httphttps)r   ro   r   r   r   r{   r}   ru   rv   rs   rp   rw   r,   r   proxy)selfopenai_argsr,   s      r:   _invocation_paramsz#OpenAIEmbeddings._invocation_paramsm  s    >!($** J8I8I JK: 5 #'#7#7<<.. $ 8 8 00 00#66
 ##
K ##'GG(,H%  ! !--!..   # %G s   8C C1)r   c          	     .	   g }g }| j                   xs | j                  }|xs | j                  }| j                  s	 ddlm} |j                  |      }	t        |      D ]  \  }
}|	j                  |d      }t        dt        |      | j                        D ]G  }|||| j                  z    }|	j                  |      }|j                  |       |j                  |
       I  n	 ddl}	 |j!                  |      }t        |      D ]  \  }
}| j                  j+                  d      r|j-                  dd      }|j                  || j.                  | j0                        }t        dt        |      | j                        D ]4  }|j                  |||| j                  z           |j                  |
       6  | j2                  r$	 ddlm}  |t        dt        |      |            }nt        dt        |      |      }g }|D ][  }
t9        | fd||
|
|z    i| j:                  }t=        |t>              s|j?                         }|jA                  d |d   D               ] t        t        |            D cg c]  }g  }}t        t        |            D cg c]  }g  }}t        t        |            D ]]  }
| jB                  rt        ||
         dk(  r!|||
      j                  ||
          |||
      j                  t        ||
                _ t        t        |            D cg c]  }g  }}t        t        |            D ]  }
||
   }t        |      dk(  rDt9        | fddi| j:                  }t=        |t>              s|j?                         }|d   d   d   }ntE        jF                  |d||
         }|tD        jH                  jK                  |      z  jM                         ||
<    |S # t        $ r t        d      w xY w# t        $ r t        d      w xY w# t"        $ r, t$        j'                  d	       d
}|j)                  |      }Y bw xY w# t        $ r t        dt        |      |      }Y w xY wc c}w c c}w c c}w )al  
        Generate length-safe embeddings for a list of texts.

        This method handles tokenization and embedding generation, respecting the
        set embedding context length and chunk size. It supports both tiktoken
        and HuggingFace tokenizer based on the tiktoken_enabled flag.

        Args:
            texts (List[str]): A list of texts to embed.
            engine (str): The engine or model to use for embeddings.
            chunk_size (Optional[int]): The size of chunks for processing embeddings.

        Returns:
            List[List[float]]: A list of embeddings for each input text.
        r   AutoTokenizerzCould not import transformers python package. This is needed in order to for OpenAIEmbeddings without `tiktoken`. Please install it with `pip install transformers`. pretrained_model_name_or_pathFadd_special_tokensNCould not import tiktoken python package. This is needed in order to for OpenAIEmbeddings. Please install it with `pip install tiktoken`.5Warning: model not found. Using cl100k_base encoding.cl100k_base001
 textr~   r   )tqdminputc              3  &   K   | ]	  }|d      ywrM   NrH   rO   rs     r:   rQ   z<OpenAIEmbeddings._get_len_safe_embeddings.<locals>.<genexpr>       %Oan%O   rR   r"   r   rM   axisweights)'r   ro   r   r   transformersr   r   from_pretrained	enumerateencoderangerN   ry   decodeappendtiktokenencoding_for_modelKeyErrorr6   warningget_encodingendswithreplacer~   r   r   	tqdm.autor   ra   r   
isinstancedictextendrU   npaveragelinalgnormtolist)r   textsr   r   tokensindices
model_name_chunk_sizer   	tokenizerir   	tokenizedjtoken_chunk
chunk_textr   encodingro   tokenr   _iterbatched_embeddingsrT   rC   resultsnum_tokens_in_batchr9   _resultaverage_embeddedr   s                                  r:   _get_len_safe_embeddingsz)OpenAIEmbeddings._get_len_safe_embeddings  s   & --;
 3DOO $$6 &55.8 6 I %U+ &4%,,Te,L	 q#i.$2K2KL &A"+AD4M4M0M"NK "+!1!1+!>JMM*-NN1%&&8#66zB
 %U+ &4::&&u-  <<c2D $($8$8'+'>'> (  q#e*d.G.GH &AMM%A0I0I,I"JKNN1%&&$ !!;*U1c&k;?@ !S[+6E02 	PA'Q[1 ))H
 h-#==?%%%Ohv>N%OO	P 9>c%j8I+J1B+J+J<A#e*<M/Nq/N/Ns7|$ 	CA3'9!'<#=#BGAJ&&'9!'<=
+223vay>B		C 6;3u:5F(G(G
(Gs5z" 	IAajG7|q #3$$ --$ 
 ""2D9'7'<'<'>$*6215kB**W1>QRS>TU$ryy~~g'>>FFHJqM	I K  !V 2  !E   8VW%#00786  ;aVk:;  ,K/N )HsM   O: &P +P* "Q" 9	R	R/	R:PP'*1QQ"RRc          	       K   g }g }| j                   xs | j                  }|xs | j                  }| j                  s	 ddlm} |j                  |      }	t        |      D ]  \  }
}|	j                  |d      }t        dt        |      | j                        D ]G  }|||| j                  z    }|	j                  |      }|j                  |       |j                  |
       I  n	 ddl}	 |j!                  |      }t        |      D ]  \  }
}| j                  j+                  d      r|j-                  dd      }|j                  || j.                  | j0                        }t        dt        |      | j                        D ]4  }|j                  |||| j                  z           |j                  |
       6  g }|xs | j                  }t        dt        |      |      D ]c  }
t3        | fd||
|
|z    i| j4                   d{   }t7        |t8              s|j9                         }|j;                  d |d   D               e t        t        |            D cg c]  }g  }}t        t        |            D cg c]  }g  }}t        t        |            D ]?  }
|||
      j                  ||
          |||
      j                  t        ||
                A t        t        |            D cg c]  }g  }}t        t        |            D ]  }
||
   }t        |      dk(  rLt3        | fddi| j4                   d{   }t7        |t8              s|j9                         }|d   d   d   }nt=        j>                  |d||
         }|t<        j@                  jC                  |      z  jE                         ||
<    |S # t        $ r t        d      w xY w# t        $ r t        d      w xY w# t"        $ r, t$        j'                  d	       d
}|j)                  |      }Y 2w xY w7 +c c}w c c}w c c}w 7 w)a  
        Asynchronously generate length-safe embeddings for a list of texts.

        This method handles tokenization and asynchronous embedding generation,
        respecting the set embedding context length and chunk size. It supports both
        `tiktoken` and HuggingFace `tokenizer` based on the tiktoken_enabled flag.

        Args:
            texts (List[str]): A list of texts to embed.
            engine (str): The engine or model to use for embeddings.
            chunk_size (Optional[int]): The size of chunks for processing embeddings.

        Returns:
            List[List[float]]: A list of embeddings for each input text.
        r   r   zCould not import transformers python package. This is needed in order to for OpenAIEmbeddings without  `tiktoken`. Please install it with `pip install transformers`.r   Fr   Nr   r   r   r   r   r   r   r   c              3  &   K   | ]	  }|d      ywr   rH   r   s     r:   rQ   z=OpenAIEmbeddings._aget_len_safe_embeddings.<locals>.<genexpr>u  r   r   rR   r   rM   r   )#r   ro   r   r   r   r   r   r   r   r   r   rN   ry   r   r   r   r   r   r6   r   r   r   r   r~   r   rg   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r  ro   r  r  rT   rC   r  r	  r9   r
  r  r   s                                r:   _aget_len_safe_embeddingsz*OpenAIEmbeddings._aget_len_safe_embeddings  sp    & --;
 3DOO $$6 &55.8 6 I %U+ &4%,,Te,L	 q#i.$2K2KL &A"+AD4M4M0M"NK "+!1!1+!>JMM*-NN1%&&8#66zB
 %U+ &4::&&u-  <<c2D $($8$8'+'>'> (  q#e*d.G.GH &AMM%A0I0I,I"JKNN1%&&$ 13 3DOOq#f+{3 		PA3Q[1 )) H h-#==?%%%Ohv>N%OO		P 9>c%j8I+J1B+J+J<A#e*<M/Nq/N/Ns7|$ 	CAGAJ&&'9!'<=
+223vay>B	C 6;3u:5F(G(G
(Gs5z" 	IAajG7|q )?** --* $ 
 ""2D9'7'<'<'>$*6215kB**W1>QRS>TU$ryy~~g'>>FFHJqM	I w  !V 2  !E   8VW%#00782 ,K/N
 )H$s   ;QO B#Q(O$ -O< >DQ	P4
AQ!	P7*Q	P<A.Q9	QAQ	Q
BQO!!Q$O99Q<1P1-Q0P11Q7Qc                \    t        t        | j                        }| j                  ||      S )aM  Call out to OpenAI's embedding endpoint for embedding search docs.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size of embeddings. If None, will use the chunk size
                specified by the class.

        Returns:
            List of embeddings, one for each text.
        r   )r   rn   rp   r  r   r   r   r   s       r:   embed_documentsz OpenAIEmbeddings.embed_documents  s*     c4??+,,U6,BBr<   c                x   K   t        t        | j                        }| j                  ||       d{   S 7 w)aS  Call out to OpenAI's embedding endpoint async for embedding search docs.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size of embeddings. If None, will use the chunk size
                specified by the class.

        Returns:
            List of embeddings, one for each text.
        r  N)r   rn   rp   r  r  s       r:   aembed_documentsz!OpenAIEmbeddings.aembed_documents  s4      c4??+33E&3IIIIs   1:8:c                ,    | j                  |g      d   S )zCall out to OpenAI's embedding endpoint for embedding query text.

        Args:
            text: The text to embed.

        Returns:
            Embedding for the text.
        r   )r  )r   r   s     r:   embed_queryzOpenAIEmbeddings.embed_query  s     ##TF+A..r<   c                L   K   | j                  |g       d{   }|d   S 7 	w)zCall out to OpenAI's embedding endpoint async for embedding query text.

        Args:
            text: The text to embed.

        Returns:
            Embedding for the text.
        Nr   )r  )r   r   r9   s      r:   aembed_queryzOpenAIEmbeddings.aembed_query  s,       00$88
!} 9s   $"
$)r   r   rG   r   )r   r   rG   r   )rG   r   )r   	List[str]r   rn   r   Optional[int]rG   List[List[float]])r   )r   r  r   r  rG   r  )r   rn   rG   zList[float])2__name__
__module____qualname____doc__r   r[   __annotations__rf   ro   rp   rs   ru   rv   rw   ry   r{   r}   setr~   r   r   r-   r   r   r   r   r   r   r   rU   r   r   r.   r/   r   r   model_configr   classmethodr   r   r   propertyr   r  r  r  r  r  r  rH   r<   r:   r    r       s   'R d3FC3dD9L#9)E3) %J%(-d-(PPS%*4z%JO]J &*O])"&L-& $#$8$)$i$HNMHO).t>)RRN7:uO4<INFNJ8K<HMIIOE GS!d!G)--J $t#8#(#>L.>VJ!6:O3:7;M4; s7s7$(K!( XBL (#  $2 J JX  H MQAA+.A<IA	AL MQww+.w<Iw	wt =>CC,9C	C& =>JJ,9J	J$	/
r<   )r9   r    rG   zCallable[[Any], Any])r9   r    rG   r   )F)rT   r   rU   r   rG   r   )r9   r    rB   r   rG   r   )3
__future__r   r7   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   numpyr   langchain_core._api.deprecationr   langchain_core.embeddingsr   langchain_core.utilsr   r   r   pydanticr   r   r   r   tenacityr   r   r   r   r   r    langchain_community.utils.openair   	getLoggerr  r6   r;   rJ   rV   ra   rg   r    rH   r<   r:   <module>r0     s    "  	      6 0 
 C B  :			8	$6"L'3 
:
ry* r
rr<   