-
Notifications
You must be signed in to change notification settings - Fork 51
[flight-booking-agent] Multi-turn chat and message injection (variant B) #26
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Signed-off-by: Peter Wielander <[email protected]>
Signed-off-by: Peter Wielander <[email protected]>
Signed-off-by: Peter Wielander <[email protected]>
Signed-off-by: Peter Wielander <[email protected]>
Signed-off-by: Peter Wielander <[email protected]>
Signed-off-by: Peter Wielander <[email protected]>
Signed-off-by: Peter Wielander <[email protected]>
| () => | ||
| new WorkflowChatTransport({ | ||
| api: '/api/chat', | ||
| onChatSendMessage: (response) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| await writer.write({ type: 'finish' }); | ||
| await writer.close(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| }); | ||
|
|
||
| // Update messages with the agent's response | ||
| messages.push(...result.messages.slice(messages.length)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| // Show pending message immediately for instant feedback | ||
| setPendingMessage(text); | ||
|
|
||
| try { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| { params }: { params: Promise<{ id: string }> } | ||
| ) { | ||
| const { id: runId } = await params; | ||
| const { message } = await req.json(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Signed-off-by: Peter Wielander <[email protected]>
Signed-off-by: Peter Wielander <[email protected]>
…g added to conversation history in multi-turn conversations Co-authored-by: VaguelySerious <[email protected]>
This makes multi-turn session the default for the flight booking app. This is an alternative to #25, using a different pattern for user message persistence.
The docs PR vercel/workflow#759 also publishes the page on how to do chat session modeling, which includes example code snippets from this PR.
Critically, this PR also removes all
localStorageuse for persistence, with the exception of the last run ID. The durable streams serve as the main durability and storage. To do this, we also specifically persist user messages inside the stream, which wasn't done previouslyAlso see vercel/workflow#739
Difference in variants
Variant A lets
useChatnatively handle optimistic rendering of user messages, and writes custom data chunks to the stream that the client interprets as user messages.Variant B writes user messages to the actual stream as user messages, so that the stream is the source of truth and consists of 100% normally interpretable
UIMessageChunkchunks.I prefer variant B, as it's better for later processing with AI SDK, since the user messages are inside the stream as the SDK would expect them to be.
The downside with Variant B is that is requires slightly more optimistic rendering code.
Screenshots