getsentry / getsentry/sentry-javascript

`instrumentLangGraph` input/output recording only works with `MessagesAnnotation`

Open
#19,628 2 comments 0 reactions 0 assignees View on GitHub
Browser Bug
Dominant language
TypeScript
Stars
8.7k
Forks
1.8k
Avg merge
1d 17h
Merged PRs (30d)
515

Description

### Is there an existing issue for this?

- [x] I have checked for existing issues https://github.com/getsentry/sentry-javascript/issues
- [x] I have reviewed the documentation https://docs.sentry.io/
- [x] I am using the latest SDK release https://github.com/getsentry/sentry-javascript/releases

### How do you use Sentry?

Sentry Saas (sentry.io)

### Which SDK are you using?

@sentry/browser

### SDK Version

^10.40.0

### Framework Version

_No response_

### Link to Sentry event

https://pri-dogfooding-ai.sentry.io/insights/ai-agents/?project=4510951776059472&statsPeriod=30d&trace=5eb7a6719e6a45dd8b4accab1881c7bd&span=a2fd3ab2120a6698&trace-timestamp=1772622965

### Reproduction Example/SDK Setup

_No response_

### Steps to Reproduce

```js
const CustomState = Annotation.Root({
idea: Annotation(),
expanded: Annotation(),
validated: Annotation(),
});

const graph = new StateGraph(CustomState)
.addNode("expand", expandNode)
.addEdge(START, "expand")
.addEdge("expand", END);

Sentry.instrumentLangGraph(graph, { recordInputs: true, recordOutputs: true });
const compiled = graph.compile({ name: "my_agent" });
const result = await compiled.invoke({ idea: "test idea" });
```

### Expected Result

The `invoke_agent` span should contain the graph's input (`{ idea: "test idea" }`) and output state as span attributes.

### Actual Result

The `invoke_agent` span has no input or output data. No error or warning is logged.

### Additional Context

`instrumentCompiledGraphInvoke` hardcodes extraction for `MessagesAnnotation`:

```js
const inputMessages = args.length > 0 ? ((args[0])?.messages ?? []) : [];
```

It looks for `args[0].messages`, which only exists when using `MessagesAnnotation`. Custom state keys (like `idea`, `expanded`, etc.) are ignored. The OTEL `gen_ai.input.messages` / `gen_ai.output.messages` attributes are message-array-oriented by design, but there is no fallback to record arbitrary state.

### Priority

React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding `+1` or `me too`, to help us triage it.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.