Skip to content

feat(AIC-3211): record each graph node as its own tracking event - #114

Merged
jeffdupont merged 2 commits into
mainfrom
jdupont/AIC-3211/per-node-graph-events
Sep 29, 2026
Merged

jeffdupont merged 2 commits into
mainfrom
jdupont/AIC-3211/per-node-graph-events

Conversation

@jeffdupont

@jeffdupont jeffdupont commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Emit $ld:ai:graph:node when each graph node is entered, with nodeKey, a 0-based index, and metric value 1, so a traversal can be rebuilt from the events instead of splitting a concatenated path string.
  • Apply the same event to graph().invoke(), graph().stream(), and the OpenAI, Claude, and LangChain native adapters. Stop sending $ld:ai:graph:path.
  • A node that throws, and a stream abandoned after the first chunk, still record the nodes that started. The public invoke result and stream done event still omit path and nodes. Native adapters still set launchdarkly.graph.path on the graph span.

Test plan

  • pytest for the client graph, graph stream, and the three native-graph suites (127 passed)
  • mypy on the changed packages
  • Confirm $ld:ai:graph:node events show up in order for a multi-node graph invoke and stream (test_graph_node_tracked_per_visited_node, test_tracks_node_per_visited_node)

Made with Cursor

jeffdupont and others added 2 commits September 28, 2026 09:21
… event

The concatenated path event had to be split apart to see which nodes ran. Emitting $ld:ai:graph:node on entry lets invoke, stream, and the native adapters rebuild the traversal from the events themselves.

Co-authored-by: Cursor <cursoragent@cursor.com>
The lint job rejects the comprehension and signature lines that were left over the formatter width.
@andrewklatzke
andrewklatzke self-requested a review September 28, 2026 18:38
@jeffdupont
jeffdupont merged commit c3c439e into main Sep 29, 2026
7 checks passed
@jeffdupont
jeffdupont deleted the jdupont/AIC-3211/per-node-graph-events branch September 29, 2026 15:28
@github-actions github-actions Bot mentioned this pull request Sep 28, 2026
donei003 added a commit that referenced this pull request Sep 30, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>launchdarkly-ai-server: 0.2.4</summary>

##
[0.2.4](launchdarkly-ai-server-0.2.3...launchdarkly-ai-server-0.2.4)
(2026-09-30)


### Features

* **AIC-3210:** support graph().stream() in the Python AI SDK
([#104](#104))
([25a345a](25a345a))
* **AIC-3211:** record each graph node as its own tracking event
([#114](#114))
([c3c439e](c3c439e))
* **AIC-3449:** refactor AI Config reference into a dataclass
([#113](#113))
([3ac06b4](3ac06b4))
* **AIC-3449:** Support pulling in configs for evals from code
([#108](#108))
([fa374e2](fa374e2))
* **evaluations:** preserve the tool trajectory for judges
([#89](#89))
([bcaa8c8](bcaa8c8))


### Bug Fixes

* **graph:** rename the graph span back to launchdarkly.graph, thread
trajectory into stream judges
([79c9eeb](79c9eeb))
* **judges:** bound recorded values in memory, and show config's full
tool catalog
([25fafef](25fafef))
* **judges:** exclude native tools from the config's available-tool list
([245a0a5](245a0a5))
* **judges:** keep trajectory recording total and observational
([57386b6](57386b6))
</details>

<details><summary>launchdarkly-ai-python: 0.1.8</summary>

##
[0.1.8](launchdarkly-ai-python-0.1.7...launchdarkly-ai-python-0.1.8)
(2026-09-30)


### Features

* **evaluations:** preserve the tool trajectory for judges
([#89](#89))
([bcaa8c8](bcaa8c8))
</details>

<details><summary>launchdarkly-ai-claude-agents: 0.2.4</summary>

##
[0.2.4](launchdarkly-ai-claude-agents-0.2.3...launchdarkly-ai-claude-agents-0.2.4)
(2026-09-30)


### Features

* **AIC-3211:** record each graph node as its own tracking event
([#114](#114))
([c3c439e](c3c439e))
</details>

<details><summary>launchdarkly-ai-openai-agents: 0.2.4</summary>

##
[0.2.4](launchdarkly-ai-openai-agents-0.2.3...launchdarkly-ai-openai-agents-0.2.4)
(2026-09-30)


### Features

* **AIC-3211:** record each graph node as its own tracking event
([#114](#114))
([c3c439e](c3c439e))


### Bug Fixes

* **openai-agents:** accept sync tool handlers
([0ac9231](0ac9231))
* **openai-agents:** accept sync tool handlers
([#119](#119))
([656d922](656d922))
</details>

<details><summary>launchdarkly-ai-langchain-agents: 0.2.4</summary>

##
[0.2.4](launchdarkly-ai-langchain-agents-0.2.3...launchdarkly-ai-langchain-agents-0.2.4)
(2026-09-30)


### Features

* **AIC-3211:** record each graph node as its own tracking event
([#114](#114))
([c3c439e](c3c439e))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Overview**
> **Release Please** bumps monorepo package versions and adds changelog
entries; there is no new application source in the diff—only
`.release-please-manifest.json`, `pyproject.toml`, `__version__`, and
`CHANGELOG.md` updates.
> 
> **`launchdarkly-ai-server` 0.2.4** (and aligned **claude / openai /
langchain-agents** 0.2.4, **`launchdarkly-ai-python`** 0.1.8) documents
already-merged work: **`graph().stream()`**, **per-graph-node tracking
events**, **AI Config as a dataclass** and **eval configs from code**,
**tool trajectory preserved for judges**, plus judge/graph telemetry
fixes (e.g. `launchdarkly.graph` span, bounded trajectory memory, native
tools excluded from available-tool lists) and **openai-agents**
accepting **sync tool handlers**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
27fba0e. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
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.

2 participants