Skip to content

Set store & stream writer #4044

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions libs/langgraph/langgraph/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import asyncio

Check notice on line 1 in libs/langgraph/langgraph/config.py

View workflow job for this annotation

GitHub Actions / benchmark

Benchmark results

........... fanout_to_subgraph_10x: Mean +- std dev: 58.2 ms +- 1.4 ms ........... fanout_to_subgraph_10x_sync: Mean +- std dev: 52.0 ms +- 0.5 ms ........... fanout_to_subgraph_10x_checkpoint: Mean +- std dev: 74.8 ms +- 0.8 ms ........... fanout_to_subgraph_10x_checkpoint_sync: Mean +- std dev: 94.0 ms +- 0.7 ms ........... fanout_to_subgraph_100x: Mean +- std dev: 565 ms +- 6 ms ........... fanout_to_subgraph_100x_sync: Mean +- std dev: 504 ms +- 5 ms ........... fanout_to_subgraph_100x_checkpoint: Mean +- std dev: 784 ms +- 20 ms ........... fanout_to_subgraph_100x_checkpoint_sync: Mean +- std dev: 958 ms +- 32 ms ........... react_agent_10x: Mean +- std dev: 32.1 ms +- 1.9 ms ........... react_agent_10x_sync: Mean +- std dev: 23.5 ms +- 0.1 ms ........... react_agent_10x_checkpoint: Mean +- std dev: 40.7 ms +- 0.8 ms ........... react_agent_10x_checkpoint_sync: Mean +- std dev: 38.1 ms +- 0.4 ms ........... react_agent_100x: Mean +- std dev: 346 ms +- 6 ms ........... react_agent_100x_sync: Mean +- std dev: 276 ms +- 3 ms ........... react_agent_100x_checkpoint: Mean +- std dev: 716 ms +- 7 ms ........... react_agent_100x_checkpoint_sync: Mean +- std dev: 702 ms +- 10 ms ........... wide_state_25x300: Mean +- std dev: 20.2 ms +- 0.4 ms ........... wide_state_25x300_sync: Mean +- std dev: 12.9 ms +- 0.1 ms ........... wide_state_25x300_checkpoint: Mean +- std dev: 82.4 ms +- 0.5 ms ........... wide_state_25x300_checkpoint_sync: Mean +- std dev: 76.8 ms +- 0.5 ms ........... wide_state_15x600: Mean +- std dev: 23.6 ms +- 0.5 ms ........... wide_state_15x600_sync: Mean +- std dev: 14.9 ms +- 0.2 ms ........... wide_state_15x600_checkpoint: Mean +- std dev: 134 ms +- 2 ms ........... wide_state_15x600_checkpoint_sync: Mean +- std dev: 127 ms +- 1 ms ........... wide_state_9x1200: Mean +- std dev: 23.6 ms +- 0.4 ms ........... wide_state_9x1200_sync: Mean +- std dev: 14.8 ms +- 0.1 ms ........... wide_state_9x1200_checkpoint: Mean +- std dev: 93.4 ms +- 0.8 ms ........... wide_state_9x1200_checkpoint_sync: Mean +- std dev: 86.9 ms +- 0.7 ms ........... sequential_10: Mean +- std dev: 3.95 ms +- 0.05 ms ........... sequential_10_sync: Mean +- std dev: 2.78 ms +- 0.03 ms ........... sequential_1000: Mean +- std dev: 830 ms +- 11 ms ........... sequential_1000_sync: Mean +- std dev: 725 ms +- 7 ms ........... pydantic_state_25x300: Mean +- std dev: 23.7 ms +- 0.5 ms ........... pydantic_state_25x300_sync: Mean +- std dev: 15.9 ms +- 0.2 ms ........... pydantic_state_25x300_checkpoint: Mean +- std dev: 96.7 ms +- 1.2 ms ........... pydantic_state_25x300_checkpoint_sync: Mean +- std dev: 90.5 ms +- 0.4 ms ........... pydantic_state_15x600: Mean +- std dev: 30.9 ms +- 0.6 ms ........... pydantic_state_15x600_sync: Mean +- std dev: 21.3 ms +- 0.2 ms ........... pydantic_state_15x600_checkpoint: Mean +- std dev: 161 ms +- 1 ms ........... pydantic_state_15x600_checkpoint_sync: Mean +- std dev: 154 ms +- 1 ms ........... pydantic_state_9x1200: Mean +- std dev: 34.3 ms +- 0.5 ms ........... pydantic_state_9x1200_sync: Mean +- std dev: 24.7 ms +- 0.1 ms ........... pydantic_state_9x1200_checkpoint: Mean +- std dev: 118 ms +- 1 ms ........... pydantic_state_9x1200_checkpoint_sync: Mean +- std dev: 110 ms +- 0 ms ........... WARNING: the benchmark result may be unstable * the standard deviation (24.7 ms) is 14% of the mean (176 ms) Try to rerun the benchmark with more runs, values and/or loops. Run 'python -m pyperf system tune' command to reduce the system jitter. Use pyperf stats, pyperf dump and pyperf hist to analyze results. Use --quiet option to hide these warnings. sequential_1000_compilation: Mean +- std dev: 176 ms +- 25 ms ........... pydantic_state_25x300_compilation: Mean +- std dev: 232 us +- 4 us ........... wide_state_15x600_compilation: Mean +- std dev: 226 us +- 4 us

Check notice on line 1 in libs/langgraph/langgraph/config.py

View workflow job for this annotation

GitHub Actions / benchmark

Comparison against main

+-----------------------------------------+---------+-----------------------+ | Benchmark | main | changes | +=========================================+=========+=======================+ | fanout_to_subgraph_100x_checkpoint | 837 ms | 784 ms: 1.07x faster | +-----------------------------------------+---------+-----------------------+ | fanout_to_subgraph_100x | 593 ms | 565 ms: 1.05x faster | +-----------------------------------------+---------+-----------------------+ | react_agent_100x_checkpoint_sync | 723 ms | 702 ms: 1.03x faster | +-----------------------------------------+---------+-----------------------+ | fanout_to_subgraph_10x_checkpoint | 76.7 ms | 74.8 ms: 1.03x faster | +-----------------------------------------+---------+-----------------------+ | react_agent_100x_checkpoint | 734 ms | 716 ms: 1.02x faster | +-----------------------------------------+---------+-----------------------+ | fanout_to_subgraph_10x_checkpoint_sync | 95.5 ms | 94.0 ms: 1.02x faster | +-----------------------------------------+---------+-----------------------+ | react_agent_100x | 351 ms | 346 ms: 1.02x faster | +-----------------------------------------+---------+-----------------------+ | fanout_to_subgraph_100x_checkpoint_sync | 973 ms | 958 ms: 1.02x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_25x300_checkpoint_sync | 78.0 ms | 76.8 ms: 1.02x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_25x300_checkpoint | 83.6 ms | 82.4 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_9x1200_checkpoint | 94.7 ms | 93.4 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | pydantic_state_15x600_checkpoint | 163 ms | 161 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | react_agent_100x_sync | 279 ms | 276 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | pydantic_state_25x300_checkpoint_sync | 91.6 ms | 90.5 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_9x1200_checkpoint_sync | 87.9 ms | 86.9 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_15x600_checkpoint | 135 ms | 134 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_9x1200_sync | 15.0 ms | 14.8 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | react_agent_10x_checkpoint_sync | 38.5 ms | 38.1 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | pydantic_state_15x600_checkpoint_sync | 155 ms | 154 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | pydantic_state_25x300_checkpoint | 97.6 ms | 96.7 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_15x600_sync | 15.0 ms | 14.9 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | pydantic_state_9x1200_checkpoint_sync | 111 ms | 110 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | pydantic_state_25x300_sync | 16.1 ms | 15.9 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | wide_state_25x300 | 20.4 ms | 20.2 ms: 1.01x faster | +-----------------------------------------+---------+-----------------------+ | fanout_to_subgraph_100x_sync | 508 ms | 504 ms: 1.01x faster | +---------------------------------------
import sys
from typing import Any

Expand Down Expand Up @@ -118,6 +118,17 @@
return config[CONF][CONFIG_KEY_STORE]


def set_store(store: BaseStore) -> None:
"""Set LangGraph store in context."""
var_config = var_child_runnable_config.get()
if not var_config:
var_config = {CONF: {CONFIG_KEY_STORE: store}}
var_child_runnable_config.set(var_config)
else:
var_config[CONF][CONFIG_KEY_STORE] = store
var_child_runnable_config.set(var_config)


def get_stream_writer() -> StreamWriter:
"""Access LangGraph [StreamWriter][langgraph.types.StreamWriter] from inside a graph node or entrypoint task at runtime.

Expand Down Expand Up @@ -183,3 +194,14 @@
"""
config = get_config()
return config[CONF].get(CONFIG_KEY_STREAM_WRITER, _no_op_stream_writer)


def set_stream_writer(stream_writer: StreamWriter) -> None:
"""Set LangGraph stream writer in context."""
var_config = var_child_runnable_config.get()
if not var_config:
var_config = {CONF: {CONFIG_KEY_STREAM_WRITER: stream_writer}}
var_child_runnable_config.set(var_config)
else:
var_config[CONF][CONFIG_KEY_STREAM_WRITER] = stream_writer
var_child_runnable_config.set(var_config)
Loading