shinychat (development version)
New features
Added
chat_restore()which adds Shiny bookmarking hooks to save and restore the ellmer chat client. (#28, #82)Added
update_chat_user_input()for programmatically updating the user input of a chat UI element. (#78)shinychat now shows tool call request and results in the UI, and the feature is enabled by default in
chat_app()and the chat module (chat_mod_server()). When usingchat_append()withchat_ui(), setstream = "content"when you call the$stream_async()method on theellmer::Chatclient to ensure tool calls are included in the chat stream output. Learn more in the tool calling UI article. (#52)Added
chat_append(icon=...)andchat_ui(icon_assistant=...)for customizing the icon that appears next to assistant responses. (#88)chat_mod_server()now returns a list of reactives forlast_inputandlast_turn, as well functions toupdate_user_input(),append()andclear()the chat. (#130, #143, #145)
Improvements
chat_app()now correctly restores the chat client state when refreshing the app, e.g. by reloading the page. (#71)External links in chat messages in
chat_ui()now open in a new tab by default, with a confirmation dialog. (#120)
Bug fixes
- The chat input no longer submits incomplete text when the user has activated IME completions (e.g. while typing in Japanese or Chinese). (#85)
 
Internal changes
- We consolidated the 
<shiny-chat-message>and<shiny-user-message>components into a single<shiny-chat-message>component with adata-roleattribute to indicate whether it’s an “assistant” or “user” message. This likely has minimal impact on your apps, other than custom styles. You should update anyshiny-user-messagerules to useshiny-chat-message[data-role="user"]. (#101) 
shinychat 0.2.0
CRAN release: 2025-05-16
New features and improvements
Added new
output_markdown_stream()andmarkdown_stream()functions to allow for streaming markdown content to the client. This is useful for showing Generative AI responses in real-time in a Shiny app, outside of a chat interface. (#23)Both
chat_ui()andoutput_markdown_stream()now support arbitrary Shiny UI elements inside of messages. This allows for gathering input from the user (e.g.,selectInput()), displaying of rich output (e.g., htmlwidgets like plotly), and more. (#29)Added a new
chat_clear()function to clear the chat of all messages. (#25)Added
chat_app(),chat_mod_ui()andchat_mod_server().chat_app()takes an ellmer chat client and launches a simple Shiny app interface with the chat.chat_mod_ui()andchat_mod_server()replicate the interface as a Shiny module, for easily adding a simple chat interface connected to a specific ellmer chat client. (#36)The promise returned by
chat_append()now resolves to the content streamed into the chat. (#49)
Bug fixes
chat_append(),chat_append_message()andchat_clear()now all work in Shiny modules without needing to namespace theidof the Chat component. (#37)chat_append()now logs and throws a silent error if the stream errors for any reason. This prevents the app from crashing if the stream is interrupted. You can still usepromises::catch()to handle the error in your app code if desired. (#46)