ó
    lQjb  ã                  óô  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJrJrJrJrJr  \(       a   \R2                  " S
5      rSrSrSr\ " S S5      5       r\ " S S5      5       r " S S\
5      r  " S S\ 5      r! " S S\ 5      r"\!" 5       r#\"" 5       r$\\\S.       S S jjr%\\\S.       S S jjr&S!S jr' " S S\!5      r( " S S\"5      r)g)"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                  óF   • \ rS rSr% SrS\S'   S\S'   SrS\S	'   SS
 jrSrg)Ú
CacheEntryé!   z4A single cache entry with metadata for TTL tracking.r
   ÚvalueÚfloatÚ
created_atNzOptional[Callable[[], Any]]Úrefresh_funcc                óT   • Uc  g[         R                   " 5       U R                  -
  U:„  $ )z/Check if entry is past its TTL (needs refresh).F)Útimer   )ÚselfÚttl_secondss     ÚS/home/mande/repo/quber/.venv/lib/python3.13/site-packages/langsmith/prompt_cache.pyÚis_staleÚCacheEntry.is_stale)   s%   € àÑØÜ—	’	“˜dŸo™oÑ-°Ñ<Ð<ó    © )r   úOptional[float]ÚreturnÚbool)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   Ú__static_attributes__r   r   r   r   r   !   s    ‡ á>àƒJØÓØ04€LÐ-Ó4÷=r   r   c                  óz   • \ rS rSr% SrSrS\S'   SrS\S'   SrS\S'   Sr	S\S'   \
SS	 j5       r\
SS
 j5       rSrg)ÚCacheMetricsé0   zCache performance metrics.r   ÚintÚhitsÚmissesÚ	refreshesÚrefresh_errorsc                ó4   • U R                   U R                  -   $ )z%Total cache requests (hits + misses).)r.   r/   ©r   s    r   Útotal_requestsÚCacheMetrics.total_requests9   s   € ð �y‰y˜4Ÿ;™;Ñ&Ð&r   c                óH   • U R                   nUS:”  a  U R                  U-  $ S$ )zCache hit rate (0.0 to 1.0).r   g        )r4   r.   )r   Útotals     r   Úhit_rateÚCacheMetrics.hit_rate>   s)   € ð ×#Ñ#ˆØ$)¨A£Iˆt�y‰y˜5Ñ Ð6°3Ð6r   r   N)r!   r-   )r!   r   )r#   r$   r%   r&   r'   r.   r(   r/   r0   r1   Úpropertyr4   r8   r)   r   r   r   r+   r+   0   sQ   ‡ á$à€Dˆ#ƒMØ€FˆCƒOØ€IˆsÓØ€N�CÓàó'ó ð'ð ó7ó ó7r   r+   c                  óÀ   • \ rS rSrSr/ SQr\\\4       SS jjr	\
SS j5       rSS jrSS jrSS jrSS	 jrSS
 jrSS jrSS jrSS jr        SS jrSrg)Ú_BasePromptCacheéE   z¡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                ó–   • [        5       U l        [        R                  " 5       U l        [        5       U l        U R                  UUUS9  g)a7  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   r>   Ú	threadingÚRLockr?   r+   rC   Ú
_configure©r   rF   r   rG   s       r   Ú__init__Ú_BasePromptCache.__init__U   s?   € ô 5@³MˆŒÜ—_’_Ó&ˆŒ
Ü$›ˆŒØ�‰ØØ#Ø%=ð 	ò 	
r   c                ó   • U R                   $ )zGet cache performance metrics.)rC   r3   s    r   ÚmetricsÚ_BasePromptCache.metricsl   s   € ð �}‰}Ðr   c                ó"   • [        5       U l        g)zReset all metrics to zero.N)r+   rC   r3   s    r   Úreset_metricsÚ_BasePromptCache.reset_metricsq   s   € ä$›ˆ�r   c                ó˜  • U R                   S:X  a  gU R                     XR                  ;  a)  U R                  =R                  S-  sl         SSS5        gU R                  U   nX#l        U R                  R                  U5        U R                  =R                  S-  sl        UR                  sSSS5        $ ! , (       d  f       g= f)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é   )	r@   r?   r>   rC   r/   r   Úmove_to_endr.   r   )r   Úkeyr   Úentrys       r   ÚgetÚ_BasePromptCache.getu   s•   € ð �>‰>˜QÓØà�Z‹ZØŸ+™+Ó%Ø—‘×$Ò$¨Ñ)Õ$Ø÷ ˆZð
 —K‘K Ñ$ˆEð ".Ôð �K‰K×#Ñ# CÔ(à�M‰M×Ò !Ñ#ÕØ—;‘;÷ �Z�Zús   ž0B;ÁAB;Â;
C	c                ó  • U R                   S:X  a  gU R                     [        R                  " 5       n[        X$US9nXR                  ;  at  [        U R                  5      U R                   :¼  aQ  [        [        U R                  5      5      nU R                  R                  U5        [        R                  SU 35        XPR                  U'   U R                  R                  U5        SSS5        g! , (       d  f       g= f)ú¯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: )r@   r?   r   r   r>   ÚlenÚnextÚiterÚpopÚloggerÚdebugrV   )r   rW   r   r   ÚnowrX   Ú
oldest_keys          r   Ú_setÚ_BasePromptCache._set”   s°   € ð �>‰>˜QÓØà�Z‹ZÜ—)’)“+ˆCÜ UÈÑVˆEð Ÿ+™+Ó%¬#¨d¯k©kÓ*:¸d¿n¹nÓ*Lä!¤$ t§{¡{Ó"3Ó4�
Ø—‘—‘ 
Ô+Ü—‘Ð;¸J¸<ÐHÔIà$�K‰K˜ÑØ�K‰K×#Ñ# CÔ(÷ �ZŽZús   žCC3Ã3
Dc                óˆ   • U R                      U R                  R                  US5        SSS5        g! , (       d  f       g= f)zQRemove a specific entry from cache.

Args:
    key: The cache key to invalidate.
N)r?   r>   r`   )r   rW   s     r   Ú
invalidateÚ_BasePromptCache.invalidate®   s'   € ð �Z‹ZØ�K‰K�O‰O˜C Ô&÷ �ZŽZús	   �3³
Ac                ó„   • U R                      U R                  R                  5         SSS5        g! , (       d  f       g= f)z$Clear all cache entries from memory.N)r?   r>   Úclearr3   s    r   rk   Ú_BasePromptCache.clear·   s#   € à�Z‹ZØ�K‰K×ÑÔ÷ �ZŽZús   �1±
?c                ó   • U R                      U R                  R                  5        VVs/ s H*  u  pUR                  U R                  5      (       d  M'  X4PM,     snnsSSS5        $ s  snnf ! , (       d  f       g= f)z.Get list of stale cache entries (thread-safe).N)r?   r>   Úitemsr   rA   )r   rW   rX   s      r   Ú_get_stale_entriesÚ#_BasePromptCache._get_stale_entries¼   s_   € à�Z‹Zð #'§+¡+×"3Ñ"3Ô"5ôâ"5‘J�CØ—>‘> $×"3Ñ"3×4ó �“Ù"5ò÷ ‰Zùó÷ �Zús"   �A/«&A)ÁA)ÁA/Á)A/Á/
A=c                óz  • SSK Jn  [        U5      nUR                  R	                  SSS9  U R
                     0 nU R                  R                  5        HŠ  u  pE[        UR                  UR                  5      (       aP  [        UR                  S5      (       a  UR                  R                  SS9nO'UR                  R                  5       nOUR                  nXcU'   MŒ     SU0nS	S	S	5        UR                  S
5      n [        US5       n	[         R"                  " WU	SS9  S	S	S	5        UR%                  U5        [&        R)                  S[+        W5       SU 35        g	! , (       d  f       N�= f! , (       d  f       NU= f! [,         a,  n
UR/                  5       (       a  UR1                  5         U
eS	n
A
ff = f)zcDump 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 )Ú	langsmithrs   r   ÚparentÚmkdirr?   r>   rn   Ú
isinstancer   ÚPromptCommitÚhasattrrv   ÚdictÚwith_suffixÚopenrw   ÚdumpÚreplacera   rb   r]   Ú	ExceptionÚexistsÚunlink)r   ÚpathÚ
ls_schemasry   rW   rX   Ú
value_dataÚdataÚ	temp_pathÚfÚes              r   r†   Ú_BasePromptCache.dumpÅ   sf  € õ 	4ä�D‹zˆØ�‰×Ñ $°ÐÑ6à�Z‹ZØˆGØ"Ÿk™k×/Ñ/Ö1‘
�ä˜eŸk™k¨:×+BÑ+B×CÑCä˜uŸ{™{¨L×9Ñ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"ÄF ÄE3Ä$=F Å"
E0Å3
FÅ=F Æ
F:Æ'F5Æ5F:c           	     óH  • SSK Jn  [        U5      nUR                  5       (       d  [        R                  SU 35        g [        U5       n[        R                  " U5      nSSS5        WR                  S0 5      nSn[        R                  " 5       nU R                     UR                  5        H±  u  pš[!        U R"                  5      U R$                  :¼  a  [        R                  SU 35          Os ['        UR(                  S	5      (       a  UR(                  R+                  U
5      nOUR(                  R-                  U
5      n[/        X¸S
9nXÀR"                  U	'   US-  nM³     SSS5        [        R                  SU SU 35        U$ ! , (       d  f       GN/= f! [        R                  [        4 a%  n[        R                  SU SU 35         SnAgSnAff = f! [0         a'  n[        R                  SU	 SU 35         SnAGMZ  SnAff = f! , (       d  f       N³= f)zí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   rr   zCache file not found: NzFailed to load cache file ú: ry   z)Reached max cache size, stopping load at Úmodel_validate)r   r   rU   zFailed to load cache entry zLoaded z cache entries from )r}   rs   r   r‰   ra   rb   r…   rw   ÚloadÚJSONDecodeErrorÚOSErrorÚwarningrY   r   r?   rn   r]   r>   r@   r‚   r�   r•   Ú	parse_objr   rˆ   )r   r‹   rŒ   r�   rŽ   r‘   ry   Úloadedrc   rW   r�   r   rX   s                r   r–   Ú_BasePromptCache.loadï   s»  € õ 	4ä�D‹zˆà�{‰{�}‰}Ü�L‰LÐ1°$°Ð8Ô9Øð	Ü�d”˜qÜ—y’y “|�÷ ð —(‘(˜9 bÓ)ˆØˆÜ�iŠi‹kˆà�Z‹ZØ#*§=¡=¦?‘�Ü�t—{‘{Ó# t§~¡~Ó5Ü—L‘LÐ#LÈVÈHÐ!UÔVÙðä˜z×6Ñ6Ð8H×IÑIØ *× 7Ñ 7× FÑ FÀzÓ R™à *× 7Ñ 7× AÑ AÀ*Ó M˜ô '¨UÑC�EØ',—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úsn   ÁF ÁFÁ#F Â AHÃ4A.GÅ"HÆ
FÆF ÆF ÆGÆ7GÇGÇ
HÇ)HÈHÈHÈHÈ
H!c                ó(   • Xl         X l        X0l        g )N)r@   rA   rB   rK   s       r   rJ   Ú_BasePromptCache._configure&  s   € ð "ŒØ'ÔØ!9Õr   )r>   r?   r@   rC   rB   rA   N©rF   r-   r   r    rG   r   r!   ÚNone)r!   r+   ©r!   r    )rW   Ústrr   úCallable[[], Any]r!   zOptional[Any]©rW   r¢   r   r
   r   r£   r!   r    )rW   r¢   r!   r    )r!   zlist[tuple[str, CacheEntry]])r‹   úUnion[str, Path]r!   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_SECONDSrL   r:   rO   rR   rY   re   rh   rk   ro   r†   r–   rJ   r)   r   r   r   r<   r<   E   s­   † ñò€Ið 6Ø'GØ*Wð	
àð
ð %ð
ð #(ð	
ð
 
õ
ð. óó ðô'ôô>)ô4'ô ô
ô(ôT5ðn:àð:ð %ð:ð #(ð	:ð
 
÷:r   r<   c                  ó²   ^ • \ rS rSrSrSS/r\\\S.       SU 4S jjjr	SS jr
SS jrSS	 jrSS
 jrSS jrSS jr\\\S.       SS jjrSrU =r$ )ÚPromptCachei1  a¥  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_threadrE   c               óf   >• [         TU ]  UUUS9  [        R                  " 5       U l        SU l        g)aX  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.
rE   N)ÚsuperrL   rH   ÚEventr¬   r­   ©r   rF   r   rG   Ú	__class__s       €r   rL   ÚPromptCache.__init__K  s9   ø€ ô  	‰ÑØØ#Ø%=ð 	ñ 	
ô
  )ŸšÓ0ˆÔØ;?ˆÕr   c                ób   • U R                   c  U R                  5         U R                  XU5        g)r\   N)r­   Ú_start_refresh_threadre   ©r   rW   r   r   s       r   ÚsetÚPromptCache.sete  s*   € ð ×ÑÑ'Ø×&Ñ&Ô(Ø�	‰	�#˜lÕ+r   c                ó$   • U R                  5         g)úWStop background refresh thread.

Should be called when the client is being cleaned up.
N)Úshutdownr3   s    r   ÚstopÚPromptCache.stopr  s   € ð
 	�‰�r   c                ó®   • U R                   b  U R                   R                  5         U R                  b!  U R                  R                  SS9  SU l        gg)rº   Ng      @)Útimeout)r¬   r·   r­   Újoinr3   s    r   r»   ÚPromptCache.shutdowny  sR   € ð
 ×ÑÑ+Ø× Ñ ×$Ñ$Ô&Ø×ÑÑ+Ø× Ñ ×%Ñ%¨cÐ%Ñ2Ø#'ˆDÕ ð ,r   c                óü   • U R                   bo  U R                  R                  5         [        R                  " U R
                  SSS9U l        U R                  R                  5         [        R                  S5        gg)z5Start background thread for refreshing stale entries.NTzPromptCache-refresh)ÚtargetÚdaemonÚnamezStarted cache refresh thread)
rA   r¬   rk   rH   ÚThreadÚ_refresh_loopr­   Ústartra   rb   r3   s    r   rµ   Ú!PromptCache._start_refresh_thread„  sh   € à×ÑÑ(Ø× Ñ ×&Ñ&Ô(Ü#,×#3Ò#3Ø×)Ñ)ØØ*ñ$ˆDÔ ð
 × Ñ ×&Ñ&Ô(Ü�L‰LÐ7Õ8ð )r   c                ó2  • U R                   R                  U R                  5      (       d>   U R                  5         U R                   R                  U R                  5      (       d  M=  gg! [         a"  n[
        R                  SU 35         SnANUSnAff = f)z)Background loop to refresh stale entries.z(Unexpected error in cache refresh loop: N)r¬   ÚwaitrB   Ú_refresh_stale_entriesrˆ   ra   Ú	exception©r   r‘   s     r   rÇ   ÚPromptCache._refresh_loop�  s}   € à×&Ñ&×+Ñ+¨D×,BÑ,B×CÑCðQØ×+Ñ+Ô-ð ×&Ñ&×+Ñ+¨D×,BÑ,B×CÕCøô ó Qä× Ñ Ð#KÈAÈ3Ð!O×PÑPûðQús   ¬A* Á*
BÁ4BÂBc                óZ  • U R                  5       nU(       d  g[        R                  S[        U5       S35        U H™  u  p#U R                  R                  5       (       a    gUR                  c  M5   UR                  5       nU R                  X$UR                  5        U R                  =R                  S-  sl	        [        R                  SU 35        M›     g! [         aE  nU R                  =R                  S-  sl        [        R                  SU SU 35         SnAMè  SnAff = f)z)Check for stale entries and refresh them.NzRefreshing ú stale cache entriesrU   zRefreshed cache entry: zFailed to refresh cache entry r”   )ro   ra   rb   r]   r¬   Úis_setr   r·   rC   r0   rˆ   r1   r™   ©r   Ústale_entriesrW   rX   Ú	new_valuer‘   s         r   rÌ   Ú"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   Á3A#CÃ
D*Ã%:D%Ä%D*c               óF   • U R                  5         U R                  UUUS9  g)úê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.
rE   N©r¼   rJ   rK   s       r   Ú	configureÚPromptCache.configure°  s'   € ð 	�	‰	ŒØ�‰ØØ#Ø%=ð 	ò 	
r   )r­   r¬   rŸ   r¤   r¡   )r#   r$   r%   r&   r'   r¦   r§   r¨   r©   rL   r·   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                  óÀ   ^ • \ rS rSrSrS/r\\\S.       SU 4S jjjr	        SS jr
SS jrSS jrSS	 jrSS
 jrSS jr\\\S.       SS jjrSrU =r$ )ÚAsyncPromptCacheiÆ  aÑ  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_taskrE   c               ó2   >• [         TU ]  UUUS9  SU l        g)a7  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.
rE   N)r¯   rL   rà   r±   s       €r   rL   ÚAsyncPromptCache.__init__á  s+   ø€ ô 	‰ÑØØ#Ø%=ð 	ñ 	
ð
 <@ˆÕr   c              ƒ  ó~   #   • U R                   c  U R                  5       I Sh  v•N   U R                  XU5        g N7f)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È   re   r¶   s       r   ÚasetÚAsyncPromptCache.aset÷  s5   é € ð ×ÑÑ%Ø—*‘*“,×ÐØ�	‰	�#˜lÕ+ñ ùs   ‚!=£;¤=c              ƒ  ó¾   #   • U R                   c  gU R                  b  g[        R                  " U R	                  5       SS9U l        [
        R                  S5        g7f)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)rA   rà   ÚasyncioÚcreate_taskrÇ   ra   rb   r3   s    r   rÈ   ÚAsyncPromptCache.start  sV   é € ð ×ÑÑ$Øà×ÑÑ)àä$×0Ò0Ø×ÑÓ Ø+ñ
ˆÔô 	�‰Ð7Õ8ùs   ‚AAc                ób   • U R                   b"  U R                   R                  5         SU l         gg)z‹Stop background refresh task.

Synchronous wrapper that cancels the refresh task.
For proper cleanup in async context, use stop() instead.
N)rà   Úcancelr3   s    r   r»   ÚAsyncPromptCache.shutdown  s/   € ð ×ÑÑ)Ø×Ñ×%Ñ%Ô'Ø!%ˆDÕð *r   c              ƒ  óö   #   • U R                   c  gU R                   R                  5          U R                   I Sh  v•N   SU l         [        R                  S5        g N!! [        R                   a     N5f = f7f)z\Stop async background refresh loop.

Cancels the refresh task and waits for it to complete.
Nz Stopped async cache refresh task)rà   rë   rç   ÚCancelledErrorra   rb   r3   s    r   r¼   ÚAsyncPromptCache.stop$  so   é € ð
 ×ÑÑ%Øà×Ñ×!Ñ!Ô#ð	Ø×$Ñ$×$Ð$ð "ˆÔÜ�‰Ð7Õ8ñ	 %øÜ×%Ñ%ó 	Ùð	üs8   ‚)A9¬A »A¼A Á A9ÁA ÁA6Á3A9Á5A6Á6A9c              ƒ  ó   #   •   [         R                  " U R                  5      I Sh  v•N   U R                  5       I Sh  v•N   MC   N N! [         R                   a    e [
         a"  n[        R                  SU 35         SnANASnAff = f7f)z/Async background loop to refresh stale entries.Nz.Unexpected error in async cache refresh loop: )rç   ÚsleeprB   rÌ   rî   rˆ   ra   rÍ   rÎ   s     r   rÇ   ÚAsyncPromptCache._refresh_loop4  s€   é € àðWÜ—m’m D×$:Ñ$:Ó;×;Ð;Ø×1Ñ1Ó3×3Ð3ñ á;Ù3øÜ×)Ñ)ó ØÜó Wä× Ñ Ð#QÐRSÐQTÐ!U×VÑVûðWüsP   ‚B…#A ¨A©A Á A	ÁA ÁBÁA Á	A ÁBÁ)BÂBÂBÂBc              ƒ  óH  #   • U R                  5       nU(       d  g[        R                  S[        U5       S35        U Hˆ  u  p#UR                  c  M   UR	                  5       I Sh  v•N nU R                  X$UR                  5      I Sh  v•N   U R                  =R                  S-  sl        [        R                  SU 35        MŠ     g Nd NB! [         aE  nU R                  =R                  S-  sl	        [        R                  SU SU 35         SnAMÛ  SnAff = f7f)z8Check for stale entries and refresh them asynchronously.NzAsync refreshing rÑ   rU   zAsync refreshed cache entry: z$Failed to async refresh cache entry r”   )ro   ra   rb   r]   r   rä   rC   r0   rˆ   r1   r™   rÓ   s         r   rÌ   Ú'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             ƒ  ód   #   • U R                  5       I Sh  v•N   U R                  XU5        g N7f)rØ   NrÙ   rK   s       r   rÚ   ÚAsyncPromptCache.configureU  s*   é € ð �i‰i‹k×ÐØ�‰˜Ð/GÕHñ 	ùs   ‚0–.—0)rà   rŸ   )rW   r¢   r   r
   r   zCallable[[], Awaitable[Any]]r!   r    r¡   )r#   r$   r%   r&   r'   r¦   r§   r¨   r©   rL   rä   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ó Ir   rß   rE   c                ó.   • [         R                  U UUS9  g©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)
rE   N)Úprompt_cache_singletonrÚ   rE   s      r   Úconfigure_global_prompt_cacherú   l  s    € ô& ×$Ñ$ØØØ!9ð %ò r   c              ƒ  óJ   #   • [         R                  U UUS9I Sh  v•N   g N7frø   )Úasync_prompt_cache_singletonrÚ   rE   s      r   Ú#configure_global_async_prompt_cacherý   †  s-   é € ô& '×
0Ñ
0ØØØ!9ð 1ð ÷ ó ùs   ‚#›!œ#c                 ó8   • [         R                  " S[        SS9  g )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                  óJ   ^ • \ rS rSrSr\\\S.       SU 4S jjjrSr	U =r
$ )ÚCachei¬  z:Deprecated alias for PromptCache. Use PromptCache instead.rE   c               ó8   >• [        5         [        TU ]	  UUUS9  g)zï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.
rE   N©r  r¯   rL   r±   s       €r   rL   ÚCache.__init__¯  ó&   ø€ ô 	(Ô)Ü‰ÑØØ#Ø%=ð 	ò 	
r   r   rŸ   ©r#   r$   r%   r&   r'   r§   r¨   r©   rL   r)   rÜ   rÝ   s   @r   r  r  ¬  sC   ø† ÙDð
 6Ø'GØ*Wñ
ð ð
ð %ð	
ð
 #(ð
ð 
÷
ö 
r   r  c                  óJ   ^ • \ rS rSrSr\\\S.       SU 4S jjjrSr	U =r
$ )Ú
AsyncCacheiÅ  zDDeprecated alias for AsyncPromptCache. Use AsyncPromptCache instead.rE   c               ó8   >• [        5         [        TU ]	  UUUS9  g)zô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.
rE   Nr  r±   s       €r   rL   ÚAsyncCache.__init__È  r
  r   r   rŸ   r  rÝ   s   @r   r  r  Å  sC   ø† ÙNð
 6Ø'GØ*Wñ
ð ð
ð %ð	
ð
 #(ð
ð 
÷
ö 
r   r  rŸ   r¡   )*r'   Ú
__future__r   rç   rw   ÚloggingrH   r   r  Úabcr   Úcollectionsr   Úcollections.abcr   Údataclassesr   Úpathlibr   Útypingr	   r
   r   r   r   Ú	getLoggerra   r¨   r§   r©   r   r+   r<   r«   rß   rù   rü   rú   rý   r  r  r  r   r   r   Ú<module>r     sa  ðñõ #ã Û Û Û Û Û Ý Ý #Ý %Ý !Ý ß @Õ @æØà	×	Ò	Ð,Ó	-€ð $*Ð  Ø #Ð Ø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   