aaroh_chat 1.2.1+2
aaroh_chat: ^1.2.1+2 copied to clipboard
Flutter chat SDK by Aaroh for AI-powered conversations, featuring built-in NLP, Claude API integration, and branding options.
aaroh_chat #
A plug-and-play Flutter chat SDK โ add a fully branded AI assistant to your app in 5 minutes.
Built by Aaroh AI ยท Powered by Aaroh shown in every widget.
Features #
- ๐ฌ 3-screen UI: Chat ยท History ยท Language
- ๐ข Company branding: Your name + logo in the header
- ๐ง Built-in engine: Works offline, no API key needed
- ๐ค Claude API support: Plug in your Claude key for smarter responses
- ๐ Knowledge base: Feed company data โ bot answers from it
- ๐ Multilingual: English / Hindi / Hinglish
- ๐พ Chat history: Auto-saved locally on device
- ๐๏ธ Voice input: Mic support built in
- โก Streaming: Real-time token streaming for Claude
Installation #
# pubspec.yaml
dependencies:
aaroh_chat: ^1.2.1+1
flutter pub get
Quick Start #
Option 1 โ Full widget (new screen) #
import 'package:aaroh_chat/aaroh_chat.dart';
// Inside your widget tree:
AarohChatWidget(
config: AarohConfig(
companyName: 'MyCompany',
),
)
Option 2 โ Navigate to chat #
import 'package:aaroh_chat/aaroh_chat.dart';
ElevatedButton(
onPressed: () => pushAarohChat(
context,
config: AarohConfig(companyName: 'MyCompany'),
),
child: const Text('Open Chat'),
)
AarohConfig Reference #
| Parameter | Type | Description |
|---|---|---|
companyName |
String โ
|
Your company/product name (shown in header) |
companyLogoUrl |
String? |
URL of your company logo |
claudeApiKey |
String? |
Claude API key โ enables AI mode |
knowledgeBase |
List<Object> (String/KnowledgeItem) |
Company info, FAQs, product docs โ see Knowledge Base Format |
searchEngineData |
List<Object> (String/KnowledgeItem) |
Same format as knowledgeBase, separate list for your own organization |
knowledgeMatchThreshold |
int |
Built-in engine: min keyword overlap to trigger a knowledge answer (default 1) |
topics |
List<TopicRule> |
Rule-based replies โ "if user asks X, reply Y", with optional deep-link action. See Topics & Rule-Based Replies |
support |
SupportConfig? |
Support email / Contact Us link / phone (phone shown only if asked). See Support Fallback |
fallbackReply |
String? |
Shown in built-in engine mode when nothing else matches |
botGreeting |
String? |
Custom welcome message |
primaryColor |
String? |
Brand color hex e.g. '#E07A5F' |
poweredByText |
String |
Footer text (default: 'Powered by Aaroh') |
Knowledge Base Format #
knowledgeBase and searchEngineData both accept a List containing either:
- Plain
Strings โ quick and simple KnowledgeItemobjects โ structured, with categories and keywords for better matching
You can mix both freely in the same list.
Plain strings (simplest) #
knowledgeBase: [
'ShopMart sells electronics, clothing, and home goods.',
'We offer free delivery on orders above โน500.',
'Return policy: 30-day hassle-free returns.',
],
Structured KnowledgeItem (recommended for FAQs) #
knowledgeBase: [
KnowledgeItem(
id: 'return-policy', // optional, your own reference id
question: 'What is your return policy?',
answer: '30-day hassle-free returns, no questions asked.',
category: 'Policies', // optional, for your own organization
keywords: ['refund', 'exchange', 'send back'], // optional, boosts matching
),
KnowledgeItem(
answer: 'ShopMart was founded in 2020 and ships across India.',
// question/category/keywords are all optional โ this is just a fact
),
],
| Field | Required | Purpose |
|---|---|---|
id |
No | Stable reference if you update/remove entries later |
question |
No | The question this answers โ omit for plain facts/docs |
answer |
Yes | The answer text or fact content |
category |
No | Grouping label, e.g. 'Pricing', 'Shipping' |
keywords |
No | Extra search terms beyond what's in question/answer |
How it's used in each mode #
- Claude API mode โ every entry (string or
KnowledgeItem) is formatted and joined into Claude's system prompt automatically. Claude reasons over all of it. - Built-in engine mode (no
claudeApiKey) โ each incoming message is keyword-matched against your knowledge base. If a confident match is found, the bot answers directly from that entry'sanswerinstead of its generic wellness response. Tune sensitivity withknowledgeMatchThreshold(default1โ at least one matching keyword).
AarohConfig(
companyName: 'ShopMart',
knowledgeBase: [ /* ... */ ],
knowledgeMatchThreshold: 2, // require 2+ overlapping keywords to trigger
)
Full example #
AarohChatWidget(
config: AarohConfig(
companyName: 'ShopMart',
claudeApiKey: 'sk-ant-YOUR_KEY', // omit to use built-in engine
knowledgeBase: [
'ShopMart sells electronics, clothing, and home goods.',
KnowledgeItem(
question: 'What is your return policy?',
answer: '30-day hassle-free returns, no questions asked.',
category: 'Policies',
keywords: ['refund', 'exchange'],
),
KnowledgeItem(
question: 'Do you offer EMI?',
answer: 'Yes, on orders above โน2000 via major banks.',
category: 'Payments',
),
],
botGreeting: 'Hi! I\'m ShopMart\'s assistant. Ask me anything!',
),
)
Topics & Rule-Based Replies #
For general questions that aren't facts (e.g. "what's your pricing?", "track my order"), define TopicRules โ "if the user asks about X, reply with Y", with an optional deep link.
topics: [
TopicRule(
triggers: ['pricing', 'plans', 'cost', 'how much'],
reply: 'Here are our current plans:',
action: MessageAction(label: 'View Pricing', route: '/pricing'),
),
TopicRule(
triggers: ['track order', 'where is my order'],
reply: 'Let me pull that up for you.',
action: MessageAction(label: 'Track Order', actionId: 'track_order'),
),
],
topics is checked first, before the knowledge base โ first matching rule wins.
MessageAction โ three ways to handle a tap #
| Field | Use for |
|---|---|
route |
A named route in your own app (e.g. /pricing), pushed via Navigator.pushNamed. Works automatically with pushAarohChat (reuses your app's Navigator). With AarohChatWidget, pass your route table via its routes or onGenerateRoute param. |
url |
An external link (e.g. https://yoursite.com/contact), opened in the browser. |
actionId |
An arbitrary string passed to your own onAction callback โ run any custom logic. |
You can set more than one โ onAction fires first, then route is tried, falling back to url if route doesn't resolve.
pushAarohChat(
context,
config: myConfig,
onAction: (actionId) {
if (actionId == 'track_order') {
// your own logic โ open a bottom sheet, call an API, etc.
}
},
)
Support Fallback #
When a message looks support-related (e.g. "I need help", "this isn't working") and no TopicRule or knowledge entry matched, the bot uses SupportConfig:
support: SupportConfig(
email: 'support@shopmart.com', // shown by default
contactUsUrl: 'https://shopmart.com/contact', // shown as a button if set
phoneNumber: '1800-XXX-XXXX', // shown ONLY if user explicitly asks for it
),
- Email is always shown for support-style queries.
- Contact Us link is shown as a tappable button if you set
contactUsUrl. - Phone number is never shown proactively โ only when the user explicitly asks ("what's your number", "can I call you").
If nothing matches at all โ not a topic, not knowledge, not a support query โ fallbackReply is shown:
fallbackReply: "I'm not sure about that. Try asking about pricing, "
"your order, or our return policy.",
If you don't set fallbackReply, a generic safe default is used instead.
Claude API Setup #
- Get your key at console.anthropic.com
- Pass it as
claudeApiKeyinAarohConfig - Your
knowledgeBaseandsearchEngineDataare automatically injected into Claude's system prompt
Model used: claude-sonnet-4-6
Screens #
| Screen | How to access |
|---|---|
| Chat | Main screen (default) |
| History | ๐ icon in AppBar top-right |
| Language | ๐ icon in AppBar top-right |
Language Options #
| Option | Code |
|---|---|
| English | LanguageTone.english |
| Hindi | LanguageTone.hindi |
| Hinglish | LanguageTone.hinglish |
Publishing to pub.dev #
See PUBLISHING.md for step-by-step instructions.
License #
MIT ยฉ Aaroh AI