Ë
    ³Œjb  ã                  óà  — d Z ddlmZ ddlZddlZddl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 ddlmZ ddlmZ dd	lmZmZmZmZmZ er	  ej2                  d
«      ZdZdZdZe G d„ d«      «       Ze G d„ d«      «       Z G d„ de
«      Z  G d„ de «      Z! G d„ de «      Z" e!«       Z# e"«       Z$eeedœ	 	 	 	 	 	 	 d d„Z%eeedœ	 	 	 	 	 	 	 d d„Z&d!d„Z' G d„ de!«      Z( G d„ de"«      Z)y)"z°Prompt caching module for LangSmith SDK.

This module provides thread-safe LRU caches with background refresh
for prompt caching. Includes both sync and async implementations.
é    )ÚannotationsN)ÚABC)ÚOrderedDict)Ú	Awaitable)Ú	dataclass)ÚPath)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚUnionzlangsmith.cachei,  éd   é<   c                  ó<   — e Zd ZU dZded<   ded<   dZded<   d
d	„Zy)Ú
CacheEntryz4A single cache entry with metadata for TTL tracking.r
   ÚvalueÚfloatÚ
created_atNzOptional[Callable[[], Any]]Úrefresh_funcc                óP   — |€yt        j                   «       | j                  z
  |kD  S )z/Check if entry is past its TTL (needs refresh).F)Útimer   )ÚselfÚttl_secondss     ú`/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langsmith/prompt_cache.pyÚis_stalezCacheEntry.is_stale)   s%   € àÐØÜ—	‘	“˜dŸo™oÑ-°Ñ<Ð<ó    )r   úOptional[float]ÚreturnÚbool)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   © r   r   r   r   !   s    … á>àƒJØÓØ04€LÐ-Ó4ô=r   r   c                  ón   — e Zd ZU dZdZded<   dZded<   dZded<   dZded<   e	dd„«       Z
e	dd	„«       Zy
)ÚCacheMetricszCache performance metrics.r   ÚintÚhitsÚmissesÚ	refreshesÚrefresh_errorsc                ó4   — | j                   | j                  z   S )z%Total cache requests (hits + misses).)r)   r*   ©r   s    r   Útotal_requestszCacheMetrics.total_requests9   s   € ð �y‰y˜4Ÿ;™;Ñ&Ð&r   c                óF   — | j                   }|dkD  r| j                  |z  S dS )zCache hit rate (0.0 to 1.0).r   g        )r/   r)   )r   Útotals     r   Úhit_ratezCacheMetrics.hit_rate>   s)   € ð ×#Ñ#ˆØ$)¨A¢Iˆt�y‰y˜5Ñ Ð6°3Ð6r   N)r   r(   )r   r   )r    r!   r"   r#   r)   r$   r*   r+   r,   Úpropertyr/   r2   r%   r   r   r'   r'   0   sQ   … á$à€Dˆ#ƒMØ€FˆCƒOØ€IˆsÓØ€N�CÓàò'ó ð'ð ò7ó ñ7r   r'   c                  ó    — e Zd ZdZg d¢Zeeef	 	 	 	 	 	 	 dd„Ze	dd„«       Z
dd„Zdd„Zdd„Zdd„Zdd	„Zdd
„Zdd„Zdd„Z	 	 	 	 	 	 	 	 dd„Zy)Ú_BasePromptCachez­Base class for prompt caches with shared LRU logic.

    Provides thread-safe in-memory LRU cache operations.
    Subclasses implement the background refresh mechanism.
    )Ú_cacheÚ_lockÚ	_max_sizeÚ_ttl_secondsÚ_refresh_intervalÚ_metricsc                óš   — t        «       | _        t        j                  «       | _        t        «       | _        | j                  |||¬«       y)ag  Initialize the base cache.

        Args:
            max_size: Maximum entries in cache (LRU eviction when exceeded).
            ttl_seconds: Time before entry is considered stale. Set to None for
                infinite TTL (entries never expire, no background refresh).
            refresh_interval_seconds: How often to check for stale entries.
        ©Úmax_sizer   Úrefresh_interval_secondsN)r   r6   Ú	threadingÚRLockr7   r'   r;   Ú
_configure©r   r>   r   r?   s       r   Ú__init__z_BasePromptCache.__init__U   s?   € ô 5@³MˆŒÜ—_‘_Ó&ˆŒ
Ü$›ˆŒØ�‰ØØ#Ø%=ð 	õ 	
r   c                ó   — | j                   S )zGet cache performance metrics.)r;   r.   s    r   Úmetricsz_BasePromptCache.metricsl   s   € ð �}‰}Ðr   c                ó"   — t        «       | _        y)zReset all metrics to zero.N)r'   r;   r.   s    r   Úreset_metricsz_BasePromptCache.reset_metricsq   s   € ä$›ˆ�r   c                óŒ  — | j                   dk(  ry| j                  5  || j                  vr)| j                  xj                  dz  c_        	 ddd«       y| j                  |   }||_        | j                  j                  |«       | j                  xj                  dz  c_        |j                  cddd«       S # 1 sw Y   yxY w)a]  Get a value from cache.

        Args:
            key: The cache key (prompt identifier like "owner/name:hash").
            refresh_func: Function to refresh this cache entry when stale.

        Returns:
            The cached value or None if not found.
            Stale entries are still returned (background refresh handles updates).
        r   Né   )	r8   r7   r6   r;   r*   r   Úmove_to_endr)   r   )r   Úkeyr   Úentrys       r   Úgetz_BasePromptCache.getu   s™   € ð �>‰>˜QÒØà�Z‹ZØ˜$Ÿ+™+Ñ%Ø—‘×$Ò$¨Ñ)Õ$Ø÷ ˆZð
 —K‘K Ñ$ˆEð ".ˆEÔð �K‰K×#Ñ# CÔ(à�M‰M×Ò !Ñ#ÕØ—;‘;÷ �ZŠZús   �/B:ÁAB:Â:Cc                ó   — | j                   dk(  ry| j                  5  t        j                  «       }t        |||¬«      }|| j                  vrst        | j                  «      | j                   k\  rQt        t        | j                  «      «      }| j                  j                  |«       t        j                  d|› �«       || j                  |<   | j                  j                  |«       ddd«       y# 1 sw Y   yxY w)ú×Set a value in the cache.

        Args:
            key: The cache key (prompt identifier).
            value: The value to cache.
            refresh_func: Function to refresh this cache entry when stale.
        r   N)r   r   r   zEvicted oldest cache entry: )r8   r7   r   r   r6   ÚlenÚnextÚiterÚpopÚloggerÚdebugrK   )r   rL   r   r   ÚnowrM   Ú
oldest_keys          r   Ú_setz_BasePromptCache._set”   s¶   € ð �>‰>˜QÒØà�Z‹ZÜ—)‘)“+ˆCÜ U°sÈÔVˆEð ˜$Ÿ+™+Ñ%¬#¨d¯k©kÓ*:¸d¿n¹nÒ*Lä!¤$ t§{¡{Ó"3Ó4�
Ø—‘—‘ 
Ô+Ü—‘Ð;¸J¸<ÐHÔIà$ˆD�K‰K˜ÑØ�K‰K×#Ñ# CÔ(÷ �Z‰Zús   �CC4Ã4C=c                ó~   — | j                   5  | j                  j                  |d«       ddd«       y# 1 sw Y   yxY w)ziRemove a specific entry from cache.

        Args:
            key: The cache key to invalidate.
        N)r7   r6   rT   )r   rL   s     r   Ú
invalidatez_BasePromptCache.invalidate®   s'   € ð �Z‹ZØ�K‰K�O‰O˜C Ô&÷ �Z‰Zús   �3³<c                óz   — | j                   5  | j                  j                  «        ddd«       y# 1 sw Y   yxY w)z$Clear all cache entries from memory.N)r7   r6   Úclearr.   s    r   r]   z_BasePromptCache.clear·   s#   € à�Z‹ZØ�K‰K×ÑÔ÷ �Z‰Zús   �1±:c                óæ   — | j                   5  | j                  j                  «       D ��cg c]$  \  }}|j                  | j                  «      r||f‘Œ& c}}cddd«       S c c}}w # 1 sw Y   yxY w)z.Get list of stale cache entries (thread-safe).N)r7   r6   Úitemsr   r9   )r   rL   rM   s      r   Ú_get_stale_entriesz#_BasePromptCache._get_stale_entries¼   sa   € à�Z‹Zð #'§+¡+×"3Ñ"3Ô"5ôá"5‘J�C˜Ø—>‘> $×"3Ñ"3Ô4ð �e’Ø"5ò÷ ‰Zùó÷ ˆZús   �A'«)A!ÁA'Á!A'Á'A0c                óV  — ddl m} t        |«      }|j                  j	                  dd¬«       | j
                  5  i }| j                  j                  «       D ]„  \  }}t        |j                  |j                  «      rNt        |j                  d«      r|j                  j                  d¬«      }n'|j                  j                  «       }n|j                  }|||<   Œ† d|i}d	d	d	«       |j                  d
«      }	 t        |d«      5 }	t!        j"                  |	d¬«       d	d	d	«       |j%                  |«       t&        j)                  dt+        «      › d|› �«       y	# 1 sw Y   Œ~xY w# 1 sw Y   ŒKxY w# t,        $ r'}
|j/                  «       r|j1                  «        |
‚d	}
~
ww xY w)z{Dump cache contents to a JSON file for offline use.

        Args:
            path: Path to the output JSON file.
        r   ©ÚschemasT)ÚparentsÚexist_okÚ
model_dumpÚjson)ÚmodeÚentriesNz.tmpÚwé   )ÚindentzDumped z cache entries to )Ú	langsmithrc   r   ÚparentÚmkdirr7   r6   r_   Ú
isinstancer   ÚPromptCommitÚhasattrrf   ÚdictÚwith_suffixÚopenrg   ÚdumpÚreplacerU   rV   rQ   Ú	ExceptionÚexistsÚunlink)r   ÚpathÚ
ls_schemasri   rL   rM   Ú
value_dataÚdataÚ	temp_pathÚfÚes              r   rv   z_BasePromptCache.dumpÅ   sa  € õ 	4ä�D‹zˆØ�‰×Ñ $°ÐÔ6à�Z‹ZØˆGØ"Ÿk™k×/Ñ/Ö1‘
��Uä˜eŸk™k¨:×+BÑ+BÔCä˜uŸ{™{¨LÔ9Ø%*§[¡[×%;Ñ%;ÀÐ%;Ó%H™
à%*§[¡[×%5Ñ%5Ó%7™
ð "'§¡�Jà)�˜’ð 2ð ˜wÐ'ˆD÷! ð& ×$Ñ$ VÓ,ˆ	ð		Ü�i Ô%¨Ü—	‘	˜$ ¨!Õ,÷ &à×Ñ˜dÔ#Ü�L‰L˜7¤3 w£< .Ð0BÀ4À&ÐIÕJ÷1 ˆZú÷* &Ð%ûô ò 	à×ÑÔ!Ø× Ñ Ô"ØˆGûð		ús<   »B(E Ã=E8 Ä	E,Ä"=E8 Å E)Å,E5Å1E8 Å8	F(Æ"F#Æ#F(c           	     ó  — ddl m} t        |«      }|j                  «       st        j                  d|› �«       y	 t        |«      5 }t        j                  |«      }ddd«       j                  di «      }d}t        j                  «       }| j                  5  |j                  «       D ]°  \  }	}
t!        | j"                  «      | j$                  k\  rt        j                  d|› �«        nq	 t'        |j(                  d	«      r|j(                  j+                  |
«      }n|j(                  j-                  |
«      }t/        ||¬
«      }|| j"                  |	<   |dz  }Œ² ddd«       t        j                  d|› d|› �«       |S # 1 sw Y   �Œ'xY w# t        j                  t        f$ r%}t        j                  d|› d|› �«       Y d}~yd}~ww xY w# t0        $ r&}t        j                  d|	› d|› �«       Y d}~�ŒPd}~ww xY w# 1 sw Y   Œ¦xY w)a%  Load cache contents from a JSON file.

        Args:
            path: Path to the JSON file to load.

        Returns:
            Number of entries loaded.

        Loaded entries get a fresh TTL starting from load time.
        If the file doesn't exist or is corrupted, returns 0.
        r   rb   zCache file not found: NzFailed to load cache file ú: ri   z)Reached max cache size, stopping load at Úmodel_validate)r   r   rJ   zFailed to load cache entry zLoaded z cache entries from )rm   rc   r   ry   rU   rV   ru   rg   ÚloadÚJSONDecodeErrorÚOSErrorÚwarningrN   r   r7   r_   rQ   r6   r8   rr   rq   r„   Ú	parse_objr   rx   )r   r{   r|   r€   r~   r�   ri   ÚloadedrW   rL   r}   r   rM   s                r   r…   z_BasePromptCache.loadï   s¼  € õ 	4ä�D‹zˆà�{‰{Œ}Ü�L‰LÐ1°$°Ð8Ô9Øð	Ü�d”˜qÜ—y‘y “|�÷ ð —(‘(˜9 bÓ)ˆØˆÜ�i‰i‹kˆà�Z‹ZØ#*§=¡=¦?‘��ZÜ�t—{‘{Ó# t§~¡~Ò5Ü—L‘LÐ#LÈVÈHÐ!UÔVÙðä˜z×6Ñ6Ð8HÔIØ *× 7Ñ 7× FÑ FÀzÓ R™à *× 7Ñ 7× AÑ AÀ*Ó M˜ô '¨U¸sÔC�EØ',�D—K‘K Ñ$Ø˜a‘K‘Fð $3÷ ô* 	�‰�w˜v˜hÐ&:¸4¸&ÐAÔBØˆ÷A ‘ûä×$Ñ$¤gÐ.ò 	Ü�N‰NÐ7¸°v¸RÀ¸sÐCÔDÜûð	ûô2 !ò Ü—N‘NÐ%@ÀÀÀRÈÀsÐ#KÔLÝûðú÷# ˆZúsg   ¼F ÁFÁF ÂAHÃ-A.GÅHÆFÆF ÆGÆ(GÇGÇ	G?ÇG:Ç4HÇ:G?Ç?HÈHc                ó.   — || _         || _        || _        y )N)r8   r9   r:   rC   s       r   rB   z_BasePromptCache._configure&  s   € ð "ˆŒØ'ˆÔØ!9ˆÕr   N©r>   r(   r   r   r?   r   r   ÚNone)r   r'   ©r   r�   )rL   Ústrr   úCallable[[], Any]r   zOptional[Any]©rL   r�   r   r
   r   r�   r   r�   )rL   r�   r   r�   )r   zlist[tuple[str, CacheEntry]])r{   úUnion[str, Path]r   r�   )r{   r’   r   r(   )r    r!   r"   r#   Ú	__slots__ÚDEFAULT_PROMPT_CACHE_MAX_SIZEÚ DEFAULT_PROMPT_CACHE_TTL_SECONDSÚ-DEFAULT_PROMPT_CACHE_REFRESH_INTERVAL_SECONDSrD   r3   rF   rH   rN   rY   r[   r]   r`   rv   r…   rB   r%   r   r   r5   r5   E   s­   „ ñò€Ið 6Ø'GØ*Wð	
àð
ð %ð
ð #(ð	
ð
 
ó
ð. òó ðó'óó>)ó4'ó ó
ó(óT5ðn:àð:ð %ð:ð #(ð	:ð
 
ô:r   r5   c                  ó”   ‡ — e Zd ZdZddgZeeedœ	 	 	 	 	 	 	 dˆ fd„Zdd„Z	dd„Z
dd„Zdd	„Zdd
„Zdd„Zeeedœ	 	 	 	 	 	 	 dd„Zˆ xZS )ÚPromptCacheaí  Thread-safe LRU cache with background thread refresh.

    For use with the synchronous Client.

    Features:
    - In-memory LRU cache with configurable max size
    - Background thread for refreshing stale entries
    - Stale-while-revalidate: returns stale data while refresh happens
    - Thread-safe for concurrent access

    Example:
        >>> def fetch_prompt(key: str) -> PromptCommit:
        ...     return client._fetch_prompt_from_api(key)
        >>> cache = PromptCache(
        ...     max_size=100,
        ...     ttl_seconds=3600,
        ...     fetch_func=fetch_prompt,
        ... )
        >>> cache.set("my-prompt:latest", prompt_commit)
        >>> cached = cache.get("my-prompt:latest")
        >>> cache.shutdown()
    Ú_shutdown_eventÚ_refresh_threadr=   c               ój   •— t         ‰| �  |||¬«       t        j                  «       | _        d| _        y)a�  Initialize the sync prompt cache.

        Args:
            max_size: Maximum entries in cache (LRU eviction when exceeded).
            ttl_seconds: Time before entry is considered stale. Set to None for
                infinite TTL (offline mode - entries never expire).
                Default: 300 (5 minutes).
            refresh_interval_seconds: How often to check for stale entries.
        r=   N)ÚsuperrD   r@   ÚEventr™   rš   ©r   r>   r   r?   Ú	__class__s       €r   rD   zPromptCache.__init__K  s9   ø€ ô  	‰ÑØØ#Ø%=ð 	ô 	
ô
  )Ÿ™Ó0ˆÔØ;?ˆÕr   c                ób   — | j                   €| j                  «        | j                  |||«       y)rP   N)rš   Ú_start_refresh_threadrY   ©r   rL   r   r   s       r   ÚsetzPromptCache.sete  s,   € ð ×ÑÐ'Ø×&Ñ&Ô(Ø�	‰	�#�u˜lÕ+r   c                ó$   — | j                  «        y)úgStop background refresh thread.

        Should be called when the client is being cleaned up.
        N)Úshutdownr.   s    r   ÚstopzPromptCache.stopr  s   € ð
 	�‰�r   c                ó°   — | j                   �| j                   j                  «        | j                  �$| j                  j                  d¬«       d| _        yy)r¥   Ng      @)Útimeout)r™   r£   rš   Újoinr.   s    r   r¦   zPromptCache.shutdowny  sR   € ð
 ×ÑÐ+Ø× Ñ ×$Ñ$Ô&Ø×ÑÐ+Ø× Ñ ×%Ñ%¨cÐ%Ô2Ø#'ˆDÕ ð ,r   c                óþ   — | j                   �q| j                  j                  «        t        j                  | j
                  dd¬«      | _        | j                  j                  «        t        j                  d«       yy)z5Start background thread for refreshing stale entries.NTzPromptCache-refresh)ÚtargetÚdaemonÚnamezStarted cache refresh thread)
r9   r™   r]   r@   ÚThreadÚ_refresh_looprš   ÚstartrU   rV   r.   s    r   r¡   z!PromptCache._start_refresh_thread„  sh   € à×ÑÐ(Ø× Ñ ×&Ñ&Ô(Ü#,×#3Ñ#3Ø×)Ñ)ØØ*ô$ˆDÔ ð
 × Ñ ×&Ñ&Ô(Ü�L‰LÐ7Õ8ð )r   c                ó  — | j                   j                  | j                  «      s8	 | j                  «        | j                   j                  | j                  «      sŒ7yy# t        $ r"}t
        j                  d|› �«       Y d}~ŒNd}~ww xY w)z)Background loop to refresh stale entries.z(Unexpected error in cache refresh loop: N)r™   Úwaitr:   Ú_refresh_stale_entriesrx   rU   Ú	exception©r   r�   s     r   r°   zPromptCache._refresh_loop�  sw   € à×&Ñ&×+Ñ+¨D×,BÑ,BÔCðQØ×+Ñ+Ô-ð ×&Ñ&×+Ñ+¨D×,BÑ,B×Cøô ò Qä× Ñ Ð#KÈAÈ3Ð!O×PÑPûðQús   §A Á	B
Á(BÂB
c                ó>  — | j                  «       }|syt        j                  dt        |«      › d�«       |D ]“  \  }}| j                  j                  «       r y|j                  €Œ/	 |j                  «       }| j                  |||j                  «       | j                  xj                  dz  c_	        t        j                  d|› �«       Œ• y# t        $ rD}| j                  xj                  dz  c_        t        j                  d|› d|› �«       Y d}~Œßd}~ww xY w)z)Check for stale entries and refresh them.NzRefreshing ú stale cache entriesrJ   zRefreshed cache entry: zFailed to refresh cache entry rƒ   )r`   rU   rV   rQ   r™   Úis_setr   r£   r;   r+   rx   r,   rˆ   ©r   Ústale_entriesrL   rM   Ú	new_valuer�   s         r   r´   z"PromptCache._refresh_stale_entries™  sú   € à×/Ñ/Ó1ˆáØä�‰�{¤3 }Ó#5Ð"6Ð6JÐKÔLã'‰JˆC�Ø×#Ñ#×*Ñ*Ô,ÙØ×!Ñ!Ñ-ðPØ %× 2Ñ 2Ó 4�IØ—H‘H˜S )¨U×-?Ñ-?Ô@Ø—M‘M×+Ò+¨qÑ0Õ+Ü—L‘LÐ#:¸3¸%Ð!@ÕAñ (øô !ò Pà—M‘M×0Ò0°AÑ5Õ0Ü—N‘NÐ%CÀCÀ5ÈÈ1È#Ð#N×OÑOûðPús   Á(A$CÃ	DÃ:DÄDc               óL   — | j                  «        | j                  |||¬«       y)á  Reconfigure the cache parameters.

        Args:
            max_size: Maximum entries in cache (LRU eviction when exceeded).
            ttl_seconds: Time before entry is considered stale.
            refresh_interval_seconds: How often to check for stale entries.
        r=   N©r§   rB   rC   s       r   Ú	configurezPromptCache.configure°  s'   € ð 	�	‰	ŒØ�‰ØØ#Ø%=ð 	õ 	
r   rŒ   r‘   rŽ   )r    r!   r"   r#   r“   r”   r•   r–   rD   r£   r§   r¦   r¡   r°   r´   rÀ   Ú__classcell__©rŸ   s   @r   r˜   r˜   1  sª   ø„ ñð. #Ð$5Ð6€Ið
 6Ø'GØ*Wñ@ð ð@ð %ð	@ð
 #(ð@ð 
õ@ó4,óó	(ó
9óQóPð4 6Ø'GØ*Wñ
ð ð
ð %ð	
ð
 #(ð
ð 
÷
r   r˜   c                  ó¢   ‡ — e Zd ZdZdgZeeedœ	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 	 	 dd„Z	dd„Z
dd„Zdd„Zdd	„Zdd
„Zeeedœ	 	 	 	 	 	 	 dd„Zˆ xZS )ÚAsyncPromptCachea  Thread-safe LRU cache with asyncio task refresh.

    For use with the asynchronous AsyncClient.

    Features:
    - In-memory LRU cache with configurable max size
    - Asyncio task for refreshing stale entries
    - Stale-while-revalidate: returns stale data while refresh happens
    - Thread-safe for concurrent access

    Example:
        >>> async def fetch_prompt(key: str) -> PromptCommit:
        ...     return await client._afetch_prompt_from_api(key)
        >>> cache = AsyncPromptCache(
        ...     max_size=100,
        ...     ttl_seconds=3600,
        ...     fetch_func=fetch_prompt,
        ... )
        >>> await cache.start()
        >>> cache.set("my-prompt:latest", prompt_commit)
        >>> cached = cache.get("my-prompt:latest")
        >>> await cache.stop()
    Ú_refresh_taskr=   c               ó8   •— t         ‰| �  |||¬«       d| _        y)ag  Initialize the async prompt cache.

        Args:
            max_size: Maximum entries in cache (LRU eviction when exceeded).
            ttl_seconds: Time before entry is considered stale. Set to None for
                infinite TTL (offline mode - entries never expire).
            refresh_interval_seconds: How often to check for stale entries.
        r=   N)rœ   rD   rÅ   rž   s       €r   rD   zAsyncPromptCache.__init__á  s+   ø€ ô 	‰ÑØØ#Ø%=ð 	ô 	
ð
 <@ˆÕr   c              ƒ  ó~   K  — | j                   €| j                  «       ƒ d{  –—†  | j                  |||«       y7 Œ­w)zÝSet a value in the cache.

        Args:
            key: The cache key (prompt identifier).
            value: The value to cache.
            refresh_func: Async function to refresh this cache entry when stale.
        N)rÅ   r±   rY   r¢   s       r   ÚasetzAsyncPromptCache.aset÷  s8   è ø€ ð ×ÑÐ%Ø—*‘*“,×ÐØ�	‰	�#�u˜lÕ+ð ús   ‚ =¢;£=c              ƒ  ó¾   K  — | j                   €y| j                  �yt        j                  | j	                  «       d¬«      | _        t
        j                  d«       y­w)züStart async background refresh loop.

        Must be called from an async context. Creates an asyncio task that
        periodically checks for stale entries and refreshes them.
        Does nothing if ttl_seconds is None (infinite TTL mode).
        NzAsyncPromptCache-refresh)r®   z Started async cache refresh task)r9   rÅ   ÚasyncioÚcreate_taskr°   rU   rV   r.   s    r   r±   zAsyncPromptCache.start  sW   è ø€ ð ×ÑÐ$Øà×ÑÐ)àä$×0Ñ0Ø×ÑÓ Ø+ô
ˆÔô 	�‰Ð7Õ8ùs   ‚AAc                ó`   — | j                   �"| j                   j                  «        d| _         yy)z£Stop background refresh task.

        Synchronous wrapper that cancels the refresh task.
        For proper cleanup in async context, use stop() instead.
        N)rÅ   Úcancelr.   s    r   r¦   zAsyncPromptCache.shutdown  s/   € ð ×ÑÐ)Ø×Ñ×%Ñ%Ô'Ø!%ˆDÕð *r   c              ƒ  óò   K  — | j                   €y| j                   j                  «        	 | j                   ƒ d{  –—†  d| _         t        j                  d«       y7 Œ!# t        j                  $ r Y Œ4w xY w­w)zlStop async background refresh loop.

        Cancels the refresh task and waits for it to complete.
        Nz Stopped async cache refresh task)rÅ   rÍ   rÊ   ÚCancelledErrorrU   rV   r.   s    r   r§   zAsyncPromptCache.stop$  sp   è ø€ ð
 ×ÑÐ%Øà×Ñ×!Ñ!Ô#ð	Ø×$Ñ$×$Ð$ð "ˆÔÜ�‰Ð7Õ8ð	 %ùÜ×%Ñ%ò 	Ùð	üs7   ‚(A7«A ºA»A ¿A7ÁA ÁA4Á1A7Á3A4Á4A7c              ƒ  ó  K  — 	 	 t        j                  | j                  «      ƒ d{  –—†  | j                  «       ƒ d{  –—†  ŒA7 Œ7 Œ# t         j                  $ r ‚ t
        $ r"}t        j                  d|› �«       Y d}~Œ>d}~ww xY w­w)z/Async background loop to refresh stale entries.Nz.Unexpected error in async cache refresh loop: )rÊ   Úsleepr:   r´   rÏ   rx   rU   rµ   r¶   s     r   r°   zAsyncPromptCache._refresh_loop4  s‚   è ø€ àðWÜ—m‘m D×$:Ñ$:Ó;×;Ð;Ø×1Ñ1Ó3×3Ð3ð à;øØ3ùÜ×)Ñ)ò ØÜò Wä× Ñ Ð#QÐRSÐQTÐ!U×VÑVûðWüsO   ‚B
…"A	 §A¨A	 ¿AÁ A	 ÁB
ÁA	 ÁA	 Á	BÁ%BÁ=B
ÂBÂB
c              ƒ  ó6  K  — | j                  «       }|syt        j                  dt        |«      › d�«       |D ]‡  \  }}|j                  €Œ	 |j	                  «       ƒ d{  –—† }| j                  |||j                  «      ƒ d{  –—†  | j                  xj                  dz  c_        t        j                  d|› �«       Œ‰ y7 Œc7 Œ@# t        $ rD}| j                  xj                  dz  c_	        t        j                  d|› d|› �«       Y d}~Œ×d}~ww xY w­w)z8Check for stale entries and refresh them asynchronously.NzAsync refreshing r¸   rJ   zAsync refreshed cache entry: z$Failed to async refresh cache entry rƒ   )r`   rU   rV   rQ   r   rÈ   r;   r+   rx   r,   rˆ   rº   s         r   r´   z'AsyncPromptCache._refresh_stale_entries@  sý   è ø€ à×/Ñ/Ó1ˆáØä�‰Ð(¬¨]Ó);Ð(<Ð<PÐQÔRã'‰JˆC�Ø×!Ñ!Ñ-ðVØ&+×&8Ñ&8Ó&:× :�IØŸ)™) C¨°E×4FÑ4FÓG×GÐGØ—M‘M×+Ò+¨qÑ0Õ+Ü—L‘LÐ#@ÀÀÐ!FÕGñ (ð !;øØGùô !ò Và—M‘M×0Ò0°AÑ5Õ0Ü—N‘NÐ%IÈ#ÈÈbÐQRÐPSÐ#T×UÑUûðVüsT   ‚A
DÁC	Á!CÁ"$C	ÂCÂ;C	ÃDÃC	ÃC	Ã		DÃ:DÄDÄDÄDc             ƒ  óf   K  — | j                  «       ƒ d{  –—†  | j                  |||«       y7 Œ­w)r¾   Nr¿   rC   s       r   rÀ   zAsyncPromptCache.configureU  s-   è ø€ ð �i‰i‹k×ÐØ�‰˜ +Ð/GÕHð 	ús   ‚1–/—1rŒ   )rL   r�   r   r
   r   zCallable[[], Awaitable[Any]]r   r�   rŽ   )r    r!   r"   r#   r“   r”   r•   r–   rD   rÈ   r±   r¦   r§   r°   r´   rÀ   rÁ   rÂ   s   @r   rÄ   rÄ   Æ  sÌ   ø„ ñð0 !Ð!€Ið
 6Ø'GØ*Wñ@ð ð@ð %ð	@ð
 #(ð@ð 
õ@ð,,Øð,Ø"ð,Ø2Nð,à	ó,ó9ó(&ó9ó 
WóVð0 6Ø'GØ*WñIð ðIð %ð	Ið
 #(ðIð 
÷Ir   rÄ   r=   c                ó4   — t         j                  | ||¬«       y©aâ  Configure the global prompt cache.

    This should be called before any cache instances are created or used.

    Args:
        max_size: Maximum entries in cache (LRU eviction when exceeded).
        ttl_seconds: Time before entry is considered stale.
        refresh_interval_seconds: How often to check for stale entries.

    Example:
        >>> from langsmith import configure_global_prompt_cache
        >>> configure_global_prompt_cache(max_size=200, ttl_seconds=7200)
    r=   N)Úprompt_cache_singletonrÀ   r=   s      r   Úconfigure_global_prompt_cacher×   l  s    € ô& ×$Ñ$ØØØ!9ð %õ r   c              ƒ  óP   K  — t         j                  | ||¬«      ƒ d{  –—†  y7 Œ­wrÕ   )Úasync_prompt_cache_singletonrÀ   r=   s      r   Ú#configure_global_async_prompt_cacherÚ   †  s.   è ø€ ô& '×
0Ñ
0ØØØ!9ð 1ó ÷ ò ús   ‚&ž$Ÿ&c                 ó<   — t        j                  dt        d¬«       y )NzcThe 'Cache' class is deprecated and will be removed in a future version. Use 'PromptCache' instead.é   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningr%   r   r   Ú_deprecated_cache_class_warningrá   £  s   € Ü‡M�Mð	%äØö	r   c                  ó<   ‡ — e Zd ZdZeeedœ	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚCachez:Deprecated alias for PromptCache. Use PromptCache instead.r=   c               ó>   •— t        «        t        ‰| �	  |||¬«       y)a  Initialize the deprecated Cache class.

        Args:
            max_size: Maximum entries in cache (LRU eviction when exceeded).
            ttl_seconds: Time before entry is considered stale.
            refresh_interval_seconds: How often to check for stale entries.
        r=   N©rá   rœ   rD   rž   s       €r   rD   zCache.__init__¯  ó&   ø€ ô 	(Ô)Ü‰ÑØØ#Ø%=ð 	õ 	
r   rŒ   ©	r    r!   r"   r#   r”   r•   r–   rD   rÁ   rÂ   s   @r   rã   rã   ¬  sC   ø„ ÙDð
 6Ø'GØ*Wñ
ð ð
ð %ð	
ð
 #(ð
ð 
÷
ñ 
r   rã   c                  ó<   ‡ — e Zd ZdZeeedœ	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )Ú
AsyncCachezDDeprecated alias for AsyncPromptCache. Use AsyncPromptCache instead.r=   c               ó>   •— t        «        t        ‰| �	  |||¬«       y)a  Initialize the deprecated AsyncCache class.

        Args:
            max_size: Maximum entries in cache (LRU eviction when exceeded).
            ttl_seconds: Time before entry is considered stale.
            refresh_interval_seconds: How often to check for stale entries.
        r=   Nrå   rž   s       €r   rD   zAsyncCache.__init__È  ræ   r   rŒ   rç   rÂ   s   @r   ré   ré   Å  sC   ø„ ÙNð
 6Ø'GØ*Wñ
ð ð
ð %ð	
ð
 #(ð
ð 
÷
ñ 
r   ré   rŒ   rŽ   )*r#   Ú
__future__r   rÊ   rg   Úloggingr@   r   rÞ   Úabcr   Úcollectionsr   Úcollections.abcr   Údataclassesr   Úpathlibr   Útypingr	   r
   r   r   r   Ú	getLoggerrU   r•   r”   r–   r   r'   r5   r˜   rÄ   rÖ   rÙ   r×   rÚ   rá   rã   ré   r%   r   r   Ú<module>rô      sc  ðñõ #ã Û Û Û Û Û Ý Ý #Ý %Ý !Ý ß @Õ @áØà	ˆ×	Ñ	Ð,Ó	-€ð $*Ð  Ø #Ð Ø02Ð -ð ÷=ð =ó ð=ð ÷7ð 7ó ð7ô(i:�sô i:ôXR
Ð"ô R
ôj^IÐ'ô ^IñD %›Ð Ù/Ó1Ð ð
 2Ø#CØ&Sñ	àðð !ðð $ð	ð
 
óð8 2Ø#CØ&Sñ	àðð !ðð $ð	ð
 
óó:ô
ˆKô 
ô2
Ð!õ 
r   