Skip to main content
Recipes

Calling Agents

VoltAgent agents can be invoked in multiple ways depending on your use case.

Programmatic Usage

The most direct way to call an agent is through its methods in your TypeScript code.

generateText

Returns a complete text response after the agent finishes processing.

import { Agent } from "@voltagent/core";
import { VercelAIProvider } from "@voltagent/vercel-ai";
import { openai } from "@ai-sdk/openai";

const agent = new Agent({
name: "Assistant",
instructions: "You are a helpful assistant.",
llm: new VercelAIProvider(),
model: openai("gpt-4o"),
});

const response = await agent.generateText("What is the capital of France?");
console.log(response.text); // "The capital of France is Paris."

With options for conversation tracking:

const response = await agent.generateText("Remember my name is John", {
userId: "user-123",
conversationId: "conv-456",
});

streamText

Returns a streaming response for real-time output.

const result = await agent.streamText("Write a short story about a robot.");

// Option 1: Iterate over text chunks
for await (const chunk of result.textStream) {
process.stdout.write(chunk);
}

// Option 2: Get full text after stream completes
const fullText = await result.text;

For UI frameworks, use the built-in response helpers:

// Next.js API route
export async function POST(req: Request) {
const { messages } = await req.json();

const result = await agent.streamText(messages, {
userId: "user-id",
conversationId: "thread-id",
});

// Returns SSE stream compatible with AI SDK UI
return result.toUIMessageStreamResponse();
}

generateObject

Returns a structured object matching a Zod schema.

import { z } from "zod";

const WeatherSchema = z.object({
location: z.string(),
temperature: z.number(),
unit: z.enum(["celsius", "fahrenheit"]),
conditions: z.string(),
});

const response = await agent.generateObject("What's the weather in Tokyo?", WeatherSchema);

console.log(response.object);
// { location: "Tokyo", temperature: 18, unit: "celsius", conditions: "partly cloudy" }

streamObject

Streams a structured object for progressive UI updates.

const result = await agent.streamObject("Generate a user profile", UserProfileSchema);

for await (const partial of result.partialObjectStream) {
// Receive partial object as it builds
console.log(partial);
}

const finalObject = await result.object;

REST API

When using @voltagent/server-hono, agents are exposed via REST endpoints.

Generate Text

curl -X POST http://localhost:3141/api/agents/assistant/text \
-H "Content-Type: application/json" \
-d '{
"input": "What is VoltAgent?",
"userId": "user-123",
"conversationId": "conv-456"
}'

Response:

{
"text": "VoltAgent is an open-source TypeScript framework for building AI agents...",
"usage": { "promptTokens": 25, "completionTokens": 150 }
}

Stream Text

curl -X POST http://localhost:3141/api/agents/assistant/stream \
-H "Content-Type: application/json" \
-d '{
"input": "Write a haiku about coding"
}'

Returns Server-Sent Events (SSE):

data: {"type":"text-delta","text":"Lines"}
data: {"type":"text-delta","text":" of"}
data: {"type":"text-delta","text":" code"}
...
data: {"type":"finish","usage":{"promptTokens":20,"completionTokens":30}}

Chat Stream (UI Compatible)

For frontend integrations with @ai-sdk/react or similar:

curl -X POST http://localhost:3141/api/agents/assistant/chat \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "Hello!"}
]
}'

Generate Object

curl -X POST http://localhost:3141/api/agents/assistant/object \
-H "Content-Type: application/json" \
-d '{
"input": "Extract user info from: John Doe, [email protected]",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string"}
}
}
}'

Stream Object

curl -X POST http://localhost:3141/api/agents/assistant/stream-object \
-H "Content-Type: application/json" \
-d '{
"input": "Generate a product listing",
"schema": { ... }
}'

Framework Integrations

Next.js API Routes

// app/api/chat/route.ts
import { agent } from "@/lib/agent";

export async function POST(req: Request) {
const { messages } = await req.json();

const result = await agent.streamText(messages, {
userId: req.headers.get("x-user-id") || "anonymous",
conversationId: req.headers.get("x-conversation-id"),
});

return result.toUIMessageStreamResponse();
}

Frontend with @ai-sdk/react:

"use client";
import { useChat } from "@ai-sdk/react";

export function Chat() {
const { messages, input, handleInputChange, handleSubmit } = useChat({
api: "/api/chat",
});

return (
<div>
{messages.map((m) => (
<div key={m.id}>{m.content}</div>
))}
<form onSubmit={handleSubmit}>
<input value={input} onChange={handleInputChange} />
<button type="submit">Send</button>
</form>
</div>
);
}

Webhook Handlers

Handle incoming webhooks (Slack, WhatsApp, etc.):

import { Hono } from "hono";
import { agent } from "./agent";

const app = new Hono();

app.post("/webhook/whatsapp", async (c) => {
const { from, body } = await c.req.json();

const response = await agent.generateText(body, {
userId: from,
conversationId: `whatsapp_${from}`,
});

// Send response back via WhatsApp API
await sendWhatsAppMessage(from, response.text);

return c.json({ success: true });
});

Calling from Workflows

Use .andAgent() to include agent calls in workflows:

import { Workflow } from "@voltagent/core";

const workflow = new Workflow("research-workflow")
.addStep("fetch", async (input) => {
const data = await fetchData(input.topic);
return { data };
})
.andAgent(researchAgent, {
inputMapper: (prev) => `Analyze this data: ${JSON.stringify(prev.data)}`,
outputMapper: (result) => ({ analysis: result.text }),
})
.addStep("format", async (input) => {
return formatReport(input.analysis);
});

const result = await workflow.run({ topic: "AI trends" });

Calling from Tools

Agents can call other agents through tools:

import { createTool, Agent } from "@voltagent/core";

const expertAgent = new Agent({
name: "Expert",
instructions: "You are a domain expert.",
// ...
});

const consultExpert = createTool({
name: "consult_expert",
description: "Consult with a domain expert",
parameters: z.object({
question: z.string(),
}),
execute: async ({ question }) => {
const response = await expertAgent.generateText(question);
return response.text;
},
});

const mainAgent = new Agent({
name: "Coordinator",
instructions: "You coordinate with experts when needed.",
tools: [consultExpert],
// ...
});

Options Reference

All agent methods accept an options object:

OptionTypeDescription
userIdstringUser identifier for conversation tracking
conversationIdstringConversation thread identifier
contextobjectAdditional context passed to the agent
maxTokensnumberMaximum tokens in response
temperaturenumberResponse randomness (0-1)
const response = await agent.generateText("Hello", {
userId: "user-123",
conversationId: "conv-456",
context: { userName: "John", preferredLanguage: "en" },
maxTokens: 500,
temperature: 0.7,
});

Full Example

See the complete examples:

Table of Contents