If you already have a React or Next.js application, you're in a strong position to add AI features. Here's a practical guide to doing it without rewriting your product.
Pattern 1: Server-side AI with streaming UI
The most common pattern for Next.js apps. AI processing happens on the server; results stream to the client.
// app/api/chat/route.ts
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({
model: openai('gpt-4o'),
messages,
});
return result.toDataStreamResponse();
}
On the client, use the Vercel AI SDK's useChat hook for streaming responses with loading states.
Best for: Chat interfaces, content generation, Q&A features.
Pattern 2: Embedded AI in existing workflows
Don't add a separate AI page. Embed AI into workflows users already use:
- Search bar → AI-powered semantic search across product data
- Text editor → AI writing assistance inline
- Form fields → AI auto-fill from uploaded documents
- Dashboard → Natural language query interface for analytics
Pattern 3: Background AI processing
For tasks that don't need real-time interaction:
- Upload document → background job extracts data → notify user when ready
- Scheduled AI analysis of user data → results appear in dashboard
- Batch processing of records with AI classification
Use Next.js Route Handlers or a job queue (Inngest, Trigger.dev) for background processing.
Pattern 4: RAG for product-specific knowledge
When AI needs to answer questions about your product's data:
- Index your product data, docs, or user content into a vector store
- On user query, retrieve relevant context
- Generate answer with citations
This works well for help centers, internal tools, and knowledge bases.
Architecture considerations
Where to put AI logic
- Route Handlers / Server Actions — for user-facing AI features
- Separate API service — if AI processing is heavy or needs different scaling
- Edge functions — for low-latency, lightweight AI tasks
State management
- Use the Vercel AI SDK for chat state (messages, loading, errors)
- Don't put AI responses in global state unless needed across components
- Cache embeddings and retrieval results where appropriate
Error handling
- Always show loading states during AI processing
- Handle API failures gracefully with retry options
- Show when AI confidence is low
- Never block the existing workflow if AI fails
Incremental adoption path
- Add AI to one high-value workflow (not a general chatbot)
- Use feature flags to control rollout
- Measure usage and quality before expanding
- Extract reusable AI components (chat UI, streaming text, citation display)
- Expand to additional workflows based on validated patterns
Your existing React/Next.js architecture is an asset, not a limitation. AI features should feel native to your product, not bolted on.