← All @molecule/* packages · App templates
@molecule/app-chatbot-tester-reactFeature · chatbot-tester · App (browser) · v1.0.1 · Apache-2.0
Bot-picker + transcript + composer sandbox UI
npm install @molecule/app-chatbot-tester-react@molecule/app-chatbot-tester-react is a ready-made chatbot-tester feature for the app (browser) side. It composes the core interfaces it needs, so it works with whichever providers your app has bonded.
import { ChatbotTester, type TesterMessage } from '@molecule/app-chatbot-tester-react'
const [messages, setMessages] = useState<TesterMessage[]>([])
const handleSend = async (text: string) => {
setMessages((prev) => [...prev, { id: Date.now(), role: 'user', content: text }])
const reply = await http.post(`/api/conversations/${conversationId}/messages`, { content: text })
setMessages((prev) => [...prev, { id: reply.id, role: 'assistant', content: reply.content }])
}
;<ChatbotTester
messages={messages}
onSend={handleSend}
loading={sending}
bots={bots}
botId={botId}
onBotChange={setBotId}
error={error}
/>Works with: @molecule/app-react, @molecule/app-ui, @molecule/app-ui-react
Auto-generated, AI-first package reference for the molecule.dev ecosystem. It is written to be read by coding agents as much as by people, and is generated from this package's source — edit
src/index.tsJSDoc, not this file.
@molecule/app-chatbot-tester-react — sandbox UI shell for live-testing
conversational AI: optional bot picker, message transcript, input row,
error display.
Stateless about transport. The consumer owns the message array, send handler, and bot list; the package handles the layout and composition.
Extracted from the ai-chatbot-builder TestChat page; usable for any "preview your bot live" UI.
import { ChatbotTester, type TesterMessage } from '@molecule/app-chatbot-tester-react'
const [messages, setMessages] = useState<TesterMessage[]>([])
const handleSend = async (text: string) => {
setMessages((prev) => [...prev, { id: Date.now(), role: 'user', content: text }])
const reply = await http.post(`/api/conversations/${conversationId}/messages`, { content: text })
setMessages((prev) => [...prev, { id: reply.id, role: 'assistant', content: reply.content }])
}
;<ChatbotTester
messages={messages}
onSend={handleSend}
loading={sending}
bots={bots}
botId={botId}
onBotChange={setBotId}
error={error}
/>
feature
npm install @molecule/app-chatbot-tester-react @molecule/app-react @molecule/app-ui @molecule/app-ui-react react
npm install -D @types/react
ChatbotTesterInputPropsProps for {@link ChatbotTesterInput}.
interface ChatbotTesterInputProps {
value: string
onChange: (next: string) => void
onSend: () => void
loading?: boolean
placeholder?: string
sendLabel?: string
}
ChatbotTesterMessagesPropsProps for {@link ChatbotTesterMessages}.
interface ChatbotTesterMessagesProps {
messages: TesterMessage[]
loading?: boolean
emptyState?: React.ReactNode
}
ChatbotTesterPropsProps for {@link ChatbotTester}.
interface ChatbotTesterProps {
messages: TesterMessage[]
loading?: boolean
/** When provided, send invokes this with the composer text. */
onSend: (text: string) => void | Promise<void>
/** Optional bot list — when length >= 2, a picker is rendered. */
bots?: TesterBotOption[]
botId?: string
onBotChange?: (id: string) => void
/** Last error message — rendered in a `role="alert"` paragraph. */
error?: ReactNode
/** Empty-state slot when there are no messages yet. */
emptyState?: ReactNode
botPickerLabel?: ReactNode
inputPlaceholder?: string
sendLabel?: string
className?: string
}
TesterBotOptionA selectable bot/agent option shown in the chatbot tester sandbox UI.
interface TesterBotOption {
id: string
name?: string
}
TesterMessageA single chat message displayed in the chatbot tester sandbox UI.
interface TesterMessage {
id: string | number
role: 'user' | 'assistant' | 'system'
content: string
timestamp?: string
}
ChatbotTester(props)Full chatbot tester sandbox.
function ChatbotTester({
messages,
loading,
onSend,
bots,
botId,
onBotChange,
error,
emptyState,
botPickerLabel = 'Test bot',
inputPlaceholder,
sendLabel,
className,
}: ChatbotTesterProps): JSX.Element
ChatbotTesterInput(props)Message composer + send button.
function ChatbotTesterInput({
value,
onChange,
onSend,
loading,
placeholder = 'Type a message…',
sendLabel = 'Send',
}: ChatbotTesterInputProps): JSX.Element
ChatbotTesterMessages(props)Scrollable transcript pane.
function ChatbotTesterMessages({
messages,
loading,
emptyState,
}: ChatbotTesterMessagesProps): JSX.Element
Peer dependencies:
@molecule/app-react ^1.0.1@molecule/app-ui ^1.0.1@molecule/app-ui-react ^1.0.1react ^18.0.0 || ^19.0.0@molecule/app-react@molecule/app-ui@molecule/app-ui-reactreactBuilt-in labels (botPickerLabel default "Test bot", inputPlaceholder
default "Type a message…", sendLabel default "Send") are hardcoded
English — there is no companion locale bond. For localized apps, pass all
three props with t('key', {}, { defaultValue: '…' }) values.
Enter sends; Shift+Enter inserts a newline. The bot picker renders only
when bots has 2+ entries. Styling includes Tailwind classes with
Material-3 tokens (bg-surface-container-high, border-outline-variant,
text-on-primary, …) — the app's Tailwind theme must define those tokens
(the default molecule Tailwind ClassMap bond does); with a non-Tailwind
ClassMap the bubbles/borders lose their styling.