Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Client tools never execute against spec-compliant AG-UI servers (plain `success` RUN_FINISHED)

Aperta
#1,464 0 commenti 0 reazioni 1 assegnatario Vedi su GitHub

@jherr ci sta già lavorando.

Dal 23/9/2026.

Valutazione

Questa issue non è ancora stata valutata.

Descrizione

waiting-on: maintainer
TanStack AI version

0.54

Framework/Library version

React 19

Describe the bug and the steps to reproduce it
What happens

When useChat is connected to a third-party AG-UI server (Pydantic AI's AGUIAdapter in my case), the model calls a registered .client() tool, the tool call is rendered, and then the run just ends. The .client() handler is never invoked and no continuation run is started.

The server emits the canonical AG-UI sequence for a frontend tool:

TOOL_CALL_START  { toolCallId: "tooluse_…", toolCallName: "ping" }
TOOL_CALL_ARGS   { delta: "" }
TOOL_CALL_END
RUN_FINISHED     { outcome: { type: "success" } }
Why

Client-tool execution is only triggered from StreamProcessor.handleInterrupts (activities/chat/stream/processor.ts), i.e. when RUN_FINISHED carries outcome.type: "interrupt" with a metadata.kind: "client_tool" interrupt. That's the shape TanStack's own chat() emits, but it isn't what AG-UI specifies.

Per ag-ui-protocol/ag-ui#2731, a frontend tool call ends the run with a plain success outcome. It may include pendingToolCallIds; otherwise the client derives the unanswered calls from the stream. The client then executes the tools and continues with role: "tool" messages in the next run's history. There is no success-outcome path that calls onToolCall, so nothing fires.

Expected

On a success RUN_FINISHED, the client should dispatch onToolCall for tool calls that were started but not answered by TOOL_CALL_RESULT, using outcome.pendingToolCallIds when present. The rest of the pipeline already exists (pendingToolExecutions, addToolResultForClientTool, continuation). The interrupt path would stay unchanged.

Repro
  1. Pydantic AI agent exposed via AGUIAdapter, no server-side ping tool.
  2. useChat({ connection: fetchServerSentEvents(url), tools: [pingDef.client(() => 'pong')] })
  3. Ask the agent to call ping and report the result → handler never runs, conversation stops.
Your Minimal, Reproducible Example - (Sandbox Highly Recommended)

_

Screenshots or Videos (Optional)

No response

Do you intend to try to help solve this bug with your own PR?

None

Terms & Code of Conduct
  • I agree to follow this project's Code of Conduct
  • I understand that if my bug cannot be reliable reproduced in a debuggable environment, it will probably not be fixed and this issue may even be closed.
Lingua principale
TypeScript
Stelle
3.1k
Fork
331
Merge medio
1g 10h
PR unite (30g)
130

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di TanStack/ai

Tutte le issue di TanStack/ai

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.