o
    gw                    @   s  d dl mZmZmZmZ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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 d dlmZ d d	lmZ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(m)Z) d dl*m+Z+ d dl*m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL d dlMmNZN d dlOZOd dlPZQd dlRmSZS d dlTmUZUmVZW d dlXmYZY d dlZm[Z[ d dl\m]Z]m^Z^ d dl_m`Z`maZa d dlbmcZcmdZdmeZemfZf d dl\mgZh eOiejZkd d! Zld"ed#dfd$d%Zmd&ed'eegef d#efd(d)Znd&ed'eegef d#efd*d+Zod&ed'eegef d#efd,d-Zpe	d.e#d/d0Zqd1eeq d2ed#eqfd3d4ZrG d5d6 d6ejsZtG d7d8 d8eBZdS )9    )
Any	AwaitableCallablecastDictSequenceOptionalTypeTypeVarTupleN)	to_threadCapacityLimiter)FastAPIResponseRequest)get_openapi)CORSMiddlewareORJSONResponse)APIRoute)HTTPExceptionstatus)wraps)CollectionConfigurationInternal)	BaseModel)	Embedding	GetResultQueryResult
Embeddingsconvert_list_embeddings_to_np)UserIdentity)AuthzActionAuthzResourceServerAuthenticationProviderServerAuthorizationProvider)DEFAULT_DATABASEDEFAULT_TENANTSettingsSystem)	ServerAPI)ChromaErrorInvalidDimensionExceptionInvalidHTTPVersionRateLimitError
QuotaError)QuotaEnforcer)AsyncRateLimitEnforcer)Server)	AddEmbeddingCreateDatabaseCreateTenantDeleteEmbeddingGetEmbeddingQueryEmbeddingCreateCollectionUpdateCollectionUpdateEmbedding)Headers)ServerStartEvent)fastapi_json_responsestring_to_uuid)trace)instrument_fastapi)DatabaseTenant)ServerContextProductTelemetryClient)OpenTelemetryClientOpenTelemetryGranularityadd_attributes_to_current_spantrace_method)
Collectionc                    s&   t  dtdtdtf fdd}|S )Nargskwargsreturnc                     s&   | d }|j  | i |I d H S )Nr   )_async_rate_limit_enforcer
rate_limit)rJ   rK   selffunc W/var/www/visachat/venv/lib/python3.10/site-packages/chromadb/server/fastapi/__init__.pywrapperY   s   zrate_limit.<locals>.wrapper)r   r   )rQ   rT   rR   rP   rS   rN   X   s   rN   apprL   c                 C   s"   | j D ]}t|tr|j|_qdS )z
    Simplify operation IDs so that generated API clients have simpler function
    names.
    Should be called only after all routes have been added.
    N)routes
isinstancer   nameoperation_id)rU   routerR   rR   rS    use_route_names_as_operation_ids`   s
   

r[   request	call_nextc                    s2   t   j}|| I d H }t|d|jd< |S )NxzChroma-Trace-Id)r?   get_current_spanget_span_contexttrace_idformatheaders)r\   r]   ra   responserR   rR   rS   #add_trace_id_to_response_middlewarek   s
   re   c              
      s   z|| I d H W S  t y } z
t|W  Y d }~S d }~w ty; } ztdt|dddW  Y d }~S d }~w tyW } ztdt|dddW  Y d }~S d }~w tyw } zt| tdt	|iddW  Y d }~S d }~ww )NInvalidArgumentError)errormessage  )contentstatus_coderg     )
r*   r=   
ValueErrorr   str	TypeError	Exceptionlogger	exceptionrepr)r\   r]   erR   rR   rS   catch_exceptions_middlewaret   s.   
 ru   c                    s4   | j d}|dvrtd| d|| I d H S )Nhttp_version)z1.12zHTTP version z is not supported)scopegetr,   )r\   r]   rv   rR   rR   rS   check_http_version_middleware   s
   rz   DT)boundcontravariantmodeldatac                 C   s*   z|  |W S  ty   | | Y S w )z1Used for backward compatibility with Pydantic 1.x)model_validateAttributeError	parse_obj)r~   r   rR   rR   rS   validate_model   s
   r   c                       s.   e Zd Zdedededdf fddZ  ZS )ChromaAPIRouterpathrJ   rK   rL   Nc                    s   d|v o|d   dt dtf fdd}|||d< t j|g|R i | |dr3|d d }n|d }|||d< t j|g|R i | d S )Ninclude_in_schemar   rL   c                    s     o|  d S )N/)endswith)r   exclude_from_schemarR   rS   r      s   z8ChromaAPIRouter.add_api_route.<locals>.include_in_schemar   )rn   boolsuperadd_api_router   )rO   r   rJ   rK   r   	__class__r   rS   r      s   
zChromaAPIRouter.add_api_route)__name__
__module____qualname__rn   r   r   __classcell__rR   rR   r   rS   r      s    &r   c                   @   sv  e Zd ZdefddZdeeef fddZde	e
 deeef fdd	ZdddZdddZdejfddZdededefddZdeeef fddZdededefddZdeeef fddZdefddZdedd
fddZedejed e d!e!d"e"e d#e"e d$e"e dd
fd%d&Z#d e d!e!d"e"e d#e"e d$e"e dd
fd'd(Z$ed)ejdede%fd*d)Z&ed+ejded"edd
fd,d+Z'ed-ejded.ed"ede(fd/d-Z)ed0ejded.ed"edd
fd1d0Z*ed2ejdedd
fd3d2Z+ed4ejded"ede,fd5d4Z-ed6ej	
	
dded"ed7e"e d8e"e de.e( f
d9d6Z/ed:ej	
	
dded"ed.ed7e"e d8e"e de.e0 fd;d:Z1ed<ejded"ed.edefd=d<Z2ed>ejded"ed.ede0fd?d>Z3ed@ejded"ed.edAede0f
dBd@Z4edCejd"ed.edDededd
f
dEdCZ5edFejdedAed"ed.edd
f
dGdFZ6edHejeded"ed.edDede7f
dIdHZ8edJejeded"ed.edDedd
f
dKdJZ9edLejeded"ed.edDedd
f
dMdLZ:edNejedDed"ed.edede;f
dOdNZ<edPejedDed"ed.ededd
f
dQdPZ=edRejeded"ed.edDedef
dSdRZ>edTejedede7fdUdTZ?edVejed"ed.edDedede@f
dWdVZAdeeef fdXdYZBddZd[ZCed\ejed e d!e!d"e"e d#e"e d$e"e deDe"e e"e f fd]d^ZEd e d!e!d"e"e d#e"e d$e"e deDe"e e"e f fd_d`ZFedaejeeGfded"edd
fdbdaZHedcejeeGfded#ed"ede(fdddcZIedeejededd
fdfdeZJedgejeded"ede,fdhdgZKediejed
d
eGeLfded7e"e d8e"e d"ed#ede.e0 fdjdiZMedkejeeGeLfded"ed#edefdldkZNedmejeeGeLfded"ed#ede0fdndmZOedoejeeGeLfdedAed"ed#ede0f
dpdoZPedqejedDededd
fdrdqZQedsejeeGeLfdedAed"ed#edd
f
dtdsZReduejededDede7fdvduZSedwejdedDedd
fdxdwZTedyejededDedd
fdzdyZUed{ejedDedede;fd|d{ZVed}ejedDededd
fd~d}ZWedejededDedefddZXedejedede7fddZYedejedDedede@fddZZd
S )r   settingsc                 C   s  t jt_tjdtd| _t|| _	| j	
t| _i | _| j| j_| jt| _t|j| _| j	t| _| j	  | jdt | jdt | jdt | jjtdg|jdgd | j t!| j" | j t#| j$ | j	t%| _&| j'd| j( d | _)|j*r| j	t+| _)d | _,|j-r| j	t.| _,t/ | _0| 1  | 2  | j3| j0 t4| j t5| j | j	
t}|6t7  d S )NT)debugdefault_response_classhttp*)allow_headersallow_originsallow_methodsshutdown)8rC   FASTAPIrD   SERVER_CONTEXTfastapir   r   _appr(   _systeminstancer)   _api_extra_openapi_schemasgenerate_openapiopenapirequirerE   _opentelemetry_clientr   chroma_server_thread_pool_size_capacity_limiterr/   _quota_enforcerstart
middlewarerz   ru   re   add_middlewarer    chroma_server_cors_allow_originsadd_exception_handlerr.   quota_exception_handlerr-   rate_limit_exception_handlerr0   rM   on_eventr   authn_providerchroma_server_authn_providerr#   authz_providerchroma_server_authz_providerr$   r   routersetup_v1_routessetup_v2_routesinclude_routerr[   r@   capturer<   )rO   r   telemetry_clientrR   rR   rS   __init__   sR   




zFastAPI.__init__rL   c                 C   sB   t d| jjtjdd}| j D ]\}}||d d |< q|S )z_Used instead of the default openapi() generation handler to include manually-populated schemas.Chromachromadb)titlerV   version
componentsschemas)r   r   rV   	importlibmetadatar   r   items)rO   schemakeyvaluerR   rR   rS   r      s   
zFastAPI.generate_openapirequest_modelc                 C   sN   |j dd}d|v r|d  D ]	\}}|| j|< qddd|iiddi}|S )	Nz#/components/schemas/{model})ref_templatez$defsrequestBodyzapplication/jsonr   T)rj   required)model_json_schemar   r   )rO   r   r   r   r   openapi_extrarR   rR   rS   !get_openapi_extras_for_body_model   s   
z)FastAPI.get_openapi_extras_for_body_modelNc              	   C   s  | j jd| jdgd | j jd| jdgd | j jd| jdgd | j jd| jdgd | j jd| jdgd | j jd	| jdgd d
 | j jd| jdgd | 	t
d | j jd| jdgd d
 | j jd| jdgd d
 | j jd| jdgd | 	td | j jd| jdgd d
 | j jd| jdgd d
 | j jd| jdgd d
 | j jd| jdgd d
 | j jd| jdgd | 	td | j jd| jdgtjd | 	td | j jd| jdgd | 	td | j jd| jdgd | 	td | j jd| jdgd | 	td | j jd| jdgd | 	td | j jd| j dgd d
 | j jd| j!dgd | j	t"dd | j jd| j#dgd d
 | j jd| j$dgd | 	t%d | j jd| j&dgd d
 d S )Nz/api/v2GETmethodsz/api/v2/resetPOSTz/api/v2/versionz/api/v2/heartbeatz/api/v2/pre-flight-checksz/api/v2/auth/identityr   response_modelz"/api/v2/tenants/{tenant}/databasesr   r   r   z2/api/v2/tenants/{tenant}/databases/{database_name}DELETEz/api/v2/tenantsz/api/v2/tenants/{tenant}z>/api/v2/tenants/{tenant}/databases/{database_name}/collectionszD/api/v2/tenants/{tenant}/databases/{database_name}/collections_countzR/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}/addr   rk   r   r   zU/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}/updatezU/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}/upsertzR/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}/getzU/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}/deletezT/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}/countzT/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}/query)r   zP/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_name}zN/api/v2/tenants/{tenant}/databases/{database_name}/collections/{collection_id}PUT)'r   r   rootresetr   	heartbeatpre_flight_checksget_user_identitycreate_databaser   r3   get_databasedelete_databasecreate_tenantr4   
get_tenantlist_databaseslist_collectionscount_collectionscreate_collectionr8   addr   HTTP_201_CREATEDr2   updater:   upsertry   r6   deleter5   countget_nearest_neighborsr7   get_collectionupdate_collectionr9   delete_collectionrO   rR   rR   rS   r     s  
	
zFastAPI.setup_v2_routesc                 C   s   | j   d S N)r   stopr   rR   rR   rS   r        zFastAPI.shutdownc                 C   s   | j S r   )r   r   rR   rR   rS   rU     s   zFastAPI.appr\   excc                    s   t dddidS )Ni  rh   zRate limit exceeded.rk   rj   r   rO   r\   r   rR   rR   rS   r     s
   z$FastAPI.rate_limit_exception_handlerc                 C   s   d| j  iS )Nznanosecond heartbeat)r   r   r   rR   rR   rS   r     r   zFastAPI.rootc                    s   t dd| idS )Nri   rh   r   )r   rh   r   rR   rR   rS   r     s
   
zFastAPI.quota_exception_handlerc                    s
   |   S r   )r   r   rR   rR   rS   r     s   zFastAPI.heartbeatc                    s   | j  S r   )r   get_versionr   rR   rR   rS   r     s   
zFastAPI.versionc                 C   s   | j jd|id dS )zU
        Set context about the request on any components that might need it.
        r\   )contextN)r   set_contextrO   r\   rR   rR   rS   _set_request_context  s   zFastAPI._set_request_contextauth_requestrc   actiontenantdatabase
collectionc                    s&   t j| jg|||||fR  I d H S r   )r   run_syncsync_auth_requestrO   rc   r  r  r  r  rR   rR   rS   r    s   $zFastAPI.auth_requestc                 C   sf   | j st|||d dS | j t|}| jsdS t|||d}| j||| t|||d dS )z
        Authenticates and authorizes the request based on the given headers
        and other parameters. If the request cannot be authenticated or cannot
        be authorized (with the configured providers), raises an HTTP 401.
        r  r  r  N)r   rG   authenticate_or_raisedictr   r"   authorize_or_raise)rO   rc   r  r  r  r  user_identityauthz_resourcerR   rR   rS   r    s0   zFastAPI.sync_auth_requestzFastAPI.get_user_identityc                    s8   j stdttgdS ttt fddI d H S )N )user_idr  	databasesc                      s   t tjt jS r   )r   r#   r   r
  r  rc   rR   r\   rO   rR   rS   <lambda>  s    z+FastAPI.get_user_identity.<locals>.<lambda>)r   r    r&   r%   r   r   r  r   rR   r  rS   r     s   zFastAPI.create_databasec                    sN   dt dtdtdd f fdd}tj|| j  I d H jdI d H  d S )Nr  rc   raw_bodyrL   c                    sB   t tt|}|tj| |jd  j d j	
|j| S )Nr\   )r   r3   orjsonloadsr  r!   CREATE_DATABASErX   r   r   r   )r  rc   r  dbr  rR   rS   process_create_database  s   z8FastAPI.create_database.<locals>.process_create_databaselimiterrn   r;   bytesr   r  rc   bodyr   rO   r\   r  r  rR   r  rS   r     s"   zFastAPI.get_databasedatabase_namec                    sB   |  |jtj||d I d H  tttj| jj	||| j
dI d H S Nr  )r  rc   r!   GET_DATABASEr   rA   r   r  r   r   r   rO   r\   r!  r  rR   rR   rS   r   7  s"   

zFastAPI.delete_databasec                    s:   |  |jtj||d  tj| jj||| jdI d H  d S r"  )	r  rc   r!   DELETE_DATABASEr   r  r   r   r   r$  rR   rR   rS   r   P  s   zFastAPI.create_tenantc                    D   dt dtdd f fdd}tj||| I d H  jdI d H  d S )Nr\   r  rL   c                    s6   t tt|} | jtj|jd d   j	
|jS r   )r   r4   r  r  r  rc   r!   CREATE_TENANTrX   r   r   )r\   r  r  r   rR   rS   process_create_tenantk  s   	z4FastAPI.create_tenant.<locals>.process_create_tenantr  r   r  r   r  r  r   rO   r\   r(  rR   r   rS   r   f  s   zFastAPI.get_tenantc                    s@   |  |jtj|d d I d H  tttj| jj	|| j
dI d H S r"  )r  rc   r!   
GET_TENANTr   rB   r   r  r   r   r   )rO   r\   r  rR   rR   rS   r     s    

zFastAPI.list_databaseslimitoffsetc              	      sH   |  |jtj|d d I d H  ttt tj| j	j
|||| jdI d H S r"  )r  rc   r!   LIST_DATABASESr   r   rA   r   r  r   r   r   )rO   r\   r  r,  r-  rR   rR   rS   r     s$   

zFastAPI.list_collectionsc                    s^   dt t dt t dtdtdtt f
 fdd}ttt tj|||||jdI d H }|S )	Nr,  r-  r  r!  rL   c                    sB     jtj||d  j d td|i jj||| |dS )Nr  r  )r  r  r,  r-  )r  rc   r!   LIST_COLLECTIONSr   rG   r   r   )r,  r-  r  r!  r  rR   rS   process_list_collections  s   z:FastAPI.list_collections.<locals>.process_list_collectionsr  )	r   intrn   r   CollectionModelr   r   r  r   )rO   r\   r  r!  r,  r-  r0  api_collection_modelsrR   r  rS   r     s0   	
zFastAPI.count_collectionsc                    sN   |  |jtj||d I d H  td|i tttj| j	j
||| jdI d H S Nr  r  )r  rc   r!   COUNT_COLLECTIONSrG   r   r1  r   r  r   r   r   )rO   r\   r  r!  rR   rR   rS   r     s$   

zFastAPI.create_collectionc              
      V   dt dtdtdtdtf
 fdd}tttj||||| I d H  jdI d H }|S )	Nr\   r  r  r  rL   c                    sv   t tt|}|jst nt|j} | jt	j
|||j  j| d td|i  jj|j||j|j||dS )Nr  r  rX   configurationr   get_or_creater  r  )r   r8   r  r  r8  r   	from_jsonr  rc   r!   CREATE_COLLECTIONrX   r   rG   r   r   r   r9  )r\   r  r  r  creater8  r   rR   rS   process_create_collection  s,   
z<FastAPI.create_collection.<locals>.process_create_collectionr  	r   rn   r  r2  r   r   r  r  r   )rO   r\   r  r!  r=  api_collection_modelrR   r   rS   r     s0   
zFastAPI.get_collectioncollection_namec              	      sT   |  |jtj|||I d H  td|i tttj| j	j
|||| jdI d H }|S r4  )r  rc   r!   GET_COLLECTIONrG   r   r2  r   r  r   r   r   )rO   r\   r  r!  r@  r?  rR   rR   rS   r   )  s(   


zFastAPI.update_collectioncollection_idc                    sN   dt dtdtdd f fdd}tj|||| I d H jdI d H  d S )Nr\   rB  r  rL   c                    s\   t tt|}| jtj | j| d t	di j
jt||j|j dS )Nr  r  )idnew_namenew_metadatar  r  )r   r9   r  r  r  rc   r!   UPDATE_COLLECTIONr   rG   r   _modify_uuidrD  rE  r\   rB  r  r   r!  rO   r  rR   rS   process_update_collectionO  s"   z<FastAPI.update_collection.<locals>.process_update_collectionr  r   rn   r  r   r  r  r   )rO   r  r!  rB  r\   rK  rR   rJ  rS   r   G  s"   zFastAPI.delete_collectionc                    sN   |  |jtj|||I d H  td|i tj| jj|||| j	dI d H  d S r4  )
r  rc   r!   DELETE_COLLECTIONrG   r   r  r   r   r   )rO   r\   r@  r  r!  rR   rR   rS   r   l  s    
zFastAPI.addc              
      sx   z&dt dtdtf fdd}tttj||| I d H jdI d H W S  ty; } zt	dt
|dd }~ww )	Nr\   r  rL   c              
      |   t tt|}| jtj  j| d t	di j
jt |jtt|jr1t|jnd |j|j|jdS Nr  r  )rB  ids
embeddings	metadatas	documentsurisr  r  )r   r2   r  r  r  rc   r!   ADDr   rG   r   _addrH  rP  r   r   rQ  r   rR  rS  rT  r\   r  r   rB  r!  rO   r  rR   rS   process_add  s2   z FastAPI.add.<locals>.process_addr  rl   rk   detailr   r  r   r   r   r  r  r   r+   r   rn   )rO   r\   r  r!  rB  rY  rt   rR   rX  rS   r     s    	 
	zFastAPI.updatec                    J   dt dtdtf fdd}tj||| I d H jdI d H  d S )Nr\   r  rL   c              
      sv   t tt|}| jtj  j| d t	di j
jt |j|jr/t|jnd |j|j|jdS rO  )r   r:   r  r  r  rc   r!   UPDATEr   rG   r   _updaterH  rP  rQ  r   rR  rS  rT  r\   r  r   rX  rR   rS   process_update  s,   z&FastAPI.update.<locals>.process_updater  r   r  r   r   r  r  r   )rO   r\   r  r!  rB  ra  rR   rX  rS   r     s    	zFastAPI.upsertc                    r]  )Nr\   r  rL   c              
      rN  rO  )r   r2   r  r  r  rc   r!   UPSERTr   rG   r   _upsertrH  rP  r   r   rQ  r   rR  rS  rT  r\   r  r   rX  rR   rS   process_upsert  s2   z&FastAPI.upsert.<locals>.process_upsertr  rb  )rO   r\   r  r!  rB  rf  rR   rX  rS   r     s    	zFastAPI.getc                    r   dt dtdtf fdd}tttj||| I d H jdI d H }|d d ur7dd	 |d D |d< |S )
Nr\   r  rL   c                    sp   t tt|}| jtj  j| d t	di j
jt |j|j|j|j|j|j|jd
S )Nr  r  )
rB  rP  wheresortr,  r-  where_documentincluder  r  )r   r6   r  r  r  rc   r!   r   r   rG   r   _getrH  rP  rh  ri  r,  r-  rj  rk  r\   r  ry   rX  rR   rS   process_get  s,   z FastAPI.get.<locals>.process_getr  rQ  c                 S      g | ]	}t t| qS rR   r   r   tolist.0	embeddingrR   rR   rS   
<listcomp>:      zFastAPI.get.<locals>.<listcomp>r   r  r   r   r   r  r  r   )rO   rB  r  r!  r\   rn  
get_resultrR   rX  rS   ry     s     	


zFastAPI.deletec                    sJ   dt dtdd f fdd}tj||| I d H jdI d H  d S )Nr\   r  rL   c                    s`   t tt|}| jtj  j| d t	di j
jt |j|j|jdS )Nr  r  )rB  rP  rh  rj  r  r  )r   r5   r  r  r  rc   r!   r   r   rG   r   _deleterH  rP  rh  rj  r\   r  r   rX  rR   rS   process_deleteJ  s$   z&FastAPI.delete.<locals>.process_deleter  r)  )rO   rB  r  r!  r\   r{  rR   rX  rS   r   A  s    	zFastAPI.countc              	      sT   |  |jtj|||I d H  td|i tttj| j	j
t|||| jdI d H S r4  )r  rc   r!   COUNTrG   r   r1  r   r  r   _countrH  r   )rO   r\   r  r!  rB  rR   rR   rS   r   e  s&   	

zFastAPI.resetc                    >   |  |jtjd d d I d H  tttj| jj	| j
dI d H S r"  )r  rc   r!   RESETr   r   r   r  r   r   r   r   rR   rR   rS   r        

zFastAPI.get_nearest_neighborsc                    rg  )
Nr\   r  rL   c              
      s|   t tt|}| jtj  j| d t	di j
jt tt|jr/t|jnd |j|j|j|jdS )Nr  r  )rB  query_embeddings	n_resultsrh  rj  rk  r  r  )r   r7   r  r  r  rc   r!   QUERYr   rG   r   _queryrH  r   r   r  r   r  rh  rj  rk  r\   r  queryrX  rR   rS   process_query  s2   z4FastAPI.get_nearest_neighbors.<locals>.process_queryr  rQ  c                 S      g | ]	}d d |D qS )c                 S   ro  rR   rp  rr  rR   rR   rS   ru        z<FastAPI.get_nearest_neighbors.<locals>.<listcomp>.<listcomp>rR   rs  resultrR   rR   rS   ru    rv  z1FastAPI.get_nearest_neighbors.<locals>.<listcomp>r   r  r   r   r   r  r  r   )rO   r  r!  rB  r\   r  nnresultrR   rX  rS   r     s     	


c                    s@   dt ttf f fdd}tt ttf tj| jdI d H S )NrL   c                      s   d j  iS )Nmax_batch_size)r   get_max_batch_sizerR   r   rR   rS   process_pre_flight_checks  s   
z<FastAPI.pre_flight_checks.<locals>.process_pre_flight_checksr  )r   rn   r   r   r   r  r   )rO   r  rR   r   rS   r     s   

zFastAPI.pre_flight_checksc              	   C   s^  | j jd| jdgd | j jd| jdgd | j jd| jdgd | j jd| jdgd | j jd| jdgd | j jd	| jdgd | t	d
 | j jd| j
dgd d | j jd| jdgd | td
 | j jd| jdgd d | j jd| jdgd d | j jd| jdgd d | j jd| jdgd | td
 | j jd| jdgtjd | td | j jd| jdgd | td
 | j jd| jdgd | td
 | j jd| jdgd | td
 | j jd| jdgd | td
 | j jd| jdgd d | j jd| jdgd | td
 | j jd| j dgd d | j jd| j!dgd | t"d
 | j jd| j#dgd d d S )Nz/api/v1r   r   z/api/v1/resetr   z/api/v1/versionz/api/v1/heartbeatz/api/v1/pre-flight-checksz/api/v1/databasesr   z/api/v1/databases/{database}r   z/api/v1/tenantsz/api/v1/tenants/{tenant}z/api/v1/collectionsz/api/v1/count_collectionsz'/api/v1/collections/{collection_id}/addr   z*/api/v1/collections/{collection_id}/updatez*/api/v1/collections/{collection_id}/upsertz'/api/v1/collections/{collection_id}/getz*/api/v1/collections/{collection_id}/deletez)/api/v1/collections/{collection_id}/countz)/api/v1/collections/{collection_id}/queryz%/api/v1/collections/{collection_name}z#/api/v1/collections/{collection_id}r   r   )$r   r   r   r   r   r   r   create_database_v1r   r3   get_database_v1create_tenant_v1r4   get_tenant_v1list_collections_v1count_collections_v1create_collection_v1r8   add_v1r   r   r2   	update_v1r:   	upsert_v1get_v1r6   	delete_v1r5   count_v1get_nearest_neighbors_v1r7   get_collection_v1update_collection_v1r9   delete_collection_v1r   rR   rR   rS   r     s   

zFastAPI.setup_v1_routes/auth_and_get_tenant_and_database_for_request_v1c                    s   t | j|||||I dH S )a  
        Authenticates and authorizes the request based on the given headers
        and other parameters. If the request cannot be authenticated or cannot
        be authorized (with the configured providers), raises an HTTP 401.

        If the request is authenticated and authorized, returns the tenant and
        database to be used for the request. These will differ from the passed
        tenant and database if and only if:
        - The request is authenticated
        - chroma_overwrite_singleton_tenant_database_access_from_auth = True
        - The passed tenant or database are None or default_{tenant, database}
            (can be overwritten separately)
        - The user has access to a single tenant and/or single database.
        N)r   r  ,auth_and_get_tenant_and_database_for_requestr  rR   rR   rS   r  a  s   z4FastAPI.auth_and_get_tenant_and_database_for_requestc           
      C   s   | j st|||d ||fS | j t|}| j |\}}|r%|tkr)|r)|}|r/|tkr3|r3|}| js:||fS t|||d}	| j	|||	 t|||d ||fS )Nr	  )
r   rG   r
  r  'singleton_tenant_database_if_applicabler&   r%   r   r"   r  )
rO   rc   r  r  r  r  r  
new_tenantnew_databaser  rR   rR   rS   1sync_auth_and_get_tenant_and_database_for_request~  s@   	
z9FastAPI.sync_auth_and_get_tenant_and_database_for_requestzFastAPI.create_database_v1c                    sL   dt dtdtdd f fdd}tj|||j| I d H  jdI d H  d S )Nr  rc   r  rL   c                    sL   t tt|} |tj| |jd \}}|r|} |r||_ j	|j| S r   )
r   r3   r  r  r  r!   r  rX   r   r   )r  rc   r  r  maybe_tenantmaybe_databaser   rR   rS   r    s    z;FastAPI.create_database_v1.<locals>.process_create_databaser  r  r   rR   r   rS   r    s"   zFastAPI.get_database_v1c                    sV   |  |jtj||d I d H \}}|r|}|r|}tttj| jj	||| j
dI d H S r"  )r  rc   r!   r#  r   rA   r   r  r   r   r   )rO   r\   r  r  r  r  rR   rR   rS   r    0   
zFastAPI.create_tenant_v1c                    r&  )Nr\   r  rL   c                    sD   t tt|} | jtj|jd d \}}|r||_ j	
|jS r   )r   r4   r  r  r  rc   r!   r'  rX   r   r   )r\   r  r  r  _r   rR   rS   r(    s   z7FastAPI.create_tenant_v1.<locals>.process_create_tenantr  r)  r*  rR   r   rS   r    s   zFastAPI.get_tenant_v1c                    sL   |  |jtj|d d I d H \}}|r|}tttj| jj	|| j
dI d H S r"  )r  rc   r!   r+  r   rB   r   r  r   r   r   )rO   r\   r  r  r  rR   rR   rS   r    s$   
zFastAPI.list_collections_v1c           	   
      sb   |  |jtj||d I d H \}}|r|}|r|}ttt tj| j	j
||||| jdI d H }|S r"  )r  rc   r!   r/  r   r   r2  r   r  r   r   r   )	rO   r\   r,  r-  r  r  r  r  r3  rR   rR   rS   r  ,  s6   
zFastAPI.count_collections_v1c                    sV   |  |jtj||d I d H \}}|r|}|r|}tttj| jj	||| j
dI d H S r"  )r  rc   r!   r5  r   r1  r   r  r   r   r   )rO   r\   r  r  r  r  rR   rR   rS   r  S  r  zFastAPI.create_collection_v1c              
      r6  )	Nr\   r  r  r  rL   c                    sr   t tt|}|jst nt|j} | jt	j
|||j\}}|r&|}|r*|} jj|j||j|j||dS )Nr7  )r   r8   r  r  r8  r   r:  r  rc   r!   r;  rX   r   r   r   r9  )r\   r  r  r  r<  r8  r  r  r   rR   rS   r=  |  s6   
	z?FastAPI.create_collection_v1.<locals>.process_create_collectionr  r>  )rO   r\   r  r  r=  r?  rR   r   rS   r  t  s0   "
zFastAPI.get_collection_v1c                    sP    |jtj I d H \}}|r||r| fdd}| I d H S )Nc               	      s,   t ttjjj jdI d H } | S r"  )r   r2  r   r  r   r   r   )r?  r@  r  rO   r  rR   rS   inner  s   

z(FastAPI.get_collection_v1.<locals>.inner)r  rc   r!   rA  )rO   r\   r@  r  r  r  r  r  rR   r  rS   r    s"   zFastAPI.update_collection_v1c                    sJ   dt dtdtdd f fdd}tj|||| I d H  jdI d H  d S )Nr\   rB  r  rL   c                    s@   t tt|} | jtjd d |  jj	t
||j|jdS )N)rC  rD  rE  )r   r9   r  r  r  rc   r!   rF  r   rG  rH  rD  rE  rI  r   rR   rS   rK    s   z?FastAPI.update_collection_v1.<locals>.process_update_collectionr  rL  )rO   rB  r\   rK  rR   r   rS   r    s"   zFastAPI.delete_collection_v1c                    sV   |  |jtj|||I d H \}}|r|}|r|}tj| jj|||| jdI d H  d S r"  )	r  rc   r!   rM  r   r  r   r   r   )rO   r\   r@  r  r  r  r  rR   rR   rS   r    s,   zFastAPI.add_v1c              
      st   z$dt dtdtf fdd}tttj||| I d H jdI d H W S  ty9 } zt	dt
|dd }~ww )	Nr\   r  rL   c                    `   t tt|}| jtjd d   jj	t
 |jtt|jr%t|jnd |j|j|jdS N)rB  rP  rQ  rR  rS  rT  )r   r2   r  r  r  rc   r!   rU  r   rV  rH  rP  r   r   rQ  r   rR  rS  rT  rW  rB  rO   rR   rS   rY    s*   z#FastAPI.add_v1.<locals>.process_addr  rl   rZ  r\  )rO   r\   rB  rY  rt   rR   r  rS   r    s    
	zFastAPI.update_v1c                    F   dt dtdtf fdd}tj||| I d H jdI d H  d S )Nr\   r  rL   c                    sZ   t tt|}| jtjd d   jj	t
 |j|jr#t|jnd |j|j|jdS r  )r   r:   r  r  r  rc   r!   r^  r   r_  rH  rP  rQ  r   rR  rS  rT  r`  r  rR   rS   ra  D  s$   z)FastAPI.update_v1.<locals>.process_updater  rb  )rO   r\   rB  ra  rR   r  rS   r  >  s   zFastAPI.upsert_v1c                    r  )Nr\   r  rL   c                    r  r  )r   r2   r  r  r  rc   r!   rc  r   rd  rH  rP  r   r   rQ  r   rR  rS  rT  re  r  rR   rS   rf  h  s*   z)FastAPI.upsert_v1.<locals>.process_upsertr  rb  )rO   r\   rB  rf  rR   r  rS   r  a  s   zFastAPI.get_v1c                    n   dt dtdtf fdd}tttj||| I d H jdI d H }|d d ur5dd	 |d D |d< |S )
Nr\   r  rL   c              
      sT   t tt|}| jtjd d   jj	t
 |j|j|j|j|j|j|jdS )N)rB  rP  rh  ri  r,  r-  rj  rk  )r   r6   r  r  r  rc   r!   r   r   rl  rH  rP  rh  ri  r,  r-  rj  rk  rm  r  rR   rS   rn    s$   z#FastAPI.get_v1.<locals>.process_getr  rQ  c                 S   ro  rR   rp  rr  rR   rR   rS   ru    rv  z"FastAPI.get_v1.<locals>.<listcomp>rw  )rO   rB  r\   rn  rx  rR   r  rS   r    s    


zFastAPI.delete_v1c                    sF   dt dtdd f fdd}tj||| I d H jdI d H  d S )Nr\   r  rL   c                    sD   t tt|}| jtjd d   jj	t
 |j|j|jdS )N)rB  rP  rh  rj  )r   r5   r  r  r  rc   r!   r   r   ry  rH  rP  rh  rj  rz  r  rR   rS   r{    s   z)FastAPI.delete_v1.<locals>.process_deleter  r)  )rO   rB  r\   r{  rR   r  rS   r    s   zFastAPI.count_v1c                    sD   |  |jtjd d |I d H  tttj| jj	t
|| jdI d H S r"  )r  rc   r!   r|  r   r1  r   r  r   r}  rH  r   )rO   r\   rB  rR   rR   rS   r    s    

zFastAPI.reset_v1c                    r~  r"  )r  rc   r!   r  r   r   r   r  r   r   r   r   rR   rR   rS   reset_v1  r  z FastAPI.get_nearest_neighbors_v1c                    r  )
Nr\   r  rL   c                    s`   t tt|}| jtjd d   jj	t
 tt|jr#t|jnd |j|j|j|jdS )N)rB  r  r  rh  rj  rk  )r   r7   r  r  r  rc   r!   r  r   r  rH  r   r   r  r   r  rh  rj  rk  r  r  rR   rS   r  
  s*   z7FastAPI.get_nearest_neighbors_v1.<locals>.process_queryr  rQ  c                 S   r  )c                 S   ro  rR   rp  rr  rR   rR   rS   ru  /  r  z?FastAPI.get_nearest_neighbors_v1.<locals>.<listcomp>.<listcomp>rR   r  rR   rR   rS   ru  .  rv  z4FastAPI.get_nearest_neighbors_v1.<locals>.<listcomp>r  )rO   rB  r\   r  r  rR   r  rS   r    s    	


)rL   N)NN)[r   r   r   r'   r   r   rn   r   r   r	   r{   r   r   r   r   r   rU   r   r-   r   r   r1  r   r.   r   r   r   r   rH   rF   	OPERATIONrN   r;   r!   r   r  r  r    r   r   rA   r   r   r   rB   r   r   r   r2  r   r   r   r   r   r   r   r   r   r   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  r  rR   rR   rR   rS   r      s   6


 





,







(

2

$

0
(
+
1
"

6
 

2
#



%

5
%


*
"
%
+

r   )utypingr   r   r   r   r   r   r   r	   r
   r   r   r  anyior   r   r   _FastAPIr   r   fastapi.openapi.utilsr   fastapi.middleware.corsr   fastapi.responsesr   fastapi.routingr   r   r   	functoolsr   chromadb.api.configurationr   pydanticr   chromadb.api.typesr   r   r   r   r   chromadb.authr    r!   r"   r#   r$   chromadb.configr%   r&   r'   r(   chromadb.apir)   chromadb.errorsr*   r+   r,   r-   r.   chromadb.quotar/   chromadb.rate_limitr0   chromadb.serverr1   chromadb.server.fastapi.typesr2   r3   r4   r5   r6   r7   r8   r9   r:   starlette.datastructuresr;   loggingimportlib.metadatar   !chromadb.telemetry.product.eventsr<   chromadb.utils.fastapir=   r>   rH  opentelemetryr?   (chromadb.telemetry.opentelemetry.fastapir@   chromadb.typesrA   rB   chromadb.telemetry.productrC   rD    chromadb.telemetry.opentelemetryrE   rF   rG   rH   rI   r2  	getLoggerr   rq   rN   r[   re   ru   rz   r{   r   	APIRouterr   rR   rR   rR   rS   <module>   s|   0 ,

	

	