Adds Shiny bookmarking hooks to save and restore the ellmer chat
client. Also restores chat messages from the history in the client.
If either bookmark_on_input or bookmark_on_response is TRUE, the Shiny
App's bookmark will be automatically updated without showing a modal to the
user.
Note: Only the client's chat state is saved/restored in the bookmark. If
the client's state doesn't properly capture the chat's UI (i.e., a
transformation is applied in-between receiving and displaying the message),
then you may need to implement your own session$onRestore() (and possibly
session$onBookmark) handler to restore any additional state.
To avoid restoring chat history from the client, you can ensure that the
history is empty by calling client$set_turns(list()) before passing the
client to chat_restore().
Usage
chat_restore(
id,
client,
...,
bookmark_on_input = TRUE,
bookmark_on_response = TRUE,
session = getDefaultReactiveDomain()
)Arguments
- id
The ID of the chat element
- client
The ellmer LLM chat client.
- ...
Used for future parameter expansion.
- bookmark_on_input
A logical value determines if the bookmark should be updated when the user submits a message. Default is
TRUE.- bookmark_on_response
A logical value determines if the bookmark should be updated when the response stream completes. Default is
TRUE.- session
The Shiny session object
Examples
if (FALSE) { # interactive()
library(shiny)
library(bslib)
library(shinychat)
ui <- function(request) {
page_fillable(
chat_ui("chat", fill = TRUE)
)
}
server <- function(input, output, session) {
chat_client <- ellmer::chat_ollama(
system_prompt = "Important: Always respond in a limerick",
model = "qwen2.5-coder:1.5b",
echo = TRUE
)
# Update bookmark to chat on user submission and completed response
chat_restore("chat", chat_client)
observeEvent(input$chat_user_input, {
stream <- chat_client$stream_async(input$chat_user_input)
chat_append("chat", stream)
})
}
# Enable bookmarking!
shinyApp(ui, server, enableBookmarking = "server")
}