Skip to content

fix(client): give each graph() run its own run id - #132

Draft
apucacao wants to merge 2 commits into
fix/native-graph-span-identityfrom
fix/graph-run-id-per-run-clean
Draft

apucacao wants to merge 2 commits into
fix/native-graph-span-identityfrom
fix/graph-run-id-per-run-clean

Conversation

@apucacao

@apucacao apucacao commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Running the same graph() twice for the same context reported both runs under one run id, so separate runs looked like one in the $ld:ai:graph:* events.

graph() caches the built graph per context so it doesn't re-evaluate every node's flag on each call. The run id was created in that build, so it was cached too. Each run now gets a fresh id. Every graph event within a run still shares it, and the flag evaluations stay cached.

Builds on #121. In JS the same fix is part of launchdarkly/js-ai-sdk#101.

Testing

  • New test in test_graph_stream.py, for both invoke and stream: two runs on one graph() instance and context get different ids, and all graph events in a run (node, handoff, success) share one. It fails on main.
  • Client, openai-agents, claude-agents and langchain-agents suites pass. mypy and ruff are clean.

Note

Overview
Fixes duplicate runId when reusing a cached graph() build for the same context. Previously the id was created in _build_graph and cached with the topology, so two invoke/stream calls looked like one run in $ld:ai:graph:* events.

Each run now mints a fresh runId at execution time (invoke / stream) while keeping the rest of the cached track metadata. That per-run payload is passed into route / stream_route as _run_track_data, and handoff success/failure events read from opts so they use the current run’s id instead of the build’s. Graph-level events (node, duration, invocation) already use the per-run graph_track_data.

Adds TestGraphRunId for invoke and stream: two runs on one graph() instance share one id within a run and differ across runs.

Reviewed by Cursor Bugbot for commit 30f7d4a. Bugbot is set up for automated code reviews on this repo. Configure here.

graph() caches the built graph per context so repeated runs skip
re-evaluating every node's flag. The build also created the graph's
track data, run id included, so every run for the same context
reported the same runId on its $ld:ai:graph:* events.

Each run now copies the cached track data with a fresh runId and passes
it to route and stream_route through their opts, so the node, handoff
and graph-level events of one run share one id and the next run gets
another. The flag evaluations stay cached.
@apucacao

apucacao commented Oct 2, 2026

Copy link
Copy Markdown
Contributor 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.

Stale Bugbot comment from a previous run.

@apucacao
apucacao changed the base branch from main to fix/native-graph-span-identity October 9, 2026 15:58
@apucacao
apucacao added this pull request to stack #151 October 9, 2026 15:58
@apucacao

apucacao commented Oct 9, 2026

Copy link
Copy Markdown
Contributor 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.

Stale Bugbot comment from a previous run.

@apucacao

Copy link
Copy Markdown
Contributor 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 30f7d4a. Configure here.

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.

1 participant