o
    1XxiEG                     @   s4  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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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 e6e7Z8G dd deeZ9dS )    N)UUID)AnyOptionalcastTupleSequenceDict)override)AsyncServerAPI)BaseHTTPClient)CollectionConfigurationInternal)DEFAULT_DATABASEDEFAULT_TENANTSystemSettings)OpenTelemetryClientOpenTelemetryGranularitytrace_method)ProductTelemetryClient)async_to_sync)DatabaseTenant
Collection)	Documents
EmbeddingsIDsInclude	MetadatasURIsWhereWhereDocument	GetResultQueryResultCollectionMetadatavalidate_batchc                       s  e Zd ZU i Zeeejf ed< de	f fddZ
djddZdkd	d
ZdedededdfddZedk 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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deefd&e e d'e e ded(ede!e" f
d)d%Z#ed*ejeeefded(edefd+d*Z$ed,ejeddd-eefded.e e% d/e e& d0e'ded(ede"fd1d,Z(ed2ejedeefded3e e) ded(ede"f
d4d2Z*ed5ejeddeefded.e e% d/e e& ded(ede"fd6d5Z+ed7eje		dld3e)d8e e d9e e& ddfd:d7Z,ed;ejeeefded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	Admd>e)dBede/fdCd@Z0edDejedi dddddi dEdFgf	d>e)dGe e1 dHe e2 dIe e d&e e d'e e dJe e dKe e dLe e3 dMe4de/fdNdDZ5edOejedi i fd>e)dGe e1 dHe e2 dLe e3 de1f
dPdOZ6edQej7dRe8e1e e9 e e: e e; e e< f dSedefdTdQZ=edUej7e			dndGe1d>e)dVe9dEe e: dFe e; dWe e< de'fdXdUZ>edYej7e				dod>e)dGe1dVe e9 dEe e: dFe e; dWe e< de'fdZdYZ?ed[ej7e			dnd>e)dGe1dVe9dEe e: dFe e; dWe e< de'fd\d[Z@ed]ej7edAi i g d^fd>e)d_e9d`edHe e2 dLe e3 dMe4deAfdad]ZBedbej7ede'fdcdbZCeddejedefdeddZDedeEfdfdgZFedhejedefdidhZG  ZHS )p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__ Y/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/chromadb/api/async_fastapi.pyr-   5   s   
zAsyncFastAPI.__init__returnc                    s   |    | S N)_get_clientr7   r:   r:   r;   
__aenter__F   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)r7   _clientr:   r:   r;   _cleanupJ   s
   zAsyncFastAPI._cleanupexc_type	exc_value	tracebackc                    s   |   I d H  d S r=   rF   )r7   rG   rH   rI   r:   r:   r;   	__aexit__O   s   zAsyncFastAPI.__aexit__c                    s&   t    td fdd}|  d S )Nr<   c                      s      I d H  d S r=   rJ   r:   r?   r:   r;   sync_cleanupV   s   z'AsyncFastAPI.stop.<locals>.sync_cleanupr<   N)r,   stopr   )r7   rL   r8   r?   r;   rN   R   s   

zAsyncFastAPI.stopc                 C   sV   d }z
t  }| }W n ty   d}Y nw || jvr&tjd d| j|< | j| S )Nr   )timeout)asyncioget_event_loop__hash__RuntimeErrorr&   httpxAsyncClient)r7   	loop_hashloopr:   r:   r;   r>   \   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data/)safeencodingerrors)orjsondumpspopurllibparsequoter6   r>   requestr   r   r   _raise_chroma_errorloadstext)r7   rX   rY   rZ   r\   escaped_pathurlresponser:   r:   r;   _make_requestn   s   
$
zAsyncFastAPI._make_requestzAsyncFastAPI.heartbeatc                    s    |  ddI d H }t|d S )Nget znanosecond heartbeat)rn   int)r7   rm   r:   r:   r;   	heartbeat   s   zAsyncFastAPI.create_databasenametenantc                    s&   | j ddd|id|idI d H  d S )Npostz
/databasesrs   rt   r[   paramsrn   )r7   rs   rt   r:   r:   r;   create_database   s   zAsyncFastAPI.get_databasec                    s:   | j dd| d|idI d H }t|d |d |d dS )Nro   z/databases/rt   rw   idrs   )r{   rs   rt   )rn   r   )r7   rs   rt   rm   r:   r:   r;   get_database   s   zAsyncFastAPI.create_tenantc                    s    | j ddd|idI d H  d S )Nru   z/tenantsrs   r[   rx   )r7   rs   r:   r:   r;   create_tenant   s   zAsyncFastAPI.get_tenantc                    s&   |  dd| I d H }t|d dS )Nro   z	/tenants/rs   )rs   )rn   r   )r7   rs   	resp_jsonr:   r:   r;   
get_tenant   s   
zAsyncFastAPI.list_collectionslimitoffsetdatabasec              
      s:   | j ddt||||ddI d H }dd |D }|S )Nro   /collections)rt   r   r   r   rz   c                 S   s   g | ]}t |qS r:   )CollectionModel	from_json).0json_collectionr:   r:   r;   
<listcomp>   s    
z1AsyncFastAPI.list_collections.<locals>.<listcomp>)rn   r   _clean_params)r7   r   r   rt   r   r   modelsr:   r:   r;   list_collections   s    	zAsyncFastAPI.count_collectionsc                    s(   | j dd||ddI d H }tt|S )Nro   z/count_collectionsrt   r   rz   )rn   r   rq   )r7   rt   r   r   r:   r:   r;   count_collections   s   
zAsyncFastAPI.create_collectionFconfigurationmetadataget_or_createc           	         sD   | j dd|||r| nd|d||ddI dH }t|}|S )zCreates a collectionru   r   N)rs   r   r   r   r   rv   )rn   to_jsonr   r   )	r7   rs   r   r   r   rt   r   r   modelr:   r:   r;   create_collection   s   
zAsyncFastAPI.get_collectionr{   c                    s|   |d u r	|d u s|d ur|d urt d||d}|d ur$t||d< | jd|r-d| nt||dI d H }t|}|S )Nz*Name or id must be specified, but not bothr   typero   /collections/rz   )
ValueErrorr4   rn   r   r   )r7   rs   r{   rt   r   rw   r   r   r:   r:   r;   get_collection   s    	

z%AsyncFastAPI.get_or_create_collectionc                    s   | j |||d||dI d H S )NT)rs   r   r   r   rt   r   )r   )r7   rs   r   r   rt   r   r:   r:   r;   get_or_create_collection  s   zAsyncFastAPI._modifynew_namenew_metadatac                    s*   | j ddt| ||ddI d H  d S )Nputr   )r   r   r}   )rn   r4   )r7   r{   r   r   r:   r:   r;   _modify+  s   
zAsyncFastAPI.delete_collectionc                    s&   | j dd| ||ddI d H  d S )Ndeleter   r   rz   rx   )r7   rs   rt   r   r:   r:   r;   delete_collection9  s   zAsyncFastAPI._countcollection_idc                    s*   |  ddt| d I dH }tt|S )z0Returns the number of embeddings in the databasero   r   z/countN)rn   r4   r   rq   )r7   r   r   r:   r:   r;   _countG  s   

zAsyncFastAPI._peek
   nc                    s   | j ||g ddI d H S )N)
embeddings	documents	metadatas)r   include)_get)r7   r   r   r:   r:   r;   _peekU  s   zAsyncFastAPI._getr   r   idswheresortpage	page_sizewhere_documentr   c                    s   |r|r|d | }|}| j ddt| d ||||||	|
ddI d H }t|d |dd |d	d |d
d d |dd |d|
dS )N   ru   r   z/get)r   r   r   r   r   r   r   r}   r   r   r   r   urisincluded)r   r   r   r   r\   r   r   )rn   r4   r!   ro   )r7   r   r   r   r   r   r   r   r   r   r   r   r:   r:   r;   r   b  s2   




zAsyncFastAPI._deletec                    s6   | j ddt| d |||ddI d H }tt|S )Nru   r   z/delete)r   r   r   r}   )rn   r4   r   r   )r7   r   r   r   r   r   r:   r:   r;   _delete  s   	

zAsyncFastAPI._submit_batchbatchrl   c              	      s8   | j d||d |d |d |d |d ddI d	H S )
z?
        Submits a batch of embeddings to the database
        ru   r   r            )r   r   r   r   r   r}   Nrx   )r7   r   rl   r:   r:   r;   _submit_batch  s   zAsyncFastAPI._addr   r   c                    sJ   |||||f}t |d|  I d H i | |dt| d I d H  dS )Nmax_batch_sizer   z/addTr$   get_max_batch_sizer   r4   )r7   r   r   r   r   r   r   r   r:   r:   r;   _add  s
   zAsyncFastAPI._updatec                    J   |||||f}t |d|  I d H i | |dt| d I d H  dS )Nr   r   z/updateTr   r7   r   r   r   r   r   r   r   r:   r:   r;   _update  s   
zAsyncFastAPI._upsertc                    r   )Nr   r   z/upsertTr   r   r:   r:   r;   _upsert  s   
zAsyncFastAPI._query)r   r   	distancesquery_embeddings	n_resultsc                    s|   | j ddt| d |||||ddI d H }t|d |dd |dd |d	d |d
d |dd d |d|dS )Nru   r   z/query)r   r   r   r   r   r}   r   r   r   r   r   r   r   )r   r   r   r   r   r   r\   r   )rn   r4   r"   ro   )r7   r   r   r   r   r   r   r   r:   r:   r;   _query  s*   





zAsyncFastAPI.resetc                       |  ddI d H }tt|S )Nru   z/reset)rn   r   boolr7   r   r:   r:   r;   reset     
zAsyncFastAPI.get_versionc                    r   )Nro   z/version)rn   r   r4   r   r:   r:   r;   get_version  r   c                 C   s   | j S r=   )r2   r?   r:   r:   r;   get_settings  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 )Nro   z/pre-flight-checksr   )_max_batch_sizern   r   rq   r   r:   r:   r;   r   !  s
   
)r<   r%   rM   )NN)r   )NNN)NNNN)I__name__
__module____qualname__r&   r   rq   rT   rU   __annotations__r   r-   r@   rF   r   rK   r	   rN   r>   r4   rn   r   r   	OPERATIONrr   r   ry   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   __classcell__r:   r:   r8   r;   r%   *   s  
 	

	















	

)
	





 

r%   ):rP   uuidr   urllib.parserd   ra   typingr   r   r   r   r   r   loggingrT   	overridesr	   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$   	getLoggerr   loggerr%   r:   r:   r:   r;   <module>   s&     8
