Typed tools.
Define tool schemas in TypeScript. Zod-validated inputs, typed outputs, automatic retry semantics.
An open-source, TypeScript-native framework for building durable AI agents. Composable tools, typed memory, full observability — all in one SDK.
Voltagent gives you typed primitives for the four hard parts of agent engineering — tools, memory, control-flow, and observability — without locking you into a vendor.
Define tool schemas in TypeScript. Zod-validated inputs, typed outputs, automatic retry semantics.
Long-term store with vector + SQL semantics. Sessions, threads, and replayable state — no Redis to babysit.
Every tool call, prompt, and decision lands in a trace tree. Diff agent versions across runs.
Sequential, parallel, and loop primitives. Branch on tool output without writing custom orchestration.
OpenAI, Anthropic, Google, local Ollama — swap providers in one line. Token accounting included.
Rate limits, cost budgets, prompt-injection guards, audit logging — every concern your security team will ask.
No decorators. No magic. The agent is a plain TypeScript value — composable, testable, deployable.
import { defineAgent, tool } from "@voltagent/core"; import { z } from "zod"; const searchKb = tool({ name: "search_kb", input: z.object({ query: z.string() }), run: async ({ query }) => kb.search(query), }); export const support = defineAgent({ model: "gpt-4o", tools: [searchKb], system: "You triage customer support tickets.", }); // run it const trace = await support.run("order #4821 lost"); console.log(trace.steps);
Self-host every primitive on your own infra. Forever, no asterisks.
Hosted runtime with trace history, evals, and prompt-management UI.
BYOC, SOC 2, dedicated capacity, and on-call agent engineers.
Near-black canvas, one electric-green accent, hairline-bordered cards, Inter + SF Mono. The brand reads as documentation that decided to also sell something.
READ THE FULL DESIGN.MD →1px hairline border on the dark canvas. No shadow.
const agent = defineAgent({ model: "gpt-4o" }); const trace = await agent.run("hello, voltage");