Ë
    lQêjUO  ã                   ót  — d Z ddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZ dd	lmZ  e«       gZd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Zd
e
ddfd„Z d
e
ddfd„Z!d
e
ddfd„Z"d
e
ddfd„Z#d
e
ddfd„Z$y)z‘
Integration test for Chroma's Task API

Tests the task creation, execution, and removal functionality
for automatically processing collections.
é    N)ÚClient)ÚRECORD_COUNTER_FUNCTIONÚSTATISTICS_FUNCTIONÚFunction)ÚSystem)ÚChromaErrorÚNotFoundError)Úskip_if_not_cluster)Úget_collection_versionÚwait_for_version_increase)ÚsleepÚbasic_http_clientÚreturnc                 ó˜  — t        j                  | «      }|j                  «        |j                  dddi¬«      }|j	                  dt
        dd¬«      \  }}|€J ‚|d	u sJ ‚t        ||j                  «      }|j                  t        d
d«      D �cg c]  }dj                  |«      ‘Œ c}dgdz  ¬«       |j                  «       dk(  sJ ‚t        ||j                  |«       t        d«       |j                  d«      j                  d«      }|d   €J ‚|d   d
   d   dk(  sJ ‚|j!                  |j                  d	¬«      }|d	u sJ ‚yc c}w )úFTest creating and removing a function with the record_counter operatorÚmy_documentÚdescriptionú$Sample documents for task processing©ÚnameÚmetadataÚcount_my_docsÚmy_documents_countsN©r   ÚfunctionÚoutput_collectionÚparamsTr   é,  údoc_{}útest document©ÚidsÚ	documentsé<   Úfunction_outputÚ	metadatasÚtotal_count©Údelete_output_collection©ÚClientCreatorÚfrom_systemÚresetÚget_or_create_collectionÚattach_functionr   r   r   ÚaddÚrangeÚformatÚcountr   r   Úget_collectionÚgetÚdetach_function©	r   ÚclientÚ
collectionÚattached_fnÚcreatedÚinitial_versionÚiÚresultÚsuccesss	            úl/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/chromadb/test/distributed/test_task_api.pyÚ%test_count_function_attach_and_detachrA      s}  € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×0Ñ0ØØÐ!GÐHð 1ó €Jð &×5Ñ5ØÜ(Ø/Øð	 6ó Ñ€K�ð Ð"Ð"Ð"Ø�d‰?Ðˆ?Ü,¨V°Z·_±_ÓE€Oð ‡N�NÜ).¨q°#«Ö7 AˆX�_‰_˜QÕÒ7Ø"Ð# cÑ)ð ô ð ×ÑÓ Ò$Ð$Ð$ä˜f j§o¡o°ÔGä	ˆ"„Ià×"Ñ"Ð#8Ó9×=Ñ=Ð>OÓP€FØ�+ÑÐ*Ð*Ð*Ø�+Ñ˜qÑ! -Ñ0°CÒ7Ð7Ð7ð ×(Ñ(Ø×ÑØ!%ð )ó €Gð �d‰?Ð‰?ùò- 8s   ÂEc                 óB  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       t        j                  t        d¬«      5  |j                  t        j                  dd	d
¬«       d
d
d
«       y
# 1 sw Y   y
xY w)zBTest that creating a task with an invalid function raises an errorÚtest_invalid_function©r   Úid1r    r!   zfunction not found©ÚmatchÚinvalid_taskr   N©r   r   r   r   )r+   r,   r-   r.   r0   ÚpytestÚraisesr   r/   r   Ú_NONEXISTENT_TEST_ONLY©r   r8   r9   s      r@   Útest_task_with_invalid_functionrN   N   s�   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nà×0Ñ0Ð6MÐ0ÓN€JØ‡N�N˜�w¨?Ð*;€NÔ<ô 
�‰”{Ð*>Ô	?ñ 
Ø×"Ñ"Ü×4Ñ4ØØ1Øð	 	#ô 	
÷
÷ 
ñ 
ús   Á($BÂBc                 óŽ  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  t        ddd¬	«      \  }}|d
u sJ ‚|j                  dk(  sJ ‚|j                  dk(  sJ ‚|j                  d«      }||k(  sJ ‚|j                  |j                  d
¬«       y)z^Test that attach_function and get_attached_function return function_name field instead of UUIDÚtest_function_namerD   rE   Údoc1r!   Ú
my_counterr   NrI   TÚrecord_counterr(   )r+   r,   r-   Úcreate_collectionr0   r/   r   Úfunction_namer   Úget_attached_functionr6   )r   r8   r9   r:   r;   Úretrieved_fns         r@   Ú*test_attach_function_returns_function_namerX   `   sÞ   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nà×)Ñ)Ð/CÐ)ÓD€JØ‡N�N˜�w¨6¨(€NÔ3ð &×5Ñ5Ü(ØØ-Øð	 6ó Ñ€K�ð �d‰?Ðˆ?Ø×$Ñ$Ð(8Ò8Ð8Ð8Ø×Ñ˜|Ò+Ð+Ð+ð ×3Ñ3°LÓA€LØ˜;Ò&Ð&Ð&ð ×Ñ˜{×/Ñ/È$ÐÕOó    c                 óD  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  ddgddg¬«       |j                  t        dd	d
¬«      \  }}|€J ‚|du sJ ‚|j                  d¬«      }|j	                  ddgddg¬«       |j                  t        ddd
¬«      \  }}|€J ‚|du sJ ‚|j                  |j                  k7  sJ ‚|j                  |j                  d¬«      du sJ ‚|j                  |j                  d¬«      du sJ ‚y
)z0Test attaching functions on multiple collectionsÚcollection_1rD   rE   Úid2rQ   Údoc2r!   Útask_1Úoutput_1NrI   TÚcollection_2Úid3Úid4Údoc3Údoc4Útask_2Úoutput_2r(   ©
r+   r,   r-   rT   r0   r/   r   Úidr6   r   )r   r8   Úcollection1Úattached_fn1Úcreated1Úcollection2Úattached_fn2Úcreated2s           r@   Ú"test_function_multiple_collectionsro   }   sp  € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×*Ñ*°Ð*Ó?€KØ‡O�O˜ ˜°6¸6Ð2B€OÔCà(×8Ñ8Ü(ØØ$Øð	 9ó Ñ€L�(ð Ð#Ð#Ð#Ø�tÑÐÐð ×*Ñ*°Ð*Ó?€KØ‡O�O˜ ˜°6¸6Ð2B€OÔCà(×8Ñ8Ü(ØØ$Øð	 9ó Ñ€L�(ð Ð#Ð#Ð#Ø�tÑÐÐð �?‰?˜lŸo™oÒ-Ð-Ð-ð 	×#Ñ# L×$5Ñ$5ÐPTÐ#ÓUØñ	ðð	ð 	×#Ñ# L×$5Ñ$5ÐPTÐ#ÓUØñ	ðñ	rY   c                 ó  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  g d¢g d¢¬«       |j                  t        ddd¬	«      \  }}|€J ‚|d
u sJ ‚t        j                  t        d¬«      5  |j                  t        ddd¬	«       ddd«       t        j                  t        d¬«      5  |j                  t        ddd¬	«       ddd«       |j                  |j                  d
¬«      d
u sJ ‚|j                  t        ddd¬	«      \  }}|€J ‚|d
u sJ ‚|j                  |j                  k7  sJ ‚|j                  |j                  d
¬«      d
u sJ ‚y# 1 sw Y   ŒÊxY w# 1 sw Y   Œ™xY w)z>Test that only one attached function is allowed per collectionÚsingle_task_collectionrD   )rE   r\   ra   )rQ   r]   rc   r!   r^   r_   NrI   Tzmcollection already has an attached function: name=task_1, function=record_counter, output_collection=output_1rF   re   rf   Úoutput_differentr(   )r+   r,   r-   rT   r0   r/   r   rJ   rK   r   r   r6   r   rh   )r   r8   r9   rj   r;   rm   rn   s          r@   Ú3test_functions_one_attached_function_per_collectionrs   ¬   sÑ  € ô ×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×)Ñ)Ð/GÐ)ÓH€JØ‡N�NÒ,Ò8P€NÔQð '×6Ñ6Ü(ØØ$Øð	 7ó Ñ€L�'ð Ð#Ð#Ð#Ø�d‰?Ðˆ?ô 
�‰ÜØ}ô
ñ 	
ð 	×"Ñ"Ü,ØØ(Øð	 	#ô 	
÷		
ô 
�‰ÜØ~ô
ñ 	
ð 	×"Ñ"Ü(ØØ0Øð	 	#ô 	
÷		
ð 	×"Ñ" <×#4Ñ#4ÈtÐ"ÓTØñ	ðð	ð
 (×7Ñ7Ü(ØØ$Øð	 8ó Ñ€L�(ð Ð#Ð#Ð#Ø�tÑÐÐØ�?‰?˜lŸo™oÒ-Ð-Ð-ð 	×"Ñ" <×#4Ñ#4ÈtÐ"ÓTØñ	ðñ	÷W	
ð 	
ú÷	
ð 	
ús   ÂE3ÃE?Å3E<Å?Fc                 ó2  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       t        j                  t        d¬«      5  |j                  dt        d	d
di¬«       ddd«       y# 1 sw Y   yxY w)z?Test that attach_function with non-empty params raises an errorÚtest_invalid_paramsrD   rE   r    r!   z?params must be empty - no functions currently accept parametersrF   Úinvalid_params_taskr   Úsome_keyÚ
some_valuer   N©
r+   r,   r-   rT   r0   rJ   rK   r   r/   r   rM   s      r@   Ú(test_attach_function_with_invalid_paramsrz   ô   s”   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nà×)Ñ)Ð/DÐ)ÓE€JØ‡N�N˜�w¨?Ð*;€NÔ<ô 
�‰ÜØOô
ñ 	
ð 	×"Ñ"Ø&Ü,Ø1Ø Ð-ð	 	#ô 	
÷		
÷ 	
ñ 	
ús   Á(BÂBc                 óR  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  d¬«       t        j                  t        d¬«      5  |j                  d	t        dd
¬«       d
d
d
«       y
# 1 sw Y   y
xY w)zJTest that attach_function fails when output collection name already existsÚinput_collectionrD   rE   r    r!   Úexisting_output_collectionz?Output collection \[existing_output_collection\] already existsrF   Úmy_taskNr   ry   )r   r8   r|   s      r@   Ú5test_attach_function_output_collection_already_existsr   
  s«   € ô ×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×/Ñ/Ð5GÐ/ÓHÐØ×Ñ˜e˜W°Ð0AÐÔBð ×ÑÐ">ÐÔ?ô 
�‰ÜØPô
ñ 	
ð 	×(Ñ(ØÜ,Ø:Øð	 	)ô 	
÷		
÷ 	
ñ 	
ús   Á:BÂB&c                 ó¨  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  t        ddd¬	«      \  }}|j                  |j                  d
¬«       t        j                  t        d¬«      5  |j                  |j                  d
¬«       ddd«       y# 1 sw Y   yxY w)z<Test removing a task that doesn't exist raises NotFoundErrorÚtest_collectionrD   rE   Útestr!   Útest_functionr   NrI   Tr(   zdoes not existrF   )r+   r,   r-   rT   r0   r/   r   r6   r   rJ   rK   r	   )r   r8   r9   r:   Ú_s        r@   Ú test_function_remove_nonexistentr…   %  sÇ   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nà×)Ñ)Ð/@Ð)ÓA€JØ‡N�N˜�w¨6¨(€NÔ3Ø×/Ñ/Ü(ØØ-Øð	 0ó �N€K�ð ×Ñ˜{×/Ñ/È$ÐÔOô 
�‰”}Ð,<Ô	=ñ TØ×"Ñ" ;×#3Ñ#3ÈdÐ"ÔS÷T÷ Tñ Tús   Â!CÃCc                 óŠ  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  dt        dd¬	«      \  }}|j                  d¬«      }t        j                  t        d
¬«      5  |j                  dt        dd¬	«      }ddd«       y# 1 sw Y   yxY w)z<Test that attaching a function to an output collection failsr|   rD   rE   r‚   r!   rƒ   r   Nr   z.cannot attach function to an output collectionrF   Útest_function_2Úoutput_collection_2)r+   r,   r-   rT   r0   r/   r   r4   rJ   rK   r   )r   r8   r|   r„   r   s        r@   Ú&test_attach_to_output_collection_failsr‰   :  sÐ   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×/Ñ/Ð5GÐ/ÓHÐØ×Ñ˜e˜W°°ÐÔ9à×+Ñ+ØÜ(Ø-Øð	 ,ó �D€A€qð ×-Ñ-Ð3FÐ-ÓGÐä	�‰ÜÐKô
ñ 
ð ×-Ñ-Ø"Ü,Ø3Øð	 .ó 
ˆ÷
÷ 
ñ 
ús   ÂB9Â9Cc                 óˆ  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  dt        dd¬	«      \  }}|€J ‚|d
u sJ ‚|j                  d«       t        j                  t        «      5  |j                  d«       ddd«       y# 1 sw Y   yxY w)zKTest that deleting an output collection also detaches the attached functionr|   rD   rE   r‚   r!   Úmy_functionr   Nr   T)r+   r,   r-   rT   r0   r/   r   Údelete_collectionrJ   rK   r	   rV   ©r   r8   r|   r:   r;   s        r@   Ú/test_delete_output_collection_detaches_functionrŽ   V  sÌ   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×/Ñ/Ð5GÐ/ÓHÐØ×Ñ˜e˜W°°ÐÔ9à+×;Ñ;ØÜ(Ø-Øð	 <ó Ñ€K�ð Ð"Ð"Ð"Ø�d‰?Ðˆ?ð ×ÑÐ0Ô1ô 
�‰”}Ó	%ñ >Ø×.Ñ.¨}Ô=÷>÷ >ñ >ús   ÂB8Â8Cc                 ó@  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  dt        dd¬	«      \  }}|€J ‚|d
u sJ ‚|j                  |j                  d¬«       |j                  d«       t        j                  t        «      5  |j                  d«       ddd«       t        j                  t        «      5  |j                  d«       ddd«       y# 1 sw Y   Œ=xY w# 1 sw Y   yxY w)zOTest that deleting an output collection from a recently detached function worksr|   rD   rE   r‚   r!   r‹   r   Nr   TFr(   )r+   r,   r-   rT   r0   r/   r   r6   r   rŒ   rJ   rK   r	   rV   r4   r�   s        r@   Ú&test_delete_orphaned_output_collectionr�   p  s  € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×/Ñ/Ð5GÐ/ÓHÐØ×Ñ˜e˜W°°ÐÔ9à+×;Ñ;ØÜ(Ø-Øð	 <ó Ñ€K�ð Ð"Ð"Ð"Ø�d‰?Ðˆ?à×$Ñ$ [×%5Ñ%5ÐPUÐ$ÔVð ×ÑÐ0Ô1ô 
�‰”}Ó	%ñ >Ø×.Ñ.¨}Ô=÷>ô 
�‰”}Ó	%ñ 3à×ÑÐ1Ô2÷3ð 3÷>ð >ú÷3ð 3ús   Â:DÃ-DÄDÄDc                 ó  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dt
        dd¬«      \  }}|du sJ ‚|€J ‚|j                  d¬«      }t        j                  t        d	¬
«      5  |j	                  dt
        dd¬«      \  }}ddd«       |j                  |j                  d¬«      du sJ ‚|j	                  dt
        dd¬«      \  }}|€J ‚|du sJ ‚y# 1 sw Y   ŒQxY w)r   r   rD   r   r   Nr   TÚmy_document2z8Output collection \[my_documents_counts\] already existsrF   r(   )r+   r,   r-   r.   r/   r   rJ   rK   r   r6   r   )r   r8   r9   r:   r;   rl   r„   s          r@   Ú#test_partial_attach_function_repairr“   �  sS  € ô ×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×0Ñ0Øð 1ó €Jð
 &×5Ñ5ØÜ(Ø/Øð	 6ó Ñ€K�ð �d‰?Ðˆ?ð Ð"Ð"Ð"à×1Ñ1Øð 2ó €Kô 
�‰ÜÐVô
ñ 
ð %×4Ñ4Ø Ü,Ø3Øð	 5ó 
‰ˆ�Q÷
ð 	×"Ñ" ;×#3Ñ#3ÈdÐ"ÓSØñ	ðð	ð
 '×6Ñ6ØÜ(Ø/Øð	 7ó Ñ€K�ð Ð"Ð"Ð"Ø�d‰?Ð‰?÷1
ð 
ús   ÂC8Ã8Dc                 óŠ  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  dt        dd¬	«      \  }}|€J ‚|d
u sJ ‚|j                  d¬«      }|€J ‚d|j                  j                  «       v sJ ‚|j                  |j                  d
¬«       y)z[Test that output collections are created with the source_attached_function_id in the schemar|   rD   rE   r‚   r!   r‹   r   Nr   TÚsource_attached_function_idr(   )r+   r,   r-   rT   r0   r/   r   r4   Ú_modelÚpretty_schemar6   r   )r   r8   r|   r:   r;   r   s         r@   Ú*test_output_collection_created_with_schemar˜   É  sé   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×/Ñ/Ð5GÐ/ÓHÐØ×Ñ˜e˜W°°ÐÔ9à+×;Ñ;ØÜ(Ø-Øð	 <ó Ñ€K�ð Ð"Ð"Ð"Ø�d‰?Ðˆ?ð ×-Ñ-Ð3FÐ-ÓGÐØÐ(Ð(Ð(ð
 )Ð,=×,DÑ,D×,RÑ,RÓ,TÑTÐTÐTð ×$Ñ$ [×%5Ñ%5ÐPTÐ$ÕUrY   c                 ó0  — t        j                  | «      }|j                  «        |j                  dddi¬«      }|j	                  dt
        dd¬«      \  }}|d	u sJ ‚|€J ‚t        ||j                  «      }|j                  t        d
d«      D �cg c]  }dj                  |«      ‘Œ c}dgdz  ¬«       |j                  «       dk(  sJ ‚t        ||j                  |«       t        d«       |j                  d«      j                  d«      }|d   €J ‚|d   d
   d   dk(  sJ ‚|j!                  |j                  d	¬«      }|d	u sJ ‚|j	                  dt
        dd¬«      \  }}|€J ‚|d	u sJ ‚|j	                  dt
        dd¬«      \  }}|du sJ ‚|€J ‚yc c}w )r   r   r   r   r   r   r   Nr   Tr   r   r   r    r!   r$   r%   r&   r'   r(   Fr*   r7   s	            r@   Ú3test_count_function_attach_and_detach_attach_attachrš   è  s  € ô ×&Ñ&Ð'8Ó9€FØ
‡L�L„Nð ×0Ñ0ØØÐ!GÐHð 1ó €Jð &×5Ñ5ØÜ(Ø/Øð	 6ó Ñ€K�ð �d‰?Ðˆ?ØÐ"Ð"Ð"Ü,¨V°Z·_±_ÓE€Oð ‡N�NÜ).¨q°#«Ö7 AˆX�_‰_˜QÕÒ7Ø"Ð# cÑ)ð ô ð ×ÑÓ Ò$Ð$Ð$ä˜f j§o¡o°ÔGä	ˆ"„Ià×"Ñ"Ð#8Ó9×=Ñ=Ð>OÓP€FØ�+ÑÐ*Ð*Ð*Ø�+Ñ˜qÑ! -Ñ0°CÒ7Ð7Ð7ð ×(Ñ(Ø×Ñ°4ð )ó €Gð
 �d‰?Ðˆ?ð &×5Ñ5ØÜ(Ø/Øð	 6ó Ñ€K�ð Ð"Ð"Ð"Ø�d‰?Ðˆ?ð &×5Ñ5ØÜ(Ø/Øð	 6ó Ñ€K�ð �eÑÐÐØÐ"Ð"Ñ"ùòS 8s   ÂFc                 ó¤  — t        j                  | «      }|j                  «        |j                  d¬«      }|j	                  dgdg¬«       |j                  dt        dd¬	«      \  }}|€J ‚|d
u sJ ‚|j                  dt        dd¬	«      \  }}|€J ‚|du sJ ‚|j                  |j                  k(  sJ ‚|j                  |j                  d
¬«       y)zaTest that attach_function is idempotent - calling it twice with same params returns created=FalseÚidempotency_testrD   rE   r    r!   r‹   r   Nr   TFr(   rg   )r   r8   r9   rj   rk   rm   rn   s          r@   Ú test_attach_function_idempotencyr�   0  s   € ä×&Ñ&Ð'8Ó9€FØ
‡L�L„Nà×)Ñ)Ð/AÐ)ÓB€JØ‡N�N˜�w¨?Ð*;€NÔ<ð (×7Ñ7ØÜ(Ø-Øð	 8ó Ñ€L�(ð Ð#Ð#Ð#Ø�tÑÐÐð (×7Ñ7ØÜ(Ø-Øð	 8ó Ñ€L�(ð Ð#Ð#Ð#Ø�uÑÐÐð �?‰?˜lŸo™oÒ-Ð-Ð-ð ×Ñ˜|×0Ñ0È4ÐÕPrY   )%Ú__doc__rJ   Úchromadb.api.clientr   r+   Úchromadb.api.functionsr   r   r   Úchromadb.configr   Úchromadb.errorsr   r	   Úchromadb.test.conftestr
   Ú-chromadb.test.utils.wait_for_version_increaser   r   Útimer   Ú
pytestmarkrA   rN   rX   ro   rs   rz   r   r…   r‰   rŽ   r�   r“   r˜   rš   r�   © rY   r@   ú<module>r¨      sz  ðñó Ý 7÷ñ õ
 #ß 6Ý 6÷õ á!Ó#Ð$€
ð0¸Vð 0Èó 0ðf
°vð 
À$ó 
ð$PÀ&ð PÈTó Pð:,¸&ð ,ÀTó ,ð^EØðEà	óEðP
Àð 
È4ó 
ð,
Øð
à	ó
ð6T¸ð TÀ4ó Tð*
¸fð 
Èó 
ð8>Àvð >ÐRVó >ð43¸fð 3Èó 3ð@6Øð6à	ó6ðrVÀ&ð VÈTó Vð>E#ØðE#à	óE#ðP Q¸ð  QÀ4ô  QrY   