Skip to content

fix(server-utils): Cap the runs the LangChain callback handler keeps open - #25595

Open
RulaKhaled wants to merge 2 commits into
developfrom
fix/langchain-callback-handler-stale-runs
Open

RulaKhaled wants to merge 2 commits into
developfrom
fix/langchain-callback-handler-stale-runs

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

@langchain/core never calls the end or error callback when a consumer stops reading a stream. The handler is shared across the process, so those runs stay in its map forever, each keeping its request's span tree in memory.

The map is now an LRUMap capped at 1000 runs. An evicted run is dropped without ending its span, since ending it would send a span that lasted until eviction. Starting a run marks its ancestors as used, so a busy agent run isn't dropped.

Fixes #25510

🤖 Generated with Claude Code

…open

`@langchain/core` never calls the end or error callback when a consumer
stops reading a stream, so those runs stayed in the shared handler's map
forever. The map is now an `LRUMap` capped at 1000 runs. An evicted run
is dropped without ending its span, since ending it would send a span
that lasted until eviction.

Fixes #25510

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

size-limit report 📦

Compared: 538a908 (PR test merge using develop at 2028b68)

Against: d250a38 (develop) · base run #62866

⚠️ Baseline mismatch: 1 develop commit(s) in the PR build are missing from the baseline. Their size changes also affect this comparison. Compare commits. Re-run once develop's baseline build for 2028b68 finishes.

Path Size % Change Change
@sentry/browser 29.91 kB - -
@sentry/browser - with treeshaking flags 28.04 kB - -
@sentry/browser - with treeshaking flags tracing without tracing 27.95 kB - -
@sentry/browser (incl. Tracing) 52.1 kB - -
@sentry/browser (incl. Tracing + Span Streaming) 52.1 kB - -
@sentry/browser (incl. Tracing, Profiling) 55.04 kB - -
@sentry/browser (incl. Tracing, Replay) 91.85 kB - -
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 80.72 kB - -
@sentry/browser (incl. Tracing, Replay with Canvas) 96.58 kB - -
@sentry/browser (incl. Tracing, Replay, Feedback) 109.52 kB - -
@sentry/browser (incl. Feedback) 47.42 kB - -
@sentry/browser (incl. sendFeedback) 34.97 kB - -
@sentry/browser (incl. FeedbackAsync) 40.07 kB - -
@sentry/browser (incl. Metrics) 30.93 kB - -
@sentry/browser (incl. Logs) 31.21 kB - -
@sentry/browser (incl. Metrics & Logs) 31.84 kB - -
@sentry/react 31.73 kB - -
@sentry/react (incl. Tracing) 54.41 kB - -
@sentry/vue 38.06 kB - -
@sentry/vue (incl. Tracing) 55.03 kB - -
@sentry/svelte 29.93 kB - -
@sentry/remix (Remix 3 client bundle) 57.11 kB - -
CDN Bundle 31.67 kB - -
CDN Bundle (incl. Tracing) 52.61 kB - -
CDN Bundle (incl. Logs, Metrics) 33.87 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) 54.55 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) 74.79 kB - -
CDN Bundle (incl. Tracing, Replay) 90.28 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 92.21 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) 96.42 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 98.37 kB - -
CDN Bundle - uncompressed 93.29 kB - -
CDN Bundle (incl. Tracing) - uncompressed 156.14 kB - -
CDN Bundle (incl. Logs, Metrics) - uncompressed 99.83 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 162.1 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 229.87 kB - -
CDN Bundle (incl. Tracing, Replay) - uncompressed 276.31 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 282.25 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 290.01 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 295.94 kB - -
@sentry/nextjs (client) 57.3 kB - -
@sentry/sveltekit (client) 52.48 kB - -
@sentry/core/server 41.8 kB - -
@sentry/core/browser 13.81 kB - -
@sentry/node 155.33 kB +0.02% +23 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection) 84.06 kB - -
@sentry/node - without tracing 96.95 kB - -
@sentry/node - without channel injection 133.31 kB +0.02% +21 B 🔺
@sentry/aws-serverless 105.13 kB - -
@sentry/cloudflare (withSentry) - minified 210.99 kB - -
@sentry/cloudflare (withSentry) 523.33 kB - -
@sentry/nextjs/cloudflare (withSentry) - minified 230.62 kB - -

View base workflow run

@RulaKhaled

Copy link
Copy Markdown
Collaborator Author

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 596ad0a. Configure here.

@RulaKhaled
RulaKhaled marked this pull request as ready for review October 21, 2026 09:23
@RulaKhaled
RulaKhaled requested a review from a team as a code owner October 21, 2026 09:23
@RulaKhaled
RulaKhaled requested review from andreiborza and isaacs and removed request for a team October 21, 2026 09:23

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

LangChain callback handler keeps runs that never end in memory

1 participant