
    _jJ                         d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZmZ d dlmZmZ d dlmZmZ d dl mZ d	gZd
ee         fdZ G d d          ZdS )    N)ListAnyCallableDict)ValidationError)	MagicMockcreate_autospec)validate_config_schemaload_schemaget_available_schemas)known_embedding_functions sparse_known_embedding_functions)	Documents
Embeddings)MonkeyPatchchroma_langchainreturnc                  <    d t          j                    D             S )z(Get all embedding function names to testc                 $    g | ]}|t           v|S  )SKIP_EMBEDDING_FUNCTIONS).0names     p/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/chromadb/test/utils/test_embedding_function_schemas.py
<listcomp>z0get_embedding_function_names.<locals>.<listcomp>   s.       /// 	///    )r   keysr   r   r   get_embedding_function_namesr      s,     -244   r   c            	          e Zd ZdZej                            d e                      dede	e
gef         deddfd            ZddZed	edefd
            ZddZdeeef         deeef         fdZdeeef         defdZdedefdZdededdfdZdedededefdZej                            d e                      dede	e
gef         deddfd            Zde	e
gef         deddfdZdS )TestEmbeddingFunctionSchemasz)Test class for embedding function schemasef_namemock_embeddingsmock_common_depsr   Nc                    t           |         }t          |d          t           |dg                    }|_        |dk    r#ddlm}m} d|j        j        d	|d
j	        _
        |                    |dfd            |            }|	                                }	|                    |	          }
|
	                                }|	|k    sJ d|             dS )z/Test embedding function configuration roundtripT)instancetestreturn_valuechroma-cloud-qwenr   )ChromaCloudQwenEmbeddingModel&CHROMA_CLOUD_QWEN_DEFAULT_INSTRUCTIONSCHROMA_API_KEY
nl_to_code)api_key_env_varmodeltaskinstructions__new__c                     S Nr   )clsargskwargsmock_efs      r   <lambda>zWTestEmbeddingFunctionSchemas.test_embedding_function_config_roundtrip.<locals>.<lambda>D   s    g r   z)Configs don't match after recreation for N)r   r	   r   __call__Gchromadb.utils.embedding_functions.chroma_cloud_qwen_embedding_functionr*   r+   QWEN3_EMBEDDING_0p6Bvalue
get_configr(   setattrbuild_from_config)selfr!   r"   r#   ef_class	mock_callr*   r+   ef_instanceconfignew_instance
new_configr8   s               @r   (test_embedding_function_config_roundtripzETestEmbeddingFunctionSchemas.test_embedding_function_config_roundtrip#   sB    -W5 "(T::: ??F8+D+DEEE	$ )))        $46KQ$ F	/ /G+ 	  i!E!E!E!E	
 	
 	

 hjj ''))  11&99!,,..
 j   @w@@ !    r   c                    t                      D ]}t          |          }d|vri }|d         D ]Y}|d         |         }t          |d         t                    r|d         d         n|d         }|                     |          ||<   Z|d         D ]Z}|                                }||= t          j        t                    5  t          ||           ddd           n# 1 swxY w Y   [dS )z)Test that schemas enforce required fieldsrequired
propertiestyper   N)
r   r   
isinstancelist_get_dummy_valuecopypytestraisesr   r
   rA   schema_nameschemarE   fieldfield_schema
field_typetest_configs           r   test_schema_required_fieldsz8TestEmbeddingFunctionSchemas.test_schema_required_fieldsV   sv   022 	E 	EK --F'' F
+ B B%l3E: ",v"6==.L(++%f- 
 !% 5 5j A Au  
+ E E$kkmm&]?33 E E*;DDDE E E E E E E E E E E E E E EE#	E 	Es   C  C$'C$rX   c                 @    ddddi g d}|                     | d          S )z(Get a dummy value for a given field typedummyr   g        F)stringintegernumberbooleanobjectarray)get)rX   type_maps     r   rO   z-TestEmbeddingFunctionSchemas._get_dummy_valueo   s8     
 
 ||J000r   c                    t                      D ]}t          |          }i }d|v rb|d         D ]Y}|d         |         }t          |d         t                    r|d         d         n|d         }|                     |          ||<   Z|                                }d|d<   |                    dd          d	u rAt          j        t                    5  t          ||           d
d
d
           n# 1 swxY w Y   d
S )z.Test that schemas reject additional propertiesrJ   rK   rL   r   r=   additional_propertyadditionalPropertiesTFN)r   r   rM   rN   rO   rP   rc   rQ   rR   r   r
   rS   s           r   !test_schema_additional_propertiesz>TestEmbeddingFunctionSchemas.test_schema_additional_properties|   sv   022 	E 	EK --FF V###J/ F FE#),#7#>L &l6&:DAA2V,Q//)&1 
 %)$9$9*$E$EF5MM !++--K18K-. zz0$775@@]?33 E E*;DDDE E E E E E E E E E E E E E E+	E 	Es   C//C3	6C3	rU   c                     i }d|v r?d|v r;|d         D ]2}||d         v r&|d         |         }|                      |          ||<   3|S )zACreate a valid config from a schema by filling in required fieldsrJ   rK   )_get_value_from_field_schema)rA   rU   rE   rV   rW   s        r    _create_valid_config_from_schemaz=TestEmbeddingFunctionSchemas._create_valid_config_from_schema   sp     "$LF$:$:
+ T TF<000#),#7#>L$($E$El$S$SF5Mr   rW   c                    d|v r|d         d         S |                     d          }|dS t          |t                    rd |D             }|r|d         n|d         }|dk    rUi }d|v rI|                     d	g           }|D ]0}||d         v r$|                     |d         |                   ||<   1|r|ni S |d
k    rg S |                     |          S )z%Get a valid value from a field schemaenumr   rL   Nr\   c                     g | ]
}|d k    |S )nullr   )r   ts     r   r   zMTestEmbeddingFunctionSchemas._get_value_from_field_schema.<locals>.<listcomp>   s    CCCAqF{{a{{{r   ra   rK   rJ   rb   )rc   rM   rN   rj   rO   )rA   rW   rX   non_null_typesnested_confignested_requiredprops          r   rj   z9TestEmbeddingFunctionSchemas._get_value_from_field_schema   s+    \!!'** "%%f--
7j$'' 	PCCCCCN.<O***Q-J!!M|++"."2"2:r"B"B+  D|L999.2.O.O(6t</ /d+ %29==r9  I $$Z000r   rB   c                     	 ddi}	 |                     |           dS # t          t          t          f$ r Y dS w xY w# t          $ r Y dS w xY w)zJCheck if validate_config actually validates (not just base implementation)__invalid_test_config__TF)validate_configr   
ValueErrorFileNotFoundError	Exception)rA   rB   invalid_configs      r   _has_custom_validationz3TestEmbeddingFunctionSchemas._has_custom_validation   s}    	7>N((888u#Z1BC   tt  	 	 	44	s#   <  9< 9< 
A
	A
c                 "   i dddddddddd	d
ddddddddddddddddddddddd d!d!d"}||v r|                     ||         d#           |dk    r.|                     d$d%           |                     d&d'           d(S d(S ))zHSet up environment variables needed for embedding function instantiationcohereCHROMA_COHERE_API_KEYopenaiCHROMA_OPENAI_API_KEYhuggingfaceCHROMA_HUGGINGFACE_API_KEYhuggingface_servergoogle_palmCHROMA_GOOGLE_PALM_API_KEYgoogle_genaiGEMINI_API_KEYgoogle_generative_aigoogle_vertexCHROMA_GOOGLE_VERTEX_API_KEYjinaCHROMA_JINA_API_KEYmistralMISTRAL_API_KEYmorphMORPH_API_KEYvoyageaiCHROMA_VOYAGE_API_KEYcloudflare_workers_aiCHROMA_CLOUDFLARE_API_KEYtogether_aiCHROMA_TOGETHER_AI_API_KEYbasetenCHROMA_BASETEN_API_KEYroboflowCHROMA_ROBOFLOW_API_KEYamazon_bedrockAWS_ACCESS_KEY_IDr,   )r)   zchroma-cloud-spladetest-api-keyAWS_SECRET_ACCESS_KEYztest-secret-key
AWS_REGION	us-east-1N)setenv)rA   r!   r#   api_key_env_varss       r   _setup_env_vars_for_efz3TestEmbeddingFunctionSchemas._setup_env_vars_for_ef   sm   

-
-
 7
 !">	

 7
 ,
 #$4
 ;
 )
 (
 _
 /
 $%@
 7
 /
  1!
" 1#
$ "2#3)
 
 
0 &&&##$4W$=~NNN &&&##$;=NOOO##L+>>>>> '&r   c                    |                      ||           ddl}t                      }t                      }t                      }t                      }t                      }	t                      }
t                      }t                      }t                      }t                      }d|_        d|_        t                      |j        _        ||_        ||
_        t                      }t                      |j        _        ||	_	        |	|_
        t                      |_        t                      }t                      |_        t          t                                |_        ||_        t                      }||_        t                      |_        t                      }t          g d          g|j        j        j        j        _        ||_        |||||t                      ||	|
||d}|                                D ]!\  }}|                    |j        ||           "|dk    r |d	d
          S |dk    r |dd          S |dk    r#|
                    d          } ||d          S |dk    r |d          S |dk    r |dd          S |dk    r |d          S |dk    r
 |            S |dk    rdd lm}  ||j        d!"          S 	  |            S # t6          $ r  |d	#          cY S w xY w)$z=Create an embedding function instance, handling special casesr   Nr   r'   )g?g?g333333?)	embedding)PILz	PIL.Imagegooglezgoogle.generativeaizgoogle.genaizgoogle.genai.typesvertexaizvertexai.language_modelsboto3r   	mistralair   z
test-modelztest-account-id)
model_name
account_idr   r   zhttps://test.api.baseten.co)api_keyapi_baser   )region_namezamazon.titan-embed-text-v1)sessionr   r   zhttp://localhost:8080)urlr   ztest-projectzus-central1)
project_idregionr   zmistral-embed)r/   r   r)   )r*   r-   )r/   r0   )r   )r   sysr   r   profile_nameclientr(   Sessionfrom_pretrainedTextEmbeddingModellanguage_modelsinit	configureGenerativeModelgenerativeaigenaiClient
embeddingscreatedataMistralitemssetitemmodulesr;   r*   r<   rz   )rA   r!   rB   r#   r   mock_pilmock_pil_imagemock_google_genaimock_vertexaimock_vertexai_lm
mock_boto3	mock_jinamock_mistralaimock_boto3_sessionmock_session_instancemock_text_embedding_modelmock_googlemock_google_genai_newmock_mistral_clientmodules_to_mockmodule_namemock_modulemock_sessionr*   s                           r   _create_ef_instancez0TestEmbeddingFunctionSchemas._create_ef_instance   s   
 	##G-=>>> 	


 ;;"%KK!$;;[[
KK	" '[[ ),7)-1*4=KK$1*?'/
 %.KK!AJ!1>.G+(8%&[[  kk&/kk#,59;;,O,O,O)#4  )1 %;;	 (kk000P
(3:GL "5 '!#41"+++%(8'
 
 )8(=(=(?(? 	L 	L$K$$S[+{KKKK ---8',    	!!8&6    ((( &--+-FFL8$7    ,,,8 78888''8~mLLLL	!!8/2222
""8::+++      83H!   9xzz! 9 9 9x<8888889s   	K# #K<;K<c                    t           |         }t          |d          st          j        | d           t	          t          |dd                    st          j        | d           |                     |          st          j        | d           	 |                     |||          }n0# t          $ r#}t          j        | d|            Y d}~nd}~ww xY wt           |dg                    }|
                    |d	|           |                                }d
 |                                D             }|                    |           dS )zVTest that validate_config works correctly with actual configs from embedding functionsrw   z% does not have validate_config methodNz  validate_config is not callablez9 uses base validate_config implementation (no validation)zB requires arguments that we cannot provide without external deps: r&   r'   r:   c                     i | ]
\  }}|||S r4   r   r   kvs      r   
<dictcomp>zQTestEmbeddingFunctionSchemas.test_validate_config_with_schema.<locals>.<dictcomp>  s    CCC41aQ]!Q]]]r   )r   hasattrrQ   skipcallablegetattrr|   r   rz   r   r?   r>   r   rw   )	rA   r!   r"   r#   rB   rD   erC   rE   s	            r    test_validate_config_with_schemaz=TestEmbeddingFunctionSchemas.test_validate_config_with_schemaq  s    -W5 x!233 	KK7IIIJJJ *;TBBCC 	FK7DDDEEE **844 	KUUU  	227HFVWWKK 	 	 	Kaa^_aa       	 ??F8+D+DEEE	  j)DDD '')) DC6<<>>CCC 	  (((((s   B/ /
C9CCc                    t          j                    D ]\  }}t          |d          st          t	          |dd                    s5|                     |          sK	 |                     |||          }n# t          $ r Y pw xY wt           |dg                    }|	                    |d|           |
                                }d |                                D             }|                    |           dS )zGTest validate_config for sparse embedding functions with actual configsrw   Nr&   r'   r:   c                     i | ]
\  }}|||S r4   r   r   s      r   r   z`TestEmbeddingFunctionSchemas.test_validate_config_sparse_embedding_functions.<locals>.<dictcomp>  s    GGGtq!ar   )r   r   r   r   r   r|   r   rz   r   r?   r>   rw   )rA   r"   r#   r!   rB   rD   rC   rE   s           r   /test_validate_config_sparse_embedding_functionszLTestEmbeddingFunctionSchemas.test_validate_config_sparse_embedding_functions  sF    "B!G!I!I "	- "	-GX8%677  GH.?FFGG  ..x88 "66X'7      "x/H/HIIII$$[*iHHH !++--F HGv||~~GGGF $$V,,,,E"	- "	-s    A88
BB)r   N)__name__
__module____qualname____doc__rQ   markparametrizer   strr   r   r   r   rH   rZ   staticmethodr   rO   rh   r   rk   rj   boolr|   r   r   r   r   r   r   r   r    r        s       33[Y(D(D(F(FGG0A0A "9+z"9:0A &	0A
 
0A 0A 0A HG0AdE E E E2 
1S 
1S 
1 
1 
1 \
1E E E E438n	c3h   !1c3h !1C !1 !1 !1 !1Fs t     #?#?.9#?	#? #? #? #?Js9s9&)s9=Hs9	s9 s9 s9 s9j [Y(D(D(F(FGG,),) "9+z"9:,) &	,)
 
,) ,) ,) HG,)\(-!9+z"9:(- &(- 
	(- (- (- (- (- (-r   r    )rQ   typingr   r   r   r   
jsonschemar   unittest.mockr   r	   *chromadb.utils.embedding_functions.schemasr
   r   r   "chromadb.utils.embedding_functionsr   r   chromadb.api.typesr   r   r   r   r   r   r    r   r   r   <module>r      sJ    , , , , , , , , , , , , & & & & & & 4 4 4 4 4 4 4 4         
        5 4 4 4 4 4 4 4        
d3i    h- h- h- h- h- h- h- h- h- h-r   