Skip to main content
Recipes

Tool Routing

Tool routing keeps prompts small by exposing only searchTools and callTool. The model searches for tools, then calls the chosen tool with validated arguments.

import { Agent, createTool, VoltAgent } from "@voltagent/core";
import { openai } from "@ai-sdk/openai";
import { z } from "zod";

const weatherTool = createTool({
name: "get_weather",
description: "Get the current weather for a location",
parameters: z.object({
location: z.string().describe("City name"),
}),
execute: async ({ location }) => ({ location, temperature: 22 }),
});

const convertCurrencyTool = createTool({
name: "convert_currency",
description: "Convert money between currencies",
parameters: z.object({
amount: z.number().describe("Amount to convert"),
from: z.string().describe("Source currency code"),
to: z.string().describe("Target currency code"),
}),
execute: async ({ amount, from, to }) => ({ amount, from, to, rate: 0.92 }),
});

const agent = new Agent({
name: "Assistant",
instructions:
"When you need a tool, call searchTools with the user request, then call callTool with the exact tool name and schema-compliant arguments.",
model: openai("gpt-4o-mini"),
tools: [weatherTool, convertCurrencyTool],
toolRouting: {
embedding: "openai/text-embedding-3-small",
topK: 3,
},
});

new VoltAgent({ agents: { agent } });

If toolRouting.pool is not provided, VoltAgent uses the agent's registered tools as the pool (the routing helper tools are excluded).

Explicit Pools (Two Categories)

const weatherPool = [weatherTool];
const financePool = [convertCurrencyTool];

toolRouting: {
embedding: "openai/text-embedding-3-small",
pool: [...weatherPool, ...financePool],
}

Expose Tools Directly

Expose specific tools to the model alongside searchTools and callTool:

toolRouting: {
embedding: "openai/text-embedding-3-small",
expose: [healthCheckTool],
}

Enforce Search Before Call

By default, callTool enforces a prior searchTools call. Disable it if needed:

toolRouting: {
pool: [weatherTool, convertCurrencyTool],
enforceSearchBeforeCall: false,
}

Global Defaults

new VoltAgent({
toolRouting: {
embedding: "openai/text-embedding-3-small",
},
agents: { agent },
});

Pooling Provider and MCP Tools

import { MCPConfiguration } from "@voltagent/core";
import { openai } from "@ai-sdk/openai";

const mcp = new MCPConfiguration({
servers: [{ name: "zapier", url: process.env.ZAPIER_MCP_URL ?? "" }],
});

// MCP docs: /docs/agents/mcp/mcp/
const mcpTools = await mcp.getTools();

toolRouting: {
pool: [
openai.tools.webSearch(),
...mcpTools,
],
}

Table of Contents