Skip to content

Global chat: Add answer streaming to planner#573

Open
hanna-paasivirta wants to merge 5 commits into
mainfrom
planner-streaming-bug
Open

Global chat: Add answer streaming to planner#573
hanna-paasivirta wants to merge 5 commits into
mainfrom
planner-streaming-bug

Conversation

@hanna-paasivirta

@hanna-paasivirta hanna-paasivirta commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Short Description

The planner buffered all model text and flushed it only after the response finished. Users saw nothing while the planner worked. Text the model wrote before tool calls ("I'll build this for you...") was silently discarded. Now we stream the planner's narration text live and separate its progress messages into two event types: transient "...ing" spinners (thinking events) and a new custom status event for completed actions ("Edited workflow structure"), which also persist in a new response_segments field. Workflow YAML now streams the moment it changes instead of waiting for the next text.

Fixes #572

Matching Lightning PR: OpenFn/lightning#4969

Implementation Details

Previously the planner buffered all text and sent it at the end, and every status was a thinking event with nothing to distinguish an in-progress spinner from a completed action. Lightning had no reliable way to know which statuses to persist, and the transcript could not be re-rendered after a page reload.

  • Text deltas now stream as they generate, including the narration the model writes before tool calls.
  • Each tool call sends a spinner ("Reviewing the workflow...") as a thinking event, then a past-tense settled line as a new custom status SSE event once the action completes. The settled verb reflects the actual outcome: a workflow-agent call that returned no YAML settles to "Analyzed the workflow" rather than claiming an edit, and job-code lines only count steps that were actually stitched in. Apollo owns this classification so Lightning just maps event type to visual treatment (spinners replace each other and vanish; status events persist).
  • A new response_segments output field records the durable transcript (text woven with settled status lines, spinners excluded) so the frontend can re-render the same view on reload. The status event payload matches the segment shape, so one render path covers both.
  • The YAML changes event is now sent inside the update itself, wherever current_yaml changes (workflow edit or job-code stitch), instead of being checked before every text delta. A newly added step reaches the client before its code is written, and the per-token change-detection machinery (_sent_yaml, pending-send checks) is deleted.
  • Planner history now returns plain string content on every route, matching the direct routes.

AI Usage

Please disclose whether you've used AI in this work (it's cool, we just want to
know!):

  • Yes, I have not used AI
  • No, I have not used AI

You can read more details in our
Responsible AI Policy

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.

Global chat: Fix planner streaming

1 participant