Skip to main content

Integrating VoltAgent with Next.js

This guide walks you through setting up VoltAgent in a Next.js application. We'll build a simple AI calculator example using Server Actions and the Vercel AI SDK.

Quick Start with Example

If you prefer to start directly with the completed example project, you can create it using the following command:

npm create voltagent-app@latest -- --example with-nextjs

This command will scaffold the entire Next.js example project described in this guide.

Create a New Next.js Project

Start by creating a new Next.js project using the latest version:

npx create-next-app@latest my-voltagent-app
cd my-voltagent-app

Follow the prompts, selecting TypeScript and App Router.

Install VoltAgent Dependencies

Install the necessary VoltAgent packages and the Vercel AI SDK provider:

npm install @voltagent/core @voltagent/vercel-ai @voltagent/cli @ai-sdk/openai zod
  • @voltagent/core: The core VoltAgent library.
  • @voltagent/vercel-ai: Integrates VoltAgent with the Vercel AI SDK.
  • @ai-sdk/openai: The AI SDK provider for OpenAI (or your preferred LLM provider).
  • @voltagent/cli: The command-line interface for VoltAgent tasks (e.g., managing updates).
  • zod: Required by the Vercel AI SDK for schema validation.

Configure next.config.js

Next.js might try to bundle server-side packages by default. To prevent issues with VoltAgent, you need to mark its packages as external in your next.config.mjs (or .js / .ts) file:

next.config.mjs // or next.config.ts
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
experimental: {
// Mark VoltAgent packages as external
serverComponentsExternalPackages: ["@voltagent/*"],
// If using other packages that need to run externally (like npm-check-updates in the example)
// add them here too.
// serverComponentsExternalPackages: ["@voltagent/*", "another-package"],
},
};

export default nextConfig;

Note: The property was serverExternalPackages in older Next.js versions, but changed to experimental.serverComponentsExternalPackages. Ensure you use the correct one for your Next.js version.

Initialize VoltAgent

Create a file to initialize the VoltAgent agent, for example, voltagent/index.ts in your project root:

voltagent/index.ts
import { VoltAgent } from "@voltagent/core";
import { VercelAIManager } from "@voltagent/vercel-ai";
import { openai } from "@ai-sdk/openai"; // Or your preferred provider

export const agent = new VoltAgent({
provider: "vercel-ai", // Specify the Vercel AI provider
manager: new VercelAIManager({
model: openai("gpt-4o"), // Configure your desired model
}),
functions: [
// Add any VoltAgent functions/tools here if needed
],
});

Remember to set up your environment variables (e.g., OPENAI_API_KEY) in a .env.local file. Create a .env.local file in your project root if it doesn't exist, and add your necessary API keys:

.env.local
OPENAI_API_KEY="your-openai-api-key-here"
# Add other environment variables if needed

Create a Server Action

Define a Server Action to interact with the VoltAgent agent. Create app/actions.ts:

app/actions.ts
"use server";

import { agent } from "@/voltagent"; // Adjust path if needed

export async function calculateExpression(expression: string) {
const result = await agent.generateText(
`Calculate ${expression}. Only respond with the numeric result.`
);

return result.text;
}

Build the UI Component

Create a client component to take user input and display the result. Create app/components/calculator.tsx:

app/components/calculator.tsx
"use client";

import { useState } from "react";
import { calculateExpression } from "../actions";

export function Calculator() {
const [result, setResult] = useState<string | null>(null);
const [loading, setLoading] = useState(false);
const [expression, setExpression] = useState("");

async function handleSubmit(formData: FormData) {
const expr = formData.get("expression") as string;
if (!expr.trim()) return;

setLoading(true);
try {
const calcResult = await calculateExpression(expr);
setResult(calcResult);
setExpression(expr);
} catch (error) {
console.error("Calculation error:", error);
setResult("Error calculating expression");
} finally {
setLoading(false);
}
}

return (
<div>
<h2>AI Calculator</h2>
<form action={handleSubmit}>
<label htmlFor="expression">Enter calculation:</label>
<input
id="expression"
name="expression"
type="text"
placeholder="E.g. (5 + 3) * 2"
required
/>
<button type="submit" disabled={loading}>
{loading ? "Calculating..." : "Calculate"}
</button>
</form>

{result && (
<div>
<h3>Result:</h3>
<p>{expression} = {result}</p>
</div>
)}
</div>
);
}

(Styling omitted for brevity. Refer to the example project for full styling)

Use the Component

Finally, import and use the Calculator component in your main page (app/page.tsx):

app/page.tsx
import { Calculator } from "./components/calculator";

export default function HomePage() {
return (
<main>
<h1>VoltAgent Next.js Example</h1>
<Calculator />
</main>
);
}

Now you can run your Next.js development server (npm run dev) and test the AI calculator! This demonstrates a basic integration of VoltAgent within a Next.js application using Server Actions.

Table of Contents