Ë
    ®ìjŸ9  ã                  ó†  — d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlZddlmZmZ ddlmZ dd	lmZ  ej0                  e«      Zd
ZdZdZdZdZ e	d¬«       G d„ d«      «       Z e	 G d„ d«      «       Z!e	 G d„ d«      «       Z"e	 G d„ d«      «       Z# G d„ d«      Z$ G d„ d«      Z%g d¢Z&y)u¼  ParalelnÃ­ batch zpracovÃ¡nÃ­ pro knowledge plane (FÃ¡ze C1).

Implementuje producer-consumer model s bounded queue, dvouÃºrovÅˆovÃ½m batchingem
(embedding batch size + concurrency), exponenciÃ¡lnÃ­m backoffem s jitterem,
dead-letter queue pro selhanÃ© poloÅ¾ky a batched LanceDB upserty.

Vzory z vÃ½zkumu:
- Producer-consumer bounded queue (index-management.org, AskTable two-level batching)
- Exponential backoff with full jitter (index-management.org)
- Ollama maxQueuedRequests=10 â†’ semaphore pÅ™i 8 soubÄ›Å¾nÃ½ch (ollama/ollama#4124)
- Batch size 32 jako sweet spot (ishwarj.com RAG first principles)
- LlamaIndex IngestionPipeline struktura (transformace â†’ dedup â†’ cache â†’ persist)
- Mem0 concurrent graph+vector operations (ThreadPoolExecutor vzor)

PouÅ¾itÃ­:
    processor = BatchProcessor(embedding_service, vector_store, deduplication_engine)
    results = await processor.process_documents(file_paths, batch_size=32, max_concurrent=8)
é    )ÚannotationsN)Ú	dataclassÚfield)ÚPath)ÚAnyÚCallable)ÚDeduplicationEngineÚDeduplicationResult)ÚEmbeddingService)ÚKnowledgeVectorStoreé   é    é   ç      ð?g      >@T)Úfrozenc                  óD   — e Zd ZU dZded<   ded<   ded<   ded	<   ded
<   y)Ú	BatchItemu0   Jedna poloÅ¾ka ke zpracovÃ¡nÃ­ v batch pipeline.r   ÚpathÚbytesÚcontentÚstrÚ
source_uriÚintÚchunk_indexÚtextN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    úR/home/oem/CyberBrain26-unified/src/cyberbrain26/knowledge_plane/batch_processor.pyr   r   0   s   … á:à
ƒJØƒNØƒOØÓØ
„Ir#   r   c                  ól   — e Zd ZU dZded<   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<   y)ÚBatchResultu'   VÃ½sledek zpracovÃ¡nÃ­ jednÃ© poloÅ¾ky.r   r   ÚboolÚsuccessNz
str | NoneÚdocument_idÚerrorç        ÚfloatÚembedding_time_msÚupsert_time_msFÚcached)
r   r   r   r    r!   r)   r*   r-   r.   r/   r"   r#   r$   r&   r&   ;   sB   … á1à
ƒJØƒMØ"€K�Ó"Ø€Eˆ:ÓØ"Ð�uÓ"Ø€N�EÓØ€FˆDÔr#   r&   c                  ó˜   — e Zd ZU dZ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<   d	Z
d
ed<   d	Zd
ed<   edd„«       Zedd„«       Zy)ÚBatchSummaryu#   CelkovÃ½ souhrn batch zpracovÃ¡nÃ­.r   r   ÚtotalÚ	succeededÚfailedr/   Údead_letteredr+   r,   Útotal_embedding_time_msÚtotal_upsert_time_msc                óT   — | j                   dk(  ry| j                  | j                   z  S ©Nr   r   )r2   r3   ©Úselfs    r$   Úsuccess_ratezBatchSummary.success_rateT   s#   € à�:‰:˜Š?ØØ�~‰~ §
¡
Ñ*Ð*r#   c                óT   — | j                   dk(  ry| j                  | j                   z  S r9   )r2   r/   r:   s    r$   Úcache_hit_ratezBatchSummary.cache_hit_rateZ   s#   € à�:‰:˜Š?ØØ�{‰{˜TŸZ™ZÑ'Ð'r#   N)Úreturnr,   )r   r   r   r    r2   r!   r3   r4   r/   r5   r6   r7   Úpropertyr<   r>   r"   r#   r$   r1   r1   H   sp   … á-à€Eˆ3ƒNØ€IˆsÓØ€FˆCƒOØ€FˆCƒOØ€M�3ÓØ%(Ð˜UÓ(Ø"%Ð˜%Ó%àò+ó ð+ð
 ò(ó ñ(r#   r1   c                  ó:   — e Zd ZU dZded<   ded<   ded<   ded	<   y
)ÚDeadLetterEntryu5   PoloÅ¾ka v dead-letter queue po vyÄ�erpÃ¡nÃ­ pokusÅ¯.r   Úitemr   r*   r   Úattemptsr,   Ú	failed_atNr   r"   r#   r$   rB   rB   a   s   … á?à
ƒOØƒJØƒMØÔr#   rB   c                  ó@   — e Zd ZdZeeef	 	 	 	 	 	 	 dd„Zddd„Zd	d„Z	y)
ÚEmbeddingRetryPolicyu>   ExponenciÃ¡lnÃ­ backoff s plnÃ½m jitterem pro Ollama volÃ¡nÃ­.c                ó.   — || _         || _        || _        y ©N)Úmax_retriesÚ
base_delayÚ	max_delay)r;   rJ   rK   rL   s       r$   Ú__init__zEmbeddingRetryPolicy.__init__n   s   € ð 'ˆÔØ$ˆŒØ"ˆ�r#   Nc                óª   — |�t        || j                  «      S t        | j                  d|z  z  | j                  «      }t        j                  d|«      S )u  VypoÄ�Ã­ta zpoÅ¾dÄ›nÃ­ pro danÃ½ pokus.

        Pokud server vrÃ¡til Retry-After header, pouÅ¾ije se jeho hodnota
        (omezena na max_delay). Jinak exponenciÃ¡lnÃ­ backoff s plnÃ½m jitterem:
        random.uniform(0, min(base_delay * 2^attempt, max_delay)).
        é   r+   )ÚminrL   rK   ÚrandomÚuniform)r;   ÚattemptÚretry_afterÚcappeds       r$   Úcompute_delayz"EmbeddingRetryPolicy.compute_delayx   sI   € ð Ð"Ü�{ D§N¡NÓ3Ð3Ü�T—_‘_¨¨7©
Ñ3°T·^±^ÓDˆÜ�~‰~˜c 6Ó*Ð*r#   c                óü   — || j                   k\  ryt        |t        j                  «      r|j                  j
                  dv S t        |t        j                  t        j                  t        j                  f«      ryy)u%   Rozhodne, zda mÃ¡ smysl zkusit retry.F)i­  iô  iö  i÷  iø  T)	rJ   Ú
isinstanceÚhttpxÚHTTPStatusErrorÚresponseÚstatus_codeÚConnectErrorÚReadTimeoutÚConnectTimeout)r;   rS   Úexcs      r$   Úshould_retryz!EmbeddingRetryPolicy.should_retry„   sb   € à�d×&Ñ&Ò&Øä�cœ5×0Ñ0Ô1Ø—<‘<×+Ñ+Ð/HÐHÐHä�cœE×.Ñ.´×0AÑ0AÄ5×CWÑCWÐXÔYØØr#   )rJ   r   rK   r,   rL   r,   r?   ÚNonerI   )rS   r   rT   zfloat | Noner?   r,   )rS   r   r`   ÚBaseExceptionr?   r'   )
r   r   r   r    ÚDEFAULT_MAX_RETRIESÚDEFAULT_BASE_DELAYÚDEFAULT_MAX_DELAYrM   rV   ra   r"   r#   r$   rG   rG   k   sE   „ ÙHð /Ø.Ø,ð	#àð#ð ð#ð ð	#ð
 
ó#ô
+ô
r#   rG   c                  ó°   — e Zd ZdZ	 	 deedddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zddœ	 	 	 	 	 dd„Z	 	 	 	 	 	 dd	„Z	 	 	 	 dd
„Z	e
dd„«       Ze
dd„«       Zdd„Zy)ÚBatchProcessoru  ParalelnÃ­ batch zpracovÃ¡nÃ­ dokumentÅ¯ pro knowledge plane.

    Producer-consumer model s bounded queue poskytuje backpressure pÅ™i velkÃ½ch
    korpusech. DvouÃºrovÅˆovÃ½ batching: batch_size textÅ¯ na jedno Ollama volÃ¡nÃ­,
    max_concurrent soubÄ›Å¾nÃ½ch batchÅ¯ (semaphore).
    NT)Úmax_concurrentÚ
batch_sizeÚretry_policyÚenable_cachec               óì   — || _         || _        || _        || _        || _        |xs
 t        «       | _        || _        i | _        g | _	        t        «       | _        t        j                  |«      | _        y rI   )Úembedding_serviceÚvector_storeÚdeduplication_engineri   rj   rG   rk   rl   Ú_embedding_cacheÚ_dead_letter_queuer1   Ú_summaryÚasyncioÚ	SemaphoreÚ
_semaphore)r;   rn   ro   rp   ri   rj   rk   rl   s           r$   rM   zBatchProcessor.__init__™   so   € ð "3ˆÔØ(ˆÔØ$8ˆÔ!Ø,ˆÔØ$ˆŒØ(ÒBÔ,@Ó,BˆÔØ(ˆÔØ8:ˆÔØ9;ˆÔÜ$›ˆŒÜ!×+Ñ+¨NÓ;ˆ�r#   Úlocal)Ú	source_idc          
   ƒ  óà  ‡ ‡‡K  — t        «       ‰ _        g ‰ _        g Š|D ]�  }	 |j                  «       }|j	                  dd¬«      }t        j                  |«      j                  «       }‰j                  t        ||t        |«      d|¬«      «       ‰ j                  xj                  dz  c_        Œ’ ‰s‰ j                  S ‰ j                  �Òg }‰ j                  j!                  ‰D �	cg c]  }	|	j"                  |	j$                  f‘Œ c}	|«      }
|
D ��ci c]  \  }}||“Œ
 }}}t'        ‰«      D ��	cg c]0  \  }}	|j)                  |t+        d	¬
«      «      j,                  dk7  r|	‘Œ2 c}	}Št        j/                  dt1        ‰«      ‰ j                  j                  «       t3        j4                  ‰ j6                  dz  ¬«      Šdˆˆˆ fd„}dˆˆ fd„}t3        j8                   |«       gt;        ‰ j6                  «      D �cg c]
  } ||«      ‘Œ c}¢­Ž ƒ d{  –—†  t        j/                  d‰ j                  j<                  ‰ j                  j                  ‰ j                  j>                  ‰ j                  j@                  ‰ j                  jB                  dz  «       ‰ j                  S # t        $ r"}t        j                  d||«       Y d}~�Œ®d}~ww xY wc c}	w c c}}w c c}	}w c c}w 7 ŒÕ­w)uG  Zpracuje seznam souborÅ¯ v paralelnÃ­m batch pipeline.

        Postup:
        1. Producer Ä�te soubory a rozdÄ›lÃ­ na chunky â†’ fronta
        2. Consumeryâ€™embedu chunky (batch_size textÅ¯ / volÃ¡nÃ­) â†’ vektorovÃ½ store
        3. Dead-letter queue pro poloÅ¾ky po vyÄ�erpÃ¡nÃ­ retry
        4. Souhrn statistik
        zutf-8Úreplace)Úerrorsr   )r   r   r   r   r   é   u   Nelze pÅ™eÄ�Ã­st soubor %s: %sNF)Úis_duplicateÚskipu'   Po deduplikaci zbÃ½vÃ¡ %d z %d poloÅ¾ekrO   )Úmaxsizec               “  ó¼   •K  — ‰D ]  } ‰j                  | «      ƒ d {  –—†  Œ t        ‰j                  «      D ]  }‰j                  d «      ƒ d {  –—†  Œ y 7 Œ:7 Œ	­wrI   )ÚputÚrangeri   )rC   Ú_ÚitemsÚqueuer;   s     €€€r$   Úproducerz2BatchProcessor.process_documents.<locals>.producerô   s_   øè ø€ Øò &�Ø—i‘i “o×%Ñ%ð&ô ˜4×.Ñ.Ó/ò &�Ø—i‘i “o×%Ñ%ñ&ð &øð &ús!   ƒA�Až2AÁAÁAÁAc              “  óˆ  •K  — 	 ‰j                  «       ƒ d {  –—† }|€‰j                  «        y 	 ‰j                  || «      ƒ d {  –—† }|j                  rK‰j                  xj
                  dz  c_        |j                  r?‰j                  xj                  dz  c_        n‰j                  xj                  dz  c_        ‰j                  «        ŒÍ7 Œ¹7 Œ�# t        $ rK}t        j                  d| |j                  |«       ‰j                  xj                  dz  c_        Y d }~Œdd }~ww xY w# ‰j                  «        w xY w­w)Nr|   u(   Worker %d chyba pÅ™i zpracovÃ¡nÃ­ %s: %s)ÚgetÚ	task_doneÚ_process_single_itemr(   rs   r3   r/   r4   Ú	ExceptionÚloggerr*   r   )Ú	worker_idrC   Úresultr`   r…   r;   s       €€r$   Úconsumerz2BatchProcessor.process_documents.<locals>.consumerû   sý   øè ø€ ØØ"ŸY™Y›[×(�Ø�<Ø—O‘OÔ%Øð&Ø#'×#<Ñ#<¸TÀ9Ó#M×M�FØ—~’~ØŸ™×/Ò/°1Ñ4Õ/Ø!Ÿ=š=Ø ŸM™M×0Ò0°AÑ5Ö0àŸ™×,Ò,°Ñ1Õ,ð
 —O‘OÔ%ð# Ø(øð
 Nùô !ò .Ü—L‘LÐ!KÈYÐX\×XaÑXaÐcfÔgØ—M‘M×(Ò(¨AÑ-×(Ò(ûð.ûð —O‘OÕ%üsX   ƒE˜C™E±C ÁCÁA:C ÃEÃC Ã	D*ÃAD%Ä D- Ä%D*Ä*D- Ä-D?Ä?EuX   Batch dokonÄ�eno: %d/%d ÃºspÄ›Å¡nÃ©, %d selhalo, %d dead-lettered, cache hit rate %.1f%%éd   )r?   rb   )r�   r   r?   rb   )"r1   rs   rr   Ú
read_bytesÚdecodeÚhashlibÚsha256Ú	hexdigestÚappendr   r   r2   r‹   rŒ   Úwarningrp   Údeduplicate_batchr   r   Ú	enumeraterˆ   r
   Úrecommended_actionÚinfoÚlenrt   ÚQueueri   Úgatherr‚   r3   r4   r5   r>   )r;   Ú
file_pathsrx   r   r   r   r”   r`   Úexisting_docsrC   Údedup_resultsÚidxrŽ   Ú	dedup_mapr†   r�   Úir„   r…   s   `                @@r$   Úprocess_documentsz BatchProcessor.process_documents´   s˜  úè ø€ ô %›ˆŒØ"$ˆÔð "$ˆØò 	LˆDðLØŸ/™/Ó+�Ø—~‘~ g°i�~Ó@�Ü Ÿ™¨Ó0×:Ñ:Ó<�à—‘ÜØ!Ø 'Ü#& t£9Ø$%Ø!ôôð —‘×#Ò# qÑ(Ö#ð	Lñ& Ø—=‘=Ð ð ×$Ñ$Ð0Ø')ˆMØ ×5Ñ5×GÑGØ=BÖC°T�$—,‘, §¡Ò0ÒCØóˆMð IV×(V¹¸¸f¨¨f©Ð(VˆIÑ(Vô "+¨5Ó!1÷á�C˜Ø—=‘= Ô&9ÀuÔ&MÓN×aÑaØòò óˆEô �K‰KØ9¼3¸u»:ÀtÇ}Á}×GZÑGZôô
 29·±Ø×'Ñ'¨!Ñ+ô2
ˆ÷	&ö	&ô* �n‰nÙ‹Jð
ä#(¨×)<Ñ)<Ó#=Ö>˜a‰h�q�kÒ>ò
÷ 	
ð 	
ô
 	�‰ð$à�M‰M×#Ñ#Ø�M‰M×ÑØ�M‰M× Ñ Ø�M‰M×'Ñ'Ø�M‰M×(Ñ(¨3Ñ.ô	
ð �}‰}ÐøôO ò LÜ—‘Ð?ÀÀs×KÒKûðLüò Dùó )WùóùòZ ?ð	
úsm   …K.¤BJ(Â17K.Ã(KÄK.ÄKÄ!K.Ä25K!Å'BK.Ç>K'
È	K.ÈK,ÈBK.Ê(	KÊ1KËK.ËKËK.c           
   ƒ  ó  K  — t        j                  «       }t        j                  |j                  «      j                  «       }|› d| j                  j                  j                  › �}d}| j                  r?|| j                  v r1| j                  |   }| j                  xj                  dz  c_        d}nC| j                  |j                  «      ƒ d{  –—† \  }}| j                  r|�|| j                  |<   d}d}	| j                  ��&|��#ddlm}
  |
t        j                  |j$                  › d|j&                  › �j)                  «       «      j                  «       ||j                  |j*                  t-        |j$                  «      |j$                  j/                  «       r$|j$                  j1                  «       j2                  nd||j&                  ¬«      }t        j                  «       }| j                  j5                  |g«       t        j                  «       |z
  d	z  }|j6                  }	t        j                  «       |z
  |d	z  z
  d	z  }t9        |j$                  d
|	||| j                  xr || j                  v ¬«      S 7 �Œ±­w)u<   Zpracuje jednu poloÅ¾ku: embed â†’ upsert (s retry a cache).ú:Nr|   r+   Ú r   )ÚVectorDocument)ÚidÚvectorr   rx   r   Úmtimer”   r   ç     @�@T)r   r(   r)   r-   r.   r/   )ÚtimeÚ	monotonicr“   r”   r   r•   rn   ÚconfigÚmodelrl   rq   rs   r/   Ú_embed_with_retryr   ro   Ú)cyberbrain26.knowledge_plane.vector_storer©   r   r   Úencoder   r   ÚexistsÚstatÚst_mtimeÚadd_documentsrª   r&   )r;   rC   r�   ÚstartÚcontent_hashÚ	cache_keyr«   r-   r.   r)   r©   ÚdocÚupsert_starts                r$   rŠ   z#BatchProcessor._process_single_item   s(  è ø€ ô —‘Ó ˆô —~‘~ d§l¡lÓ3×=Ñ=Ó?ˆØ#�n A d×&<Ñ&<×&CÑ&C×&IÑ&IÐ%JÐKˆ	ð &*ˆØ×Ò ¨d×.CÑ.CÑ!CØ×*Ñ*¨9Ñ5ˆFØ�M‰M× Ò  AÑ%Õ Ø #Ñð /3×.DÑ.DÀTÇYÁYÓ.O×(OÑ%ˆFÐ%Ø× Ò  VÐ%7Ø39�×%Ñ% iÑ0ð ˆØˆØ×ÑÑ(¨VÑ-?ÝPá Ü—>‘> T§Y¡Y K¨q°×1AÑ1AÐ0BÐ"C×"JÑ"JÓ"LÓM×WÑWÓYØØ—Y‘YØŸ/™/Ü˜Ÿ™“^Ø37·9±9×3CÑ3CÔ3E�d—i‘i—n‘nÓ&×/Ò/È3Ø#Ø ×,Ñ,ô	ˆCô  Ÿ>™>Ó+ˆLØ×Ñ×+Ñ+¨S¨EÔ2Ü"Ÿn™nÓ.°Ñ=ÀÑGˆNØŸ&™&ˆKä!Ÿ^™^Ó-°Ñ5¸ÈÑ8OÑOÐSYÑYÐäØ—‘ØØ#Ø/Ø)Ø×$Ñ$ÒK¨°d×6KÑ6KÐ)Kô
ð 	
ð7 )Pûs   ‚CJÃJÃF1Jc           	   ƒ  ór  K  — t        j                  «       }d}t        | j                  j                  dz   «      D ]b  }	 | j
                  4 ƒd{  –—†  | j                  j                  |«      }ddd«      ƒd{  –—†  t        j                  «       |z
  dz  }|fc S  t        j                  «       |z
  dz  }t        j                  d| j                  j                  dz   |«       |xs t!        d«      ‚7 Œ§7 Œ~# 1 ƒd{  –—†7  sw Y   ŒŽxY w# t        $ r›}|}| j                  j                  ||«      sY d}~ Œ�| j                  j                  |«      }t        j                  d|dz   | j                  j                  dz   ||«       t        j                  |«      ƒ d{  –—†7   Y d}~�Œtd}~ww xY w­w)u8   Embedding textu s exponenciÃ¡lnÃ­m backoffem a jitterem.Nr|   r­   z2Embedding selhal (pokus %d/%d), retry za %.2fs: %sz#Embedding selhal po %d pokusech: %su!   Embedding selhal neznÃ¡mou chybou)r®   r¯   r‚   rk   rJ   rv   rn   Ú
embed_textr‹   ra   rV   rŒ   r—   rt   Úsleepr*   ÚRuntimeError)	r;   r   r¹   Úlast_excrS   r«   Ú
elapsed_msr`   Údelays	            r$   r²   z BatchProcessor._embed_with_retryV  s�  è ø€ ô —‘Ó ˆØ)-ˆä˜T×.Ñ.×:Ñ:¸QÑ>Ó?ò 	+ˆGð+ØŸ?™?÷ Eñ EØ!×3Ñ3×>Ñ>¸tÓD�F÷E÷ Eä"Ÿn™nÓ.°Ñ6¸&Ñ@�
Ø˜zÐ)Ò)ð	+ô( —n‘nÓ&¨Ñ.°&Ñ8ˆ
Ü�‰Ð:¸D×<MÑ<M×<YÑ<YÐ\]Ñ<]Ð_gÔhàÒKœ,Ð'JÓKÐKð+Eøð Eø÷ E÷ Eñ Eûô ò +Ø�Ø×(Ñ(×5Ñ5°g¸sÔCÝØ×)Ñ)×7Ñ7¸Ó@�Ü—‘ØHØ˜a‘KØ×%Ñ%×1Ñ1°AÑ5ØØôô —m‘m EÓ*×*×*ûð+üs�   ‚<F7¿DÁC7ÁDÁC;Á/DÁ:C9Á;!DÂAF7Ã7DÃ9DÃ;D	ÄDÄD	Ä	DÄ	F4ÄF/Ä7F7Ä=A&F/Æ#F&Æ$F/Æ)F7Æ/F4Æ4F7c                ó   — | j                   S rI   )rs   r:   s    r$   ÚsummaryzBatchProcessor.summaryv  s   € à�}‰}Ðr#   c                ó   — | j                   S rI   )rr   r:   s    r$   Údead_letter_queuez BatchProcessor.dead_letter_queuez  s   € à×&Ñ&Ð&r#   c                ó®  — | j                   j                  | j                   j                  | j                   j                  | j                   j                  | j                   j
                  | j                   j                  | j                   j                  | j                   j                  | j                   j                  | j                  | j                  dœS )u+   VrÃ¡tÃ­ metriky pro monitoring/CLI vÃ½stup.)r2   r3   r4   r/   r5   r<   r>   r6   r7   ri   rj   )rs   r2   r3   r4   r/   r5   r<   r>   r6   r7   ri   rj   r:   s    r$   Úget_metricszBatchProcessor.get_metrics~  s“   € ð —]‘]×(Ñ(ØŸ™×0Ñ0Ø—m‘m×*Ñ*Ø—m‘m×*Ñ*Ø!Ÿ]™]×8Ñ8Ø ŸM™M×6Ñ6Ø"Ÿm™m×:Ñ:Ø'+§}¡}×'LÑ'LØ$(§M¡M×$FÑ$FØ"×1Ñ1ØŸ/™/ñ
ð 	
r#   )NN)rn   r   ro   zKnowledgeVectorStore | Nonerp   zDeduplicationEngine | Noneri   r   rj   r   rk   zEmbeddingRetryPolicy | Nonerl   r'   r?   rb   )rŸ   z
list[Path]rx   r   r?   r1   )rC   r   r�   r   r?   r&   )r   r   r?   z tuple[list[float] | None, float])r?   r1   )r?   zlist[DeadLetterEntry])r?   zdict[str, Any])r   r   r   r    ÚDEFAULT_MAX_CONCURRENTÚDEFAULT_BATCH_SIZErM   r¥   rŠ   r²   r@   rÆ   rÈ   rÊ   r"   r#   r$   rh   rh   ‘   s  „ ñð 59Ø;?ð	<ð 5Ø,Ø48Ø!ñ<à+ð<ð 2ð<ð 9ð	<ð ð<ð ð<ð 2ð<ð ð<ð 
ó<ð> !ñ	jàðjð ð	jð
 
ójðX4
Øð4
Ø*-ð4
à	ó4
ðlLØðLà	)óLð@ òó ðð ò'ó ð'ô
r#   rh   )rh   r&   r1   rB   rG   rË   rÌ   )'r    Ú
__future__r   rt   r“   ÚloggingrQ   r®   Údataclassesr   r   Úpathlibr   Útypingr   r   rY   Ú*cyberbrain26.knowledge_plane.deduplicationr	   r
   Ú.cyberbrain26.knowledge_plane.embedding_servicer   r³   r   Ú	getLoggerr   rŒ   rË   rÌ   rd   re   rf   r   r&   r1   rB   rG   rh   Ú__all__r"   r#   r$   ú<module>rÖ      sí   ðñõ& #ã Û Û Û Û ß (Ý ß  ã ç _Ý KÝ Jà	ˆ×	Ñ	˜8Ó	$€ð Ð ØÐ ØÐ ØÐ ØÐ ñ �$Ô÷ð ó ðð ÷	ð 	ó ð	ð ÷(ð (ó ð(ð0 ÷ð ó ð÷#ñ #÷L{
ñ {
ò|�r#   