
    i(                    r    d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	  e	e
          Z G d d          ZdS )	u  Embedding client using an OpenAI-compatible embeddings API.

文本向量化客户端封装模块。
通过 OpenAI 兼容的 Embeddings API 将文本转换为稠密向量，
支持批量编码和单条查询编码，默认使用 bge-m3 模型（1024 维）。
    )annotationsN)AsyncOpenAI)settings)
get_loggerc                  J    e Zd ZdZdddddddZddZddddZddddZdS )EmbeddingClientu   Async wrapper for computing text embeddings via an OpenAI-compatible API.

    异步文本向量化客户端，支持批量和单条文本的向量计算。
    N)base_urlapi_keymodel
dimensionsr	   
str | Noner
   r   r   
int | NonereturnNonec               *   |pt           j        | _        |pt           j        | _        t          |pt           j        |pt           j        t          j	        dd          t          j
        dt          j	        dd                              | _        d S )Ng      $@g      @)connectF)	trust_envtimeout)r	   r
   r   http_client)r   embedding_model_modelembedding_dimensions_dimensionsr   embedding_base_urlembedding_api_keyhttpxTimeoutAsyncClient_client)selfr	   r
   r   r   s        =D:\work\zm-rag\backend\app\infrastructure\embedding_client.py__init__zEmbeddingClient.__init__   s     7x7%F)F #<!<9x9M$444)dC888  	
 
 
    c                H   K   | j                                          d {V  d S )N)r   close)r    s    r!   r%   zEmbeddingClient.close0   s2      l  """""""""""r#   r   texts	list[str]list[list[float]]c          	       K   |sg S 	 | j         j                            |p| j        || j                   d{V }nR# t
          $ rE}t                              d|p| j        t          |          t          |                      d}~ww xY wd |j
        D             }t          |          D ]\  }}t          |          | j        k    r|t                              d| j        t          |          |           t          |          | j        k    r|d| j                 ||<   x|dg| j        t          |          z
  z  z   ||<   |S )	a  Embed a batch of texts and return a list of vectors.

        Each vector has *self._dimensions* dimensions (default 1024 for
        ``bge-m3``).

        The OpenAI embeddings API accepts a list of strings so a single
        round-trip is made for the whole batch.
        )r   inputr   Nembedding_api_error)r   
text_counterrorc                    g | ]	}|j         
S  )	embedding).0items     r!   
<listcomp>z/EmbeddingClient.embed_texts.<locals>.<listcomp>V   s    <<<d4><<<r#   embedding_dim_mismatch)expectedactualindexg        )r   
embeddingscreater   r   	Exceptionloggerr.   lenstrdata	enumeratewarning)r    r'   r   responseexcvectorsivecs           r!   embed_textszEmbeddingClient.embed_texts3   s       	I	!\4;;*t{+ <        HH
  	 	 	LL%*t{u::#hh	     	 =<hm<<<  (( 	M 	MFAs3xx4+++,!-s88	     s88d...!$%7t'7%7!8GAJJ "%u0@3s880K'L!LGAJs   4= 
BA BBtextr>   list[float]c               R   K   |                      |g|           d{V }|d         S )zEmbed a single query text and return the vector.

        This is a convenience wrapper around :meth:`embed_texts` for the
        common single-query use case.
        r&   Nr   )rG   )r    rH   r   rD   s       r!   embed_queryzEmbeddingClient.embed_queryk   s>       (($u(========qzr#   )
r	   r   r
   r   r   r   r   r   r   r   )r   r   )r'   r(   r   r   r   r)   )rH   r>   r   r   r   rI   )__name__
__module____qualname____doc__r"   r%   rG   rK   r0   r#   r!   r   r      s           $" !%
 
 
 
 
 
.# # # # !	6 6 6 6 6 6x !	       r#   r   )rO   
__future__r   r   openair   
app.configr   app.utils.loggerr   rL   r<   r   r0   r#   r!   <module>rT      s     # " " " " "              ' ' ' ' ' '	H		d d d d d d d d d dr#   