
    k
i~                     T   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mZm	Z	m
Z
mZmZmZmZmZ d dl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 d dlmZ d d	lm Z  d d
l!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)  ej*        e+          Z,dZ-dZ.dZ/ G d dee0         e	e)e(f                   Z1dS )    N)abstractmethod)	AnyDictGenericListOptionalSequenceTupleUnioncast)RunnableConfig)WRITES_IDX_MAPBaseCheckpointSaver
CheckpointCheckpointMetadataPendingWrite)SerializerProtocol)ChannelProtocol)FilterQuery)Tag)safely_decodeto_storage_safe_idto_storage_safe_str   )JsonPlusRedisSerializer)	IndexTypeRedisClientType:
checkpointcheckpoint_writec                   :    e Zd ZU dZeed<   dZeed<   dZe	e
         ed<   eed<   eed<   	 dGdddeed	d
e	e         de	e         de	eee
f                  de	eee
f                  dededdf fdZedeee
f         fd            Zedeee
f         fd            ZedHd            Ze	 	 	 dId
e	e         de	e         de	eee
f                  ddfd            ZdHdZdHdZdHdZdeeee
f         ef         deee
f         dee
         defdZ	 	 dJdede	ee                  de	e         de
fd Z dede!ee
f         fd!Z"de!ee
f         de!ee
f         fd"Z#d#e
de
fd$Z$d%ed&ed'ed(ed)e%e&ee
f                  dee!ee
f                  fd*Z'd+e!ee
f         de(fd,Z)d+e(defd-Z*d.e	e         d/e+e
e
e
f         defd0Z,d1e
defd2Z-d1ede.fd3Z/d4edee0eee
f                  fd5Z1	 dKd7e2d)e%e&ee
f                  d(ed8eddf
d9Z3d%ed&ed'edee4         fd:Z5d%ed&ed'ed;ed<edee4         fd=Z6e7d>e8d?e!e&eef         e!f         dee4         fd@            Z9e7d1e.ez  de.fdA            Z:e7dBede!fdC            Z;d%ed&ed'edefdDZ<d%ed&ed'ed(edEe	e=         defdFZ> xZ?S )LBaseRedisSaverzBase Redis implementation for checkpoint saving.

    Uses Redis JSON for storing checkpoints and related data, with RediSearch for querying.
    _redisF_owns_its_clientN_key_registrycheckpoints_indexcheckpoint_writes_index)redis_clientconnection_argsttlcheckpoint_prefixcheckpoint_write_prefix	redis_urlr(   r)   r*   r+   r,   returnc                   t                                          t                                 ||t          d          || _        || _        || _        |                     |||pi            |  |  |                                  dS )a  Initialize Redis-backed checkpoint saver.

        Args:
            redis_url: Redis connection URL
            redis_client: Redis client instance to use (alternative to redis_url)
            connection_args: Additional arguments for Redis connection
            ttl: Optional TTL configuration dict with optional keys:
                - default_ttl: TTL in minutes for all checkpoint keys
                - refresh_on_read: Whether to refresh TTL on reads
            checkpoint_prefix: Prefix for checkpoint keys (default: "checkpoint")
            checkpoint_write_prefix: Prefix for checkpoint write keys (default: "checkpoint_write")
        )serdeNz1Either redis_url or redis_client must be provided)r-   r(   r)   )	super__init__r   
ValueError
ttl_config_checkpoint_prefix_checkpoint_write_prefixconfigure_clientcreate_indexes)selfr-   r(   r)   r*   r+   r,   	__class__s          C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langgraph/checkpoint/redis/base.pyr2   zBaseRedisSaver.__init__3   s    , 	688999!5PQQQ  #4(?%%+1r 	 	
 	
 	
 	)/    c                     | j         | j         t          z   ddddddddddddddd	ddd
dddddddddddg	dS )z!Schema for the checkpoints index.jsonnameprefixstorage_type	thread_idtagr@   typerun_idcheckpoint_nscheckpoint_idparent_checkpoint_idcheckpoint_tsnumericsourcestep
has_writesindexfields)r5   REDIS_KEY_SEPARATORr9   s    r;   checkpoints_schemaz!BaseRedisSaver.checkpoints_schema_   s    
 /14GG &  %e44!511(%88(%88/??()<<!51133%u55

 
 	
r<   c           
      p    | j         | j         t          z   ddddddddddddddd	d
dddddddgdS )z'Schema for the checkpoint writes index.r>   r?   rC   rD   rE   rH   rI   task_ididxrL   channelrF   rP   )r6   rS   rT   s    r;   writes_schemazBaseRedisSaver.writes_schemau   s    
 57:MM &  %e44(%88(%88"E22	22"E22//
 
 	
r<   c                     dS )z)Create appropriate SearchIndex instances.N rT   s    r;   r8   zBaseRedisSaver.create_indexes   s	     	r<   c                     dS )zConfigure the Redis client.Nr\   )r9   r-   r(   r)   s       r;   r7   zBaseRedisSaver.configure_client   s	     	r<   c                     ddl m} ddlm} 	 | j                            d|           dS # |t          f$ r1 	 | j                            |           Y dS # t          $ r Y Y dS w xY ww xY w)z%Set client info for Redis monitoring.r   ResponseError__full_lib_name__LIB-NAMEN)	redis.exceptionsr`   "langgraph.checkpoint.redis.versionrb   r#   client_setinfoAttributeErrorecho	Exception)r9   r`   rb   s      r;   set_client_infozBaseRedisSaver.set_client_info   s    222222HHHHHH		K&&z3DEEEEE~. 	 	 	  !2333333   		s&   + A(A
A$A(#A$$A(c                   K   ddl m} ddlm} 	 | j                            d|           d{V  dS # |t          f$ rL 	 | j                            |          }t          |d          r| d{V  Y dS Y dS # t          $ r Y Y dS w xY ww xY w)z4Set client info for Redis monitoring asynchronously.r   r_   ra   rc   N	__await__)
rd   r`   re   rb   r#   rf   rg   rh   hasattrri   )r9   r`   rb   echo_results       r;   aset_client_infozBaseRedisSaver.aset_client_info   s     222222HHHHHH	+,,Z9JKKKKKKKKKKK~. 		 		 		"k../@AA;44 &%%%%%%%%%%%& & &   		s'   !3 B 2A88
BBBBc                 r    | j                             d           | j                            d           dS )z Initialize the indices in Redis.F)	overwriteN)r&   creater'   rT   s    r;   setupzBaseRedisSaver.setup   s>     	%%%666$++e+<<<<<r<   r   channel_valuespending_sendsc                      |si S t          |t                    r|n&t          t          t          j        |                    }i | fd|pg D             |dS )Nc                 h    g | ].\  }}j                             t          |          |f          /S r\   )r0   loads_typedr   ).0cbr9   s      r;   
<listcomp>z3BaseRedisSaver._load_checkpoint.<locals>.<listcomp>   sJ       Aq 
&&a(8(8!'<==  r<   )ru   rt   )
isinstancedictr   orjsonloads)r9   r   rt   ru   loadeds   `    r;   _load_checkpointzBaseRedisSaver._load_checkpoint   s      	I
 *d++6JJdFL4455 	

   )/R   -
 
 
 	
r<   main_keyrelated_keysttl_minutesc                    |*| j         r#d| j         v r| j                             d          }||dk    rU|g|pg z   }|D ]H}	 | j                            |           # t          $ r t
                              d|           Y Ew xY wdS t          |dz            }|g|pg z   }|D ]I}	 | j                            ||           # t          $ r t
                              d|           Y Fw xY wdS dS )a  Apply Redis native TTL to keys.

        Args:
            main_key: The primary Redis key
            related_keys: Additional Redis keys that should expire at the same time
            ttl_minutes: Time-to-live in minutes, overrides default_ttl if provided
                        Use -1 to remove TTL (make keys persistent)

        Returns:
            Result of the Redis operation
        Ndefault_ttlz!Failed to remove TTL from key: %sT<   zFailed to apply TTL to key: %s)	r4   getr#   persistri   loggerwarningintexpire)r9   r   r   r   all_keyskeyttl_secondss          r;   _apply_ttl_to_keysz!BaseRedisSaver._apply_ttl_to_keys   sm   "  A=DO#C#C"o11-@@"b   %:);<# Q QCQ++C0000$ Q Q Q'JCPPPPPQ t kB.//K
 !z\%7R8H J JJK&&sK8888  J J JNN#CSIIIIIJ 47 #"s$   A%BB)C%C-,C-c                    | j                             |          \  }}|dk    r(t          t          t	          j        |                    }nt          t          | j                             ||f                    }d|v rU|d                                         D ]:\  }}t          |t                    r d| 
                    |          i|d         |<   ;d|v r'd |d                                         D             |d<   d|i|dg iS )z#Convert checkpoint to Redis format.r>   rt   	__bytes__channel_versionsc                 4    i | ]\  }}|t          |          S r\   )str)ry   kvs      r;   
<dictcomp>z3BaseRedisSaver._dump_checkpoint.<locals>.<dictcomp>%  s1     3 3 3"a3q663 3 3r<   rF   ru   )r0   dumps_typedr   r~   r   r   rx   itemsr}   bytes_encode_blob)r9   r   type_datacheckpoint_datar   values          r;   _dump_checkpointzBaseRedisSaver._dump_checkpoint  s0   j,,Z88t F??"4d););<<OO #4)?)?)N)NOOO  ?22"12B"C"I"I"K"K  JC!%// '):):5)A)AB(89#>
 003 3&56H&I&O&O&Q&Q3 3 3O./ FF/2FFFr<   c           
         |si S 	 |                      |          S # t          $ r}t                              d|            i }|                                D ][\  }}	 |                      |          ||<   # t          $ r0}t                              d| d| d           |||<   Y d}~Td}~ww xY w|cY d}~S d}~ww xY w)a  Deserialize channel values that were stored inline.

        When channel values are stored inline in the checkpoint, they're in their
        serialized form. This method deserializes them back to their original types.

        This specifically handles LangChain message objects that may be stored in their
        serialized format: {'lc': 1, 'type': 'constructor', 'id': [...], 'kwargs': {...}}
        and ensures they are properly reconstructed as message objects.
        z9Error deserializing channel values, attempting recovery: zFailed to deserialize channel 'z': z. Value will be returned as-is.N)_recursive_deserializeri   r   r   r   error)r9   rt   e	recoveredr   r   inner_es          r;   _deserialize_channel_valuesz*BaseRedisSaver._deserialize_channel_values+  s1     	I	..~>>> 	 	 	NNOAOO   I,2244 + +
U+%)%@%@%G%GIcNN  + + +LL9# 9 9' 9 9 9   &+IcNNNNNN+ 	sD    
C 8B;A76B;7
B1&B,'B;,B11B;5C ;C objc                 z    t          |t                    rd|v r.t          |          dk    r                     |d                   S |                    d          du rd|v rd|v rt          |          dk    rt	 dd	lm}  ||d                              |d                   
          S # t          t          t          f$ r'}t                              d|d           Y d}~nd}~ww xY w|                    d          dv rp|                    d          dk    rV	 t           j        d          r j                            |          S t           j        d          r j                            |          S t                              d|                    d                      |S # t$          $ r}|                    dd          }t          |                    d          t&                    r|                    ddg          d         nd}t                              d| d| d|                    d           d|                    d           d| 
           |cY d}~S d}~ww xY w fd|                                D             S t          |t&                    r fd|D             S |S )a  Recursively deserialize LangChain objects and nested structures.

        This method specifically handles the deserialization of LangChain message objects
        that may be stored in their serialized format to prevent MESSAGE_COERCION_FAILURE.

        Args:
            obj: The object to deserialize, which may be a dict, list, or primitive.

        Returns:
            The deserialized object, with LangChain objects properly reconstructed.
        r   r   __send__Tnodearg   r   )Send)r   r   z%Failed to deserialize Send object: %s)exc_infoNlc)r      rF   constructor_revive_if_needed_reviverziSerializer does not have a reviver method. LangChain object may not be properly deserialized. Object ID: idunknownr   z0Failed to deserialize LangChain object of type 'z3'. This may cause MESSAGE_COERCION_FAILURE. Error: z. Object structure: lc=z, type=z, id=c                 B    i | ]\  }}|                     |          S r\   r   )ry   r   r   r9   s      r;   r   z9BaseRedisSaver._recursive_deserialize.<locals>.<dictcomp>  s-    NNN$!QAt22155NNNr<   c                 :    g | ]}                     |          S r\   r   )ry   itemr9   s     r;   r|   z9BaseRedisSaver._recursive_deserialize.<locals>.<listcomp>  s'    FFF$D//55FFFr<   )r}   r~   len_decode_blobr   langgraph.typesr   r   ImportError	TypeErrorr3   r   debugrm   r0   r   r   r   ri   listr   r   )r9   r   r   r   obj_idobj_types   `     r;   r   z%BaseRedisSaver._recursive_deserializeN  sC    c4   A	c!!c#hh!mm(([)9::: 
##t++cMMSLLHHMM
4444444 [ 77E
CC    $Y
;   LL?T !         wwt}}&&3776??m+K+K tz+>?? ##z;;C@@@ Z88 	##z223777 :*-''$--: :  
  #
     WWT955F &cggdmmT::'yk22266& 
 LL'8 ' 'KL' '03' 'FIggfoo' ' %' '   JJJJJJ" ONNN#))++NNNNT"" 	FFFF#FFFF JsC   =1B/ /C-C((C-#.F3 .F3 1F3 3
I5=B-I0*I50I5rC   rH   rI   rW   writesc                 J      fdt          |          D             S )z+Convert write operations for Redis storage.c                    g | ]}\  }\  }}j                             |          \  }}t          
          t                    t                    	t	          j        ||          ||                    |          d ~S ))rC   rH   rI   rW   rX   rY   rF   blob)r0   r   r   r   r   r   r   )ry   rX   rY   r   tr{   rI   rH   r9   rW   rC   s         r;   r|   z/BaseRedisSaver._dump_writes.<locals>.<listcomp>  s     
 
 
 &%gu//661 0	::!4]!C!C!3M!B!B"%)'377"))!,,	 	
 
 
r<   )	enumerate)r9   rC   rH   rI   rW   r   s   ````` r;   _dump_writeszBaseRedisSaver._dump_writes  sP    
 
 
 
 
 
 
 
 *36):):
 
 
 	
r<   metadatac                 t    | j                             |          \  }}| j                             ||f          S )zLoad metadata from Redis-compatible dictionary.

        Args:
            metadata: Dictionary representation from Redis.

        Returns:
            Original metadata dictionary.
        )r0   r   rx   )r9   r   type_str
data_bytess       r;   _load_metadatazBaseRedisSaver._load_metadata  s9      $z55h??*z%%x&<===r<   c                     | j                             |          \  }}|                                                    dd          S )zConvert metadata to a Redis-compatible dictionary.

        Args:
            metadata: Metadata to convert.

        Returns:
            Dictionary representation of metadata for Redis storage.
        z\u0000 )r0   r   decodereplace)r9   r   r   serialized_bytess       r;   _dump_metadatazBaseRedisSaver._dump_metadata  sA     &*Z%;%;H%E%E""&&((00B???r<   currentrY   c                     |d}n@t          |t                    r|}n(t          |                    d          d                   }|dz   }t          j                    }|dd|dS )zGenerate next version number.Nr   .r   032016)r}   r   splitrandom)r9   r   rY   	current_vnext_vnext_hs         r;   get_next_versionzBaseRedisSaver.get_next_version  su     ?II%% 	3IIGMM#..q122IQ+++v++++r<   r   c                 |    t          |t                    r&t          j        |                                          S |S )z#Encode blob data for Redis storage.)r}   r   base64	b64encoder   r9   r   s     r;   r   zBaseRedisSaver._encode_blob  s6    dE"" 	3#D))00222r<   c                     	 t          j        |          S # t          j        t          f$ r. t          |t                    r|                                n|cY S w xY w)z$Decode blob data from Redis storage.)r   	b64decodebinasciiErrorr   r}   r   encoder   s     r;   r   zBaseRedisSaver._decode_blob  sf    	D#D)))	* 	D 	D 	D$.tS$9$9C4;;===tCCC	Ds    AAA	write_keyc                    |sg S t          t          t          t          t          f                  | j                                                            |                    }|sg S g }|d         D ]_}|                    |d         |d         | j	        
                    |d         |                     |d                   f          f           `|S )z+Load writes from Redis JSON storage by key.r   rW   rY   rF   r   )r   r   r   r   r   r#   r>   r   appendr0   rx   r   )r9   r   resultr   writes        r;   _load_writes_from_redisz&BaseRedisSaver._load_writes_from_redis  s     	I htCH~.0@0@0B0B0F0Fy0Q0QRR 	IH% 		 		EMM)$)$J**v(9(9%-(H(HI     r<   r   config	task_pathc                 ,   |d         d         }|d                              dd          }|d         d         }g }t          |          D ]\  }	\  }
}| j                            |          \  }}t	          |          t          |          t	          |          ||t          j         |
|	          |
||                     |          d	}|                    |           | j	        
                                                    d          5 }g }|D ]}|d	         }t          |t                    sJ |                     |||||          }| j	                            |          d
k    }t!          d |D                       r|r|
                                                    |d|d                    |
                                                    |d|d                    |
                                                    |d|d                    |
                                                    |d|           |                    |           C|s>|
                                                    |d|           |                    |           |                                 |rI| j        rBd| j        v r9|                     |d         t+          |          d
k    r
|d
d         nd           |r|                     t	          |          t          |          t	          |                    }| j	                            |          r.| j	        
                                                    |dd           ddd           dS # 1 swxY w Y   dS )aL  Store intermediate writes linked to a checkpoint.

        Args:
            config: Configuration of the related checkpoint.
            writes: List of writes to store, each as (channel, value) pair.
            task_id: Identifier for the task creating the writes.
            task_path: Optional path info for the task.
        configurablerC   rH   r   rI   )	rC   rH   rI   rW   r   rX   rY   rF   r   F)transactionrX   r   c              3   4   K   | ]}|d          t           v V  dS )r   N)r   )ry   ws     r;   	<genexpr>z,BaseRedisSaver.put_writes.<locals>.<genexpr><  s+      >>!qt~->>>>>>r<   z	$.channelrY   z$.typerF   $.blobr   $r   r   Nz$.has_writesT)r   r   r0   r   r   r   r   r   r   r#   r>   pipeliner}   r   !_make_redis_checkpoint_writes_keyexistsallsetexecuter4   r   r   _make_redis_checkpoint_key)r9   r   r   rW   r   rC   rH   rI   writes_objectsrX   rY   r   r   r   	write_objr   created_keys	idx_valuer   
key_existscheckpoint_keys                        r;   
put_writeszBaseRedisSaver.put_writes  s    >*;7	~.22?BGG~.? %.v%6%6 	- 	-!C!'5*0077KE4/	::!4]!C!C!3M!B!B"&%)'377"))  I !!),,,, [((U(;; 6	QxL+ 1 1	%e,	!)S11111<<!!  "[//449
>>v>>>>> 1! 1 ++Ci	>RSSS ++C9V;LMMM ++C9V;LMMMM !++Ci@@@$++C0000 & 1 ++Ci@@@$++C000   MT_4T4T'' O\9J9JQ9N9N\!""%5%5TX  
  
Q!%!@!@&y11'66&}55" " ;%%n55 Q K$$&&**>>4PPPm6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Q 6	Qs   I1N		NNc                    |g S | j                             |||          }| j                            |          }|sg S t	          t          d          t          |          k    t          d          t          |          k    z  t          d          t          |          k    z  g dd          }| j        	                    |          }t          |j        d           }i }	|D ]}
t          t          |
d	d
                    }t          t          |
dd                    }t          |
dd
          }t          |t                    r|                    d          }||t          t          |
dd
                    t          t          |
dd
                    |d|	||f<   t                               | j        |	          }|S )NrC   rH   rI   rW   rX   rY   rF   r     filter_expressionreturn_fieldsnum_resultsc                 $    t          | dd          S NrX   r   getattrxs    r;   <lambda>z5BaseRedisSaver._load_pending_writes.<locals>.<lambda>      '!UTUBVBV r<   r   rW   r   rX   r   r   utf-8rY   rF   rW   rX   rY   rF   r   )r%   make_write_keys_zset_keyr#   r   r   r   r   r   r'   searchsorteddocsr   r  r}   r   r"   _load_writesr0   )r9   rC   rH   rI   write_registry_keyregistry_existswrites_querywrites_resultssorted_writeswrites_dictdocrW   rX   	blob_datapending_writess                  r;   _load_pending_writesz#BaseRedisSaver._load_pending_writesb  s     I "/HH}m
 
 +,,-?@@ 	I #";//3Ei3P3PP?##':='I'IIK?##'9-'H'HHJ JII
 
 
 5<<\JJ ~28V8VWWW >@  	 	C'#y"5566Ggc5!,,--CXr22I)S)) 6%,,W55	"wsIr::;;GC4455!+ +K#'' (44TZMMr<   checkpoint_has_writesregistry_has_writesc                 .   |g S |sg S |sg S t          t          d          t          |          k    t          d          t          |          k    z  t          d          t          |          k    z  g dd          }| j                            |          }t          |j        d 	          }i }	|D ]}
t          t          |
d
d                    }t          t          |
dd                    }t          |
dd          }t          |t                    r|                    d          }||t          t          |
dd                    t          t          |
dd                    |d|	||f<   t                              | j        |	          }|S )zTLoad pending writes with pre-computed registry check to avoid duplicate Redis calls.NrC   rH   rI   r  r  r  c                 $    t          | dd          S r  r  r  s    r;   r  zIBaseRedisSaver._load_pending_writes_with_registry_check.<locals>.<lambda>  r  r<   r  rW   r   rX   r   r   r  rY   rF   r  )r   r   r   r   r'   r  r   r!  r   r  r}   r   r"   r"  r0   )r9   rC   rH   rI   r-  r.  r%  r&  r'  r(  r)  rW   rX   r*  r+  s                  r;   (_load_pending_writes_with_registry_checkz7BaseRedisSaver._load_pending_writes_with_registry_check  s     I # 	I % 	I
 #";//3Ei3P3PP?##':='I'IIK?##'9-'H'HHJ JII
 
 
 5<<\JJ ~28V8VWWW >@  	 	C'#y"5566Ggc5!,,--CXr22I)S)) 6%,,W55	"wsIr::;;GC4455!+ +K#'' (44TZMMr<   r0   task_id_to_datac                 H      fd|                                 D             }|S )zDeserialize pending writes.c                     g | ]L\  \  }}}||d                               |d         t                              |d                   f          fMS )rY   rF   r   )rx   r"   _decode_blob_static)ry   rW   _r   r0   s       r;   r|   z/BaseRedisSaver._load_writes.<locals>.<listcomp>  sp     	
 	
 	
 #!d Y!!&\>#E#Ed6l#S#ST 	
 	
 	
r<   )r   )r0   r2  r   s   `  r;   r"  zBaseRedisSaver._load_writes  s@    
	
 	
 	
 	
 '6&;&;&=&=	
 	
 	
 r<   c                 @   	 t          | t                    rt          j        |           S t          j        |                     d                    S # t
          j        t          t          f$ r/ t          | t                    r|                     d          n| cY S w xY w)z4Decode blob data from Redis storage (static method).r  )
r}   r   r   r   r   r   r   r   r3   r   )r   s    r;   r5  z"BaseRedisSaver._decode_blob_static  s    	K$&& .'---#DKK$8$8999	:6 	K 	K 	K+5dC+@+@J4;;w'''dJJJ	Ks   (A &A ABB	redis_keyc                 l   t          |           } |                     t                    }t          |          dk     rt	          dt          |                     |d d         \  }}}}}}|t
          k    rt	          d          t          |          t          |          t          |          ||dS )N   z,Expected at least 6 parts in Redis key, got z2Expected checkpoint key to start with 'checkpoint')rC   rH   rI   rW   rX   )r   r   rS   r   r3   CHECKPOINT_WRITE_PREFIXr   )r8  parts	namespacerC   rH   rI   rW   rX   s           r;   "_parse_redis_checkpoint_writes_keyz1BaseRedisSaver._parse_redis_checkpoint_writes_key  s     "),,	 344u::>>Ks5zzKK  
 LQQSRSQS9H	9m]GS///QRRR -Y770??0??
 
 	
r<   c           
          t                               | j        t          t	          |                    t          |          t          t	          |                    g          S N)rS   joinr5   r   r   r   )r9   rC   rH   rI   s       r;   r  z)BaseRedisSaver._make_redis_checkpoint_key  sZ     #'''&y1122#M22&}5566	
 
 	
r<   rX   c           
      @   t          t          |                    }t          |          }t          t          |                    }|$t                              | j        ||||g          S t                              | j        ||||t          |          g          S r@  )r   r   r   rS   rA  r6   )	r9   rC   rH   rI   rW   rX   storage_safe_thread_idstorage_safe_checkpoint_nsstorage_safe_checkpoint_ids	            r;   r   z0BaseRedisSaver._make_redis_checkpoint_writes_key  s     "%%7	%B%B!C!C%8%G%G"%();M)J)J%K%K";&++1*..   #''-&**C	
 	
 		
r<   r@  )r.   N)NNN)NN)r   )@__name__
__module____qualname____doc__r   __annotations__r$   boolr%   r   r   r   CHECKPOINT_PREFIXr;  r   r   r2   propertyrU   rZ   r   r8   r7   rj   ro   rs   r   r   r   r   r   floatr   r~   r   r   r   r	   tupler   r   r   r   r   r   r   r   r   r
   r   r   r  r   r,  r1  staticmethodr   r"  r5  r>  r  r   r   __classcell__)r:   s   @r;   r"   r"   &   s.         
 "d"""#'M8C='''    &&&& $(* 3748(,!2'>* * *C=* /	*
 "$sCx.1* d38n%* * "%* 
* * * * * *X 
DcN 
 
 
 X
* 
tCH~ 
 
 
 X
&    ^  $(2648	 C= / "$sCx.1	
 
   ^   "   (= = = =
$sCx.#-.
 S#X
 Cy	

 

 
 
 
8 -1'+	1 11 tCy)1 e_	1
 
1 1 1 1fG: G$sCx. G G G G8!"38n!	c3h! ! ! !FM# M# M M M M^

 
 	

 
 sCx)
 
d38n	
 
 
 
0>tCH~ >:L > > > >@'9 @c @ @ @ @,},/>sC}/M,	, , , ,     D D D D D D eCcM>R9S    : ]Q ]Q]Q sCx)]Q 	]Q
 ]Q 
]Q ]Q ]Q ]Q~22-02AD2	l	2 2 2 2h77 7 	7
  $7 "7 
l	7 7 7 7r !48sCx$9N4O	l	   \  
K%#+ 
K% 
K 
K 
K \
K 
c 
d 
 
 
 \
2



-0

AD

	

 

 

 

 
 
  
 	 

  
 c] 
 
 
  
  
  
  
  
  
  
r<   r"   )2r   r   loggingr   abcr   typingr   r   r   r   r   r	   r
   r   r   r   langchain_core.runnablesr   langgraph.checkpoint.baser   r   r   r   r   langgraph.checkpoint.serde.baser    langgraph.checkpoint.serde.typesr   redisvl.queryr   redisvl.query.filterr   langgraph.checkpoint.redis.utilr   r   r   jsonplus_redisr   typesr   r   	getLoggerrF  r   rS   rL  r;  r   r"   r\   r<   r;   <module>r_     s             S S S S S S S S S S S S S S S S S S S S S S  3 3 3 3 3 3              ? > > > > > < < < < < < % % % % % % $ $ $ $ $ $          4 3 3 3 3 3 - - - - - - - -		8	$	$   , M
 M
 M
 M
 M
(-w	7Q/R M
 M
 M
 M
 M
r<   