Ë
    Bêñi8M  ã                   óþ   — d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	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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#  G d„ de!«      Z$ G d„ d«      Z%y)é    N)Údefaultdict)Údeepcopy)Úget_all_start_methods)ÚIterableÚAnyÚTypeÚget_args)Ú	BaseModel)Úmodels)ÚINFERENCE_OBJECT_TYPES)ÚInspectorEmbed)ÚEmbedder)ÚNumericVectorÚNumericVectorStruct)ÚModelSchemaParser)Ú	FieldPath)ÚFastEmbedMisc)ÚParallelWorkerPoolÚWorker)Ú
iter_batchc                   ój   — e Zd Zdedefd„Zedededd fd„«       Zdee	eef      dee	eef      fd„Z
y)	ÚModelEmbedderWorkerÚ
batch_sizeÚkwargsc                 ó2   — t        di |¤Ž| _        || _        y )N© )ÚModelEmbedderÚmodel_embedderr   )Úselfr   r   s      úd/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/qdrant_client/embed/model_embedder.pyÚ__init__zModelEmbedderWorker.__init__   s   € Ü+Ñ5¨fÑ5ˆÔØ$ˆ�ó    Úreturnc                 ó   —  | dd|dœ|¤ŽS )Né   )Úthreadsr   r   r   )Úclsr   r   s      r    ÚstartzModelEmbedderWorker.start   s   € áÐ>˜1¨Ñ>°vÑ>Ð>r"   Úitemsc              #   óˆ   K  — |D ]9  \  }}|t        | j                  j                  || j                  ¬«      «      f–— Œ; y ­w)N©Úinference_batch_size)Úlistr   Úembed_models_batchr   )r   r)   ÚidxÚbatchs       r    ÚprocesszModelEmbedderWorker.process   sP   è ø€ Øò 	‰JˆC�àÜØ×'Ñ'×:Ñ:Ø°D·O±Oð ;ó óðó ñ	ùs   ‚A AN)Ú__name__Ú
__module__Ú__qualname__Úintr   r!   Úclassmethodr(   r   Útupler1   r   r"   r    r   r      sl   „ ð% 3ð %°#ó %ð ð?˜sð ?¨cð ?Ð6Kò ?ó ð?ð	˜X e¨C°¨H¡oÑ6ð 	¸8ÀEÈ#ÈsÈ(ÁOÑ;Tô 	r"   r   c                   óx  — e Zd ZdZ	 	 ddedz  dedefd„Z	 	 ddee	e   z  ded	e
d
e	e   fd„Z	 	 dde	eeef   ez     d	e
de
dz  d
e	eeef   ez     fd„Z	 	 ddeeeef   ez     dede
d
e	e   fd„Z	 	 	 	 ddeeef   ez  dee   dz  dedede
dz  d
eeef   eeef   z  ez  ez  ej(                  z  fd„Zdej,                  d
dfd„Z	 d dej,                  dede
d
eej(                  z  fd„Zddede
d
dfd„Zded
eej(                  z  fd„Zdej,                  d
ej,                  fd„Zed
ee   fd„«       Z y)!r   é@   NÚparserÚis_local_moder   c                 ó¼   — i | _         i | _        t        |¬«      | _        | | _        t        j                  «       | _        t        dd| j                  i|¤Ž| _	        y )N)r:   Úuse_core_bm25r   )
Ú_batch_accumulatorÚ_embed_storager   Ú_embed_inspectorÚ_is_builtin_embedder_availabler   Úis_installedÚ_fastembed_availabler   Úembedder)r   r:   r;   r   s       r    r!   zModelEmbedder.__init__-   sZ   € ð LNˆÔØVXˆÔÜ .°fÔ =ˆÔØ2?Ð.?ˆÔ+Ü$1×$>Ñ$>Ó$@ˆÔ!Ü Ñ]¨t×/RÑ/RÐ]ÐV\Ñ]ˆ�r"   Ú
raw_modelsÚis_queryr   r#   c              #   óÐ   K  — | j                   st        j                  «        t        |t        «      r|g}t        ||«      D ]  }| j                  |||¬«      E d{  –—†  Œ  y7 Œ­w)a2  Embed raw data fields in models and return models with vectors

            If any of model fields required inference, a deepcopy of a model with computed embeddings is returned,
            otherwise returns original models.
        Args:
            raw_models: Iterable[BaseModel] - models which can contain fields with raw data
            is_query: bool - flag to determine which embed method to use. Defaults to False.
            batch_size: int - batch size for inference
        Returns:
            list[BaseModel]: models with embedded fields
        r+   N)rA   r   Úimport_fastembedÚ
isinstancer
   r   r.   )r   rE   rF   r   Úraw_models_batchs        r    Úembed_modelszModelEmbedder.embed_models:   sn   è ø€ ð" ×2Ò2Ü×*Ñ*Ô,ä�j¤)Ô,Ø$˜ˆJÜ *¨:°zÓ Bò 	ÐØ×.Ñ.Ø  (Àð /ó ÷ ñ ñ	ðús   ‚AA&ÁA$ÁA&Úparallelc              #   ó  K  — | j                   st        j                  «        d}t        |t        «      rt        |«      |k  rd}|�|dk(  s|r-t        ||«      D ]  }| j                  ||¬«      E d{  –—†  Œ yd}t        ||¬«      }|dk(  rt        j                  «       }dt        «       v rdnd	}|€J ‚t        || j                  «       || j                  ¬
«      }	|	j                  ||¬«      D ]  }|E d{  –—†  Œ y7 Œ�7 Œ	­w)a1  Embed raw data fields in models and return models with vectors

        Requires every input sequences element to contain raw data fields to inference.
        Does not accept ready vectors.

        Args:
            raw_models: Iterable[BaseModel] - models which contain fields with raw data to inference
            batch_size: int - batch size for inference
            parallel: int - number of parallel processes to use. Defaults to None.

        Returns:
            Iterable[Union[dict[str, BaseModel], BaseModel]]: models with embedded fields
        FTNr%   r+   )Úsizer   Ú
forkserverÚspawn)Únum_workersÚworkerÚstart_methodÚmax_internal_batch_size)r   )rA   r   rH   rI   r-   Úlenr   r.   ÚosÚ	cpu_countr   r   Ú_get_worker_classÚMAX_INTERNAL_BATCH_SIZEÚordered_map)
r   rE   r   rL   Úis_smallr0   Úmultiprocessing_batch_sizeÚraw_models_batchesrS   Úpools
             r    Úembed_models_strictz!ModelEmbedder.embed_models_strictU   s&  è ø€ ð& ×2Ò2Ü×*Ñ*Ô,àˆä�j¤$Ô'Ü�:‹ Ò+Ø�àÐ˜x¨1š}±Ü# J°
Ó;ò [�Ø×2Ñ2°5ÈzÐ2ÓZ×ZÑZñ[ð *+Ð&ä!+¨JÐ=WÔ!XÐØ˜1Š}ÜŸ<™<›>�à+7Ô;PÓ;RÑ+R™<ÐX_ˆLØÐ'Ð'Ð'Ü%Ø$Ø×-Ñ-Ó/Ø)Ø(,×(DÑ(Dô	ˆDð ×)Ñ)Ø"Ð/Ið *ó ò !�ð !× Ñ ñ!ð# [øð( !ús%   ‚A1DÁ3DÁ4BDÃ9DÃ:DÄDr,   c              #   óè   ‡ ‡‡K  — ‰ j                   st        j                  «        |D ]  }‰ j                  |‰d¬«       Œ ‰ j                  s|E d{  –—†  yˆˆˆ fd„|D «       E d{  –—†  y7 Œ7 Œ­w)af  Embed a batch of models with raw data fields and return models with vectors

            If any of model fields required inference, a deepcopy of a model with computed embeddings is returned,
            otherwise returns original models.
        Args:
            raw_models: list[Union[dict[str, BaseModel], BaseModel]] - models which can contain fields with raw data
            is_query: bool - flag to determine which embed method to use. Defaults to False.
            inference_batch_size: int - batch size for inference
        Returns:
            Iterable[BaseModel]: models with embedded fields
        T)rF   ÚaccumulatingNc              3   óH   •K  — | ]  }‰j                  |‰d ‰¬«      –— Œ y­w)F©rF   ra   r,   N)Ú_process_model)Ú.0Ú	raw_modelr,   rF   r   s     €€€r    ú	<genexpr>z3ModelEmbedder.embed_models_batch.<locals>.<genexpr>£   s7   øè ø€ ò ð ð ×#Ñ#ØØ%Ø!&Ø)=ð	 $÷ ñùs   ƒ")rA   r   rH   rd   r>   )r   rE   rF   r,   rf   s   ` `` r    r.   z ModelEmbedder.embed_models_batch‰   s|   úè ø€ ð" ×2Ò2Ü×*Ñ*Ô,à#ò 	QˆIØ×Ñ 	°HÈ4ÐÕPð	Qð ×&Ò&Ø!×!Ñ!õð ",ô÷ ñ ð "øðús$   …AA2ÁA.ÁA2Á(A0Á)A2Á0A2ÚmodelÚpathsra   c           
      ó¬  — t        |t        t        «      «      r1|r| j                  |«       n|€J d«       ‚| j	                  |||¬«      S |€|st        |«      n|}t        |t        «      rJ|j                  «       D ]5  \  }}|r| j                  ||d¬«       Œ| j                  |||d|¬«      ||<   Œ7 |S |�|n| j                  j                  |«      }|D ]õ  }t        |t        «      s|gn|}	|	D ]Ù  }
t        |
|j                  d«      }|€Œ|j                  r!| j                  ||j                  |||¬«       ŒJt        |t        «      }|r|n|g}|s_|€J d«       ‚|D �cg c]  }| j	                  |||¬«      ‘Œ }}|rt        |
|j                  |«       Œ§t        |
|j                  |d   «       ŒÂ|D ]  }| j                  |«       Œ ŒÛ Œ÷ |S c c}w )	ab  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.
            accumulating: Flag to determine if we are accumulating models for batch embedding. Defaults to False.
            inference_batch_size: Optional[int] - batch size for inference

        Returns:
            A deepcopy of the method with embedded fields
        Nz3inference_batch_size should be passed for inference©rF   r,   T)ra   Frc   r   )rI   r	   r   Ú_accumulateÚ_drain_accumulatorr   Údictr)   rd   r@   Úinspectr-   ÚgetattrÚcurrentÚtailÚsetattr)r   rh   ri   rF   ra   r,   ÚkeyÚvalueÚpathÚ
list_modelÚitemÚcurrent_modelÚwas_listÚdataÚ
embeddingss                  r    rd   zModelEmbedder._process_model­   s3  € ô6 �eœXÔ&<Ó=Ô>ÙØ× Ñ  Õ'ð )Ð4ðIàHóIØ4à×.Ñ.ØØ%Ø)=ð /ó ð ð ˆ=Ù+7”H˜U”O¸UˆEä�eœTÔ"Ø#Ÿk™k›mò 
‘
��UÙØ×'Ñ'¨¨uÀ4Ð'ÕHà!%×!4Ñ!4ØØØ!)Ø%*Ø-Að "5ó "�E˜#’Jð	
ð ˆLàÐ*‘°×0EÑ0E×0MÑ0MÈeÓ0Tˆàò "	3ˆDÜ(2°5¼$Ô(?˜%™ÀUˆJØ"ò  3�Ü '¨¨d¯l©l¸DÓ A�Ø Ð(ØØ—9’9Ø×'Ñ'Ø%ØŸ	™	Ø!)Ø%1Ø-Að (õ ô  *¨-¼Ó>�HÙ5=¡MÀMÀ?�Má'à0Ð<ðQàPóQØ<ð )6ö	&ð !%ð !×3Ñ3Ø $¨xÐNbð 4õ ð&˜
ð &ñ $Ü# D¨$¯,©,¸
ÕCä# D¨$¯,©,¸
À1¹ÕFà$1ò 3˜DØ ×,Ñ,¨TÕ2ñ3ñ? 3ð"	3ðF ˆùò&s   Å!Gr{   c                 ó   — t        |t        «      r'|j                  «       D ]  }| j                  |«       Œ yt        |t        «      r3|D ].  }t        |t        t        «      «      s y| j                  |«       Œ0 t        |t        t        «      «      sy| j                  |«      }|j                  | j                  vrg | j                  |j                  <   | j                  |j                     j                  |«       y)aH  Add data to batch accumulator

        Args:
            data: models.VectorStruct - any vector struct data, if inference object types instances in `data` - add them
                to the accumulator, otherwise - do nothing. `InferenceObject` instances are converted to proper types.

        Returns:
            None
        N)rI   rn   Úvaluesrl   r-   r	   r   Ú_resolve_inference_objectrh   r>   Úappend)r   r{   ru   s      r    rl   zModelEmbedder._accumulate  sÙ   € ô �dœDÔ!ØŸ™›ò (�Ø× Ñ  Õ'ð(àä�dœDÔ!Øò (�Ü! %¬Ô2HÓ)IÔJÙØ× Ñ  Õ'ð(ô
 ˜$¤Ô)?Ó @ÔAØà×-Ñ-¨dÓ3ˆØ�:‰:˜T×4Ñ4Ñ4Ø24ˆD×#Ñ# D§J¡JÑ/Ø×Ñ §
¡
Ñ+×2Ñ2°4Ô8Ør"   c                 ó,  — t        |t        «      r1|j                  «       D ]  \  }}| j                  |||¬«      ||<   Œ |S t        |t        «      rIt        |«      D ]9  \  }}t        |t        t        «      «      s|c S | j                  |||¬«      ||<   Œ; |S t        |t        t        «      «      s|S | j                  r&| j                  j                  |j                  d«      s| j                  ||¬«       | j                  |j                  «      S )at  Drain accumulator and replaces inference objects with computed embeddings
            It is assumed objects are traversed in the same order as they were added to the accumulator

        Args:
            data: models.VectorStruct - any vector struct data, if inference object types instances in `data` - replace
                them with computed embeddings. If embeddings haven't yet been computed - compute them and then replace
                inference objects.
            inference_batch_size: int - batch size for inference

        Returns:
            NumericVectorStruct: data with replaced inference objects
        rk   N)rI   rn   r)   rm   r-   Ú	enumerater	   r   r?   Úgetrh   Ú_embed_accumulatorÚ_next_embed)r   r{   rF   r,   rt   ru   Úis          r    rm   z ModelEmbedder._drain_accumulator+  s  € ô �dœDÔ!Ø"Ÿj™j›lò ‘
��UØ ×3Ñ3Ø HÐCWð 4ó ��S’	ðð ˆKä�dœDÔ!Ü% d›Oò ‘��5Ü! %¬Ô2HÓ)IÔJØ’Kà×1Ñ1Ø HÐCWð 2ó ��Q’ð	ð ˆKäØ”(Ô1Ó2ô
ð ˆKà×"Ò"¨$×*=Ñ*=×*AÑ*AÀ$Ç*Á*ÈdÔ*SØ×#Ñ#¨XÐL`Ð#Ôaà×Ñ §
¡
Ó+Ð+r"   c           
      ó’  ‡ ‡— dt         t           dt        dt        dt         t           t         t
        j                     z  fˆˆ fd„}‰ j                  D ]�  }t        ‰ j                  j                  |«      ‰ j                  j                  |«      ‰ j                  j                  |«      ‰ j                  j                  |«      ‰ j                  j                  |«      f«      rŒ‘t        |› d�«      ‚ ‰ j                  j!                  «       D ]  \  }} ||||¬«      ‰ j"                  |<   Œ ‰ j                  j%                  «        y)	a  Embed all accumulated objects for all models

        Args:
            is_query: bool - flag to determine which embed method to use. Defaults to False.
            inference_batch_size: int - batch size for inference
        Returns:
            None
        ÚobjectsÚ
model_namer   r#   c                 óº  •— g }g }g }t        t        «      }t        | «      D ]û  \  }}t        |t        j
                  «      }	t        t        ||«      «      D ]_  \  }
\  }}||j                  k(  sŒ|	|k(  sŒ||
   j                  |«       ||
   j                  |	r|j                  n|j                  «        Œ– |g|t        |«      <   |j                  |j                  «       |j                  |	«       |j                  |	r|j                  n|j                  g«       Œý g }t        t        ||«      «      D ]X  \  }\  }}	|j                  ‰j                  j                  ||	r||   nd|	s||   nd‰|xs i |¬«      D �cg c]  }|‘Œ c}«       ŒZ t        |«      }g gt        | «      z  }|j!                  «       D ]  }|D ]  }t#        |«      ||<   Œ Œ |S c c}w )a,  
            Assemble batches by options and data type based groups, embeds and return embeddings in the original order.
            If models.Document model is bm25 and Qdrant version is 1.15.3 or higher, return the document without changes
            to be processed by Qdrant itself.
            N)r‰   ÚtextsÚimagesrF   Úoptionsr   )r   r-   r‚   rI   r   ÚDocumentÚzipr�   r€   ÚtextÚimagerU   ÚextendrD   ÚembedÚiterr~   Únext)rˆ   r‰   r   Úunique_optionsÚunique_options_is_textÚbatchesÚgroup_indicesr†   ÚobjÚis_textÚjr�   Úoptions_is_textr|   Ú	embeddingÚiter_embeddingsÚordered_embeddingsÚindicesÚindexrF   r   s                      €€r    r“   z/ModelEmbedder._embed_accumulator.<locals>.embed_  sý  ø€ ð 46ˆNØ13Ð"à!#ˆGÜ2=¼dÓ2CˆMÜ# GÓ,ò I‘��3Ü$ S¬&¯/©/Ó:�Ü5>Ü˜Ð(>Ó?ó6ò IÑ1�AÑ1˜ ð  #§+¡+Ó-°'¸_Ó2LØ% aÑ(×/Ñ/°Ô2Ø ™
×)Ñ)±g¨#¯(ª(À3Ç9Á9ÔMÙðIð ;<¸�M¤# nÓ"5Ñ6Ø"×)Ñ)¨#¯+©+Ô6Ø*×1Ñ1°'Ô:Ø—N‘N± C§H¢H¸S¿Y¹YÐ#GÕHðIð  ˆJÜ)2´3°~ÐG]Ó3^Ó)_ò Ñ%�Ñ%�G˜WØ×!Ñ!ð *.¯©×)<Ñ)<Ø'1Ù07 '¨!¢*¸TÙ5< 7¨1¢:À$Ø%-Ø$+¢M¨rØ'1ð *=ó *ö
à%ò "ò
õðô # :Ó.ˆOØ=?¸DÄ3ÀwÃ<Ñ<OÐØ(×/Ñ/Ó1ò F�Ø$ò F�EÜ04°_Ó0EÐ& uÒ-ñFðFð &Ð%ùò%
s   Æ 	G
z� is not found among supported models.Check if `cloud_inference` is set to True or `fastembed` is installed (for local inference)?)rˆ   r‰   r   N)r-   r   Ústrr5   r   r   rŽ   r>   ÚanyrD   Úis_supported_text_modelÚis_supported_sparse_modelÚ(is_supported_late_interaction_text_modelÚis_supported_image_modelÚ.is_supported_late_interaction_multimodal_modelÚ
ValueErrorr)   r?   Úclear)r   rF   r,   r“   rh   r{   s   ``    r    r„   z ModelEmbedder._embed_accumulatorU  s6  ù€ ð2	&ÜÔ0Ñ1ð2	&Ü?Bð2	&ÜPSð2	&ä”-Ñ ¤4¬¯©Ñ#8Ñ8ö2	&ðh ×,Ñ,ò 	ˆEÜà—M‘M×9Ñ9¸%Ó@Ø—M‘M×;Ñ;¸EÓBØ—M‘M×JÑJÈ5ÓQØ—M‘M×:Ñ:¸5ÓAØ—M‘M×PÑPÐQVÓWðõô !Ø�gð sð tóð ð	ð  ×2Ñ2×8Ñ8Ó:ò 	‰KˆE�4Ù).Ø¨Ð;Oô*ˆD×Ñ Ò&ð	ð 	×Ñ×%Ñ%Õ'r"   r‰   c                 ó>   — | j                   |   j                  d«      S )zïGet next computed embedding from embedded batch

        Args:
            model_name: str - retrieve embedding from the storage by this model name

        Returns:
            NumericVector | models.Document : computed embedding
        r   )r?   Úpop)r   r‰   s     r    r…   zModelEmbedder._next_embed¨  s    € ð ×"Ñ" :Ñ.×2Ñ2°1Ó5Ð5r"   c                 ó8  — t        |t        j                  «      s|S |j                  }|j                  }|j
                  }t        | j                  j                  |«      | j                  j                  |«      | j                  j                  |«      f«      rt        j                  |||¬«      S | j                  j                  |«      rt        j                  |||¬«      S | j                  j                  |«      rt        |› d�«      ‚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
        )rh   r�   r�   )rh   r‘   r�   z- does not support `InferenceObject` interfacez is not among supported models)rI   r   ÚInferenceObjectrh   Úobjectr�   r¤   rD   r¥   r¦   r§   rŽ   r¨   ÚImager©   rª   )r   r{   r‰   ru   r�   s        r    r   z'ModelEmbedder._resolve_inference_object³  sé   € ô ˜$¤× 6Ñ 6Ô7ØˆKà—Z‘Zˆ
Ø—‘ˆØ—,‘,ˆÜà—‘×5Ñ5°jÓAØ—‘×7Ñ7¸
ÓCØ—‘×FÑFÀzÓRðô
ô —?‘?¨¸%ÈÔQÐQØ�=‰=×1Ñ1°*Ô=Ü—<‘< j¸ÀwÔOÐOØ�=‰=×GÑGÈ
ÔSÜ 
˜|Ð+XÐYÓZÐZä˜J˜<Ð'EÐFÓGÐGr"   c                 ó   — t         S )N)r   )r'   s    r    rX   zModelEmbedder._get_worker_classÓ  s   € ä"Ð"r"   )NF)Fé   )r³   N)NFFN)r³   )!r2   r3   r4   rY   r   Úboolr   r!   r
   r   r5   rK   rn   r£   r_   r-   r.   r   r   r   rŽ   rd   ÚVectorStructrl   r   rm   r„   r…   r   r6   r   r   rX   r   r"   r    r   r   *   s¦  „ Ø Ðð ,0Ø#ñ^à! DÑ(ð^ð ð^ð ó	^ð  Øñ	à ¨Ñ 3Ñ3ðð ðð ð	ð
 
�)Ñ	óð< Ø#ñ	2!à˜T # y .Ñ1°IÑ=Ñ>ð2!ð ð2!ð ˜‘*ð	2!ð
 
�$�s˜I�~Ñ&¨Ñ2Ñ	3ó2!ðn Ø$%ñ	"à˜˜c 9˜nÑ-°	Ñ9Ñ:ð"ð ð"ð "ð	"ð
 
�)Ñ	ó"ðN )-ØØ"Ø+/ñ^à�C˜�NÑ# iÑ/ð^ð �I‰ Ñ%ð^ð ð	^ð
 ð^ð " D™jð^ð 	ˆS�)ˆ^ÑØ
ˆs�MÐ!Ñ
"ñ	#à
ñ	ð ñ	ð �/‰/ñ		ó^ð@ × 3Ñ 3ð ¸ó ð> VWñ(,Ø×'Ñ'ð(,Ø37ð(,ØORð(,à	˜vŸ™Ñ	.ó(,ñTQ(¨4ð Q(Èsð Q(Ð[_ó Q(ðf	6 cð 	6¨m¸f¿o¹oÑ.Mó 	6ðH¨f×.AÑ.Að HÀf×FYÑFYó Hð@ ð# $Ð':Ñ";ò #ó ñ#r"   r   )&rV   Úcollectionsr   Úcopyr   Úmultiprocessingr   Útypingr   r   r   r	   Úpydanticr
   Úqdrant_client.httpr   Úqdrant_client.embed.commonr   Ú#qdrant_client.embed.embed_inspectorr   Úqdrant_client.embed.embedderr   Úqdrant_client.embed.modelsr   r   Ú!qdrant_client.embed.schema_parserr   Úqdrant_client.embed.utilsr   Úqdrant_client.fastembed_commonr   Ú qdrant_client.parallel_processorr   r   Úqdrant_client.uploader.uploaderr   r   r   r   r"   r    ú<module>rÅ      sP   ðÛ 	Ý #Ý Ý 1ß 0Ó 0å å %Ý =Ý >Ý 1ß IÝ ?Ý /Ý 8ß GÝ 6ô˜&ô ÷*k#ò k#r"   