
    \ǻi%                    4   d dl mZ d dlmZmZmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ d
Z G d de	      ZddZ G d deee   d      Z edi e G d dee                Z edded e             ZdddZ y)    )annotations)	dataclassfieldreplace)AnyGeneric
NamedTuplecast)	BaseStore)	TypedDictUnpack)CONFCONFIG_KEY_RUNTIME)
get_config)
_DC_KWARGSStreamWriter)ContextT)ExecutionInfoRuntimeget_runtimec                  :    e Zd ZU dZdZded<   	 dZded<   	 d	dZy)
r   zORead-only execution info/metadata for the execution of current thread/run/node.   intnode_attemptNzfloat | Nonenode_first_attempt_timec                &     | j                   di |S )zAReturn a new execution info object with selected fields replaced. )_replaceself	overridess     O/opt/lhia/marcimex/agent/venv/lib/python3.12/site-packages/langgraph/runtime.pypatchzExecutionInfo.patch   s    t}})y))    )r!   r   returnr   )__name__
__module____qualname____doc__r   __annotations__r   r#   r   r$   r"   r   r      s%    YL#<,0\0F*r$   r   c                     y Nr   )_s    r"   _no_op_stream_writerr.      s    r$   c                  @    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   y)_RuntimeOverridesr   contextBaseStore | Nonestorer   stream_writerr   previousr   execution_infoN)r&   r'   r(   r*   r   r$   r"   r0   r0   "   s    M!!r$   r0   F)totalc                      e Zd ZU dZ ed      Zded<   	  ed      Zded<   	  ee      Z	ded	<   	  ed      Z
d
ed<   	  ee      Zded<   	 ddZ	 	 	 	 ddZddZy)r   a	  Convenience class that bundles run-scoped context and other runtime utilities.

    This class is injected into graph nodes and middleware. It provides access to
    `context`, `store`, `stream_writer`, `previous`, and `execution_info`.

    !!! note "Accessing `config`"

        `Runtime` does not include `config`. To access `RunnableConfig`, you can inject
        it directly by adding a `config: RunnableConfig` parameter to your node function
        (recommended), or use `get_config()` from `langgraph.config`.

    !!! note
        `ToolRuntime` (from `langgraph.prebuilt`) is a subclass that provides similar
        functionality but is designed specifically for tools. It shares `context`, `store`,
        and `stream_writer` with `Runtime`, and adds tool-specific attributes like `config`,
        `state`, and `tool_call_id`.

    !!! version-added "Added in version v0.6.0"

    Example:

    ```python
    from typing import TypedDict
    from langgraph.graph import StateGraph
    from dataclasses import dataclass
    from langgraph.runtime import Runtime
    from langgraph.store.memory import InMemoryStore


    @dataclass
    class Context:  # (1)!
        user_id: str


    class State(TypedDict, total=False):
        response: str


    store = InMemoryStore()  # (2)!
    store.put(("users",), "user_123", {"name": "Alice"})


    def personalized_greeting(state: State, runtime: Runtime[Context]) -> State:
        '''Generate personalized greeting using runtime context and store.'''
        user_id = runtime.context.user_id  # (3)!
        name = "unknown_user"
        if runtime.store:
            if memory := runtime.store.get(("users",), user_id):
                name = memory.value["name"]

        response = f"Hello {name}! Nice to see you again."
        return {"response": response}


    graph = (
        StateGraph(state_schema=State, context_schema=Context)
        .add_node("personalized_greeting", personalized_greeting)
        .set_entry_point("personalized_greeting")
        .set_finish_point("personalized_greeting")
        .compile(store=store)
    )

    result = graph.invoke({}, context=Context(user_id="user_123"))
    print(result)
    # > {'response': 'Hello Alice! Nice to see you again.'}
    ```

    1. Define a schema for the runtime context.
    2. Create a store to persist memories and other information.
    3. Use the runtime context to access the `user_id`.
    N)defaultr   r1   r2   r3   r   r4   r   r5   )default_factoryr   r6   c                *   t        |j                  xs | j                  |j                  xs | j                  |j                  t        ur|j                  n| j                  |j
                  | j
                  n|j
                  |j                        S )zMerge two runtimes together.

        If a value is not provided in the other runtime, the value from the current runtime is used.
        r1   r3   r4   r5   r6   )r   r1   r3   r4   r.   r5   r6   )r    others     r"   mergezRuntime.merge   ss    
 MM1T\\+++""*>>  --##&+nn&<T]]%.. //
 	
r$   c                    t        | fi |S )z@Replace the runtime with a new runtime with the given overrides.)r   r   s     r"   overridezRuntime.override   s     t)y))r$   c                P    t        |  | j                  j                  di |      S )zBReturn a new runtime with selected execution_info fields replaced.)r6   r   )r   r6   r#   r   s     r"   patch_execution_infozRuntime.patch_execution_info   s+    44..44AyA
 	
r$   )r=   Runtime[ContextT]r%   rC   )r!   z#Unpack[_RuntimeOverrides[ContextT]]r%   rC   )r!   r   r%   rC   )r&   r'   r(   r)   r   r1   r*   r3   r.   r4   r5   r   r6   r>   r@   rB   r   r$   r"   r   r   *   s    FP d+GX+5 $D1E1C"'0D"EM<E4$'Hc'
 %*-$HNMHL
*>*	*
r$   r   Nr<   c                x    t        t        t           t               t           j                  t                    }|S )zGet the runtime for the current graph run.

    Args:
        context_schema: Optional schema used for type hinting the return type of the runtime.

    Returns:
        The runtime for the current graph run.
    )r
   r   r   r   r   getr   )context_schemaruntimes     r"   r   r      s-     78$jl4&8&<&<=O&PQGNr$   )r-   r   r%   Noner   r,   )rF   ztype[ContextT] | Noner%   rC   )!
__future__r   dataclassesr   r   r   typingr   r   r	   r
   langgraph.store.baser   typing_extensionsr   r   langgraph._internal._constantsr   r   langgraph.configr   langgraph.typesr   r   langgraph.typingr   __all__r   r.   r0   r   DEFAULT_RUNTIMEr   r   r$   r"   <module>rT      s    " 1 1 1 1 * / C ' 4 %
5*J * ."	78#4E " Zw
gh w
 w
t 
& ?r$   