Skip to content

fix: reduce checkpointer calls lg events #2063

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

Merged
merged 5 commits into from
Jul 8, 2025

Conversation

ranst91
Copy link
Collaborator

@ranst91 ranst91 commented Jun 27, 2025

Today, we are querying the checkpointer for the latest state on every event. This is too many calls.
This PR introduces a significant reduction of these calls

Summary by CodeRabbit

  • Refactor
    • Improved internal state handling and caching to optimize performance and synchronization during event streaming.
  • Chores
    • Updated SDK version to 0.1.54-alpha.3.
Copy link

vercel bot commented Jun 27, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
copilotkit-feature-viewer ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 8, 2025 11:58am
demo-viewer ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 8, 2025 11:58am
docs ❌ Failed (Inspect) Jul 8, 2025 11:58am
examples-coagents-ai-travel-app ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 8, 2025 11:58am
examples-coagents-research-canvas-ui ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 8, 2025 11:58am
1 Skipped Deployment
Name Status Preview Comments Updated (UTC)
examples-coagents-ai-researcher-ui ⬜️ Ignored (Inspect) Visit Preview Jul 8, 2025 11:58am
Copy link
Contributor

coderabbitai bot commented Jun 27, 2025

## Walkthrough The `_stream_events` method in `langgraph_agent.py` was modified to maintain a local mutable dictionary, `current_graph_state`, which tracks the agent's state throughout event streaming. This approach reduces redundant asynchronous state fetches by updating the local state with event outputs and using it as the authoritative state during processing. Additionally, thread-specific state caching and method signature updates optimize state handling and synchronization. ## Changes | File(s) | Change Summary | |----------------------------------------|--------------------------------------------------------------------------------------------------| | sdk-python/copilotkit/langgraph_agent.py | Added `thread_state` cache; updated `prepare_stream` to accept explicit `agent_state`; maintained local mutable `current_graph_state` updated during streaming; modified `_stream_events` to use cached and updated state instead of repeated async fetches; changed `prepare_regenerate_stream` and `get_checkpoint_before_message` signatures to use `thread_id` explicitly. | | sdk-python/pyproject.toml | Updated `copilotkit` SDK version from `0.1.53` to `0.1.54-alpha.3`. | ## Sequence Diagram(s) ```mermaid sequenceDiagram  participant Client  participant LangGraphAgent  participant EventStream   Client->>LangGraphAgent: Start _stream_events(initial_state)  LangGraphAgent->>LangGraphAgent: Initialize current_graph_state from agent_state  loop For each event in EventStream  EventStream-->>LangGraphAgent: Send event  alt event.type == "on_chain_end" and event.output is dict  LangGraphAgent->>LangGraphAgent: Update current_graph_state with event.output  end  alt Intermediate state emitted  LangGraphAgent->>LangGraphAgent: Use emitted intermediate state as updated_state  else  LangGraphAgent->>LangGraphAgent: Use current_graph_state as updated_state  end  LangGraphAgent->>Client: Emit event with updated_state  LangGraphAgent->>LangGraphAgent: Update current_graph_state with updated_state  end

Suggested reviewers

  • mme
  • suhasdeshpande
 <!-- walkthrough_end --> --- <details> <summary>📜 Recent review details</summary> **Configuration used: .coderabbit.yaml** **Review profile: CHILL** **Plan: Pro** <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 5c9846754e56c72bdb636cbe03913a1513ac3917 and 99ff7907b9e6fe3c344f5dca0625c39201b23329. </details> <details> <summary>📒 Files selected for processing (2)</summary> * `sdk-python/copilotkit/langgraph_agent.py` (11 hunks) * `sdk-python/pyproject.toml` (1 hunks) </details> <details> <summary>🚧 Files skipped from review as they are similar to previous changes (2)</summary> * sdk-python/pyproject.toml * sdk-python/copilotkit/langgraph_agent.py </details> <details> <summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)</summary> * GitHub Check: Build Images (coagents-qa-native, ui) * GitHub Check: Build Images (next-openai, next-openai) * GitHub Check: Build Images (coagents-research-canvas, agent, python, local-deps) * GitHub Check: Build Images (coagents-qa-text, agent, python, local-deps) * GitHub Check: Build Images (coagents-qa-text, ui) * GitHub Check: Build Images (coagents-routing, ui) * GitHub Check: Build Images (coagents-qa-native, agent, python, local-deps) * GitHub Check: Build Images (coagents-research-canvas, ui) * GitHub Check: Build Images (coagents-routing, agent, python, local-deps) * GitHub Check: Test (18.x) * GitHub Check: Test (20.x) </details> </details> <!-- internal state start --> <!-- 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 --> <!-- internal state end --> <!-- finishing_touch_checkbox_start --> <details open="true"> <summary>✨ Finishing Touches</summary> - [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings </details> <!-- finishing_touch_checkbox_end --> <!-- tips_start --> --- Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. <details> <summary>❤️ Share</summary> - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code) </details> <details> <summary>🪧 Tips</summary> ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=CopilotKit/CopilotKit&utm_content=2063): > ‼️ **IMPORTANT** > Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged. - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai explain this code block.` -	`@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.` - `@coderabbitai read src/utils.ts and explain its main purpose.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` ### Support Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (Invoked using PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR. - `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. ### Other keywords and placeholders - Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. - Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description. - Add `@coderabbitai` anywhere in the PR title to generate the title automatically. ### Documentation and Community - Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit. - Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements. </details> <!-- tips_end --> 
@ranst91 ranst91 force-pushed the fix/reduce-checkpointer-calls-lg-events branch from d8f31d5 to e035299 Compare June 27, 2025 11:08
@ranst91 ranst91 force-pushed the fix/reduce-checkpointer-calls-lg-events branch from e035299 to 69c9eee Compare July 1, 2025 08:37
@ranst91 ranst91 force-pushed the fix/reduce-checkpointer-calls-lg-events branch from 48b8478 to 29dda16 Compare July 1, 2025 11:29
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
sdk-python/copilotkit/langgraph_agent.py (1)

270-272: Consider removing explicit None assignments.

The explicit assignment of None values for "stream", "state", and "config" keys is redundant since the dictionary could simply omit these keys when they're not applicable.

- "stream": None, - "state": None, - "config": None, + # stream, state, and config are omitted when interrupts are active without resume input
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f8f9592 and 5c98467.

📒 Files selected for processing (2)
  • sdk-python/copilotkit/langgraph_agent.py (11 hunks)
  • sdk-python/pyproject.toml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • sdk-python/pyproject.toml
⏰ Context from checks skipped due to timeout of 90000ms (11)
  • GitHub Check: Build Images (coagents-qa-native, ui)
  • GitHub Check: Build Images (next-openai, next-openai)
  • GitHub Check: Build Images (coagents-qa-native, agent, python, local-deps)
  • GitHub Check: Build Images (coagents-qa-text, ui)
  • GitHub Check: Build Images (coagents-routing, agent, python, local-deps)
  • GitHub Check: Build Images (coagents-qa-text, agent, python, local-deps)
  • GitHub Check: Build Images (coagents-routing, ui)
  • GitHub Check: Build Images (coagents-research-canvas, agent, python, local-deps)
  • GitHub Check: Build Images (coagents-research-canvas, ui)
  • GitHub Check: Test (18.x)
  • GitHub Check: Test (20.x)
🔇 Additional comments (15)
sdk-python/copilotkit/langgraph_agent.py (15)

168-168: LGTM: Thread state caching initialization.

The addition of self.thread_state = {} provides the foundation for caching thread-specific states, which directly supports the PR objective of reducing checkpointer calls.


223-224: Effective local state initialization from agent state.

The initialization of current_graph_state from agent_state.values and setting state_input["messages"] provides a solid foundation for local state tracking, eliminating the need for repeated checkpointer calls during event processing.


227-227: Correct parameter usage for merge_state function.

Using state_input instead of the previous state parameter aligns with the new method signature and maintains consistency in state merging logic.


232-232: Proper local state synchronization.

The current_graph_state.update(state) ensures the local state dictionary is kept in sync with the merged state, which is crucial for the optimization strategy.


278-278: Correct return of local state for optimization.

Returning current_graph_state instead of the merged state ensures the caller receives the locally maintained state, supporting the optimization goals.


290-291: Improved parameter extraction and method call.

The explicit extraction of thread_id and passing it directly to get_checkpoint_before_message improves clarity and aligns with the updated method signature.


338-338: Strategic state fetch positioning.

Moving the agent_state fetch before prepare_stream and passing it explicitly eliminates redundant state fetches within the method, directly addressing the PR objective.


340-341: Clean separation of state parameters.

The explicit passing of state_input and agent_state as separate parameters improves method interface clarity and supports the optimization strategy.


369-369: Proper local state assignment.

Assigning current_graph_state from the prepared stream response's "state" establishes the local state tracking mechanism that's central to the optimization.


403-408: Excellent optimization: Local state updates from events.

This is a key optimization that directly addresses the PR objective. By updating current_graph_state with output from "on_chain_end" events, the code avoids expensive checkpointer calls while maintaining state consistency.

The condition checks are appropriate to ensure only valid output dictionaries are used to update the state.


451-451: Core optimization: Use local state instead of checkpointer.

This change represents the heart of the optimization - using current_graph_state instead of fetching state from the checkpointer. The fallback to manually_emitted_state when present is correct logic.


475-475: Maintain local state consistency.

The current_graph_state.update(updated_state) ensures the local state dictionary remains synchronized with state changes, which is essential for the optimization to work correctly throughout the event streaming process.


697-697: Improved method signature with direct thread_id parameter.

The method signature change from accepting a config object to directly accepting thread_id is cleaner and more explicit about the required parameter, improving code clarity.


213-214: prepare_stream Signature Verified Across Codebase

Confirmed via ripgrep that the only definition and invocation of prepare_stream reside in sdk-python/copilotkit/langgraph_agent.py, and both pass the new state_input and agent_state parameters. No other references exist, so this change poses no breaking impact.


616-619: Address potential race in thread state caching

The current implementation in sdk-python/copilotkit/langgraph_agent.py correctly caches per-thread_id state to avoid redundant fetches, but if get_state is invoked concurrently for the same thread_id, both calls may see a missing entry and trigger duplicate await self.graph.aget_state(config) calls. While this won’t corrupt the dict, it does waste resources and could surface unexpected behavior under true multi-threaded or highly concurrent async loads.

To harden this:

  • Introduce an asyncio.Lock (or similar) keyed by thread_id around the “get-or-set” block.
  • Ensure only one fetch populates self.thread_state[thread_id], with other calls awaiting its completion.

Location:
• File: sdk-python/copilotkit/langgraph_agent.py
• Lines: ~616–619

Copy link
Contributor

github-actions bot commented Jul 2, 2025

Preview environments destroyed for this pull request.

Copy link
Contributor

github-actions bot commented Jul 2, 2025

Test Results

Status: ✅ Passed (View Run)

Commit: e93dc17

Duration: 225.0s

Total Tests: 20

Pass Rate: 100.0%

Failed Tests: 0

🔍 Detailed Results

coagents-research-canvas

CoAgents Research Canvas (UI) - Local Depenencies

Model Browser Status Video
OpenAI chromium ✅ PASSED -
Anthropic chromium ✅ PASSED -
CrewAI chromium ✅ PASSED -

coagents-qa-native

CoAgents QA Native (UI) - Local

Model Browser Status Video
OpenAI chromium ✅ PASSED -
Anthropic chromium ✅ PASSED -

coagents-qa-text

CoAgents QA Text (UI) - Local

Model Browser Status Video
OpenAI chromium ✅ PASSED -
Anthropic chromium ✅ PASSED -
OpenAI (LGC Python) chromium ✅ PASSED -
Anthropic (LGC Python) chromium ✅ PASSED -
OpenAI (LGC JS) chromium ✅ PASSED -
Anthropic (LGC JS) chromium ✅ PASSED -

coagents-routing

CoAgents Routing (UI) - Local

Model Browser Status Video
OpenAI chromium ✅ PASSED -
Anthropic chromium ✅ PASSED -

next-openai

Next OpenAI - Self Hosted

Model Browser Status Video
OpenAI chromium ✅ PASSED -
Anthropic chromium ✅ PASSED -
Google Generative AI chromium ✅ PASSED -
LangChain (OpenAI) chromium ✅ PASSED -
LangChain (Anthropic) chromium ✅ PASSED -
LangChain (Gemini) chromium ✅ PASSED -
Groq chromium ✅ PASSED -
@ranst91 ranst91 force-pushed the fix/reduce-checkpointer-calls-lg-events branch from 5c98467 to 99ff790 Compare July 8, 2025 11:53
@changesets-bot-copilotkit
Copy link

⏭️ Changeset Not Required

Latest commit: 99ff790

No changes in this PR affected the @copilitkit/* packages. Merging this PR will not cause a version bump for any packages.

Changeset is not required for this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
1 participant