Today, before the article, let me introduce our new site — currently in beta:
🚀 Free TypeScript & AI Engineering Masterclass
This article is part of a structured roadmap designed to take you from TypeScript foundations to building production-ready AI applications. I have made the entire series available on a dedicated, lightning-fast platform:
👉 Access the TypeScript & AI Series on Programming Central
Why learn here?
- Zero Friction: No signup, no email required, and no "waitlists." Everything is instantly accessible for free.
- Structured Learning: Use the sidebar menu on the left to browse the full curriculum. Chapters flow logically from core concepts to real-world AI implementation.
- Engineering First: We don't just show syntax; we dive into practical examples and identify common pitfalls that senior developers avoid.
- Interactive Quizzes: At the end of each chapter, you can test your knowledge with our custom quiz engine.
How the quizzes work:
The system generates a random set of engineering challenges for every attempt. You get instant feedback and, most importantly, a detailed architectural explanation for every correct and incorrect choice. It’s designed to ensure you master the logic of AI engineering, not just the code.
Let me know what you think in the comments below.
Below you will find today's article.
For years, web development has operated on a strict division of labor: the server crunches numbers, and the client manages the interface. But in the age of Generative AI, this separation creates friction. When an AI generates a response, the client is often left scrambling to parse raw text tokens and reconstruct a UI from scratch—a brittle, slow, and error-prone process.
Enter the Vercel AI SDK Core and its revolutionary "AI" Protocol. This isn't just another library update; it’s a fundamental reimagining of the client-server boundary. It treats the UI itself as a streamable data structure, allowing servers to orchestrate visual experiences in real-time.
Let’s dive into how this protocol works and how you can implement it today.
The Core Concept: A Unified Streaming Fabric
The traditional web model treats the server as a stateless calculator and the client as a stateful UI manager. In the context of AI, this fragmentation is glaring. The server generates a stream of text tokens, and the client must interpret these tokens to reconstruct a UI, often resulting in brittle parsing logic and a disconnected user experience.
The AI Protocol solves this by establishing a unified streaming architecture. The server is no longer just a data provider; it is a UI orchestrator. It treats the generation of an interface—whether that is a string of text, a structured data object, or a fully interactive React component—as a first-class streamable entity.
To understand this deeply, we must look back at the fundamentals of retrieval. In K-Nearest Neighbors (KNN), we find the most similar vectors to a query. While KNN is purely mathematical, its output is the input for the AI Protocol. The AI Protocol takes the retrieved context and transforms it not just into a response, but into a visual representation of that response, streamed in real-time.
The Analogy: The Restaurant Kitchen vs. The Food Truck
Imagine a traditional web application as a sit-down restaurant. You send an order, the kitchen prepares the entire meal in silence, and only when the dish is fully plated does the waiter bring it to your table. If the meal takes 5 minutes, you stare at the wall for 5 minutes.
Now, imagine the AI Protocol as a high-end food truck with an open kitchen. The chef starts cooking immediately. You see the onions sizzling (the first text tokens appear). Then, the chef assembles the taco shell (a UI component structure). As ingredients are added (more tokens), the dish is handed to you piece by piece. You are engaged in the process, receiving value incrementally.
The AI Protocol allows the server to hand over "ingredients" (tokens) and "pre-assembled dishes" (React components) through the same delivery window (the stream), eliminating the need for the client to cook the meal itself.
The Architecture: RSC as the Transport Layer
The genius of the AI Protocol is that it leverages React Server Components (RSC) not just as a rendering strategy, but as a data transport protocol. In a standard API route, you send JSON. In RSC, you send a serialized React tree.
When we use streamUI (the server-side function), we are instructing the server to traverse the React component tree and stream the HTML-like markup (and the JavaScript instructions to make it interactive) to the client.
Why use RSC as a transport layer?
- Bandwidth Efficiency: Sending a pre-built React component is often smaller than sending raw data plus the JavaScript code required to build that component on the client.
- Security: The logic for fetching data (e.g., via KNN) stays on the server. The client never sees the raw vector database or the API keys for the AI model.
- Atomicity: The server can decide to render a
<Chart />component or a<Text />component based on the AI's reasoning, and the client receives it as a finished unit.
The Mechanism: streamUI and Token-Level Control
The streamUI function is the heart of the protocol. It is an asynchronous generator that yields "UI updates" rather than just text.
Here is the lifecycle of a stream using KNN context:
- Input: A user asks, "Show me the sales trend for Q3."
- Retrieval: The system uses KNN to find the top 3 relevant documents from the vector database.
- Generation & Rendering: The LLM receives the query and the KNN results. As it generates,
streamUIintercepts the token stream.- Tokens 1-10 ("Here is the"): The server streams a standard text fragment.
- Tokens 11-20 ("chart"): The LLM decides a visual representation is needed.
streamUIpauses text streaming and begins streaming a serialized<BarChart />component. - Tokens 21-30 ("click to drill down"): The LLM adds interactivity. The server streams the component with an
onClickhandler attached.
The client does not need to know how to build a chart. It simply receives the instruction to render the chart component.
Code Example: Streaming Generative UI
This example demonstrates a minimal SaaS-style web application that streams a generative UI component directly from a React Server Component using the Vercel AI SDK.
1. Server Component (app/page.tsx)
This file runs exclusively on the server. It orchestrates the AI generation and streams the UI directly to the client.
'use server';
import { streamUI } from '@vercel/ai-sdk/rsc';
import { ChatInterface } from '@/components/ChatInterface';
import { MockProvider } from '@/lib/mock-ai';
const mockProvider = new MockProvider();
export async function generateUI(prompt: string) {
// Define the UI component template
const component = ({ content }: { content: string }) => (
<div className="p-4 bg-blue-100 border border-blue-300 rounded-lg shadow-sm">
<h3 className="font-bold text-blue-800">Generated Response</h3>
<p className="text-blue-700 mt-2">{content}</p>
</div>
);
const result = await streamUI({
model: 'gpt-3.5-turbo',
prompt: `Generate a concise response to: "${prompt}".`,
// The text stream callback: Called incrementally as tokens arrive
text: ({ content, done }) => {
if (done) {
return component({ content });
}
return (
<div className="p-4 bg-gray-100 border border-gray-300 rounded-lg">
<p className="text-gray-500">Thinking... {content}</p>
</div>
);
},
});
return result;
}
export default function Page() {
return (
<main className="min-h-screen bg-gray-50 p-8">
<h1 className="text-2xl font-bold mb-4">Generative UI Streaming</h1>
<ChatInterface generateUI={generateUI} />
</main>
);
}
2. Client Component (components/ChatInterface.tsx)
This runs in the browser. It handles user input and displays the streamed UI from the server.
'use client';
import { useState } from 'react';
import { experimental_useAI as useAI } from '@vercel/ai-sdk/react';
interface ChatInterfaceProps {
generateUI: (prompt: string) => Promise<React.ReactNode>;
}
export function ChatInterface({ generateUI }: ChatInterfaceProps) {
const [input, setInput] = useState('');
// useAI hook manages the SSE connection and state
const { messages, submit, isLoading } = useAI({
api: generateUI,
initialMessages: [],
});
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (!input.trim()) return;
await submit(input);
setInput('');
};
return (
<div className="max-w-2xl mx-auto space-y-4">
<div className="space-y-4">
{messages.map((msg, index) => (
<div key={index} className="animate-fade-in">
{msg.content}
</div>
))}
</div>
<form onSubmit={handleSubmit} className="flex gap-2 mt-4">
<input
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="Ask something..."
className="flex-1 p-2 border rounded-md"
disabled={isLoading}
/>
<button
type="submit"
disabled={isLoading}
className="px-4 py-2 bg-blue-600 text-white rounded-md disabled:opacity-50"
>
{isLoading ? 'Streaming...' : 'Send'}
</button>
</form>
</div>
);
}
3. Mock Provider (lib/mock-ai.ts)
A simple class to simulate an AI provider, allowing this example to run without external API keys.
export class MockProvider {
async *createStream(prompt: string): AsyncIterable<{ content: string }> {
const response = `This is a generated response to: "${prompt}". It demonstrates streaming UI components.`;
const words = response.split(' ');
for (const word of words) {
await new Promise(resolve => setTimeout(resolve, 100));
yield { content: word + ' ' };
}
}
}
Common Pitfalls and Solutions
-
Vercel Timeouts on Server Actions:
- Issue: Server actions have a default timeout (e.g., 10 seconds on the hobby plan). Long AI generations can fail.
- Solution: Use
streamUIto return partial results early. For very long streams, consider increasing the timeout invercel.jsonor using Edge functions.
-
Async/Await Loops in Streaming:
- Issue: Blocking the event loop with synchronous waits can freeze the UI.
- Solution: Use async generators (as in
MockProvider) or the SDK's built-in streaming. Avoidawaitinside loops for streaming; instead, yield values incrementally.
-
Immutable State Violations:
- Issue: Directly mutating
messages(e.g.,messages.push(newMsg)) instead of usingsetMessages([...messages, newMsg])can lead to stale UI updates. - Solution: The
useAIhook handles immutability internally. If managing state manually, always create new arrays/objects.
- Issue: Directly mutating
-
SSE Connection Drops:
- Issue: Network interruptions can break the stream, leaving the client in a loading state.
- Solution: Implement retry logic in the client (e.g., via
useAI's built-in retry). On the server, ensurestreamUIhandles errors gracefully by returning a fallback component.
The Web Development Analogy: Embeddings as Hash Maps
To solidify the theoretical foundation, let's draw an analogy between Embeddings (from Book 1) and Hash Maps.
- Hash Map: Takes a key, runs it through a hash function, and outputs an index in an array. It allows for O(1) lookup time.
- Embedding: Takes a piece of text (the key), runs it through a neural network, and outputs a vector of floating-point numbers (the index in high-dimensional space).
In the context of the AI Protocol, the KNN algorithm is essentially performing a similarity search over a distributed Hash Map. When we use the AI Protocol, we are effectively saying: "Look up the value in this semantic Hash Map (via KNN), and instead of returning the raw value, render it using this component (via streamUI)."
Summary
The AI Protocol is a paradigm shift from Request-Response to Request-Stream-Render.
- Server-Side:
streamUIacts as a render engine that runs on the server. It consumes tokens from an LLM and outputs a stream of RSC payloads. - Transport: The stream is transmitted via HTTP/2 or WebSocket. It carries a hybrid payload: raw text and serialized React components.
- Client-Side: The
useAIhook receives this stream, deserializes the RSC payload, and updates the local state.
This architecture removes the "client-side tax"—the cost of parsing JSON and building UIs from data on the browser—and moves it to the server where resources are abundant. The result is a faster, more responsive, and more secure generative UI experience that feels truly magical.
The concepts and code demonstrated here are drawn directly from the comprehensive roadmap laid out in the book The Modern Stack. Building Generative UI with Next.js, Vercel AI SDK, and React Server Components Link
Take a look at my eBooks
- Python
- JavaScript & TypeScript
- C# / .NET
- Swift & Apple Platform
- Kotlin & Android
- Rust
JavaScript & TypeScript
Foundations
OpenAI API, Zod, and LangChain.js
The Modern Stack
Building Generative UI with Next.js, Vercel AI SDK, and React Server Components.
Master Your Data
Production RAG, Vector Databases, and Enterprise Search.
Autonomous Agents
Building Multi-Agent Systems and Workflows with LangGraph.js
The Edge of AI
Local LLMs (Ollama), Transformers.js, WebGPU, and Performance Optimization
The AI-Ready SaaS Boilerplate. Auth, Database with Vector Support, and Payment Stack
Auth, Database with Vector Support, and Payment Stack.
Backend for Frontend & Intelligent APIs. tRPC, Edge Functions, and LLM Data Transformation
tRPC, Edge Functions, and LLM Data Transformation.
The Monetization Engine. Stripe, Smart Dunning, and AI Customer Support Agents
Stripe, Smart Dunning, and AI Customer Support Agents.
AI-Driven Growth Engineering. Programmatic SEO with GPT-4, Content Automation, and Analytics.
Programmatic SEO with GPT-4, Content Automation, and Analytics.
No More Localhost. Mastering Docker, Linux, and Containerization for JS & AI Apps
Mastering Docker, Linux, and Containerization for JS & AI Apps.
The Perfect Pipeline. Advanced CI/CD with GitHub Actions, Automated Testing, and AI Code Reviews
Advanced CI/CD with GitHub Actions, Automated Testing, and AI Code Reviews.
Kubernetes & Orchestration. Deploying Scalable Node.js & AI Clusters without Tears
Deploying Scalable Node.js & AI Clusters without Tears.
React Native for Web Developers
From Next.js to Expo, NativeWind, and Universal App
Offline AI & Local LLMs. Running Llama 3 and Vector Search directly on the Smartphone
Running Llama 3 and Vector Search directly on the Smartphone.
App Store Engineering. CI/CD for Mobile (EAS), OTA Updates, and AI-Driven App Store Optimization
CI/CD for Mobile (EAS), OTA Updates, and AI-Driven App Store Optimization.
The TypeScript-First Architect. Building Robust Applications with Effect, Zod, and Drizzle
Building Robust Applications with Effect, Zod, and Drizzle.
The Native Era. Modern Node.js, Bun & Deno without Bundlers or Transpilers
Modern Node.js, Bun & Deno without Bundlers or Transpilers.
Local-First Systems in TypeScript. Collaborative & Offline-Ready Web Apps with CRDTs and WASM DBs
Collaborative & Offline-Ready Web Apps with CRDTs and WASM DBs.
TypeScript Metaprogramming. Advanced Type Gymnastics, Modern Decorators, and Compiler Internals
Advanced Type Gymnastics, Modern Decorators, and Compiler Internals.
Standardizing Tool Integration, Vision-Driven Browser Automation, and Agent Governance in TypeScript.
Generative Media & Visual Workflow Engines. Node-Based AI Canvases, Real-Time Media Streaming Pipelines, and WebGPU Processing in TypeScript
Node-Based AI Canvases, Real-Time Media Streaming Pipelines, and WebGPU Processing in TypeScript.
Neuro-Symbolic AI & Knowledge Graphs. Deterministic Solvers, GraphDBs, Ontologies, and Zero-Hallucination Architectures
Deterministic Solvers, GraphDBs, Ontologies, and Zero-Hallucination Architectures in TypeScript.
Event-Driven Architecture & DDD in TypeScript. Event Sourcing, CQRS, and Microservices at Scale
Event Sourcing, CQRS, and Microservices at Scale.
Building Desktop Apps & Developer Tools with Tauri 2.0, Rust, and TypeScript
Cross-platform desktop tools with Tauri, Rust, and TypeScript.
FinTech Architecture in TypeScript. Precision Math, Double-Entry Ledgers, and High-Reliability Payment Pipelines
Precision Math, Double-Entry Ledgers, and High-Reliability Payment Pipelines.
Hardened TypeScript. Passkeys, Supply Chain Defense, and Zero-Trust Architectures
Passkeys, Supply Chain Defense, and Zero-Trust Architectures.
Spatial Web Development. Building Interactive 3D and WebXR Experiences with React Three Fiber & TypeScript
Building Interactive 3D and WebXR Experiences with React Three Fiber & TypeScript.
Multiple-choice test book for: Foundations (Volume 1)
Spatial Web Development. Building Interactive 3D and WebXR Experiences with React Three Fiber & TypeScript
Building Interactive 3D and WebXR Experiences with React Three Fiber & TypeScript.
Jev: The Definitive Guide to System One AI
Building Sub-100ms Decision Engines, Calibrated Guardrails, and Two-Speed Architectures with Jev and Generative LLMs
Python
Data Structures and the Standard Library
Web Development with Python
Building backend services and dynamic websites with a framework like Flask
Advanced Python & AI Integration
Deep dive into OOP, decorators, asyncio, and orchestrating LLMs with LangChain.
Gemini 3 Python Programming - The Complete Guide
Agents, Veo 3.1, Lyria, Nano Banana/Pro, Function Calling, Grounding, Computer Use and Robotics
AI Autonomous Agents with Python Programming
Master LangGraph, CrewAI, and RAG to Build Self-Correcting Swarms and Autonomous Digital Workers
Finance & AI Trading with Python Programming
Master Algorithmic Trading, Financial NLP, and Vectorized Backtesting to Build Autonomous 'News + Math' Strategies
Cloud-Native Python, DevOps & LLMOps. Containerization, Kubernetes, and Serving AI Models at Scale
From Docker and Kubernetes to Serving LLMs with Pulumi
Defensive Cybersecurity with Python Programming
A Practical Guide to System Monitoring, Network Defense, and Automated Security Hardening
Data Science & Analytics with Python Programming
Neural Networks & Deep Learning with Python Programming
Architecting Neuro-Symbolic Agents with Python Programming
Integrating LLMs, Wolfram Alpha, IBM Watson and Open Source Stacks for Near-Zero Hallucination Systems
Bioinformatics & AI with Python Programming
Master Genomic Data Science, Protein Folding with AlphaFold, and AI-Driven Drug Discovery
Geospatial AI (GeoAI) with Python Programming
Building Autonomous GIS Agents, Deep Learning Models, and Interactive Dashboards
Astrophysics & AI with Python Programming
Building Research Agents for Astronomy, Cosmology, and SETI
Open-Source LLMs & Local Fine-Tuning
Mastering LoRA, vLLM, Ollama, and Custom SLMs
Unsloth: Efficient Fine-Tuning for Large Language Models
Methods and Workflows for Fine-Tuning and Deploying Large Language Models on Limited Hardware
Hermes Agent: The Self-Evolving AI Workforce
Architecting Autonomous Systems that Learn, Remember, and Grow.
Frontier AI Safety, Mechanistic Interpretability & Alignment Engineering
Inspecting Neural Circuits, Steering Vectors, Autonomous Capability Evals, and Scalable Oversight for Superintelligent Systems.
C# / .NET
Get all the Ten C# & AI volumes at a discounted price, or choose an ebook:
The Foundations
Syntax, Type System, and Logic for Modern Developers.
Advanced OOP & AI Data Structures
Modeling Complex Systems and Tensors.
Data Manipulation, LINQ & Vectors
From Collections to AI Embeddings
Asynchronous AI Pipelines
Async/Await, Parallelism, and Streaming LLM Responses.
Building AI Web APIs with ASP
NET Core. Serving Models and Chat Endpoints
Intelligent Data Access with EF Core
Vector Databases, RAG, and Memory Storage.
Cloud-Native AI & Microservices
Containerizing Agents and Scaling Inference.
The Core of AI Engineering: Microsoft Semantic Kernel & Agentic Patterns
Edge AI & Local Inference
Running LLMs (Llama/Phi) locally with C# and ONNX.
High-Performance C# for AI
Span, SIMD, and Optimizing Token Processing
Full Stack AI with Blazor. Building Interactive Copilots and WASM AI
Building Interactive Copilots and WASM AI.
Enterprise AI Integration & Process Automation. Connecting LLMs to legacy systems, internal APIs, and real-world business processes
Connecting LLMs to legacy systems, internal APIs, and real-world business processes.
AI for Game Development & Interactive Simulation. Using LLMs and generative AI to create dynamic worlds and intelligent characters in Unity
Using LLMs and generative AI to create dynamic worlds and intelligent characters in Unity.
Swift & Apple Platform
Core ML & Vision Framework
On-device image classification, object detection, and custom model integration with Core ML and Vision.
Apple Intelligence & Foundation Models
Building apps with Apple's on-device LLM APIs, Writing Tools, and the Apple Intelligence framework
Natural Language & Speech
NLP, sentiment analysis, text classification, and Speech-to-Text with Apple's Natural Language and Speech frameworks.
SwiftUI for AI Apps
Building reactive, intelligent interfaces that respond to model outputs, stream tokens, and visualize AI predictions in real time
Create ML Studio
Training custom models without Python: tabular, image, sound, and motion classifiers using Create ML in Swift.
MLX Swift & Local LLMs. Deep dive into Apple's MLX framework for high-performance machine learning.
Building custom inference engines, fine-tuning local models (LoRA), and leveraging Unified Memory directly from Swift.
visionOS & Spatial AI with Swift
Swift + OpenAI & LangChain
Integrating external LLM APIs, RAG pipelines, and agentic workflows in iOS and macOS apps
CoreData, CloudKit & Vector Search
Shipping AI Apps to the App Store
Kotlin & Android
On-Device GenAI with Android Kotlin
Mastering Gemini Nano, AICore, and local LLM deployment using MediaPipe and Custom TFLite models
Edge AI Performance with Android Kotlin
Optimizing hardware acceleration via NPU, GPU, and DSP. Advanced quantization and model pruning
Android AI Agents
Building autonomous apps that use Tool Calling, Function Injection, and Screen Awareness to perform tasks for the user
Rust
Rust Advanced Memory Patterns for AI
Mastering Lifetimes, Smart Pointers, and custom allocators for managing large models and datasets
Extending Python with Rust. Creating high-performance Python modules with PyO3.
Creating high-performance Python modules with PyO3 for data processing, tokenization, and inference, replacing slow Python code.
Top comments (0)