---
title: "Copilot Runtime"
description: "The Copilot Runtime is the backend that connects your frontend to your AI agents, providing authentication, middleware, routing, and more."
icon: "lucide/Server"
---
The Copilot Runtime is the backend layer that connects your frontend application to your AI agents. It's set up during the [quickstart](./quickstart) and is the recommended way to use CopilotKit.
## Setting up the runtime
The runtime is a lightweight server endpoint that you add to your backend. Here's a minimal example using Next.js:
```ts title="app/api/copilotkit/route.ts"
import {
CopilotRuntime,
ExperimentalEmptyAdapter,
copilotRuntimeNextJSAppRouterEndpoint,
} from "@copilotkit/runtime";
import { NextRequest } from "next/server";
const serviceAdapter = new ExperimentalEmptyAdapter();
const runtime = new CopilotRuntime({
agents: {
// your agents go here
},
});
export const POST = async (req: NextRequest) => {
const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({
runtime,
serviceAdapter,
endpoint: "/api/copilotkit",
});
return handleRequest(req);
};
```
Then point your frontend at the endpoint:
```tsx
import { CopilotKit } from "@copilotkit/react-core/v2";
```
For Express, NestJS, or plain Node.js HTTP variants, see the [quickstart](./quickstart).
## Agents
The runtime supports multiple agent types. `BuiltInAgent` is the primary agent class:
- **Simple mode** — pass a model string, CopilotKit handles everything. Best for quick setup. See [Quickstart](./quickstart).
- **Factory mode** — bring your own AI SDK, TanStack AI, or custom LLM backend. Best when you need full control. See [Factory Mode](/backend/custom-agent).
## The default agent
If you register an agent under the name `"default"`, CopilotKit's prebuilt UI components will use it automatically without any additional configuration on the frontend. This is useful when you have one primary agent and don't want to specify an `agentId` everywhere.
```ts title="app/api/copilotkit/route.ts"
import { BuiltInAgent } from "@copilotkit/runtime/v2";
const runtime = new CopilotRuntime({
agents: {
// This agent is used automatically by CopilotPopup, CopilotSidebar, etc.
default: new BuiltInAgent({ model: "openai:gpt-5.4-mini" }),
},
});
```
When you register multiple agents, the `"default"` agent is what powers the chat unless a specific agent is selected. Other agents can still be addressed by passing their `agentId` to `useAgent` or the prebuilt components.
## What the runtime provides
### Authentication & security
The runtime runs on your server, which means agent communication stays server-side. This gives you a trusted environment to enforce authentication, validate requests, and keep API keys secure. When you use the runtime, safe defaults prevent your agent endpoints from being exposed to unauthenticated access.
### AG-UI middleware
The [AG-UI protocol](./ag-ui) supports a middleware layer (`agent.use`) for logging, guardrails, request transformation, and more. Because the runtime runs server-side, this middleware executes in a trusted environment where it cannot be tampered with by the client.
### Agent routing
When you register multiple agents, the runtime handles discovery and routing automatically. Your frontend doesn't need to know where each agent lives or how to reach it.
### Premium features
[Observability](./premium/observability), the [inspector](./inspector), and other premium capabilities are provided through the runtime. These give you conversation persistence, monitoring, and debugging out of the box.
## Built-in middleware
The runtime exposes two first-class middleware options you can enable directly on `CopilotRuntime` without calling `.use()` on each agent manually.
### A2UI
Pass `a2ui: {}` to automatically apply `A2UIMiddleware` to all registered agents:
```ts title="app/api/copilotkit/route.ts"
const runtime = new CopilotRuntime({
agents: { default: myAgent },
a2ui: {}, // enables A2UI rendering for all agents
});
```
To scope it to specific agents only, pass an `agents` list:
```ts
a2ui: { agents: ["my-agent"] }
```
On the frontend, the A2UI renderer activates automatically — no extra configuration needed. If you want to override the default theme, pass an `a2ui` prop to ``:
```tsx
import { CopilotKit } from "@copilotkit/react-core/v2";
{children}
```
### mcpApps
Pass `mcpApps` to configure MCP servers for all agents from a single place:
```ts title="app/api/copilotkit/route.ts"
const runtime = new CopilotRuntime({
agents: { default: myAgent },
mcpApps: {
servers: [
{ type: "http", url: "http://localhost:3108/mcp", serverId: "my-server" },
],
},
});
```
Each server entry optionally accepts an `agentId` field to scope that server to a single agent. Without it, the server is available to all agents.
## Connecting to an AG-UI agent directly
CopilotKit is built on the [AG-UI protocol](./ag-ui), which is an open standard. If you want to connect your frontend directly to an AG-UI-compatible agent without the runtime, you can do so by passing agent instances straight to the `CopilotKit`:
```tsx
import { HttpAgent } from "@ag-ui/client";
import { CopilotKit } from "@copilotkit/react-core/v2";
const myAgent = new HttpAgent({
url: "https://my-agent.example.com",
});
;
```
Direct agent connections are intended for development and prototyping. They are **not recommended for production** and are not officially supported by CopilotKit.
Key trade-offs:
1. **Authentication is your responsibility** — the runtime's safe defaults do not apply.
2. **Many ecosystem features won't work** — runtime-backed middleware, observability, and other capabilities depend on the server-side path.
### Comparison
| | With Runtime | Direct Connection |
|---|---|---|
| **Authentication** | Safe defaults provided | You manage it |
| **AG-UI Middleware** | Runs server-side | Not available |
| **Agent Routing** | Automatic | Manual |
| **Ecosystem Features** | Full support | Limited |
| **CopilotKit Support** | Supported | Not supported |
| **Setup** | Requires a backend endpoint | Frontend-only |