UNPKG

@nuskin/chat-bot

Version:

React Chat Bot component for GenAI interaction with Amazon Bedrock

369 lines (288 loc) 14.4 kB
# @nuskin/chat-bot A React Chat Bot component for GenAI interaction with Amazon Bedrock. This component provides a modern, user-friendly chat interface that connects to AI services through Amazon Bedrock, making it easy to add conversational AI capabilities to your application. This component is written in a way that the api endpoint that it will call can take the data passed to it and use that data to invoke a Amazon Bedrock Agent. The `apiHeaders` passed to this component should include Authorization for the targeted api endpoint. ## Features - Clean, responsive UI with Material Design components - Support for markdown rendering in responses, including syntax highlighting for code blocks with copy functionality - Suggested example questions to help users get started - Seamless integration with Amazon Bedrock AI agents - Session management for conversational context with cookie-based persistence - Multiple LLM model selection via dropdown - Error handling with visual alerts - Multiline input support (Shift+Enter for new line, Enter to submit) - Easy to customize appearance and behavior - Works in both React applications and vanilla JavaScript environments - Customizable title bar with optional logo and "Clear Chat Session" button - Auto-scrolling chat container for smooth user experience ## Installation Using npm: ```bash npm install @nuskin/chat-bot ``` Using yarn: ```bash yarn add @nuskin/chat-bot ``` ### Peer Dependencies This component requires the following peer dependencies: ```bash yarn add @emotion/react@11.13.5 @emotion/styled@11.13.5 @mui/material@6.1.8 @mui/icons-material@6.1.8 react@18.3.1 react-dom@18.3.1 ``` ### Additional Dependencies The package uses these additional dependencies internally (you don't need to install them separately): - **@nuskin/axios-util**: For making HTTP requests with retry functionality - **@nuskin/uncle-buck**: For utility functions - **js-cookie**: For session management with cookie-based persistence - **uuid**: For generating unique session IDs - **tailwindcss**: For additional styling - **react-markdown**, **react-syntax-highlighter**, **rehype-raw**, **remark-gfm**, **remark-breaks**: For markdown rendering with code syntax highlighting ## Usage ### In a React Application ```jsx import { ChatBotUI } from '@nuskin/chat-bot' import '@nuskin/chat-bot/style.css' function App() { return ( <ChatBotUI.ChatBot title="My ChatBot" questions={['What is the capital of France?', 'What is GenAI?']} agentId="YOUR_BEDROCK_AGENT_ID" agentAliasId="YOUR_BEDROCK_AGENT_ALIAS_ID" apiEndpoint="YOUR_API_ENDPOINT" apiHeaders='{"Authorization": "YOUR_KEY_OR_TOKEN"}' /> ) } ``` ### With Multiple LLM Models and Hidden Title Bar ```jsx import { ChatBotUI } from '@nuskin/chat-bot' import '@nuskin/chat-bot/style.css' function App() { // Define custom example questions const exampleQuestions = ['What products help with dry skin?', 'How can I reduce wrinkles?', 'What ingredients should I look for in anti-aging products?'] const agents = [ { agentId: 'YOUR_BEDROCK_AGENT_ID', agentAliasId: 'YOUR_BEDROCK_AGENT_ALIAS_ID', value: 'haiku', label: 'Haiku' }, { agentId: 'YOUR_BEDROCK_AGENT_ID', agentAliasId: 'YOUR_BEDROCK_AGENT_ALIAS_ID', value: 'sonnet', label: 'Sonnet' } ] return ( <ChatBotUI.ChatBot title="Beauty Assistant" questions={exampleQuestions} agents={agents} hideTitleBar={true} apiEndpoint="YOUR_API_ENDPOINT" apiHeaders='{"Authorization": "YOUR_KEY_OR_TOKEN"}' /> ) } ``` The `value` and `label` properties represent the value and label for an Agent dropdown next to the search bar. In this example each agent represents using a different LLM. Providing an array of agents will enable a dropdown that will provide the user the ability to choose between the different LLM options. ### In a Static HTML Page ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>ChatBot Example</title> <!-- Required Dependencies --> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" /> <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" /> <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script> <script crossorigin src="https://unpkg.com/react@18.3.1/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"></script> <!-- Process polyfill (required for UMD build) --> <script> window.process = { env: { NODE_ENV: 'production' } } </script> <!-- ChatBot Files --> <link rel="stylesheet" href="https://unpkg.com/@nuskin/chat-bot/dist/umd/style.css" /> <script crossorigin defer src="https://unpkg.com/@nuskin/chat-bot/dist/umd/chat-bot.js"></script> </head> <body> <div id="chatbot-container"></div> <script> function checkDependencies() { const dependencies = { React: window.React, ReactDOM: window.ReactDOM, ChatBotUI: window.ChatBotUI } console.log('Dependencies check:', dependencies) return Object.entries(dependencies).every(([name, dep]) => { if (!dep) { console.error(`Missing dependency: ${name}`) return false } return true }) } function initChatBot() { if (!checkDependencies()) { console.error('Dependencies not loaded. Retrying in 100ms...') setTimeout(initChatBot, 100) return } try { ChatBotUI.init('chatbot-container', { title: 'Developer Portal Questions', questions: ['How many APIs do we have?', 'How many Lambdas do we have?', 'How do I get sso access?', 'How do I generate auth tokens?'], agentId: 'YOUR_BEDROCK_AGENT_ID', agentAliasId: 'YOUR_BEDROCK_AGENT_ALIAS_ID', apiEndpoint: 'YOUR_API_ENDPOINT', apiHeaders: '{"Content-Type": "application/json", "Authorization": "YOUR_KEY_OR_TOKEN"}' }) } catch (error) { console.error('Error initializing ChatBot:', error) } } // Wait for all scripts to load document.addEventListener('DOMContentLoaded', initChatBot) </script> </body> </html> ``` The example above includes: 1. A process polyfill required for the UMD build to work properly in browsers 2. A dependency checking function that ensures all required libraries are loaded before initializing the ChatBot 3. Error handling for initialization failures ## Props API The ChatBot component accepts the following props: | Prop | Type | Required | Default | Description | | ------------ | -------- | -------- | ------------------------- | ------------------------------------------------------------------------------------- | | title | string | No | "Nu Skin Chatbot" | The title displayed at the top of the chat window | | questions | string[] | No | [Example questions array] | Array of example questions to display | | agentId | string | No\* | - | Amazon Bedrock agent ID | | agentAliasId | string | No\* | - | Amazon Bedrock agent alias ID | | agents | array | No\* | - | Array of objects {agentId, agentAliasId, value, label} | | hideTitleBar | boolean | No | false | Hide the title bar, including the logo and "Clear Chat Session" button | | apiEndpoint | string | Yes | - | API endpoint URL for the Bedrock service | | apiHeaders | string | Yes | - | JSON string of headers for API requests, including Authorization for the api endpoint | \*Note: You will need to either include `agentId` AND `agentAliasId` OR `agents` to properly connect with Amazon Bedrock AI services. ## Additional Features ### Input Handling - **Multiline Input**: Users can press Shift+Enter to add a new line in the input field, and Enter to submit the question - **Clear Chat Session**: When the title bar is visible, users can click the "Clear Chat Session" button to reset the conversation history - **Error Handling**: The component displays error alerts when API calls fail, providing feedback to the user - **Loading Indicator**: Shows a progress bar while waiting for AI responses - **Auto-scrolling**: The chat container automatically scrolls to the latest message for a smooth user experience ### Title Bar When `hideTitleBar` is set to `false` (default), the title bar includes: - A customizable logo (using the `Logo` component) - The chat title (customizable via the `title` prop) - A "Clear Chat Session" button to reset the conversation ### LLM Selection When multiple agents are provided via the `agents` prop, a dropdown menu appears next to the input field, allowing users to select different LLM models for their conversation. ### Code Block Features - **Syntax Highlighting**: Code blocks in markdown responses are rendered with syntax highlighting - **Copy Button**: Each code block includes a "Copy" button that copies the code to the clipboard - **Success Notification**: A snackbar notification appears when code is successfully copied ## Customization ### Styling The ChatBot component includes default styling through the CSS file. You can customize its appearance by overriding CSS classes: - `.chatbot` - The main container div - `.ask-box` - The question input area - `.ask-wrapper` - Wrapper for input components - `.example-questions` - Container for example question chips - `.ask-form` - Form container for the input field - `.ask-question` - Container for the question text field - `.question` - The text input field itself - `.send-btn-wrapper` - Container for the send button - `.listed-question` - Container for each question/answer pair in the chat history - `.llm-selector` - Container for the LLM dropdown selector - `.copy-btn` - The copy button for code blocks ### Message Structure The ChatBot maintains a conversation history as an array of message objects. Each message has the following structure: ```js { question: "User's question text", answer: { value: "AI response text in markdown format" } } ``` The `answer.value` field contains markdown-formatted text, which is rendered by the `RenderMarkdown` component. This supports: - Formatting (bold, italic, etc.) - Lists (ordered and unordered) with proper nesting - Code blocks with syntax highlighting and copy functionality - Tables - Links - Line breaks - Other standard markdown features ## API Integration The ChatBot component communicates with Amazon Bedrock through a proxy API endpoint. The API integration includes: - **Retry Functionality**: Automatically retries failed API calls with exponential backoff - **Session Management**: Maintains conversation context using session cookies - **Error Handling**: Gracefully handles and displays API errors to users - **Timeout Configuration**: Configurable request timeouts ## TypeScript Support This package includes built-in TypeScript support. TypeScript users can import the component and its types directly: ```typescript import { ChatBotUI } from '@nuskin/chat-bot' import type { ChatBotProps } from '@nuskin/chat-bot' ``` ## Development 1. Clone the repository 2. Install dependencies: ```bash yarn ``` 3. Run the development server: ```bash yarn dev ``` 4. Run tests: ```bash yarn test ``` 5. Run linting: ```bash yarn lint ``` 6. Run Storybook for component development: ```bash yarn storybook ``` 7. Build the package: ```bash yarn build:both ``` The build process creates two distributions: - ESM (ES Modules) build: `dist/esm/chat-bot.js` - UMD (Universal Module Definition) build: `dist/umd/chat-bot.js` Note: The build process must be run locally before committing changes to ensure both ESM and UMD builds are properly generated. ### Testing The project uses Jest for testing. Run the test suite with: ```bash yarn test ``` This will run all tests and generate a coverage report. The project maintains high test coverage to ensure reliability. ### Storybook The project includes Storybook for component development and testing. Run Storybook with: ```bash yarn storybook ``` This will start a Storybook server at http://localhost:6060, where you can view and interact with the ChatBot component in various configurations. ## Resources - [Amazon Bedrock Documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) - [Material-UI Documentation](https://mui.com/material-ui/getting-started/overview/) - [Material-UI Components API](https://mui.com/material-ui/api/alert/) - [Material-UI Icons](https://mui.com/material-ui/material-icons/) - [React Markdown](https://github.com/remarkjs/react-markdown) - [TailwindCSS Documentation](https://tailwindcss.com/docs) ## License MIT