§
    ˜Štjõ  ã                   ó¬   — d dl mZmZmZ d dl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dS )
é    )ÚClassVarÚDictÚOptionalN)Ú	ServerAPI)ÚBaseHTTPClient)ÚSettingsÚSystem)ÚProductTelemetryClient)ÚClientStartEventc                   ó  — e Zd ZU i Zeeeef                  ed<   i Z	eeee
f                  ed<    ej        ¦   «         Zeej                 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	edd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dS )ÚSharedSystemClientÚ_identifier_to_systemÚ_identifier_to_refcountÚ_refcount_lockÚ_identifierÚsettingsÚreturnNc                 óÂ   — t                                |¦  «        | _        t                                | j        |¦  «         t                                | j        ¦  «         d S ©N)r   Ú_get_identifier_from_settingsr   Ú_create_system_if_not_existsÚ_increment_refcount)Úselfr   s     ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/chromadb/api/shared_system_client.pyÚ__init__zSharedSystemClient.__init__   sP   € õ .×KÒKÈHÑUÔUˆÔÝ×7Ò7¸Ô8HÈ(ÑSÔSÐSÝ×.Ò.¨tÔ/?Ñ@Ô@Ð@Ð@Ð@ó    Ú
identifierc                 óH  — || j         vrbt          |¦  «        }|| j         |<   |                     t          ¦  «         |                     t          ¦  «         |                     ¦   «          n+| j         |         }|j        |k    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Ý Ñ)Ô)ˆJØ4>ˆCÔ% jÑ1à×ÒÕ 6Ñ7Ô7Ð7Ø×Ò¥	Ñ*Ô*Ð*à×ÒÑÔÐÐà!Ô7¸
ÔCˆOð Ô'¨8Ò3Ð3Ý ØdÀ
ÐdÐdÐdñô ð ð Ô(¨Ô4Ð4r   c                 óÔ   — d}| j         }|€t          d¦  «        ‚|dv r| j        r| j        }n:d}n7|dv r!t	          t          j        ¦   «         ¦  «        }nt          d|› �¦  «        ‚|S )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_settings3   s¡   € àˆ
ØÔ+ˆàÐÝÐPÑQÔQÐQØð 
ð 
ð 
ð Ô%ð Ø%Ô7�
�
ð  ð �
ð ð 
ð 
ð 
õ
 �TœZ™\œ\Ñ*Ô*ˆJˆJåÐPÀhÐPÐPÑQÔQÐQàÐr   Úsystemc                 ób   — t                                | j        ¦  «        }| t           j        |<   |S r   )r   r   r   r   )r/   r   s     r   Ú_populate_data_from_systemz-SharedSystemClient._populate_data_from_systemO   s+   € å'×EÒEÀfÄoÑVÔVˆ
Ø?EÕÔ0°Ñ<ØÐr   c                 óZ   — t                                |¦  «          | |j        ¦  «        }|S )zRCreate a client from an existing system. This is useful for testing and debugging.)r   r1   r   )r"   r/   r   s      r   Úfrom_systemzSharedSystemClient.from_systemU   s.   € õ 	×5Ò5°fÑ=Ô=Ð=Ø�3�v”Ñ'Ô'ˆØˆr   c                 ó–   — | j         5  || j        vr
d| j        |<   | j        |xx         dz  cc<   ddd¦  «         dS # 1 swxY w Y   dS )z6Increment the reference count for a system identifier.r   é   N©r   r   )r"   r   s     r   r   z&SharedSystemClient._increment_refcount]   s«   € ð Ôð 	9ð 	9Ø Ô!<Ð<Ð<Ø:;�Ô+¨JÑ7ØÔ'¨
Ð3Ð3Ô3°qÑ8Ð3Ð3Ñ3ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s   ˆ)>¾AÁAc                 óÖ   — | j         5  || j        v r>| j        |xx         dz  cc<   | j        |         }|dk    r| j        |= |cddd¦  «         S 	 ddd¦  «         dS # 1 swxY w Y   dS )zODecrement the reference count for a system identifier and return the new count.r5   r   Nr6   )r"   r   Úcounts      r   Ú_decrement_refcountz&SharedSystemClient._decrement_refcounte   sï   € ð Ôð 	ð 	Ø˜SÔ8Ð8Ð8ØÔ+¨JÐ7Ð7Ô7¸1Ñ<Ð7Ð7Ñ7ØÔ3°JÔ?�Ø˜A’:�:ØÔ3°JÐ?Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ;AÁAÁA"Á%A"c                 ó¦   — |                       |¦  «        }|dk    r3| j                             |d¦  «        }|�|                     ¦   «          dS dS dS )zäDecrement refcount and stop the system if this was the last reference.

        This consolidates the "decrement + conditional stop" pattern used in
        both Client.close() and the Client.__init__ exception handler.
        r   N)r9   r   ÚpopÚstop)r"   r   Úrefcountr/   s       r   Ú_release_systemz"SharedSystemClient._release_systemq   s\   € ð ×*Ò*¨:Ñ6Ô6ˆØ�qŠ=ˆ=ØÔ.×2Ò2°:¸tÑDÔDˆFØÐ!Ø—’‘”���ð ˆ=à!Ð!r   c                  ó6   — i t           _        i t           _        d S r   )r   r   r   © r   r   Úclear_system_cachez%SharedSystemClient.clear_system_cache~   s   € à35ÕÔ0Ø57ÕÔ2Ð2Ð2r   c                 ó0   — t           j        | j                 S r   )r   r   r   )r   s    r   Ú_systemzSharedSystemClient._systemƒ   s   € å!Ô7¸Ô8HÔIÐIr   c                 ó†   — | j                              t          ¦  «        }|                     t	          ¦   «         ¦  «         d S r   )rC   r   r
   Úcapturer   )r   Útelemetry_clients     r   Ú_submit_client_start_eventz-SharedSystemClient._submit_client_start_event‡   s:   € Øœ<×0Ò0Õ1GÑHÔHÐØ× Ò Õ!1Ñ!3Ô!3Ñ4Ô4Ð4Ð4Ð4r   c                  ó~  — g } t          t          j                             ¦   «         ¦  «        }|D ]Ã}	 |                     t
          ¦  «        }t          |t          ¦  «        sŒ3|                     ¦   «         }d|vrd|vrŒP| 	                    ¦   «         }d}| 
                    ¦   «         D ]!\  }}|                     ¦   «         dk    r|} nŒ"|r|                      |¦  «         Œ´# t          $ r Y ŒÀw xY w| sdS t          | ¦  «        dk    r,t                               d| d         dd…         › d	�¦  «         | d         S )
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-tokenr5   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_clients‹   sƒ  € ð !ˆÝÕ 2Ô H× OÒ OÑ QÔ QÑRÔRÐØ&ð 	ð 	ˆFðØ#Ÿ_š_­YÑ7Ô7�
å! *­nÑ=Ô=ð àð %×0Ò0Ñ2Ô2�à'¨wÐ6Ð6Ø+°7Ð:Ð:àà$×8Ò8Ñ:Ô:�Ø�Ø")§-¢-¡/¤/ð ð ‘J�C˜Ø—y’y‘{”{Ð&6Ò6Ð6Ø"'˜Ø˜ð 7ð ð -Ø—O’O GÑ,Ô,Ð,øøÝð ð ð à�ðøøøð ð 	Ø�4õ ˆx‰=Œ=˜1ÒÐÝ�KŠKØhÐT\Ð]^ÔT_Ð`bÐabÐ`bÔTcÐhÐhÐhñô ð ð ˜Œ{Ðs   ³/C$Á#C$Â A#C$Ã$
C1Ã0C1)r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r+   r	   Ú__annotations__r   ÚintÚ	threadingÚLockr   r   r   Úclassmethodr   Ústaticmethodr   r1   r3   r   r9   r>   rA   ÚpropertyrC   rG   r   r^   r@   r   r   r   r      s•  € € € € € € Ø9;Ð˜8 D¨¨f¨Ô$5Ô6Ð;Ð;Ñ;Ø8:Ð˜X d¨3°¨8¤nÔ5Ð:Ð:Ñ:Ø/=¨y¬~Ñ/?Ô/?€N�H˜Yœ^Ô,Ð?Ð?Ñ?ØÐÐÑð &˜X™ZœZðAð AàðAð 
ðAð Að Að Að ð5Øð5Ø(0ð5à	ð5ð 5ð 5ñ „[ð5ð, ð°ð ¸Sð ð ð ñ „\ðð6 ð¨6ð °cð ð ð ñ „\ðð
 ð ð Ð,@ð ð ð ñ „[ðð ð9¨Sð 9°Tð 9ð 9ð 9ñ „[ð9ð ð	¨Sð 	°Sð 	ð 	ð 	ñ „[ð	ð ð
¨ð 
°ð 
ð 
ð 
ñ „[ð
ð ð8ð 8ð 8ñ „\ð8ð ðJ˜ð Jð Jð Jñ „XðJð5ð 5ð 5ð 5ð ð5°8¸C´=ð 5ð 5ð 5ñ „\ð5ð 5ð 5r   r   )Útypingr   r   r   Úloggingrd   r,   Úchromadb.apir   Úchromadb.api.base_http_clientr   Úchromadb.configr   r	   Úchromadb.telemetry.productr
   Ú!chromadb.telemetry.product.eventsr   Ú	getLoggerr_   rT   r   r@   r   r   ú<module>rq      sï   ðØ +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø €€€Ø Ð Ð Ð Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø =Ð =Ð =Ð =Ð =Ð =Ø >Ð >Ð >Ð >Ð >Ð >à	ˆÔ	˜8Ñ	$Ô	$€ðsð sð sð sð sñ sô sð sð sð sr   