Global chat: Add answer streaming to planner#573
Open
hanna-paasivirta wants to merge 5 commits into
Open
Conversation
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
statusevent for completed actions ("Edited workflow structure"), which also persist in a newresponse_segmentsfield. 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.
statusSSE 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).response_segmentsoutput field records the durable transcript (text woven with settled status lines, spinners excluded) so the frontend can re-render the same view on reload. Thestatusevent payload matches the segment shape, so one render path covers both.changesevent is now sent inside the update itself, wherevercurrent_yamlchanges (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.AI Usage
Please disclose whether you've used AI in this work (it's cool, we just want to
know!):
You can read more details in our
Responsible AI Policy