Drop in one React Native component and your app gets AI support that answers questions, navigates users to the right screen, fills forms, and resolves issues end-to-end โ with live human backup when needed. No custom API connectors required โ the app UI is already the integration.
Two names, one package โ pick whichever you prefer:
npm install @mobileai/react-native
# โ or โ
npm install react-native-agentic-aiTwo names, one package โ install either: @mobileai/react-native or react-native-agentic-ai
โญ If this helped you, star this repo โ it helps others find it!
Intercom, Zendesk, and every chat widget all do the same thing: send the user instructions in a chat bubble.
"To cancel your order, go to Orders, tap the order, then tap Cancel."
That's not support. That's documentation delivery with a chat UI.
This SDK takes a different approach. Instead of telling users where to go, it โ with the user's permission โ goes there for them.
Every other support tool needs you to build API connectors: endpoints, webhooks, action definitions in their dashboard. Months of backend work before the AI can do anything useful.
This SDK reads your app's live UI natively โ every button, label, input, and screen โ in real time. There's nothing to integrate. The UI is already the integration. The app already knows how to cancel orders, update addresses, apply promo codes โ it has buttons for all of it. The AI just uses them.
No OCR. No image pipelines. No selectors. No annotations. No backend connectors.
The most important insight: UI control is only uncomfortable when it's unexpected. In a support conversation, the user has already asked for help โ they're in a "please help me" mindset:
| Context | User reaction to AI controlling UI |
|---|---|
| Unprompted (out of nowhere) | ๐จ "What is happening?" |
| In a support chat โ user asked for help | ๐ "Yes please, do it for me" |
| User is frustrated and types "how do I..." | ๐ฎโ๐จ "Thank God, yes" |
The SDK handles every tier of support automatically โ from a simple FAQ answer to live human chat:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Level 1: Knowledge Answer โ
โ Answers from knowledge base โ instant, zero UI โ
โ "What's your return policy?" โ answered directly โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Level 2: Show & Guide โ
โ AI navigates to exact screen, user acts last โ
โ "Settings โ Notifications. It's right here. โ๏ธ" โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Level 3: Do & Confirm (Copilot โ default) โ
โ AI fills forms, user confirms the final action โ
โ "I've typed your new address. Tap Save to confirm." โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Level 4: Full Resolution (Autopilot) โ
โ AI completes entire flow with one permission gate โ
โ "Done! Order #4521 cancelled. Refund in 3-5 days." โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Level 5: Human Escalation โ
โ Live agent via WebSocket โ seamless handoff โ
โ Billing dispute, legal issues, edge cases โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Level 1 โ Knowledge Answer
User: "What's your return policy?"
AI: "You can return items within 30 days. Full refund in 5-7 business days."
[from knowledge base โ no UI needed]
Level 2 โ Show & Guide
User: "How do I turn on price alerts?"
AI: "That's in Settings โ Notifications. Want me to take you there?"
User: "Yes"
AI: [navigates to Settings โ scrolls to Notifications section]
AI: "Here it is. The Price Alerts toggle is right here. โ๏ธ"
[user taps the toggle themselves]
Level 3 โ Do & Confirm (Copilot, default)
User: "I need to change my shipping address"
AI: "Sure! I'll navigate to your address settings."
[navigates to Profile โ Address]
AI: "What's the new address?"
User: "15 Omar St, Nasr City, Cairo"
AI: [types the address into the fields]
AI: "I've filled in '15 Omar St, Nasr City, Cairo'. Tap Save to confirm."
[user taps Save themselves]
Level 4 โ Full Resolution (Autopilot)
User: "Cancel my last order"
AI: "Order #4521 โ Margherita pizza, $12.99. Want me to cancel it?"
User: "Yes"
AI: [navigates to Orders โ finds #4521 โ taps Cancel โ taps Confirm]
AI: "Done! Order #4521 is cancelled. Refund arrives in 3-5 days."
Level 5 โ Human Escalation
User: "I was charged twice for my order"
AI: "I can see your order history, but billing disputes need a human agent."
[triggers escalate โ live agent chat via WebSocket]
| Intercom Fin | Zendesk AI | This SDK | |
|---|---|---|---|
| Answer questions | โ | โ | โ Knowledge base |
| Navigate user to right screen | โ | โ | โ App-aware navigation |
| Fill forms for the user | โ | โ | โ Types directly into fields |
| Execute in-app actions | Via API connectors (must build) | Via API connectors | โ Via UI โ zero backend work |
| Voice support | โ | โ | โ Gemini Live |
| Human escalation | โ | โ | โ WebSocket live chat |
| Mobile-native | โ WebView overlay | โ WebView | โ React Native component |
| Setup time | Daysโweeks (build connectors) | Daysโweeks | Minutes (<AIAgent> wrapper) |
| Price per resolution | $0.99 + subscription | $1.50โ2.00 | You decide |
No competitor can do Levels 2โ4. Intercom and Zendesk answer questions (Level 1) and escalate to humans (Level 5). The middle โ app-aware navigation, form assistance, and full in-app resolution โ is uniquely possible because this SDK reads the React Native Fiber tree. That can't be added with a plugin or API connector.
The AI answers questions, guides users to the right screen, fills forms on their behalf, or completes full task flows โ with voice support and human escalation built in. All in the existing app UI. Zero backend integration.
- Zero-config โ wrap your app with
<AIAgent>, done. No annotations, no selectors, no API connectors - 5-level resolution โ knowledge answer โ guided navigation โ copilot โ full resolution โ human escalation
- Copilot mode (default) โ AI pauses once before irreversible actions (order, delete, submit). User always stays in control
- Human escalation โ live chat via WebSocket, CSAT survey, ticket dashboard โ all built in
- Knowledge base โ policies, FAQs, product data queried on demand โ no token waste
Full bidirectional voice AI powered by the Gemini Live API. Users speak their support request; the agent responds with voice AND navigates, fills forms, and resolves issues simultaneously.
- Sub-second latency โ real-time audio via WebSockets, not turn-based
- Full resolution โ same navigate, type, tap as text mode โ all by voice
- Screen-aware โ auto-detects screen changes and updates context instantly
๐ก Speech-to-text in text mode: Install
expo-speech-recognitionfor a mic button in the chat bar โ letting users dictate instead of typing. Separate from voice mode.
Every useAction you register automatically becomes a Siri shortcut and Spotlight action. One config plugin added at build time โ no Swift required โ and users can say:
"Hey Siri, track my order in MyApp" "Hey Siri, checkout in MyApp" "Hey Siri, cancel my last order in MyApp"
Setup โ Expo Config Plugin
// app.json
{
"expo": {
"plugins": [
["@mobileai/react-native/withAppIntents", {
"scanDirectory": "src",
"appScheme": "myapp"
}]
]
}
}After npx expo prebuild, every registered useAction is available in Siri and Spotlight automatically.
Or generate manually:
# Scan useAction calls โ intent-manifest.json
npx @mobileai/react-native generate-intents src
# Generate Swift AppIntents code
npx @mobileai/react-native generate-swift intent-manifest.json myapp
โ ๏ธ iOS 16+ only. Android equivalent (Google Assistant App Actions) is on the roadmap.
Your app becomes MCP-compatible with one prop. Connect any AI โ Antigravity, Claude Desktop, CI/CD pipelines โ to remotely read and control the running app. Find bugs without writing a single test.
MCP-only mode โ just want testing? No chat popup needed:
<AIAgent
showChatBar={false}
mcpServerUrl="ws://localhost:3101"
apiKey="YOUR_KEY"
navRef={navRef}
>
<App />
</AIAgent>The most powerful use case: test your app without writing test code. Connect your AI (Antigravity, Claude Desktop, or any MCP client) to the emulator and describe what to check โ in English. No selectors to maintain, no flaky tests, self-healing by design.
Skip the test framework. Just ask:
Ad-hoc โ ask your AI anything about the running app:
"Is the Laptop Stand price consistent between the home screen and the product detail page?"
YAML Test Plans โ commit reusable checks to your repo:
# tests/smoke.yaml
checks:
- id: price-sync
check: "Read the Laptop Stand price on home, tap it, compare with detail page"
- id: profile-email
check: "Go to Profile tab. Is the email displayed under the user's name?"Then tell your AI: "Read tests/smoke.yaml and run each check on the emulator"
Real Results โ 5 bugs found autonomously:
| # | What was checked | Bug found | AI steps |
|---|---|---|---|
| 1 | Price consistency (list โ detail) | Laptop Stand: $45.99 vs $49.99 | 2 |
| 2 | Profile completeness | Email missing โ only name shown | 2 |
| 3 | Settings navigation | Help Center missing from Support section | 2 |
| 4 | Description vs specifications | "breathable mesh" vs "Leather Upper" | 3 |
| 5 | Cross-screen price sync | Yoga Mat: $39.99 vs $34.99 | 4 |
Two names, one package โ pick whichever you prefer:
npm install @mobileai/react-native
# โ or โ
npm install react-native-agentic-aiNo native modules required by default. Works with Expo managed workflow out of the box โ no eject needed.
๐ธ Screenshots โ for image/video content understanding
npx expo install react-native-view-shot๐๏ธ Speech-to-Text in Text Mode โ dictate messages instead of typing
npx expo install expo-speech-recognitionAutomatically detected. No extra config needed โ a mic icon appears in the text chat bar, letting users speak their message instead of typing. This is separate from voice mode.
๐ค Voice Mode โ real-time bidirectional voice agent
npm install react-native-audio-apiExpo Managed โ add to app.json:
{
"expo": {
"android": { "permissions": ["RECORD_AUDIO", "MODIFY_AUDIO_SETTINGS"] },
"ios": { "infoPlist": { "NSMicrophoneUsageDescription": "Required for voice chat with AI assistant" } }
}
}Then rebuild: npx expo prebuild && npx expo run:android (or run:ios)
Expo Bare / React Native CLI โ add RECORD_AUDIO + MODIFY_AUDIO_SETTINGS to AndroidManifest.xml and NSMicrophoneUsageDescription to Info.plist, then rebuild.
Hardware echo cancellation (AEC) is automatically enabled โ no extra setup.
๐ฌ Human Support & Ticket Persistence โ persist tickets and discovery tooltip state across sessions
npx expo install @react-native-async-storage/async-storageOptional but recommended when using:
- Human escalation support โ tickets survive app restarts
- Discovery tooltip โ remembers if the user has already seen it
Without it, both features gracefully degrade: tickets are only visible during the current session, and the tooltip shows every launch instead of once.
Add one line to your metro.config.js โ the AI gets a map of every screen in your app, auto-generated on each dev start:
// metro.config.js
require('@mobileai/react-native/generate-map').autoGenerate(__dirname);Or generate it manually anytime:
npx @mobileai/react-native generate-mapWithout this, the AI can only see the currently mounted screen โ it has no idea what other screens exist or how to reach them. Example: "Write a review for the Laptop Stand" โ the AI sees the Home screen but doesn't know a
WriteReviewscreen exists 3 levels deep. With a map, it sees every screen in your app and knows exactly how to get there:Home โ Products โ Detail โ Reviews โ WriteReview.
import { AIAgent } from '@mobileai/react-native'; // or 'react-native-agentic-ai'
import { NavigationContainer, useNavigationContainerRef } from '@react-navigation/native';
import screenMap from './ai-screen-map.json'; // auto-generated by step 1
export default function App() {
const navRef = useNavigationContainerRef();
return (
<AIAgent
// โ ๏ธ Prototyping ONLY โ don't ship API keys in production
apiKey="YOUR_API_KEY"
// โ
Production: route through your secure backend proxy
// proxyUrl="https://api.yourdomain.com/ai-proxy"
// proxyHeaders={{ Authorization: `Bearer ${userToken}` }}
navRef={navRef}
screenMap={screenMap} // optional but recommended
>
<NavigationContainer ref={navRef}>
{/* Your existing screens โ zero changes needed */}
</NavigationContainer>
</AIAgent>
);
}In your root layout (app/_layout.tsx):
import { AIAgent } from '@mobileai/react-native'; // or 'react-native-agentic-ai'
import { Slot, useNavigationContainerRef } from 'expo-router';
import screenMap from './ai-screen-map.json'; // auto-generated by step 1
export default function RootLayout() {
const navRef = useNavigationContainerRef();
return (
<AIAgent
apiKey={process.env.AI_API_KEY!}
navRef={navRef}
screenMap={screenMap}
>
<Slot />
</AIAgent>
);
}The examples above use Gemini (default). To use OpenAI for text mode, add the provider prop. Voice mode is not supported with OpenAI.
<AIAgent
provider="openai"
apiKey="YOUR_OPENAI_API_KEY"
// model="gpt-4.1-mini" โ default, or use any OpenAI model
navRef={navRef}
>
{/* Same app, different brain */}
</AIAgent>A floating chat bar appears automatically. Ask the AI to navigate, tap buttons, fill forms, answer questions.
Set enableUIControl={false} for a lightweight FAQ / support assistant. Single LLM call, ~70% fewer tokens:
<AIAgent enableUIControl={false} knowledgeBase={KNOWLEDGE} />| Full Agent (default) | Knowledge-Only | |
|---|---|---|
| UI analysis | โ Full structure read | โ Skipped |
| Tokens per request | ~500-2000 | ~200 |
| Agent loop | Up to 25 steps | Single call |
| Tools available | 7 | 2 (done, query_knowledge) |
The agent operates in copilot mode by default. It navigates, scrolls, types, and fills forms silently โ then pauses once before the final irreversible action (place order, delete account, submit payment) to ask the user for confirmation.
// Default โ copilot mode, zero extra config:
<AIAgent apiKey="..." navRef={navRef}>
<App />
</AIAgent>What the AI does silently:
- Navigating between screens and tabs
- Scrolling to find content
- Typing into form fields
- Selecting options and filters
- Adding items to cart
What the AI pauses on (asks the user first):
- Placing an order / completing a purchase
- Submitting a form that sends data to a server
- Deleting anything (account, item, message)
- Confirming a payment or transaction
- Saving account/profile changes
<AIAgent interactionMode="autopilot" />Use autopilot for power users, accessibility tools, or repeat-task automation where confirmations are unwanted.
In copilot mode, the prompt handles ~95% of cases automatically. For extra safety on your most sensitive buttons, add aiConfirm={true} โ this adds a code-level block that cannot be bypassed even if the LLM ignores the prompt:
// These elements will ALWAYS require confirmation before the AI touches them
<Pressable aiConfirm onPress={deleteAccount}>
<Text>Delete Account</Text>
</Pressable>
<Pressable aiConfirm onPress={placeOrder}>
<Text>Place Order</Text>
</Pressable>
<TextInput aiConfirm placeholder="Credit card number" />aiConfirm works on any interactive element: Pressable, TextInput, Slider, Picker, Switch, DatePicker.
๐ก Dev tip: In
__DEV__mode, the SDK logs a reminder to addaiConfirmto critical elements after each copilot task.
| Layer | Mechanism | Developer effort |
|---|---|---|
| Prompt (primary) | AI uses ask_user before irreversible commits |
Zero |
aiConfirm prop (optional safety net) |
Code blocks specific elements | Add prop to 2โ3 critical buttons |
| Dev warning (preventive) | Logs tip in __DEV__ mode |
Zero |
Transform the AI agent into a production-grade support system. The AI resolves issues directly inside your app UI โ no backend API integrations required. When it can't help, it escalates to a live human agent.
import { SupportGreeting, buildSupportPrompt, createEscalateTool } from '@mobileai/react-native';
<AIAgent
apiKey="..."
analyticsKey="mobileai_pub_xxx" // required for MobileAI escalation
instructions={{
system: buildSupportPrompt({
enabled: true,
greeting: {
message: "Hi! ๐ How can I help you today?",
agentName: "Support",
},
quickReplies: [
{ label: "Track my order", icon: "๐ฆ" },
{ label: "Cancel order", icon: "โ" },
{ label: "Talk to a human", icon: "๐ค" },
],
escalation: { provider: 'mobileai' },
csat: { enabled: true },
}),
}}
customTools={{ escalate: createEscalateTool({ provider: 'mobileai' }) }}
userContext={{
userId: user.id,
name: user.name,
email: user.email,
plan: 'pro',
}}
>
<App />
</AIAgent>- AI creates a ticket in the MobileAI Dashboard inbox
- User receives a real-time live chat thread (WebSocket)
- Support agent replies โ user sees messages instantly
- Ticket is closed when resolved โ a CSAT survey appears
| Provider | What happens |
|---|---|
'mobileai' |
Ticket โ MobileAI Dashboard inbox + WebSocket live chat |
'custom' |
Calls your onEscalate callback โ wire to Intercom, Zendesk, etc. |
// Custom provider โ bring your own live chat:
createEscalateTool({
provider: 'custom',
onEscalate: (context) => {
Intercom.presentNewConversation();
// context includes: userId, message, screenName, chatHistory
},
})Pass user identity to the escalation ticket for agent visibility in the dashboard:
<AIAgent
userContext={{
userId: 'usr_123',
name: 'Ahmed Hassan',
email: 'ahmed@example.com',
plan: 'pro',
custom: { region: 'cairo', language: 'ar' },
}}
pushToken={expoPushToken} // for offline support reply notifications
pushTokenType="expo" // 'fcm' | 'expo' | 'apns'
/>Render the support greeting independently if you have a custom chat UI:
import { SupportGreeting } from '@mobileai/react-native';
<SupportGreeting
message="Hi! ๐ How can I help?"
agentName="Support"
quickReplies={[
{ label: 'Track order', icon: '๐ฆ' },
{ label: 'Talk to human', icon: '๐ค' },
]}
onQuickReply={(text) => send(text)}
/>By default, the AI navigates by reading what's on screen and tapping visible elements. Screen mapping gives the AI a complete map of every screen and how they connect โ via static analysis of your source code (AST). No API key needed, runs in ~2 seconds.
Add to your metro.config.js โ the screen map auto-generates every time Metro starts:
// metro.config.js
require('@mobileai/react-native/generate-map').autoGenerate(__dirname);
// ... rest of your Metro configThen pass the generated map to <AIAgent>:
import screenMap from './ai-screen-map.json';
<AIAgent screenMap={screenMap} navRef={navRef}>
<App />
</AIAgent>That's it. Works with both Expo Router and React Navigation โ auto-detected.
| Without Screen Map | With Screen Map |
|---|---|
| AI sees only the current screen | AI knows every screen in your app |
| Must explore to find features | Plans the full navigation path upfront |
| Deep screens may be unreachable | Knows each screen's navigatesTo links |
| No knowledge of dynamic routes | Understands item/[id], category/[id] patterns |
<AIAgent screenMap={screenMap} useScreenMap={false} />Advanced: Watch mode, CLI options, and npm scripts
Manual generation:
npx @mobileai/react-native generate-mapWatch mode โ auto-regenerates on file changes:
npx @mobileai/react-native generate-map --watchnpm scripts โ auto-run before start/build:
{
"scripts": {
"generate-map": "npx @mobileai/react-native generate-map",
"prestart": "npm run generate-map",
"prebuild": "npm run generate-map"
}
}| Flag | Description |
|---|---|
--watch, -w |
Watch for file changes and auto-regenerate |
--dir=./path |
Custom project directory |
๐ก The generated
ai-screen-map.jsonis committed to your repo โ no runtime cost.

