This widget is and is subject to change in minor versions.
Signature
Import
JavaScript
About this widget
<Chat> is a widget to display a chat interface that interacts with a generative AI assistant.
See also: Agent Studio
<Chat> renders the chat panel but doesn’t provide a way to open it. Add one entry point to the same <InstantSearch> instance: the <ChatTrigger> widget, AI mode on a SearchBox or autocomplete, or an inline layout. Otherwise, the widget logs a development warning. To silence it, set disableTriggerValidation to true.Examples
JavaScript
Props
string
The unique identifier of the agent to connect to. You can find the
agentId in the Agent Studio dashboard.JavaScript
boolean
Whether to enable feedback (thumbs up/down) on assistant messages. Only available when using
agentId.JavaScript
object
Request options to send with the built-in Agent Studio completion requests.
Use this option only with
agentId.
It isn’t available with a custom transport or custom chat instance.The object accepts the following properties:queryParameters(Record<string, string | number | boolean>). Query parameters to append to each completion request.headers(Record<string, string> | Headers). Headers to send with each completion request.
compatibilityMode=ai-sdk-5,
even if you set compatibilityMode in queryParameters.
Custom headers can’t override the required Algolia identity headers (x-algolia-application-id, x-algolia-api-key) or the x-algolia-agent header that identifies InstantSearch.
When users regenerate an assistant message,
InstantSearch sends cache=false even if requestOptions.queryParameters.cache is true.JavaScript
HttpChatTransportInitOptions
A custom transport object to handle the communication between the chat widget and the agent. The API endpoint must be compatible with Vercel AI SDK 5.
(nextUiState: object) => string
A function to return the URL of the main search page with the
nextUiState. This is used to navigate to the main search page when the user clicks on “View all” in the search tool.JavaScript
Record<string, Tool>
An object defining the client-side tools that the agent can use to interact with your application. The object’s keys are tool names that must match the tools defined in the Agent Studio dashboard.The widget has built-in renderers for search and Display Results tools. Import and use the exported constants as keys to customize the default rendering:To customize only the appearance of each result in the built-in carousel, use the For a step-by-step walkthrough, see Customize the chat results carousel.Each tool is an object with the following properties:
SearchIndexToolType('algolia_search_index'). Displays search results from an Algolia index in a carousel.DisplayResultsToolType('algolia_display_results'). Displays grouped results from the tool’s streaming input in carousels.
JavaScript
itemComponent prop instead. To replace the whole carousel layout, override the SearchIndexToolType tool’s layoutComponent. The tool result is on message.output (hits, nbHits, queryID):JavaScript
layoutComponent. A React component that renders the tool call in the chat. Receives the following props:message. The tool call message. It containsinput(parameters from the agent) andoutput(the result you provide withaddToolResult). For more information on the message structure, see the Vercel AI SDK documentation.indexUiState. The current InstantSearch UI state.setIndexUiState. Updates the InstantSearch UI state (for example, to refine filters or update the query based on the tool call).applyFilters. Applies filters to the InstantSearch UI state from the tool call.addToolResult. Sends the tool’s output back to the agent. Call this at least once before the next message. For more information, see the Vercel AI SDK documentation.onClose. Dismisses the tool’s UI in the chat.sendEvent. Sendsclickorconversionevents related to the tool call. For more information, see theinsightsmiddleware documentation.
onToolCall. Optional handler invoked when the agent calls the tool. Receives a parameter object with:input. The parameters the agent passed to the tool.addToolResult. Sends the tool’s output back to the agent. For more information, see the Vercel AI SDK documentation.toolCallId. The unique identifier of the tool call.toolName. The name of the tool being invoked.dynamic. Whether the tool is dynamically registered.
streamInput. Optional boolean. Whentrue, the default loader is suppressed as the tool’s input is streamed from the agent. Use the partialinputin yourlayouttemplate to render the streaming state as input chunks arrive.
Record<string, string> | () => Record<string, string>
Extra context to send with each user message (for example, the current page or selected locale).
The widget sends this context with every message, but doesn’t show it in the chat UI.
context can be a static object or a function that returns an object at send time.
The widget attaches it to the latest user message as metadata.turnContext, following the Agent Studio per-turn context contract.
The context never appears as a chat bubble.The context must be a flat object that maps strings to strings (up to 32 keys, 4,096 bytes total).
Agent Studio validates the payload and rejects malformed contexts.
For details, see Per-turn context.UIMessage[]
Messages to pre-populate the chat with when it’s initialized. These messages are added without triggering an AI response.
initialMessages only applies when the chat has no existing messages. When resume is enabled, initialMessages is ignored.JavaScript
string
A message to send automatically when the chat is initialized.
initialUserMessage is only sent when the chat has no existing messages. It’s sent after initialMessages are applied. When resume is enabled, this message isn’t sent.JavaScript
boolean
default:false
Whether to resume an ongoing chat generation stream when the widget mounts. Use this when restoring a chat session after a page reload to continue receiving an in-flight assistant response.
JavaScript
boolean | { messages?: boolean; open?: boolean }
default:true
Whether to persist and restore the conversation and the open state of the chat panel from
sessionStorage. When true (the default), the widget saves both the messages and whether the panel is open, and restores them when the widget re-mounts (for example, after a page reload). Set it to false to keep everything in memory only, so it’s cleared when the page reloads.To control each policy separately, pass an object with the messages and open booleans. Only what you set to true is persisted:- Omitted or
true: persists the messages and the open state. falseor{}: persists nothing.{ messages: true }: persists the messages, but always starts with the panel closed.{ open: true }: persists the open state, but doesn’t persist messages.
chat instance, the instance owns message persistence, so only the open option is available. The open state is persisted by default: pass { open: false } to opt out.boolean
default:false
Whether to skip the validation that requires a way to open the chat. By default,
<Chat> logs a development warning unless the chat has an entry point: a <ChatTrigger> widget, AI mode on a SearchBox or autocomplete, or an inline layout. Set this to true when you open the chat programmatically and don’t render any of those.JavaScript
(options: { message, messages, isAbort, isDisconnect, isError }) => void
A callback called when the assistant response has finished streaming, including when the stream is aborted, disconnected, or fails.The callback receives an object with:
message: the final assistant message.messages: the full message list including the new message.isAbort:trueif the stream was stopped withstop().isDisconnect:trueif the connection was lost.isError:trueif the stream finished with an error.
JavaScript
(options: { messages: UIMessage[] }) => boolean | Promise<boolean>
A function that decides whether to resubmit the conversation to the agent without user input. It receives an object with
messages, the current message list, and returns a boolean or a promise that resolves to one. When it returns true, <Chat> sends the conversation again so the agent can continue its turn.By default, <Chat> uses lastAssistantMessageIsCompleteWithToolCalls. It returns true when the last step of the last assistant message has at least one client-side tool call, and every one of those calls has an output or an error. This is what lets the agent act on the results of your tools and keep answering. The function ignores tool calls the agent executes on its own side, because their results don’t come from your app.<Chat> evaluates the function only for a response with at least one required client-side tool call. It waits for the response to finish streaming and for every required client-side tool call in that response to have a result, whichever comes last. It evaluates each response at most once, and skips a stream that’s stopped or fails.Return false to stop <Chat> from continuing turns on its own, for example when your tools end the turn and users send the next message.With a custom chat instance, set sendAutomaticallyWhen on the instance instead.boolean
default:true
Whether the widget makes InstantSearch require a main search request.
By default (
true), the widget contributes to the main search.
Set it to false to opt the widget out of the main search: if it’s the only widget on the page, no main search request is sent.JavaScript
boolean
default:false
Whether to display reasoning parts from assistant messages. Each reasoning part appears in a collapsed disclosure in its original message order. Users can expand or collapse each part, and the active part indicates that reasoning is still in progress.Copied assistant messages include the answer text, not the reasoning.
JavaScript
(props: ChatEmptyProps) => JSX.Element
A component to customize the welcome screen shown before the first message, when the chat has no messages yet. Use it to display a greeting and starter prompts that send a message when clicked. It receives:To render the default greeting (heading, subheading, and an optional banner) inside your component, use the exported
sendMessage. Sends a message to the agent. Call it with{ text }to submit a starter prompt as the first message.status. The current chat status.onClose. Dismisses the chat.setInput. Sets the value of the prompt input without sending it.
JavaScript
ChatGreeting component from react-instantsearch.For a step-by-step walkthrough, see Show starter prompts on the chat welcome screen.(props: ChatLayoutOwnProps) => JSX.Element
A component to customize the overall layout of the chat widget.
Use
ChatInlineLayout for an inline (non-overlay) layout, ChatSidePanelLayout for a side panel on the right side of the page, or ChatOverlayLayout for the default floating overlay.
To display a custom welcome screen before the first message,
see Show starter prompts on the chat welcome screen.Use the side panel layout to keep the chat widget beside your page content on wider screens.
Unlike the inline layout, the side panel requires an entry point to open the widget.By default, ChatSidePanelLayout adjusts document.body.
Set its parentElement prop to a CSS selector to adjust another element.- When the side panel opens, the layout adds the value of
--ais-chat-widthto the selected element’s inlinemargin-right. - When the side panel closes, the layout restores the previous inline margin.
- On wider screens, maximizing the chat widget changes the panel width to
--ais-chat-maximized-widthwithout increasing the reserved margin, so the maximized panel can overlap page content.
parentElement.JavaScript
(props) => JSX.Element
A component to customize the loader shown while waiting for an AI response. Import the built-in To replace the loading state, see Customize the chat loading message.
ChatMessageLoader component from react-instantsearch to render the default loader, or provide your own component.JavaScript
() => JSX.Element
Components to customize the rendering of the widget.
itemComponent. Custom component for each result. Receives an object containing a single record.headerCloseIconComponent. Header: close icon component.headerMaximizeIconComponent. Header: maximize icon component. Receives a prop containing{ maximized: boolean }for conditional rendering.headerMinimizeIconComponent. Header: minimize icon component.headerTitleIconComponent. Header: title icon component (defaults to sparkles).messagesErrorComponent. Messages: custom error component. Guardrail fallback responses render as assistant messages, not through this component. By default, the widget shows a generic message (“Sorry, we are not able to generate a response at the moment. Please contact support.”) and a “Start a new conversation” button that clears the conversation. The component receives:errorMessage. The raw error message from the API or transport layer.onNewConversation. Callback that clears the conversation and starts a new one. Use it to render a “Start a new conversation” action for errors where retrying fails again.
assistantMessageLeadingComponent. Assistant message: custom leading component (e.g. avatar).assistantMessageFooterComponent. Assistant message: custom footer component.userMessageLeadingComponent. User message: custom leading component (e.g. avatar).userMessageFooterComponent. User message: custom footer component.promptFooterComponent. Prompt: custom footer component.promptHeaderComponent. Prompt: custom header component.suggestionsComponent. Custom component to render follow-up prompt suggestions. Receives a prop containing{ suggestions: string[], onSuggestionClick: (str: string) => void }.
<ChatTrigger> widget’s toggleIconComponent prop instead.To add a disclaimer or policy notice, see Add a legal notice to the chat widget.JavaScript
object
Props forwarded to the messages section of the widget. Use To render user messages as plain text while keeping the default Markdown rendering for assistant messages:
assistantMessageProps and userMessageProps to customize each role separately:textComponent. A component that renders each text part of the message. It replaces the default markdown rendering. It receives:part. The text part to render. Itstextproperty holds the text content.message. The message the text part belongs to.messages. The full conversation, when available.status. The current chat status:'ready','submitted','streaming', or'error'.partIndex. The index of the text part in the message’spartsarray.
parseMarkdown. The default value istrue. The widget renders text and reasoning parts as Markdown, including links, code blocks, and emphasis. SetparseMarkdowntofalseto render reasoning parts and text parts that use the default renderer as plain text. Line breaks are preserved and links aren’t clickable. Use this option for user messages when Markdown characters such as*or_should remain literal. If you provide atextComponent, it takes precedence for text parts.parseMarkdownthen only controls reasoning parts.
JavaScript
JavaScript
Partial<ChatClassNames>
The CSS classes you can override and pass to the widget’s elements.
It’s useful to style widgets with class-based CSS frameworks like Bootstrap or Tailwind CSS.
root. The root element of the widget.container. The container element.header. The header section of the widget.root. The root element.clear. The clear button.close. The close button.maximize. The maximize button.title. The title element.titleIcon. The title icon element.
messages. The messages section of the widget.root. The root element.content. The scrollable content.scroll. The scroll container.scrollToBottom. The scroll to bottom button.scrollToBottomHidden. The hidden state of the scroll to bottom button.
message. The message in the messages section.root. The root element.container. The message container.leading. The leading element (e.g., avatar).content. The content element.message. The message text element.reasoning. The reasoning disclosure.reasoningHeader. The reasoning disclosure header.reasoningIcon. The reasoning icon.reasoningLabel. The reasoning label.reasoningChevron. The reasoning disclosure chevron.reasoningBody. The reasoning body.reasoningText. The reasoning text.actions. The action buttons container.footer. The footer element.
prompt. The prompt section of the widget.root. The root element.actions. The actions container.body. The body element.footer. The footer element.header. The header element.submit. The submit button.textarea. The textarea element.
JavaScript
Partial<ChatTranslations>
A dictionary of translations to customize the UI text and support internationalization.
header. The header section of the widget.clearLabel. Accessible label for the clear button.closeLabel. Accessible label for the close button.maximizeLabel. Accessible label for the maximize button.minimizeLabel. Accessible label for the minimize button.title. Title to display.
messages. The messages section of the widget.copyToClipboardLabel. Accessible label for the copy to clipboard action.feedbackThankYouText. Text shown after feedback is submitted (default:'Thanks for your feedback!').loaderText. Text to display in the loader.regenerateLabel. Accessible label for the regenerate action.scrollToBottomLabel. Accessible label for the scroll to bottom button.sendingFeedbackLabel. Accessible label for the feedback spinner (default:'Sending feedback...').thumbsDownLabel. Accessible label for the thumbs down button (default:'Dislike').thumbsUpLabel. Accessible label for the thumbs up button (default:'Like').
message. Individual message in the messages section.messageLabel. Accessible label for the message.actionsLabel. Accessible label for the actions container.reasoningLabel. Label for a reasoning disclosure.
prompt. The prompt section of the widget.disclaimer. Disclaimer text shown in the prompt footer.emptyMessageTooltip. Tooltip for the submit button when message is empty.sendMessageTooltip. Tooltip for the send button.stopResponseTooltip. Tooltip for the stop button.textareaLabel. Accessible label for the textarea.textareaPlaceholder. Placeholder text for the textarea.
JavaScript
React.ComponentProps<'div'>
Any
<div> prop to forward to the root element of the widget.JavaScript
Streaming and resumption
Assistant responses stream over Server-Sent Events. TheuseChat hook exposes the streaming lifecycle if you want to drive a custom UI.
Status values
useChat returns a status value, which can be one of:
'ready'. The chat is idle and ready to accept a new message.'submitted'. A user message was submitted and the assistant hasn’t started responding yet.'streaming'. The assistant is streaming a response.'error'. The last response finished with an error. CallclearError()before sending a new message.
state of 'streaming' or 'done' while the response streams.
Stop and resume
useChat also returns:
stop(). Aborts the current streaming response. TheonFinishcallback runs withisAbort: true.resumeStream(). Reconnects to an in-flight stream. Call this on mount, or passresumeto<Chat>to do it automatically.
JavaScript
resume on <Chat>, or call resumeStream() from a custom component.