Anthropic gen_ai span never ends when a streaming call is consumed via .asResponse()
@RulaKhaled is already working on this.
Since Sep 9, 2026.
Assessment
This issue has not been assessed yet.
Description
Problem
anthropicAIIntegration starts a gen_ai.chat span for messages.create({ stream: true }) but never ends it when the caller takes the raw Response via .asResponse() (or .withResponse()) instead of iterating the SDK's Stream. The span is silently dropped — no error, no partial data.
Cause
packages/server-utils/src/integrations/anthropic.ts:147 — wrapStreamResult checks isAsyncIterable(result). With .asResponse() the result is a raw Response, so the check fails and it returns false, meaning "end via beforeSpanEnd". beforeSpanEnd never fires, so nothing ends the span.
Repro
Two identical streaming calls, one per consumption style:
const client = new Anthropic({ apiKey: 'sk-fake', baseURL: 'http://127.0.0.1:3999' });
// A: raw Response
const res = await client.messages.create({ ...params, stream: true }).asResponse();
for await (const _ of res.body) {}
// B: SDK async iterable
const stream = await client.messages.create({ ...params, stream: true });
for await (const _ of stream) {}
Span lifecycle:
[spanStart] chat claude-haiku-4-5 <- A
[spanStart] chat claude-haiku-4-5 <- B
[spanEnd] chat claude-haiku-4-5 <- only one ends
Impact
Any consumer using .asResponse()/.withResponse() on a streaming call loses the span. Found via @flue/runtime, whose @earendil-works/pi-ai layer calls client.messages.create({ ...params, stream: true }, opts).asResponse() — a Flue app currently reports only a raw http.client span for every LLM call. Not Flue-specific.
Verified on @sentry/node@11.0.0-beta.2, @anthropic-ai/sdk@0.91.1, Node 24.11.1.
- Dominant language
- TypeScript
- Stars
- 8.7k
- Forks
- 1.9k
- Avg merge
- 1d 18h
- Merged PRs (30d)
- 562
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from getsentry/sentry-javascript
-
Browser Waiting for: Product Owner
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
getsentry/sentry-javascript#24577 · 1 comment ·
-
Task
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
getsentry/sentry-javascript#24558 · 1 comment ·
-
Task
Difficulty 1/5 Under an hour Newbie friendliness 90/100
getsentry/sentry-javascript#24557 · 1 comment ·
-
Task
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
getsentry/sentry-javascript#24556 · 1 comment ·
-
Task
Difficulty 1/5 1-3 hours Newbie friendliness 90/100
getsentry/sentry-javascript#24555 · 1 comment ·
All issues in getsentry/sentry-javascript
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
safetrustcr/dApp-SafeTrust#426 ·
-
area:workflow bug ready-for-agent
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
fil-donadoni/tolaria#4409 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Fission-AI/OpenSpec#1960 ·
-
Add dependabot Open
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
corsairdev/corsair#1764 ·