o
    gQ                     @   sH  d dl Z d dlmZ d dlZd dlZd dlmZmZm	Z	m
Z
mZmZ d dl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mZmZmZ d d
lmZm Z m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z'm(Z(m)Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 e:e;Z<G dd deeZ=dS )    N)UUID)AnyOptionalcastTupleSequenceDict)override)UserIdentity)AsyncServerAPI)BaseHTTPClient)CollectionConfigurationInternal)DEFAULT_DATABASEDEFAULT_TENANTSystemSettings)OpenTelemetryClientOpenTelemetryGranularitytrace_method)ProductTelemetryClient)async_to_sync)DatabaseTenant
Collection)	Documents
EmbeddingsPyEmbeddingsIDsInclude	MetadatasURIsWhereWhereDocument	GetResultQueryResultCollectionMetadatavalidate_batchconvert_np_embeddings_to_listc                       s  e Zd ZU i Zeeejf ed< de	f fddZ
dpddZdqd	d
ZdedededdfddZedq fddZdejfddZdededeeef defddZedejedefddZedejeefdededdfddZedejeefdededefd dZed!ejeefdededdfd"d!Zed#ejeddefd$ee d%ee dedee fd&d#Zed'ejededdfd(d'Z ed)ejedede!fd*d)Z"ed+ejede#fd,d+Z$ed-ejeddee%fd$ee d%ee ded.edee& f
d/d-Z'ed0ejeee%fded.edefd1d0Z(ed2ejeddd3ee%fded4ee) d5ee* d6e+ded.ede&fd7d2Z,ed8ejeee%fdeded.ede&fd9d8Z-ed:ejeddee%fded4ee) d5ee* ded.ede&fd;d:Z.ed<ejeddee%fd=e/d>ee d?ee* ded.eddfd@d<Z0edAejeee%fdeded.eddfdBdAZ1edCejeee%fdDe/ded.edefdEdCZ2edFejedGee%fdDe/dHeded.ede3f
dIdFZ4edJejedddddddddKdLgee%fdDe/dMee5 dNee6 dOee d$ee d%ee dPee dQee dRee7 dSe8ded.ede3fdTdJZ9edUejedddee%fdDe/dMee5 dNee6 dRee7 ded.eddfdVdUZ:edWej;dXe<e5ee= ee> ee? ee@ f dYedefdZdWZAed[ej;edddee%fdMe5dDe/d\eBdKee> dLee? d]ee@ ded.ede+fd^d[ZCed_ej;eddddee%fdDe/dMe5d\eeB dKee> dLee? d]ee@ ded.ede+fd`d_ZDedaej;edddee%fdDe/dMe5d\eBdKee> dLee? d]ee@ ded.ede+fdbdaZEedcej;edGddg ddee%fdDe/deeBdfedNee6 dRee7 dSe8ded.edeFfdgdcZGedhej;ede+fdidhZHedjejedefdkdjZIedeJfdldmZKednejedefdodnZL  ZMS )rAsyncFastAPI_clientssystemc                    sp   t  | |jd |jd | t| _| t| _|j| _t	j
t|jj|jj|jj|jjd| _d S )Nchroma_server_hostchroma_server_http_port)r+   r,   chroma_server_ssl_enableddefault_api_path)super__init__settingsrequirer   _opentelemetry_clientr   _product_telemetry_client	_settingsr(   resolve_urlstrr+   r,   r-   chroma_server_api_default_path_api_url)selfr*   	__class__ Q/var/www/visachat/venv/lib/python3.10/site-packages/chromadb/api/async_fastapi.pyr0   8   s   
zAsyncFastAPI.__init__returnc                    s   |    | S N)_get_clientr:   r=   r=   r>   
__aenter__I   s   zAsyncFastAPI.__aenter__Nc                    sB   t | jdkr| j \}}| I d H  t | jdksd S d S )Nr   )lenr)   popitemaclose)r:   _clientr=   r=   r>   _cleanupM   s
   zAsyncFastAPI._cleanupexc_type	exc_value	tracebackc                    s   |   I d H  d S r@   rI   )r:   rJ   rK   rL   r=   r=   r>   	__aexit__R   s   zAsyncFastAPI.__aexit__c                    s&   t    td fdd}|  d S )Nr?   c                      s      I d H  d S r@   rM   r=   rB   r=   r>   sync_cleanupY   s   z'AsyncFastAPI.stop.<locals>.sync_cleanupr?   N)r/   stopr   )r:   rO   r;   rB   r>   rQ   U   s   

zAsyncFastAPI.stopc                 C   sf   d }z
t  }| }W n ty   d}Y nw || jvr.tjd | jj| jj	p(dd| j|< | j| S )Nr   F)timeoutheadersverify)
asyncioget_event_loop__hash__RuntimeErrorr)   httpxAsyncClientr5   chroma_server_headerschroma_server_ssl_verify)r:   	loop_hashloopr=   r=   r>   rA   _   s   


zAsyncFastAPI._get_clientmethodpathkwargsc                    sz   d|v rt |d}||d< tjj|dd d d}| j| }|  j||fi t	t
|I d H }t| t |jS )Njsoncontent/)safeencodingerrors)orjsondumpspopurllibparsequoter9   rA   requestr   r   r   _raise_chroma_errorloadstext)r:   r_   r`   ra   dataescaped_pathurlresponser=   r=   r>   _make_requestu   s   
$
zAsyncFastAPI._make_requestzAsyncFastAPI.heartbeatc                    s    |  ddI d H }t|d S )Nget znanosecond heartbeat)rv   int)r:   ru   r=   r=   r>   	heartbeat   s   zAsyncFastAPI.create_databasenametenantc                    s(   | j dd| dd|idI d H  d S )Npost	/tenants/
/databasesr{   rb   rv   r:   r{   r|   r=   r=   r>   create_database   s   
zAsyncFastAPI.get_databasec                    sB   | j dd| d| d|idI d H }t|d |d |d dS )	Nrw   r~   /databases/r|   paramsidr{   r   r{   r|   )rv   r   )r:   r{   r|   ru   r=   r=   r>   get_database   s   zAsyncFastAPI.delete_databasec                    s$   |  dd| d| I d H  d S )Ndeleter~   r   r   r   r=   r=   r>   delete_database   s
   zAsyncFastAPI.list_databaseslimitoffsetc                    s:   | j dd| dt||ddI d H }dd |D S )Nrw   r~   r   r   r   r   c                 S   s&   g | ]}t |d  |d |d dqS )r   r{   r|   r   )r   ).0dbr=   r=   r>   
<listcomp>   s    z/AsyncFastAPI.list_databases.<locals>.<listcomp>rv   r   _clean_params)r:   r   r   r|   ru   r=   r=   r>   list_databases   s   
zAsyncFastAPI.create_tenantc                    s    | j ddd|idI d H  d S )Nr}   z/tenantsr{   r   r   )r:   r{   r=   r=   r>   create_tenant   s   zAsyncFastAPI.get_tenantc                    s&   |  dd| I d H }t|d dS )Nrw   r~   r{   )r{   )rv   r   )r:   r{   	resp_jsonr=   r=   r>   
get_tenant   s   
zAsyncFastAPI.get_user_identityc                    s   t di | ddI d H S )Nrw   z/auth/identityr=   )r
   rv   rB   r=   r=   r>   get_user_identity   s   zAsyncFastAPI.list_collectionsdatabasec                    sD   | j dd| d| dt||ddI d H }dd |D }|S )	Nrw   r~   r   /collectionsr   r   c                 S   s   g | ]}t |qS r=   )CollectionModel	from_json)r   json_collectionr=   r=   r>   r      s    
z1AsyncFastAPI.list_collections.<locals>.<listcomp>r   )r:   r   r   r|   r   r   modelsr=   r=   r>   list_collections   s   	zAsyncFastAPI.count_collectionsc                    s,   |  dd| d| dI d H }tt|S )Nrw   r~   r   z/collections_countrv   r   ry   )r:   r|   r   r   r=   r=   r>   count_collections   s   

zAsyncFastAPI.create_collectionFconfigurationmetadataget_or_createc           	         sJ   | j dd| d| d|||r| nd|ddI dH }t|}|S )zCreates a collectionr}   r~   r   r   N)r{   r   r   r   r   )rv   to_jsonr   r   )	r:   r{   r   r   r   r|   r   r   modelr=   r=   r>   create_collection  s   
zAsyncFastAPI.get_collectionc              	      s4   |  dd| d| d| I d H }t|}|S )Nrw   r~   r   /collections/)rv   r   r   )r:   r{   r|   r   r   r   r=   r=   r>   get_collection'  s   

z%AsyncFastAPI.get_or_create_collectionc                    s   | j |||d||dI d H S )NT)r{   r   r   r   r|   r   )r   )r:   r{   r   r   r|   r   r=   r=   r>   get_or_create_collection8  s   zAsyncFastAPI._modifyr   new_namenew_metadatac                    s4   | j dd| d| d| ||ddI d H  d S )Nputr~   r   r   )r   r   r   r   )r:   r   r   r   r|   r   r=   r=   r>   _modifyM  s   
zAsyncFastAPI.delete_collectionc              	      s*   |  dd| d| d| I d H  d S )Nr   r~   r   r   r   )r:   r{   r|   r   r=   r=   r>   delete_collection]  s
   zAsyncFastAPI._countcollection_idc              
      s2   |  dd| d| d| dI dH }tt|S )z0Returns the number of embeddings in the databaserw   r~   r   r   z/countNr   )r:   r   r|   r   r   r=   r=   r>   _countj  s   	

zAsyncFastAPI._peek
   nc                    s$   | j ||||g ddI d H }|S )N)
embeddings	documents	metadatas)r|   r   r   include)_get)r:   r   r   r|   r   respr=   r=   r>   _peekz  s   	zAsyncFastAPI._getr   r   idswheresortpage	page_sizewhere_documentr   c                    s   |r|r|d | }|}| j dd| d| d| d||||||	|
ddI d H }t|d	 |d
d |dd |dd d |dd |d|
dS )N   r}   r~   r   r   z/get)r   r   r   r   r   r   r   r   r   r   r   r   urisincluded)r   r   r   r   rr   r   r   )rv   r#   rw   )r:   r   r   r   r   r   r   r   r   r   r   r|   r   r   r=   r=   r>   r     s2   




zAsyncFastAPI._deletec              	      s8   | j dd| d| d| d|||ddI d H  d S )Nr}   r~   r   r   z/delete)r   r   r   r   r   )r:   r   r   r   r   r|   r   r=   r=   r>   _delete  s   
zAsyncFastAPI._submit_batchbatchrt   c              	      s8   | j d||d |d |d |d |d ddI d	H S )
z?
        Submits a batch of embeddings to the database
        r}   r   r            )r   r   r   r   r   r   Nr   )r:   r   rt   r=   r=   r>   _submit_batch  s   zAsyncFastAPI._addr   r   c	           
   
      sZ   |t ||||f}	t|	d|  I d H i | |	d| d| dt| dI d H  dS )Nmax_batch_sizer~   r   r   z/addTr'   r&   get_max_batch_sizer   r7   )
r:   r   r   r   r   r   r   r|   r   r   r=   r=   r>   _add     
zAsyncFastAPI._updatec	           
   
      sf   ||d ur
t |nd |||f}	t|	d|  I d H i | |	d| d| dt| dI d H  dS )Nr   r~   r   r   z/updateTr   
r:   r   r   r   r   r   r   r|   r   r   r=   r=   r>   _update  s   	
zAsyncFastAPI._upsertc	           
   
      sZ   |t ||||f}	t|	d|  I d H i | |	d| d| dt| dI d H  dS )Nr   r~   r   r   z/upsertTr   r   r=   r=   r>   _upsert!  r   zAsyncFastAPI._query)r   r   	distancesquery_embeddings	n_resultsc	           
         s   | j dd| d| d| d|d urt|nd ||||ddI d H }	t|	d |	d	d |	d
d |	dd |	dd |	dd d |	d|dS )Nr}   r~   r   r   z/query)r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   rr   r   )rv   r'   r$   rw   )
r:   r   r   r   r   r   r   r|   r   r   r=   r=   r>   _query<  s.   





zAsyncFastAPI.resetc                       |  ddI d H }tt|S )Nr}   z/reset)rv   r   boolr:   r   r=   r=   r>   resetb     
zAsyncFastAPI.get_versionc                    r   )Nrw   z/version)rv   r   r7   r   r=   r=   r>   get_versionh  r   c                 C   s   | j S r@   )r5   rB   r=   r=   r>   get_settingsn  s   zAsyncFastAPI.get_settingszAsyncFastAPI.get_max_batch_sizec                    s4   | j dkr| ddI d H }tt|d | _ | j S )Nrw   z/pre-flight-checksr   )_max_batch_sizerv   r   ry   r   r=   r=   r>   r   r  s
   
)r?   r(   rP   )N__name__
__module____qualname__r)   r   ry   rY   rZ   __annotations__r   r0   rC   rI   r   rN   r	   rQ   rA   r7   rv   r   r   	OPERATIONrz   r   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   r%   r   r   r   r   r   r   r   r   r#   r   r   r!   r"   r   r   r   ALLr   r   r   r   r    r   r   r   r   r   r$   r   r   r   r   r   r   __classcell__r=   r=   r;   r>   r(   -   s8  
 	

	




















	

+
	

	

	

	

	

$

r(   )>rU   uuidr   urllib.parserk   rh   typingr   r   r   r   r   r   loggingrY   	overridesr	   chromadb.authr
   chromadb.api.async_apir   chromadb.api.base_http_clientr   chromadb.api.configurationr   chromadb.configr   r   r   r    chromadb.telemetry.opentelemetryr   r   r   chromadb.telemetry.productr   chromadb.utils.async_to_syncr   chromadb.typesr   r   r   r   chromadb.api.typesr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   	getLoggerr   loggerr(   r=   r=   r=   r>   <module>   s(     @
