Skip to content

fix: render tool frames for a non-streaming agent (#91) + correct /status docs (#90) - #92

Merged
dkedar7 merged 3 commits into
mainfrom
fix/90-91-status-doc-and-snapshot-tools
Jul 23, 2026
Merged

dkedar7 merged 3 commits into
mainfrom
fix/90-91-status-doc-and-snapshot-tools

Conversation

@dkedar7

@dkedar7 dkedar7 commented Jul 23, 2026

Copy link
Copy Markdown
Owner

Closes #91 and #90.

#91 — tool calls/results invisible for a non-streaming agent

An agent whose messages are produced without token streaming — a custom node calling model.invoke(), a non-streaming provider, a rule-based node (the "Creating Your Own Agent" shape) — delivers its turn via the AG-UI snapshot path, and langstage-core's snapshot handler yielded text only. So the ● tool_name / ↳ result that print_chunk already knows how to draw never arrived, and a tool-call-only turn rendered nothing while --verify reported success.

The root cause and fix are in langstage-core (fixed there in 1.0.24: the snapshot branch now emits tool_calls/tool_result). This release raises the floor to >= 1.0.24 and adds an integration test driving the issue's exact graph through the CLI stream path.

Verified end to end — the issue's tool_agent.py, rendered through print_chunk on a UTF-8 terminal:

● get_weather
  └─ Paris
⏺ Let me check the weather.     ↳ Sunny, 24C
⏺ The weather in Paris is sunny, 24C.

Two honest notes:

  • Tool frames remain intentionally suppressed in the quiet/scriptable single-shot path (langstage-cli -a x "msg" piped), where stdout carries only the reply text — the "tool chatter" contract from 0.6.20. So a tool-call-only turn is still empty output in that mode (it has no text reply). If you'd rather scriptable mode surface tool frames, that's a deliberate contract change worth its own issue — I didn't flip it unilaterally.
  • On a cp1252 Windows console, print_chunk rendering / raises UnicodeEncodeError (non-quiet mode) — the same latent glyph-encoding bug as the HITL menu's //. Pre-existing, not introduced here; worth a separate ASCII-fallback sweep.

#90 — README /status doc drift

0.6.21 (#88) removed the "sync/async mode" line from /status and updated the CLI Options table + [ui] async_mode example, but missed the /status entry in the Commands list. Corrected to agent, thread, verbose, cwd — matching the runtime.

Verification

Full suite 140 passed.

🤖 Generated with Claude Code

https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B

dkedar7 and others added 3 commits July 23, 2026 02:49
…tus docs (#90)

#91: an agent whose messages are produced without token streaming delivers its
turn via the AG-UI snapshot path, and langstage-core's snapshot handler yielded
text only -- so the `● tool_name` / `↳ result` the CLI already knows how to draw
never arrived, and a tool-call-only turn rendered nothing while --verify reported
success. Root cause + fix are in langstage-core; this raises the floor to >=1.0.24,
which emits tool_calls/tool_result on the snapshot wire so print_chunk renders
them. Tool frames stay suppressed in the quiet/scriptable single-shot path (the
0.6.20 "tool chatter" contract) -- unchanged.

#90: the README /status line still advertised a "sync/async mode" field that 0.6.21
removed from the runtime (#88). Corrected to agent, thread, verbose, cwd.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B
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.

Tool calls and tool results silently dropped in the non-streamed (snapshot) render path — a tool-call-only turn renders completely empty

1 participant