[AI-72] LangGraph plugin samples#289
Merged
DABH merged 17 commits intotemporalio:mainfrom May 4, 2026
Merged
Conversation
Seven samples demonstrating the Temporal LangGraph plugin across both the Graph API and Functional API: - Human-in-the-loop: interrupt() + Temporal signals for chatbot approval - Continue-as-new: task result caching across workflow boundaries - ReAct agent: tool-calling loop with conditional edges / while loop - Control flow (Functional API only): parallel, for-loop, if/else Related SDK PR: temporalio/sdk-python#1448
|
|
… merge) so that CI otherwise passes
There was a problem hiding this comment.
Pull request overview
Adds a new langgraph_plugin/ sample suite to demonstrate running LangGraph workflows as durable Temporal workflows via the Temporal LangGraph plugin, covering both LangGraph Graph API and Functional API patterns.
Changes:
- Introduces 7 new LangGraph+Temporal sample workflows (human-in-the-loop, continue-as-new w/ caching, ReAct agent, control-flow).
- Adds a new
langgraphdependency group and includeslanggraph_pluginin the build packages list. - Updates repository documentation to link to the new sample suite and provides a dedicated README for running the samples.
Reviewed changes
Copilot reviewed 24 out of 34 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| pyproject.toml | Adds langgraph dependency group, includes langgraph_plugin in wheel packages, adjusts lint/test tasks, and adds mypy override. |
| README.md | Links the new langgraph_plugin samples from the repo root README. |
| langgraph_plugin/README.md | Adds usage documentation and a sample matrix for the new suite. |
| langgraph_plugin/init.py | Declares the new top-level sample package. |
| langgraph_plugin/graph_api/init.py | Declares Graph API samples namespace. |
| langgraph_plugin/graph_api/react_agent/init.py | Declares Graph API ReAct agent package. |
| langgraph_plugin/graph_api/react_agent/workflow.py | Implements Graph API ReAct agent workflow and graph definition. |
| langgraph_plugin/graph_api/react_agent/run_worker.py | Worker wiring for Graph API ReAct agent sample. |
| langgraph_plugin/graph_api/react_agent/run_workflow.py | Starter script for Graph API ReAct agent sample. |
| langgraph_plugin/graph_api/human_in_the_loop/init.py | Declares Graph API human-in-the-loop package. |
| langgraph_plugin/graph_api/human_in_the_loop/workflow.py | Implements Graph API interrupt + Temporal signal/query human approval flow. |
| langgraph_plugin/graph_api/human_in_the_loop/run_worker.py | Worker wiring for Graph API human-in-the-loop sample. |
| langgraph_plugin/graph_api/human_in_the_loop/run_workflow.py | Starter script for Graph API human-in-the-loop sample. |
| langgraph_plugin/graph_api/continue_as_new/init.py | Declares Graph API continue-as-new package. |
| langgraph_plugin/graph_api/continue_as_new/workflow.py | Implements Graph API pipeline w/ continue-as-new + cache handoff. |
| langgraph_plugin/graph_api/continue_as_new/run_worker.py | Worker wiring for Graph API continue-as-new sample. |
| langgraph_plugin/graph_api/continue_as_new/run_workflow.py | Starter script for Graph API continue-as-new sample. |
| langgraph_plugin/functional_api/init.py | Declares Functional API samples namespace. |
| langgraph_plugin/functional_api/react_agent/init.py | Declares Functional API ReAct agent package. |
| langgraph_plugin/functional_api/react_agent/workflow.py | Implements Functional API ReAct agent via @task + @entrypoint. |
| langgraph_plugin/functional_api/react_agent/run_worker.py | Worker wiring for Functional API ReAct agent sample. |
| langgraph_plugin/functional_api/react_agent/run_workflow.py | Starter script for Functional API ReAct agent sample. |
| langgraph_plugin/functional_api/human_in_the_loop/init.py | Declares Functional API human-in-the-loop package. |
| langgraph_plugin/functional_api/human_in_the_loop/workflow.py | Implements Functional API interrupt + signal/query human approval flow. |
| langgraph_plugin/functional_api/human_in_the_loop/run_worker.py | Worker wiring for Functional API human-in-the-loop sample. |
| langgraph_plugin/functional_api/human_in_the_loop/run_workflow.py | Starter script for Functional API human-in-the-loop sample. |
| langgraph_plugin/functional_api/control_flow/init.py | Declares Functional API control-flow package. |
| langgraph_plugin/functional_api/control_flow/workflow.py | Implements Functional API sample demonstrating parallelism + branching. |
| langgraph_plugin/functional_api/control_flow/run_worker.py | Worker wiring for Functional API control-flow sample. |
| langgraph_plugin/functional_api/control_flow/run_workflow.py | Starter script for Functional API control-flow sample. |
| langgraph_plugin/functional_api/continue_as_new/init.py | Declares Functional API continue-as-new package. |
| langgraph_plugin/functional_api/continue_as_new/workflow.py | Implements Functional API pipeline w/ continue-as-new + cache handoff. |
| langgraph_plugin/functional_api/continue_as_new/run_worker.py | Worker wiring for Functional API continue-as-new sample. |
| langgraph_plugin/functional_api/continue_as_new/run_workflow.py | Starter script for Functional API continue-as-new sample. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Closed
Combines LangGraphPlugin (durable execution) with LangSmithPlugin (observability) for full tracing of LLM calls through Temporal workflows.
5 tasks
- graphs parameter is now a list, not a dict - No graph()/entrypoint() lookup functions — reference objects directly - No entrypoints parameter on LangGraphPlugin - Use set_cache()/get_cache() for continue-as-new caching - Update tests and READMEs accordingly
# Conflicts: # pyproject.toml # uv.lock
The plugin API has evolved past PR #1448: - LangGraphPlugin(graphs=...) now takes dict[str, StateGraph], not list - Same for entrypoints (dict[str, Pregel]) - Each node/task must declare execute_in: "activity" | "workflow" in metadata - Workflows look up registered graphs/entrypoints via graph(name) / entrypoint(name) instead of importing them directly - get_cache/set_cache replaced by cache() and graph(name, cache=...) / entrypoint(name, cache=...) Other changes: - State schemas converted from primitives (str, int) to TypedDict, since langgraph's StateT is bound to TypedDict / dataclass / pydantic models - Module-level graph instances replaced with make_<name>_graph() factories because LangGraphPlugin mutates node metadata in-place at construction time, which prevented reuse across tests - langgraph dep group now pulls langchain, langchain-anthropic, and temporalio[langgraph,langsmith] so the langsmith_tracing samples and human_in_the_loop's RunnableConfig usage actually resolve
These features rely on contextvars propagation through asyncio.create_task(), which is only available in Python 3.11+. On 3.10 they hang rather than fail cleanly, so CI sat for an hour before today's fix landed. Mirrors the pytestmark skipif used in sdk-python's own contrib/langgraph tests.
- Drop cross-references between Functional API and Graph API READMEs so each stands alone (review comment 1) - Combine run_worker.py + run_workflow.py into a single main.py for the langsmith_tracing samples to reduce setup steps (review comment 2) - Fix workflow -> Workflow casing (review comment 3) - Alias temporalio's entrypoint and graph helpers as temporal_entrypoint / temporal_graph at import sites to avoid the langgraph.func.entrypoint collision (review comment 4) - Demonstrate @Traceable in three places in both langsmith_tracing samples: on the Activity/task itself, on a helper called from the Activity, and on a helper called from the Workflow (review comment 5) - Drop unnecessary single-task list comprehension for activity_options in hello_world and langsmith_tracing functional samples (review comment 6) - Spell out 'temporal server start-dev' in every sample README's prerequisites (review comment 7) - Fix stale README references to get_cache() now that the API is cache() (review comment 8) - Rename arbitrarily-named ETL pipeline functions in continue_as_new to honest math names (double / add_50 / triple) per review comment 9
- Drop the [tool.uv.sources] git pin; consume temporalio from PyPI now that 1.27.0 ships the LangGraph plugin. - Keep the protoc CI step around as a permanent fixture so we don't have to add and remove it each time we iterate on a new plugin sample. - Replace dict-comprehension activity_options with explicit per-task literals in the Functional API samples. - Emphasize workflow.wait_condition() in the human-in-the-loop READMEs as the durable wait primitive that pairs with interrupt() and signals. - Clarify that the task result cache is provided by the LangGraph plugin (Temporal), not by upstream LangGraph. - Drop "Same pattern as the Graph API version" cross-references from Functional API workflow docstrings; readers pick one API style. - Tighten the Functional API LangSmith tracing README copy. - Point the parent README to the released contrib package docs.
brianstrauch
approved these changes
May 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add samples demonstrating the Temporal LangGraph plugin, which runs LangGraph workflows as durable Temporal workflows. Each graph node or
@taskexecutes as a Temporal activity or in a workflow, enabling features like automatic retries, timeouts, and crash recovery.Samples are provided for both the Graph API (declarative
StateGraphwith nodes and edges) and the Functional API (imperative@task/@entrypointdecorators).interrupt()to pause for human approval, Temporal signals to receive feedback, and queries to expose the pending draft.continue-as-newwith task result caching so previously-completed stages are not re-executed.add_conditional_edges; Functional API uses awhileloop.forloops, andif/elsebranching — patterns that are natural in the Functional API.LangGraphPluginwith Temporal'sLangSmithPluginfor durable execution + full LLM observability. Requires API keys.Key Features Demonstrated
@taskruns as a Temporal activity with configurable timeouts and retry policies.interrupt()pauses the graph; Temporal signals deliver human input; queries expose pending state to UIs.get_cache()captures completed task results; passing the cache to the next execution avoids re-running them.add_conditional_edgesand Functional API's nativeif/else/whilefor agent loops.LangSmithPluginon the client +LangGraphPluginon the worker for full trace propagation through Temporal workflows.Related PRs
Test plan
uv run langgraph_plugin/<api>/<sample>/run_worker.py+run_workflow.pyANTHROPIC_API_KEYandLANGCHAIN_API_KEY