Sets or clears the greeting displayed in an existing chat_ui(). The
greeting is shown when the chat first loads and is dismissed when the user
sends their first message.
Call chat_set_greeting() from the server to display a dynamic or streaming
greeting. This is typically used inside an shiny::observeEvent() watching
input$<id>_greeting_requested – an event that fires when the chat is
visible, has no messages, and has no greeting set. See the Greeting
section in chat_ui() for details on greeting_requested.
If the greeting has already been dismissed, calling this function updates
the greeting content but does not make it visible again. To show a new
greeting after dismissal, first clear the chat with
chat_clear(id, greeting = TRUE).
Pass NULL to clear the current greeting entirely.
Usage
chat_set_greeting(id, greeting, session = getDefaultReactiveDomain())Arguments
- id
The ID of the chat element
- greeting
The greeting to display. Can be:
NULLto clear the current greeting.A plain string or
htmltools::HTML()object (auto-wrapped with default options).A
chat_greeting()object.
- session
The Shiny session object
Value
Returns invisible(NULL) for static and NULL greetings, or a
promise for streaming greetings (resolves when streaming is complete).
Examples
if (FALSE) { # interactive()
library(shiny)
library(bslib)
library(shinychat)
# Static greeting set from the server
ui <- page_fillable(chat_ui("chat"))
server <- function(input, output, session) {
chat_set_greeting("chat", "## Welcome!\n\nHow can I help you today?")
observeEvent(input$chat_user_input, {
chat_append("chat", paste0("You said: ", input$chat_user_input))
})
}
shinyApp(ui, server)
}
if (FALSE) { # interactive()
library(shiny)
library(bslib)
library(shinychat)
library(coro)
# Streaming greeting generated by a function
greeting_generator <- async_generator(function() {
for (chunk in strsplit("## Hello!\n\nHow can I help you?", "")[[1]]) {
yield(chunk)
await(async_sleep(0.02))
}
})
ui <- page_fillable(chat_ui("chat"))
server <- function(input, output, session) {
chat_set_greeting("chat", chat_greeting(greeting_generator()))
observeEvent(input$chat_user_input, {
chat_append("chat", paste0("You said: ", input$chat_user_input))
})
}
shinyApp(ui, server)
}
if (FALSE) { # interactive()
library(shiny)
library(bslib)
library(shinychat)
# LLM-generated greeting using greeting_requested
ui <- page_fillable(chat_ui("chat"))
server <- function(input, output, session) {
chat_client <- ellmer::chat_openai(model = "gpt-4o")
observeEvent(input$chat_greeting_requested, {
stream <- chat_client$stream_async(
"Generate a short, friendly welcome message."
)
chat_set_greeting("chat", chat_greeting(stream))
})
observeEvent(input$chat_user_input, {
stream <- chat_client$stream_async(input$chat_user_input)
chat_append("chat", stream)
})
}
shinyApp(ui, server)
}
if (FALSE) { # interactive()
library(shiny)
library(bslib)
library(shinychat)
# Regenerate pattern: chat_clear(greeting = TRUE) triggers greeting_requested
ui <- page_fillable(
chat_ui("chat"),
actionButton("regenerate", "New greeting")
)
server <- function(input, output, session) {
observeEvent(input$chat_greeting_requested, {
chat_set_greeting(
"chat",
paste("## Welcome!\n\nGenerated at", Sys.time())
)
})
observeEvent(input$regenerate, {
chat_clear("chat", greeting = TRUE)
})
observeEvent(input$chat_user_input, {
chat_append("chat", paste0("You said: ", input$chat_user_input))
})
}
shinyApp(ui, server)
}