Workers AI integration drops output of non-streaming chat responses in the OpenAI format (`choices`)
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 78/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- typescript
- Domínio
- observability
Direção de pesquisa
Comece lendo packages/server-utils/src/ai/workers-ai/utils.ts e sua função addResponseAttributes; em seguida, compare o tratamento de streaming existente do Workers AI em ai/workers-ai/streaming.ts com o do OpenAI em ai/openai/utils.ts. Atualize o caminho sem streaming para capturar mensagens de saída, texto da resposta e motivos de finalização de choices; confirme que a resposta no novo formato registra esses atributos e preserva o formato de resposta anterior.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Is there an existing issue for this?
- I have checked for existing issues
How do you use Sentry?
Sentry SaaS (sentry.io)
Which SDK are you using?
@sentry/cloudflare
SDK Version
11.10.0 (@sentry/server-utils 11.10.0). The same code is on develop.
Framework Version
Cloudflare Workers, Workers AI binding
Steps to Reproduce
-
Instrument the Workers AI binding (the default
@sentry/cloudflaresetup). -
Call a model that answers in the OpenAI chat-completion format, without
stream: true. For example,@cf/google/gemma-4-26b-a4b-it:const result = await env.AI.run("@cf/google/gemma-4-26b-a4b-it", { messages: [{ role: "user", content: "Say hi" }], max_tokens: 50, }); -
Open the
gen_ai.chatspan in Sentry.
Expected Result
The span has gen_ai.output.messages, gen_ai.response.text and gen_ai.response.finish_reasons, the same as for a stream: true call to the same model.
Actual Result
The span has the token usage, but no output and no finish reason.
I sent the same prompt to @cf/google/gemma-4-26b-a4b-it twice through the Workers AI REST API, once without and once with stream: true. Then I passed the real responses through instrumentWorkersAiClient (11.10.0). The gen_ai.* span attributes were:
--- no stream
gen_ai.operation.name = "chat"
gen_ai.usage.input_tokens = 19
gen_ai.usage.output_tokens = 4
gen_ai.usage.total_tokens = 23
--- stream: true
gen_ai.operation.name = "chat"
gen_ai.output.messages = "[{\"role\":\"assistant\",\"parts\":[{\"type\":\"text\",\"content\":\"Hello there!\"}]}]"
gen_ai.response.finish_reasons = "[\"stop\"]"
gen_ai.response.streaming = true
gen_ai.response.text = "Hello there!"
gen_ai.usage.input_tokens = 19
gen_ai.usage.output_tokens = 4
gen_ai.usage.total_tokens = 23
The non-streaming response was:
{"id":"...","object":"chat.completion","created":0,"model":"@cf/google/gemma-4-26b-a4b-it","choices":[{"index":0,"message":{"role":"assistant","content":"Hello there!"},"finish_reason":"stop","logprobs":null}],"usage":{"prompt_tokens":19,"completion_tokens":4,"total_tokens":23}}
Cause
Workers AI returns two response formats:
- older models:
{ response: string, tool_calls?, usage } - newer models, such as gemma-4: the OpenAI chat-completion format with
choices[].message
The streaming path supports both. instrumentWorkersAiStream in ai/workers-ai/streaming.ts reads parsed.response and also parsed.choices[].delta.content, delta.tool_calls and finish_reason.
The non-streaming path supports only the old format. addResponseAttributes in ai/workers-ai/utils.ts reads only response.response and response.tool_calls:
A possible fix: when response.choices is an array, read choices[].message.content, choices[].message.tool_calls and choices[].finish_reason, the same way as the OpenAI integration (ai/openai/utils.ts) does.
Additional Context
Workaround: we wrap the call in our own gen_ai.chat span that sets gen_ai.output.messages from choices, and we call env.AI.run inside Sentry.suppressTracing() so that the SDK span does not duplicate it.
- Linguagem predominante
- TypeScript
- Estrelas
- 8.8k
- Forks
- 1.9k
- Merge médio
- 1d 20h
- PRs com merge (30d)
- 682
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de getsentry/sentry-javascript
-
Bug Cloudflare Workers
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
getsentry/sentry-javascript#26091 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Vercel AI: `gen_ai.system_instructions` is missing when the system prompt is a message objectTalvez já em andamento @biggdawg320 assumiu hoje. AbertaBug Package: node Spans vercel ai
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 73/100
getsentry/sentry-javascript#26079 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
fsIntegration crashes in native ESM when patching the read-only fs namespaceTalvez já em andamento @chargome assumiu há 1 dia. AbertaBug Node.js Waiting for: Product Owner
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
getsentry/sentry-javascript#25950 · 2 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
normalize() throws when a getter throws a Symbol or a null-prototype objectTalvez já em andamento @rjmcgee53192 assumiu há 5 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
getsentry/sentry-javascript#25920 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
-
Only create Nuxt database and storage spans when there is a parent spanTalvez já em andamento @nicohrubec assumiu há 6 dias. AbertaImprovement Nuxt
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
getsentry/sentry-javascript#25805 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de getsentry/sentry-javascript
Issues semelhantes
-
[fullsend] E2E: scorecard — filecheck GitLab entity metrics unavailable due to initialDelay timingAbertae2e-failure ready-to-code
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
redhat-developer/rhdh-plugin-export-overlays#4698 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
devswha/herdr-web-ui#2884 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
b:minor bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
software-mansion/argent#1771 ·
Mantenedores costumam responder em até 1 dia
-
Resources: New palettes of XiamenTalvez já em andamento @rmt-svc assumiu hoje. Abertaresources
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 74/100
railmapgen/rmg-palette#2491 ·
Mantenedores costumam responder em até 4 dias