Context

Learn how to pass application context to make AI responses more relevant and personalized.

What is Context?

Context is information about your application’s current state that you pass to the AI. This allows the AI to:

  • Answer questions about the current page or user
  • Provide personalized recommendations
  • Understand user intent better
  • Reference specific data from your application

The context Prop

The context prop lets you pass real-time application state to the AI agent. Context is sent with every message, giving the AI immediate access to relevant information.

Static Context

When context doesn’t change frequently, pass a plain object:

import { useState } from 'react';
import { InAppAI, Message } from '@inappai/react';

function App() {
  const [messages, setMessages] = useState<Message[]>([]);
  const user = { name: 'Alice', role: 'admin', plan: 'professional' };

  return (
    <InAppAI
      agentId="your-agent-id"
      messages={messages}
      onMessagesChange={setMessages}
      context={{
        page: 'dashboard',
        userName: user.name,
        userRole: user.role,
        plan: user.plan,
      }}
    />
  );
}

Now when the user asks “What plan am I on?”, the AI can respond: “You’re on the Professional plan.”

Dynamic Context

When context changes frequently, use a function to capture fresh state on each message:

function App() {
  const [messages, setMessages] = useState<Message[]>([]);
  const [selectedItems, setSelectedItems] = useState<string[]>([]);

  return (
    <InAppAI
      agentId="your-agent-id"
      messages={messages}
      onMessagesChange={setMessages}
      context={() => ({
        page: window.location.pathname,
        selectedItems: selectedItems,
        scrollPosition: window.scrollY,
        timestamp: new Date().toISOString(),
      })}
    />
  );
}

The function is called every time the user sends a message, ensuring the AI gets current information.

Real-World Examples

E-commerce Product Page

function ProductPage() {
  const [messages, setMessages] = useState<Message[]>([]);

  const product = {
    id: 'shirt-001',
    name: 'Blue T-Shirt',
    price: 29.99,
    inStock: true,
    sizes: ['S', 'M', 'L', 'XL'],
  };

  const cart = [
    { name: 'Jeans', quantity: 1, price: 59.99 },
  ];

  return (
    <InAppAI
      agentId="your-agent-id"
      messages={messages}
      onMessagesChange={setMessages}
      context={{
        currentProduct: product,
        cartItemCount: cart.length,
        cartTotal: cart.reduce((sum, item) => sum + item.price * item.quantity, 0),
      }}
    />
  );
}

User: “Is this shirt available in large?” AI: “Yes! The Blue T-Shirt is available in Large. Would you like me to add it to your cart?”

SaaS Dashboard

function Dashboard() {
  const [messages, setMessages] = useState<Message[]>([]);

  const user = {
    name: 'Alice Chen',
    email: 'alice@company.com',
    role: 'admin',
  };

  const stats = {
    projects: 12,
    activeUsers: 45,
    storageUsed: '34.2 GB',
    storageLimit: '100 GB',
  };

  return (
    <InAppAI
      agentId="your-agent-id"
      messages={messages}
      onMessagesChange={setMessages}
      context={{
        userName: user.name,
        userRole: user.role,
        ...stats,
      }}
    />
  );
}

User: “How much storage do I have left?” AI: “You’ve used 34.2 GB of your 100 GB storage limit, so you have about 65.8 GB remaining.”

Documentation Site

function DocsPage() {
  const [messages, setMessages] = useState<Message[]>([]);

  return (
    <InAppAI
      agentId="your-agent-id"
      messages={messages}
      onMessagesChange={setMessages}
      displayMode="sidebar-right"
      context={() => ({
        section: 'getting-started',
        pageTitle: document.title,
        url: window.location.pathname,
        selectedText: window.getSelection()?.toString() || '',
      })}
    />
  );
}

User: “Can you explain this?” (with text selected) AI: sees selectedText in context “That code snippet creates a new React component…”

Context vs Tools

Understanding the distinction is important:

FeatureContextTools
PurposeProvide read-only state snapshotExecute actions and modify state
Passed viacontext proptools prop
When sentWith every message automaticallyOnly when AI decides to call them
AI capabilityCan read and reference dataCan call functions to take actions

Use context when: You want the AI to always have access to current state (user info, page data, settings)

Use tools when: You want the AI to take actions (create, update, delete) or fetch data on-demand

Combining Context and Tools

For the best experience, use both together:

function TodoApp() {
  const [messages, setMessages] = useState<Message[]>([]);
  const [todos, setTodos] = useState([
    { id: 1, text: 'Buy groceries', completed: false },
    { id: 2, text: 'Finish report', completed: true },
  ]);

  return (
    <InAppAI
      agentId="your-agent-id"
      messages={messages}
      onMessagesChange={setMessages}
      // Context: AI always knows current state
      context={{
        todoCount: todos.length,
        completedCount: todos.filter(t => t.completed).length,
        pendingCount: todos.filter(t => !t.completed).length,
      }}
      // Tools: AI can take actions
      tools={[
        {
          name: 'addTodo',
          description: 'Add a new todo item',
          parameters: {
            type: 'object',
            properties: {
              text: { type: 'string', description: 'The todo text' },
            },
            required: ['text'],
          },
          handler: async ({ text }) => {
            const newTodo = { id: Date.now(), text, completed: false };
            setTodos([...todos, newTodo]);
            return { success: true, todo: newTodo };
          },
        },
      ]}
    />
  );
}

User: “How many tasks do I have left?” AI: reads from context “You have 1 pending task out of 2 total.”

User: “Add a task to call mom” AI: calls addTodo tool “Done! I’ve added ‘call mom’ to your list.”

Best Practices

1. Include Only Relevant Data

// ❌ Too much data
context={{
  entireUserObject: user,
  allProducts: products,
  fullHistory: history,
}}

// ✅ Just what's needed
context={{
  userName: user.name,
  userPlan: user.plan,
  currentProductId: product.id,
}}

2. Never Include Sensitive Data

// ❌ NEVER include sensitive data
context={{
  password: user.password,
  apiKey: process.env.SECRET_KEY,
  creditCard: user.creditCard,
}}

// ✅ Safe, public information only
context={{
  userName: user.name,
  userRole: user.role,
}}

3. Keep Context Lightweight

Context is sent with every message. Keep it under 2-3KB:

// ❌ Heavy context
context={{
  allOrders: orders,  // Could be huge
  fullProductCatalog: products,
}}

// ✅ Lightweight summary
context={{
  recentOrderCount: orders.slice(-5).length,
  cartTotal: calculateTotal(cart),
}}

4. Memoize for Performance

import { useMemo } from 'react';

function App() {
  const context = useMemo(() => ({
    userId: user.id,
    userName: user.name,
  }), [user.id, user.name]);

  return (
    <InAppAI
      context={context}
      // ...
    />
  );
}

5. Structure Your Data

context={{
  user: {
    name: user.name,
    role: user.role,
  },
  page: {
    type: 'product',
    id: product.id,
  },
  app: {
    version: '2.1.0',
  },
}}

Next Steps