
    %Gg                     l   U d dl Z d dlmZ d dlmZmZmZmZmZm	Z	 d dl
m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 d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- 	 d dl.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z7 e0r< e0jr                         D  ci c]!  } | d   | d   e'jt                  jv                  f# c} ni Z<e=e>e?e@e'jt                  f   f   eAd<   e/r# e/jr                         D  ci c]  } | d   | 
 c} ni ZBe=e>e?e@e'jt                  f   f   eAd<   e/r4 e/jr                         D ch c]  }|j                  dd      r|d    c}n eD       ZEeDe>   eAd<   e1r# e1jr                         D  ci c]  } | d   | 
 c} ni ZFe=e>e?e@e'jt                  f   f   eAd<   e2r# e2jr                         D  ci c]  } | d   | 
 c} ni ZGe=e>e?e@e'jt                  f   f   eAd<    G d d e      ZHy# e8$ r dZ0dZ/dZ4dZ1dZ2dZ7Y ~w xY wc c} w c c} w c c}w c c} w c c} w )!    N)tee)AnyIterableOptionalSequenceUnionget_args)deepcopy)Path)	BaseModel)
QdrantBase)common_types)
GrpcToRest)INFERENCE_OBJECT_TYPES)InspectorEmbed)NumericVectorNumericVectorStruct)ModelSchemaParser)	FieldPath)QueryResponse)models)reciprocal_rank_fusion)grpc)show_warning)SparseTextEmbeddingTextEmbeddingLateInteractionTextEmbeddingImageEmbedding)OnnxProvider)ImagemodeldimSUPPORTED_EMBEDDING_MODELS!SUPPORTED_SPARSE_EMBEDDING_MODELSrequires_idfIDF_EMBEDDING_MODELS"_LATE_INTERACTION_EMBEDDING_MODELS_IMAGE_EMBEDDING_MODELSc                   	    e Zd ZU dZi Zeedf   ed<   i Zeedf   ed<   i Z	eedf   ed<   i Z
eedf   ed	<   eed
<   dedef fdZedefd       Zedee   fd       Z	 	 	 	 	 	 	 dVdedee   dee   dee   deed      dedeee      dededdfdZ	 	 	 	 	 	 dWdee   dee   dee   deed      dedeee      dededdfdZedXd       Zededeeej8                  f   fd       Ze	 	 	 dYdedee   dee   deed      deddfd        Ze	 	 	 dYdedee   dee   deed      deddfd!       Ze	 	 	 dYdedee   dee   deed      deddfd"       Z e	 	 	 dYdedee   dee   deed      deddfd#       Z!ed$d%dfd&e"e   ded'ed(ed)ee   de"eeee#   f      fd*Z$ed$dfd&e"e   ded'ed)ee   de"e%jL                     f
d+Z'defd,Z(dee   fd-Z)d.ee%jT                     dee+   fd/Z,	 dZd0ee"ejZ                        d1ee"eeef         d2e"eeee#   f      d3ed4ee"e%jL                        de"ej\                     fd5Z/d6ej`                  ddfd7Z1	 	 	 dYd8ee   d9eejd                     d:eejf                     deeejh                  f   fd;Z5	 	 d[d8ee   d<eejl                     deeeejn                  f      fd=Z8	 	 	 	 d\d>ed&e"e   d1ee"eeef         d0ee"ejZ                        d'ed)ee   dedee9eef      fd?Z:	 	 d]d>ed@edAeejv                     dBededee+   fdCZ<	 	 d]d>edDee   dAeejv                     dBededeee+      fdEZ=edFe9e%j|                  ee#   eee#      e%jL                  e%j~                  e%j                  ej                  ej                  ej                  df
   deej~                     fdG       ZDdFej                  dej                  fdHZFdIeej                     deej                     fdJZG	 	 d^dKeHdLeeeI      dMede9eHeJf   fdNZKeLdOej                  dej                  fdP       ZN	 d_dOej                  dMedeOfdQZPd_dRej                  dMedeJfdSZQdTej                  deJfdUZR xZSS )`QdrantFastembedMixinzBAAI/bge-small-enr   embedding_modelsr   sparse_embedding_modelsr   !late_interaction_embedding_modelsr   image_embedding_models_FASTEMBED_INSTALLEDparserkwargsc                 R   d | _         d | _        t        |      | _        	 ddlm}m} t         |j                               dkD  sJ t         |j                               dkD  sJ d| j                  _
        t        | 4  di | y # t        $ r d| j                  _
        Y ,w xY w)N)r0   r   )r   r   TF )_embedding_model_name_sparse_embedding_model_namer   _embed_inspector	fastembedr   r   lenlist_supported_models	__class__r/   ImportErrorsuper__init__)selfr0   r1   r   r   r:   s        {/home/kushmeetdev/apache_webroot/langgraph_flaskproject/venv/lib/python3.12/site-packages/qdrant_client/qdrant_fastembed.pyr=   zQdrantFastembedMixin.__init__Z   s    48";?) .f =	8D@*@@BCaGGG:}::<=AAA26DNN/ 	"6"  	827DNN/	8s   AB	 	B&%B&returnc                 T    | j                   | j                  | _         | j                   S N)r4   DEFAULT_EMBEDDING_MODELr>   s    r?   embedding_model_namez)QdrantFastembedMixin.embedding_model_namej   s(    %%-)-)E)ED&)))    c                     | j                   S rB   )r5   rD   s    r?   sparse_embedding_model_namez0QdrantFastembedMixin.sparse_embedding_model_namep   s    000rF   NrE   
max_length	cache_dirthreads	providersr   cuda
device_ids	lazy_loadc	                 n    |t        dt        d        | j                  d|||||||d|	 || _        y)a\  
        Set embedding model to use for encoding documents and queries.

        Args:
            embedding_model_name: One of the supported embedding models. See `SUPPORTED_EMBEDDING_MODELS` for details.
            max_length (int, optional): Deprecated. Defaults to None.
            cache_dir (str, optional): The path to the cache directory.
                Can be set using the `FASTEMBED_CACHE_PATH` env variable.
                Defaults to `fastembed_cache` in the system's temp directory.
            threads (int, optional): The number of threads single onnxruntime session can use. Defaults to None.
            providers: The list of onnx providers (with or without options) to use. Defaults to None.
                Example configuration:
                https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#configuration-options
            cuda (bool, optional): Whether to use cuda for inference. Mutually exclusive with `providers`
                Defaults to False.
            device_ids (Optional[list[int]], optional): The list of device ids to use for data parallel processing in
                workers. Should be used with `cuda=True`, mutually exclusive with `providers`. Defaults to None.
            lazy_load (bool, optional): Whether to load the model during class initialization or on demand.
                Should be set to True when using multiple-gpu and parallel encoding. Defaults to False.
        Raises:
            ValueError: If embedding model is not supported.
            ImportError: If fastembed is not installed.

        Returns:
            None
        Nzhmax_length parameter is deprecated and will be removed in the future. It's not used by fastembed models.   )messagecategory
stacklevel
model_namerJ   rK   rL   rM   rN   rO   r3   )r   DeprecationWarning_get_or_init_modelr4   )
r>   rE   rI   rJ   rK   rL   rM   rN   rO   r1   s
             r?   	set_modelzQdrantFastembedMixin.set_modelt   s^    N !5+	 	  		
+!		
 		
 &:"rF   c                 J    | | j                   d|||||||d| || _        y)a  
        Set sparse embedding model to use for hybrid search over documents in combination with dense embeddings.

        Args:
            embedding_model_name: One of the supported sparse embedding models. See `SUPPORTED_SPARSE_EMBEDDING_MODELS` for details.
                        If None, sparse embeddings will not be used.
            cache_dir (str, optional): The path to the cache directory.
                                       Can be set using the `FASTEMBED_CACHE_PATH` env variable.
                                       Defaults to `fastembed_cache` in the system's temp directory.
            threads (int, optional): The number of threads single onnxruntime session can use. Defaults to None.
            providers: The list of onnx providers (with or without options) to use. Defaults to None.
                Example configuration:
                https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#configuration-options
            cuda (bool, optional): Whether to use cuda for inference. Mutually exclusive with `providers`
                Defaults to False.
            device_ids (Optional[list[int]], optional): The list of device ids to use for data parallel processing in
                workers. Should be used with `cuda=True`, mutually exclusive with `providers`. Defaults to None.
            lazy_load (bool, optional): Whether to load the model during class initialization or on demand.
                Should be set to True when using multiple-gpu and parallel encoding. Defaults to False.
        Raises:
            ValueError: If embedding model is not supported.
            ImportError: If fastembed is not installed.

        Returns:
            None
        NrU   r3   )_get_or_init_sparse_modelr5   )	r>   rE   rJ   rK   rL   rM   rN   rO   r1   s	            r?   set_sparse_modelz%QdrantFastembedMixin.set_sparse_model   sJ    J  +*D** 	/##%#	 	 -A)rF   c                 2    | j                   ry t        d      )Nzjfastembed is not installed. Please install it to enable fast vector indexing with `pip install fastembed`.)r/   r;   )clss    r?   _import_fastembedz&QdrantFastembedMixin._import_fastembed   s#    ## ^
 	
rF   rV   c                 n    | j                          |t        vrt        d| dt               t        |   S )NUnsupported embedding model: . Supported models: )r_   r#   
ValueError)r^   rV   s     r?   _get_model_paramsz&QdrantFastembedMixin._get_model_params   sD    77/
|;OPjOkl  **55rF   c                     || j                   v r| j                   |   S | j                          |t        vrt        d| dt               t	        d||||d|| j                   |<   | j                   |   S Nra   rb   )rV   rJ   rK   rL   r3   )r+   r_   r#   rc   r   r^   rV   rJ   rK   rL   r1   s         r?   rX   z'QdrantFastembedMixin._get_or_init_model   s     ---''
3377/
|;OPjOkl  ,9 ,
!	,

 ,
Z( ##J//rF   c                     || j                   v r| j                   |   S | j                          |t        vrt        d| dt               t	        d||||d|| j                   |<   | j                   |   S rf   )r,   r_   r$   rc   r   rg   s         r?   r[   z.QdrantFastembedMixin._get_or_init_sparse_model  s     444..z::>>/
|;OPqOrs  3F 3
!	3

 3
##J/ **:66rF   c                     || j                   v r| j                   |   S | j                          |t        vrt        d| dt               t	        d||||d|| j                   |<   | j                   |   S rf   )r-   r_   r'   rc   r   rg   s         r?   #_get_or_init_late_interaction_modelz8QdrantFastembedMixin._get_or_init_late_interaction_model/  s     >>>88DD??/
|;OPrOst  =Y =
!	=

 =
--j9 44Z@@rF   c                     || j                   v r| j                   |   S | j                          |t        vrt        d| dt               t	        d||||d|| j                   |<   | j                   |   S rf   )r.   r_   r(   rc   r   rg   s         r?   _get_or_init_image_modelz-QdrantFastembedMixin._get_or_init_image_modelK  s     333--j9944/
|;OPgOhi  2@ 2
!	2

 2
"":. ))*55rF       default	documents
batch_size
embed_typeparallelc              #   F  K   | j                  |      t        |d      \  }}|dk(  rj                  |||      }n9|dk(  rfd|D        }n(|dk(  rj                  |||      }nt	        d|       t        ||      D ]  \  }	}
|
|	j                         f  y w)	NrV      passagerp   rr   queryc              3   Z   K   | ]"  }t        j                  |             d    $ yw)rx   r   N)listquery_embed).0rx   embedding_models     r?   	<genexpr>z8QdrantFastembedMixin._embed_documents.<locals>.<genexpr>v  s.      FK_00u0=>qAs   (+rn   zUnknown embed type: )rX   r   passage_embedembedrc   ziptolist)r>   ro   rE   rp   rq   rr   documents_adocuments_bvectors_itervectordocr~   s              @r?   _embed_documentsz%QdrantFastembedMixin._embed_documentsg  s      11=Q1R#&y!#4 ["*88
X 9 L 7"OZL 9$*00
X 1 L 3J<@AA|[9 	'KFCv}}&&	's   BB!c              #      K   | j                  |      }|j                  |||      }|D ]K  }t        j                  |j                  j                         |j                  j                                M y w)Nrt   rw   indicesvalues)r[   r   typesSparseVectorr   r   r   )r>   ro   rE   rp   rr   sparse_embedding_modelr   sparse_vectors           r?   _sparse_embed_documentsz,QdrantFastembedMixin._sparse_embed_documents  s      "&!?!?K_!?!`-33*x 4 
 * 	M$$%--446$++224 	s   A8A:c                 d    | j                   j                  d      d   j                         }d| S )
        Returns name of the vector field in qdrant collection, used by current fastembed model.
        Returns:
            Name of the vector field.
        /zfast-)rE   splitlowerr>   rV   s     r?   get_vector_field_namez*QdrantFastembedMixin.get_vector_field_name  s5     ..44S9"=CCE
zl##rF   c                 ~    | j                   1| j                   j                  d      d   j                         }d| S y)r   Nr   r   zfast-sparse-)rH   r   r   r   s     r?   get_sparse_vector_field_namez1QdrantFastembedMixin.get_sparse_vector_field_name  sD     ++799??DRHNNPJ!*..rF   scored_pointsc                    g }| j                         }| j                         }|D ]  }t        |j                  t              r|j                  j                  |d       nd }d }|8t        |j                  t              r|j                  j                  |d       nd }|j                  t        |j                  |||j                  |j                  j                  dd      |j                                |S )Ndocument )id	embeddingsparse_embeddingmetadatar   score)r   r   
isinstancer   dictgetappendr   r   payloadr   )r>   r   responsevector_field_namesparse_vector_field_namescored_pointr   r   s           r?   !_scored_points_to_query_responsesz6QdrantFastembedMixin._scored_points_to_query_responses  s      668#'#D#D#F ) 	L l1148 ##''(94@ 
  $'3 ","5"5t< !''++,DdK ! OO#'%5)11)1155j"E&,,		0 rF   idsr   encoded_docsids_accumulatorsparse_vectorsc              #   X  K   |t        d d       }|t        d d       }|t        d d      }| j                         }| j                         }t        ||||      D ]H  \  }}	\  }
}}|j	                  |       d|
i|	}||i}|||||<   t        j                  |||       J y w)Nc                  >    t        j                         j                  S rB   )uuiduuid4hexr3   rF   r?   <lambda>z7QdrantFastembedMixin._points_iterator.<locals>.<lambda>  s    tzz|// rF   c                      i S rB   r3   r3   rF   r?   r   z7QdrantFastembedMixin._points_iterator.<locals>.<lambda>  s    B rF   c                       y rB   r3   r3   rF   r?   r   z7QdrantFastembedMixin._points_iterator.<locals>.<lambda>  s    rF   Tr   )r   r   r   )iterr   r   r   r   r   PointStruct)r>   r   r   r   r   r   vector_namesparse_vector_nameidxmetar   r   r   r   point_vectors                  r?   _points_iteratorz%QdrantFastembedMixin._points_iterator  s      ;/6CJ-H!!,5N002!>>@7:<8
 	S3C}Vm ""3'!3/$/G6A65JL!--2K3@/0$$W\RR	Ss   B(B*collection_infoc                 &   | j                  | j                        \  }}| j                         }t        |j                  j
                  j                  t              s(J d|j                  j
                  j                          ||j                  j
                  j                  v s+J d|j                  j
                  j                   d|        |j                  j
                  j                  |   }||j                  k(  sJ d| d|j                          ||j                  k(  sJ d| d|j                          | j                         }|||j                  j
                  j                  v s(J d|j                  j
                  j                          | j                  t        v ra|j                  j
                  j                  |   j                  }|t        j                   j"                  k(  sJ | j                   d|        y y y )Nrt   z,Collection have incompatible vector params: z, expected zEmbedding size mismatch: z != zDistance mismatch: z, requires modifier IDF, current modifier is )rd   rE   r   r   configparamsvectorsr   sizedistancer   r   rH   r&   modifierr   ModifierIDF)r>   r   embeddings_sizer   r   vector_paramsr   r   s           r?   _validate_collection_infoz.QdrantFastembedMixin._validate_collection_info  s4   $($:$:dF_F_$:$`! 668 ""))114
 	b9/:P:P:W:W:_:_9`a	b 

 !7!7!>!>!F!FF	@9/:P:P:W:W:_:_9``kl}k~	@F (..55==>OP }111	Q&&7tM<N<N;OP	Q1 ...	H 
$}/E/E.FG	H. $(#D#D#F #/(O,B,B,I,I,X,XXf=o>T>T>[>[>c>c=defX//3GG*1188GG,(   3 33o6677cdlcmno3 H	 0rF   on_diskquantization_confighnsw_configc                     | j                         }| j                  | j                        \  }}|t        j                  |||||      iS )a  
        Generates vector configuration, compatible with fastembed models.

        Args:
            on_disk: if True, vectors will be stored on disk. If None, default value will be used.
            quantization_config: Quantization configuration. If None, quantization will be disabled.
            hnsw_config: HNSW configuration. If None, default configuration will be used.

        Returns:
            Configuration for `vectors_config` argument in `create_collection` method.
        rt   )r   r   r   r   r   )r   rd   rE   r   VectorParams)r>   r   r   r   r   r   r   s          r?   get_fastembed_vector_paramsz0QdrantFastembedMixin.get_fastembed_vector_params  sZ    " !668$($:$:dF_F_$:$`!v22$!$7' 
 	
rF   r   c                     | j                         }| j                  t        v r|t        j                  j
                  n|}|y|t        j                  t        j                  |      |      iS )a  
        Generates vector configuration, compatible with fastembed sparse models.

        Args:
            on_disk: if True, vectors will be stored on disk. If None, default value will be used.
            modifier: Sparse vector queries modifier. E.g. Modifier.IDF for idf-based rescoring. Default: None.
        Returns:
            Configuration for `vectors_config` argument in `create_collection` method.
        N)r   )indexr   )r   rH   r&   r   r   r   SparseVectorParamsSparseIndexParams)r>   r   r   r   s       r?   "get_fastembed_sparse_vector_paramsz7QdrantFastembedMixin.get_fastembed_sparse_vector_params+  ss     !==?++/CC.6.>v**HH$ v88..# "	 
 	
rF   collection_namec           	         | j                  || j                  |d|      }d}	| j                  | j                  || j                  ||      }		 | j	                  |      }
| j                  |
       g }| j                  |||||	      } | j                  d||d|xs d	|d
| |S # t
        $ rE | j                  || j                         | j                                | j	                  |      }
Y w xY w)a  
        Adds text documents into qdrant collection.
        If collection does not exist, it will be created with default parameters.
        Metadata in combination with documents will be added as payload.
        Documents will be embedded using the specified embedding model.

        If you want to use your own vectors, use `upsert` method instead.

        Args:
            collection_name (str):
                Name of the collection to add documents to.
            documents (Iterable[str]):
                List of documents to embed and add to the collection.
            metadata (Iterable[dict[str, Any]], optional):
                List of metadata dicts. Defaults to None.
            ids (Iterable[models.ExtendedPointId], optional):
                List of ids to assign to documents.
                If not specified, UUIDs will be generated. Defaults to None.
            batch_size (int, optional):
                How many documents to embed and upload in single request. Defaults to 32.
            parallel (Optional[int], optional):
                How many parallel workers to use for embedding. Defaults to None.
                If number is specified, data-parallel process will be used.

        Raises:
            ImportError: If fastembed is not installed.

        Returns:
            List of IDs of added documents. If no ids provided, UUIDs will be randomly generated on client side.

        rv   )ro   rE   rp   rq   rr   N)ro   rE   rp   rr   )r   )r   vectors_configsparse_vectors_config)r   r   r   r   r   T   )r   pointswaitrr   rp   r3   )r   rE   rH   r   get_collection	Exceptioncreate_collectionr   r   r   r   upload_points)r>   r   ro   r   r   rp   rr   r1   r   encoded_sparse_docsr   inserted_idsr   s                r?   addzQdrantFastembedMixin.addI  sO   V ,,!%!:!:!  - 
 #++7"&">">#%)%E%E%!	 #? #	S"11/1RO 	&&7&&%(. ' 
 	 	
+]!	
 	
 ;  	S"" /#??A&*&M&M&O # 
 #11/1RO	Ss   B( (AC65C6
query_textquery_filterlimitc                    | j                  | j                        }t        |j                  |            }|d   j	                         }| j
                  J| j                   | j                  d|t        j                  | j                         |      ||dd|      S | j                  | j
                        }	t        |	j                  |            d   }
t        j                  |
j                  j	                         |
j                  j	                               }t        j                  dt        j                  | j                         |      ||dd|}t        j                  dt        j                   | j#                         |      ||dd|}| j%                  |||g	      \  }}| j                  t'        ||g|
            S )aO  
        Search for documents in a collection.
        This method automatically embeds the query text using the specified embedding model.
        If you want to use your own query vector, use `search` method instead.

        Args:
            collection_name: Collection to search in
            query_text:
                Text to search for. This text will be embedded using the specified embedding model.
                And then used as a query vector.
            query_filter:
                - Exclude vectors which doesn't fit given conditions.
                - If `None` - search among all vectors
            limit: How many results return
            **kwargs: Additional search parameters. See `qdrant_client.models.SearchRequest` for details.

        Returns:
            list[types.ScoredPoint]: List of scored points.

        rt   rz   r   namer   T)r   query_vectorr   r   with_payloadr   r   filterr   r   r   requestsr   r3   )rX   rE   r{   r|   r   rH   r   searchr   NamedVectorr   r[   r   r   r   SearchRequestNamedSparseVectorr   search_batchr   )r>   r   r   r   r   r1   embedding_model_inst
embeddingsr   sparse_embedding_model_instr   sparse_query_vectordense_requestsparse_requestdense_request_responsesparse_request_responses                   r?   rx   zQdrantFastembedMixin.query  s	   :  $66$B[B[6\.:::LM
!!}++-++399 	$3!'!3!3!779," ".!%	 	  '+&D&D77 'E '
# 8DD:DVWXYZ$11!))002 ''..0

 ,, 	
%%//1#  	
 	
  -- 	
++668*  	
 	
 ;?:K:K+}n6U ;L ;
7 7 55"$:<S#T\ab
 	
rF   query_textsc           	      |   | j                  | j                        }t        |j                  |            }g }|D ]^  }	t	        j
                  dt	        j                  | j                         |	j                               ||dd|}
|j                  |
       ` | j                  2| j                  ||      }|D cg c]  }| j                  |       c}S | j                  | j                        }|j                  |      D cg c]I  }t	        j                  |j                   j                         |j"                  j                         	      K }}|D ]P  }t	        j
                  dt	        j$                  | j'                         |      ||dd|}
|j                  |
       R | j                  ||      }|dt)        |       }|t)        |      d }t+        ||      D cg c]  \  }}t-        ||g|
       }}}|D cg c]  }| j                  |       c}S c c}w c c}w c c}}w c c}w )a  
        Search for documents in a collection with batched query.
        This method automatically embeds the query text using the specified embedding model.

        Args:
            collection_name: Collection to search in
            query_texts:
                A list of texts to search for. Each text will be embedded using the specified embedding model.
                And then used as a query vector for a separate search requests.
            query_filter:
                - Exclude vectors which doesn't fit given conditions.
                - If `None` - search among all vectors
                This filter will be applied to all search requests.
            limit: How many results return
            **kwargs: Additional search parameters. See `qdrant_client.models.SearchRequest` for details.

        Returns:
            list[list[QueryResponse]]: List of lists of responses for each query text.

        rt   rz   r   Tr   Nr   ro   r   r   r3   )rX   rE   r{   r|   r   r   r   r   r   r   rH   r   r   r[   r   r   r   r   r   r   r8   r   r   )r>   r   r  r   r   r1   r   query_vectorsr   r   request	responsesr   r   r   sparse_query_vectorsdense_responsessparse_responsesdense_responsesparse_responses                       r?   query_batchz QdrantFastembedMixin.query_batch  s   8  $66$B[B[6\1==K=PQ# 	%F** ))335fmmo $! G OOG$	% ++3)) /! * I V__D::8D__&*&D&D77 'E '
# "=!B!B[!B!Y 

 	 %--446$++224 
  
 2 	%M** 	//::<( $!	 	G OOG$	% %%+ & 
	
 $$6c+&67$S%5%78 47HX3Y
/ #NO#DER
	 

 R[[X66x@[[M `
 
8

 \s    H)AH..H3H9rx   c                    t        |t        t        j                              st        |t        j                        r|S t        |t        j
                        rt        j                  |      S t        |t        j                        r$t        j                  |j                               S t        |t              rt        j                  |      S t        |t        t        j                              rGt        |t        j                        rt        j                  |      n|}t        j                  |      S t        |t              rt        j                  |      S |yt!        dt#        |             )ac  Resolves query interface into a models.Query object

        Args:
            query: models.QueryInterface - query as a model or a plain structure like list[float]

        Returns:
            Optional[models.Query]: query as it was, models.Query(nearest=query) or None

        Raises:
            ValueError: if query is not of supported type
        )nearestNzUnsupported query type: )r   r	   r   Queryr   r   r   NearestQuerynpndarrayr   r{   PointIdr   convert_point_idr   rc   type)r^   rx   s     r?   _resolve_queryz#QdrantFastembedMixin._resolve_queryT  s   6 eXekk23z%7TLeU//0&&u55eRZZ(&&u||~>>eT"&&u55eXemm456@6U
++E2[`  &&u55e34&&u55=3DK=ABBrF   c                 \    t        |      }| j                  |j                        |_        |S )zResolve QueryRequest query field

        Args:
            query: models.QueryRequest - query request to resolve

        Returns:
            models.QueryRequest: A deepcopy of the query request with resolved query field
        )r
   r  rx   )r>   rx   s     r?   _resolve_query_requestz+QdrantFastembedMixin._resolve_query_request  s(     ))%++6rF   r   c                 J    |D cg c]  }| j                  |       c}S c c}w )a  Resolve query field for each query request in a batch

        Args:
            requests: Sequence[models.QueryRequest] - query requests to resolve

        Returns:
            Sequence[models.QueryRequest]: A list of deep copied query requests with resolved query fields
        )r  )r>   r   rx   s      r?   _resolve_query_batch_requestz1QdrantFastembedMixin._resolve_query_batch_request  s%     AIIu++E2IIIs    r!   pathsis_queryc           	      h   |It        |t              r| j                  ||      S t        |      }| j                  j                  |      }|D ]  }t        |t              s|gn|}|D ]  }t        ||j                  d      }||j                  r| j                  ||j                  |       Ht        |t              }t        |t              s|gn|}|D 	cg c]  }	| j                  |	|       }
}	|rt        ||j                  |
       t        ||j                  |
d            |S c c}	w )a  Embed model's fields requiring inference

        Args:
            model: Qdrant http model containing fields to embed
            paths: Path to fields to embed. E.g. [FieldPath(current="recommend", tail=[FieldPath(current="negative", tail=None)])]
            is_query: Flag to determine which embed method to use. Defaults to False.

        Returns:
            A deepcopy of the method with embedded fields
        Nr  r   )r   r   _embed_raw_datar
   r6   inspectr{   getattrcurrenttail_embed_modelssetattr)r>   r!   r  r  path
list_modelitemcurrent_modelwas_listdatar   s              r?   r'  z"QdrantFastembedMixin._embed_models  s=     =%!78++EH+EEUOE))11%8E 	CD(25$(?%UJ" C 'dllD A (99&&}dii(&S)->H/9-/NTa " S`"JN,,TH,E"J "  dllJ?dllJqMB#C	C( "s   D/r.  c                    t        | t        j                        s| S | j                  }| j                  }| j
                  }|g t        j                         t        j                         t        j                         v rt        j                  |||      S |t        v rt        j                  |||      S t        | d      )a  Resolve inference object into a model

        Args:
            data: models.VectorStruct - data to resolve, if it's an inference object, convert it to a proper type,
                otherwise - keep unchanged

        Returns:
            models.VectorStruct: resolved data
        )r!   textoptions)r!   imager1   is not among supported models)r   r   InferenceObjectr!   objectr1  r#   keysr$   r'   Documentr(   r    rc   )r.  rV   valuer1  s       r?   _resolve_inference_objectz.QdrantFastembedMixin._resolve_inference_object  s     $ 6 67KZZ
,, 
',,.
.335
 0446
 

 ??%QQ00<<jwOOJ<'EFGGrF   c           	         | j                  |      }t        |t        j                        r| j	                  ||      S t        |t        j
                        r| j                  |      S t        |t              r5|j                         D ci c]  \  }}|| j                  ||       c}}S t        |t              r8|rt        |d   t              r|S |D cg c]  }| j                  ||       c}S |S c c}}w c c}w )ah  Iterates over the data and calls inference on the fields requiring it

        Args:
            data: models.VectorStruct - data to embed, if it's not a field which requires inference, leave it as is
            is_query: Flag to determine which embed method to use. Defaults to False.

        Returns:
            NumericVectorStruct: Embedded data
        r!  r   )r9  r   r   r7  _embed_documentr    _embed_imager   itemsr"  r{   float)r>   r.  r  keyr8  s        r?   r"  z$QdrantFastembedMixin._embed_raw_data  s     --d3dFOO,''x'@@fll+$$T**d#VZV`V`VbHRUT))%()CC  d#
47E2PTUuD(((BUU Vs   C9C?r   c                    |j                   }|j                  }|j                  xs i }|t        v rs | j                  dd|i|}|s/t        |j                  |g            d   j                         }|S t        |j                  |            d   j                         }|S |t        v r | j                  dd|i|}|s t        |j                  |g            d   }	nt        |j                  |            d   }	t        j                  |	j                  j                         |	j                  j                               S |t        v rs | j                   dd|i|}
|s/t        |
j                  |g            d   j                         }|S t        |
j                  |            d   j                         }|S t#        | d      )aO  Embed a document using the specified embedding model

        Args:
            document: Document to embed
            is_query: Flag to determine which embed method to use. Defaults to False.

        Returns:
            NumericVector: Document's embedding

        Raises:
            ValueError: If model is not supported
        rV   r  r   rz   r   r3  r3   )r!   r0  r1  r#   rX   r{   r   r   r|   r$   r[   r   r   r   r   r'   rj   rc   )r>   r   r  rV   r0  r1  r   r   r   r   li_embedding_model_insts              r?   r;  z$QdrantFastembedMixin._embed_document	  s    ^^
}}""(b33#:4#:#:#\j#\T[#\  !5!;!;tf!;!MNqQXXZ	  !!5!A!A!A!MNqQXXZ	<<*H$*H*H +%+)0+' #'(C(I(IUYTZ(I([#\]^#_ #'(C(O(OVZ(O([#\]^#_ &&(00779BRBYBYB`B`Bb  ==&Nd&N&N '%')0'#  !8!>!>$!>!PQRST[[]	  !!8!D!D4!D!PQRST[[]	
|+IJKKrF   r2  c                    |j                   }|t        v r | j                  dd|i|j                  xs i }t	        |j
                  t        t        t        j                  f      s.t        dt        |j
                         d|j
                         t        |j                  |j
                  g            d   j                         }|S t        | d      )zEmbed an image using the specified embedding model

        Args:
            image: Image to embed

        Returns:
            NumericVector: Image's embedding

        Raises:
            ValueError: If model is not supported
        rV   zUnsupported image type: z	. Image: )imagesr   r3  r3   )r!   r(   rl   r1  r   r2  strr   PilImager    rc   r  r{   r   r   )r>   r2  rV   r   r   s        r?   r<  z!QdrantFastembedMixin._embed_image8  s     [[
00#@4#@#@ $%$*/--*=2$  ekkCx~~+FG !.tEKK/@.A5;;-X  177}7MNqQXXZIJ<'EFGGrF   )NNNNFNF)NNNFNF)r@   N)NNNrB   )NN)NNrm   N)N
   )NF)F)T__name__
__module____qualname__rC   r+   r   rD  __annotations__r,   r-   r.   boolr   r   r=   propertyrE   r   rH   intr   r{   rY   r\   classmethodr_   tupler   Distancerd   rX   r[   rj   rl   r   r>  r   r   r   r   r   r   ScoredPointr   r   ExtendedPointIdr   r   CollectionInfor   QuantizationConfigHnswConfigDiffr   r   r   r   r   r   r   Filterrx   r  r  r  
NumpyArrayr7  r    r4  r  QueryRequestr  r  r   r   r   r'  staticmethodVectorStructr9  r   r"  r;  r<  __classcell__)r:   s   @r?   r*   r*   Q   sr	   135d3/05@BT#'<"<=BSU%tC1O,O'PU:<D&6!67<#0 #C #  *c * *
 1Xc] 1 1 %)#'!%8<*.9:!9: SM9: C=	9:
 #9: H^459: 9: T#Y'9: 9: 9: 
9:| $(!%8<*.0A&sm0A C=0A #	0A
 H^450A 0A T#Y'0A 0A 0A 
0Ad 
 
 63 65foo9M3N 6 6  $(!%8<00 C=0 #	0
 H^450 0 
0 06  $(!%8<77 C=7 #	7
 H^457 7 
7 76  $(!%8<AA C=A #	A
 H^45A A 
(A A6  $(!%8<66 C=6 #	6
 H^456 6 
6 6< %<#"&'C=' "' 	'
 ' 3-' 
%T%[()	*'> %<"&C= " 	
 3- 
%$$	%&$s $	hsm 	 E--.  
m	 P BFShv5567S 8DcN34S uS$u+%567	S
 S !%*<*<!=>S 
&$$	%S<"o9N9N "oSW "oL #'CG7;	
$
 &f&?&?@
 f334	

 
c6&&&	'
> #'.2
$
 6??+
 
$sF5556	7	
D 8<:>"&\\ C=\ 8DcN34	\
 hv5567\ \ 3-\ \ 
eCHo	\D 15R
R
 R
 v}}-	R

 R
 R
 
m	R
p 15W\W\ #YW\ v}}-	W\
 W\ W\ 
d=!	"W\r 1CMMKeKKOOLL""	
1C 
&,,	1C 1CfF,?,? FDWDW J !4!45J	&%%	&J  ,0	)) Y() 	)
 
y-'	()V H(;(; H@S@S H H> !!  
	>-L -L4 -LTa -L^H&,, H= HrF   r*   )Ir   	itertoolsr   typingr   r   r   r   r   r	   copyr
   pathlibr   numpyr  pydanticr   qdrant_client.client_baser   qdrant_client.conversionsr   r   $qdrant_client.conversions.conversionr   qdrant_client.embed.commonr   #qdrant_client.embed.embed_inspectorr   qdrant_client.embed.modelsr   r   !qdrant_client.embed.schema_parserr   qdrant_client.embed.utilsr   qdrant_client.fastembed_commonr   qdrant_client.httpr   qdrant_client.hybrid.fusionr   qdrant_clientr   $qdrant_client.common.client_warningsr   r7   r   r   r   r   fastembed.commonr   PILr    rE  r;   r9   rP  COSINEr#   r   rD  rO  rM  rJ  r$   r   setr&   r'   r(   r*   )r!   model_configs   00r?   <module>rt     sp     E E     0 ; ; = > I ? / 8 % >  =  .%  9]88: 	guv'='=>>
 
 DeC,@&A!AB   )R(;(Q(Q(STuU7^UT	 "4U33G-H(H#I   F/EEGND1 	W 
 c#h  $ )[(D(Z(Z(\]uU7^U]	 #DeC4H.I)I$J   )M(L(L(NOuU7^UO	 c5foo)=#>>? AH: AH_  ML#' NH U ^ Ps0   H 0&H	H"	H'H,H1HH