
    eid                         d dl 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mZ d dlmZ d dlmZ  ej"                  e      Z G d d	      Zy)
    )ClassVarDictOptionalN)	ServerAPI)BaseHTTPClient)SettingsSystem)ProductTelemetryClient)ClientStartEventc                      e Zd ZU i Zeeeef      ed<   eed<    e	       fde	ddfdZ
edede	defd       Zede	defd	       Zed
edefd       Zed
edd fd       Zedd       Zedefd       ZddZedee   fd       Zy)SharedSystemClient_identifier_to_system_identifiersettingsreturnNc                 x    t         j                  |      | _        t         j                  | j                  |       y N)r   _get_identifier_from_settingsr   _create_system_if_not_exists)selfr   s     k/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/chromadb/api/shared_system_client.py__init__zSharedSystemClient.__init__   s-     .KKHU778H8H(S    
identifierc                 @   || j                   vrUt        |      }|| j                   |<   |j                  t               |j                  t               |j                          n-| j                   |   }|j                  |k7  rt        d| d      | j                   |   S )Nz)An instance of Chroma already exists for z with different settings)r   r	   instancer
   r   startr   
ValueError)clsr   r   
new_systemprevious_systems        r   r   z/SharedSystemClient._create_system_if_not_exists   s     S666)J4>C%%j1 67	*!77
CO ''83 ?
|Kcd  ((44r   c                     d}| j                   }|t        d      |dv r| j                  r| j                  }|S d}|S |dv rt	        t        j                               }|S t        d|       )N z1Chroma API implementation must be set in settings)zchromadb.api.segment.SegmentAPIz!chromadb.api.rust.RustBindingsAPI	ephemeral)zchromadb.api.fastapi.FastAPIz'chromadb.api.async_fastapi.AsyncFastAPIz&Unsupported Chroma API implementation )chroma_api_implr   is_persistentpersist_directorystruuiduuid4)r   r   api_impls      r   r   z0SharedSystemClient._get_identifier_from_settings/   s    
++PQQ 
 
 %%%77
       
 

 TZZ\*J  EhZPQQr   systemc                 j    t         j                  | j                        }| t         j                  |<   |S r   )r   r   r   r   )r,   r   s     r   _populate_data_from_systemz-SharedSystemClient._populate_data_from_systemK   s-    'EEfooV
?E00<r   c                 T    t         j                  |        | |j                        }|S )zRCreate a client from an existing system. This is useful for testing and debugging.)r   r.   r   )r   r,   r   s      r   from_systemzSharedSystemClient.from_systemQ   s%     	55f=v'r   c                      i t         _        y r   )r   r    r   r   clear_system_cachez%SharedSystemClient.clear_system_cacheY   s    350r   c                 <    t         j                  | j                     S r   )r   r   r   )r   s    r   _systemzSharedSystemClient._system]   s    !778H8HIIr   c                 t    | j                   j                  t              }|j                  t	                      y r   )r5   r   r
   capturer   )r   telemetry_clients     r   _submit_client_start_eventz-SharedSystemClient._submit_client_start_eventa   s*    <<001GH  !1!34r   c                     g } t        t        j                  j                               }|D ]  }	 |j	                  t
              }t        |t              s*|j                         }d|vrd|vrC|j                         }d}|j                         D ]  \  }}|j                         dk(  s|} n |r| j                  |        | syt        |       dkD  rt        j!                  d| d   dd  d	       | d   S # t        $ r Y w xY w)
a
  
        Try to extract api key from existing client instances by checking httpx session headers.

        Requirements to pull api key:
        - must be a BaseHTTPClient instance (ignore RustBindingsAPI and SegmentAPI)
        - must have "api.trychroma.com" or "gcp.trychroma.com" in the _api_url (ignore local/self-hosted instances)
        - must have "x-chroma-token" or "X-Chroma-Token" in the headers

        Returns:
            The first api key found, or None if no client instances have api keys set.
        zapi.trychroma.comzgcp.trychroma.comNzx-chroma-token   zAMultiple Chroma Cloud clients found, using API key starting with r      z...)listr   r   valuesr   r   
isinstancer   get_api_urlget_request_headersitemslowerappend	Exceptionlenloggerinfo)	api_keyssystems_snapshotr,   
server_apiapi_urlheadersapi_keykeyvalues	            r   %get_chroma_cloud_api_key_from_clientsz8SharedSystemClient.get_chroma_cloud_api_key_from_clientse   s+    ! 2 H H O O QR& 	F#__Y7
!*n= %002'w6+7:$88:")--/ JCyy{&66"'
 OOG,1	:  x=1KKST\]^T_`babTcSddgh {  s#   %C:C:/;C:+C::	DD)r   N)__name__
__module____qualname__r   r   r   r(   r	   __annotations__r   r   classmethodr   staticmethodr   r.   r0   r3   propertyr5   r9   r   rQ   r2   r   r   r   r      s+   9;8Df$56; &ZTT 
T 55(05	5 5,  S  6 6 c  
  ,@   6 6 J J J5 58C= 5 5r   r   )typingr   r   r   loggingr)   chromadb.apir   chromadb.api.base_http_clientr   chromadb.configr   r	   chromadb.telemetry.productr
   !chromadb.telemetry.product.eventsr   	getLoggerrR   rG   r   r2   r   r   <module>ra      s>    + +   " 8 , = >			8	$N Nr   