Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create and configure VoltAgent AI agents with tools, memory, hooks, and sub-agents. Use when building AI agents, adding agent tools, configuring VoltAgent memory, creating multi-agent workflows, or debugging VoltAgent integrations.
.claude/skills/majiayu000-voltagent-development/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 62 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 71% | 0% |
Guides development of VoltAgent-based AI agents including:
@voltagent/core package@ai-sdk/anthropic, @ai-sdk/openai)zod for schema validationtypescriptimport { Agent } from '@voltagent/core' import { anthropic } from '@ai-sdk/anthropic' const agent = new Agent({ name: 'Assistant', instructions: 'You are a helpful assistant.', model: anthropic('claude-3-5-haiku-20241022'), }) const result = await agent.generateText('Hello!') console.log(result.text)
typescriptimport { Agent, createTool } from '@voltagent/core' import { z } from 'zod' const weatherTool = createTool({ name: 'get_weather', description: 'Get current weather for a location', parameters: z.object({ location: z.string().describe('The city name'), }), execute: async ({ location }) => { return { location, temperature: 72, conditions: 'sunny' } }, }) const agent = new Agent({ name: 'Weather Assistant', instructions: 'Help users with weather information.', model: anthropic('claude-3-5-haiku-20241022'), tools: [weatherTool], })
typescriptimport { createTool } from '@voltagent/core' import { z } from 'zod' export const myTool = createTool({ name: 'tool_name', // snake_case convention description: 'Clear description of what this tool does', parameters: z.object({ param: z.string().describe('What this parameter is for'), optional: z.number().optional().describe('Optional parameter'), }), execute: async (args, options) => { // Access context from options const userId = options?.context?.get('userId') const isAdmin = options?.context?.get('isAdmin') === 'true' // Implement tool logic return { result: 'data' } }, })
typescriptimport { createTool } from '@voltagent/core' import { z } from 'zod' export const fetchClientsTool = createTool({ name: 'fetch_clients', description: 'Get list of clients for the current trainer', parameters: z.object({ limit: z.number().optional().describe('Max clients to return'), }), execute: async ({ limit = 10 }, options) => { const db = useDB() const trainerId = options?.context?.get('trainerId') const isSuperAdmin = options?.context?.get('isSuperAdmin') === 'true' // Super admins see all clients, trainers see only assigned const clients = isSuperAdmin ? await db.select().from(users).limit(limit) : await db.select().from(users) .innerJoin(clientsTrainers, eq(users.id, clientsTrainers.clientId)) .where(eq(clientsTrainers.trainerId, trainerId)) .limit(limit) return { clients, count: clients.length } }, })
typescriptconst longRunningTool = createTool({ name: 'search_web', description: 'Search the web (supports cancellation)', parameters: z.object({ query: z.string().describe('Search query'), }), execute: async ({ query }, options) => { const signal = options?.abortController?.signal if (signal?.aborted) { throw new Error('Search cancelled before start') } const response = await fetch(`https://api.search.com?q=${query}`, { signal }) return await response.json() }, })
See tool-template.ts for a complete template.
model directly with ai-sdk LanguageModel instancesinstructions (string or function), NOT systemPrompt.describe() for all parametersuserId and conversationId for memoryllm + model pattern from v0.xgenerateObject/streamObject if you need tool callingserver/
agents/
client-insights/ # Main agent
index.ts # Agent definition
tools/ # Agent tools
fetchClients.ts
fetchClientDetails.ts
searchExercises.ts
services/
voltagent.ts # VoltAgent initialization
api/
agents/
client-insights/
text.post.ts # Sync endpoint
stream.post.ts # Streaming endpointbash# Required for Anthropic (accessed directly by AI SDK) ANTHROPIC_API_KEY=sk-ant-... # Optional: For observability VOLTAGENT_PUBLIC_KEY=pk_... VOLTAGENT_SECRET_KEY=sk_... # Optional: For Turso remote memory TURSO_DATABASE_URL=libsql://... TURSO_AUTH_TOKEN=...
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | 24,183 | 14,348 | -41% | 1 | 1 | 0% | 3,907 | 4,256 | +9% | 0 | 0 | — |
case-01 | fail→pass | 12,392 | 12,072 | -3% | 1 | 1 | 0% | 2,506 | 3,242 | +29% | 0 | 0 | — |
case-03 | fail→pass | 21,484 | 14,153 | -34% | 1 | 1 | 0% | 3,032 | 3,866 | +28% | 0 | 0 | — |
case-04 | pass→pass | 15,173 | 10,739 | -29% | 1 | 1 | 0% | 1,781 | 2,769 | +55% | 0 | 0 | — |
case-05 | pass→pass | 7,026 | 10,439 | +49% | 1 | 1 | 0% | 1,469 | 2,753 | +87% | 0 | 0 | — |
case-06 | pass→pass | 10,775 | 11,346 | +5% | 1 | 1 | 0% | 2,244 | 3,837 | +71% | 0 | 0 | — |
case-07 | pass→pass | 15,656 | 5,823 | -63% | 1 | 1 | 0% | 1,971 | 2,747 | +39% | 0 | 0 | — |
case-08 | fail→pass | 14,734 | 8,947 | -39% | 1 | 1 | 0% | 1,607 | 2,430 | +51% | 0 | 0 | — |
case-09 | pass→pass | 8,827 | 11,661 | +32% | 1 | 1 | 0% | 1,835 | 2,991 | +63% | 0 | 0 | — |
case-10 | pass→pass | 8,746 | 8,769 | +0% | 1 | 1 | 0% | 1,510 | 2,279 | +51% | 0 | 0 | — |
case-11 | fail→pass | 13,760 | 9,587 | -30% | 1 | 1 | 0% | 1,439 | 2,455 | +71% | 0 | 0 | — |
case-12 | fail→pass | 7,790 | 5,845 | -25% | 1 | 1 | 0% | 1,354 | 2,686 | +98% | 0 | 0 | — |
case-13 | pass→pass | 19,429 | 7,656 | -61% | 1 | 1 | 0% | 2,301 | 2,963 | +29% | 0 | 0 | — |
case-14 | pass→pass | 16,568 | 17,987 | +9% | 1 | 1 | 0% | 2,880 | 4,036 | +40% | 0 | 0 | — |
case-15 | pass→pass | 9,231 | 11,765 | +27% | 1 | 1 | 0% | 1,817 | 2,883 | +59% | 0 | 0 | — |
case-16 | fail→pass | 21,991 | 14,144 | -36% | 1 | 1 | 0% | 3,006 | 4,394 | +46% | 0 | 0 | — |
case-17 | pass→pass | 15,017 | 13,850 | -8% | 1 | 1 | 0% | 1,793 | 3,224 | +80% | 0 | 0 | — |
case-18 | fail→pass | 11,306 | 15,763 | +39% | 1 | 1 | 0% | 2,047 | 4,008 | +96% | 0 | 0 | — |
case-19 | pass→pass | 13,832 | 11,559 | -16% | 1 | 1 | 0% | 1,795 | 2,950 | +64% | 0 | 0 | — |
case-20 | pass→pass | 14,146 | 10,793 | -24% | 1 | 1 | 0% | 1,692 | 2,695 | +59% | 0 | 0 | — |
case-21 | pass→pass | 11,938 | 12,717 | +7% | 1 | 1 | 0% | 1,304 | 2,682 | +106% | 0 | 0 | — |
case-22 | pass→pass | 20,367 | 15,064 | -26% | 1 | 1 | 0% | 3,153 | 3,621 | +15% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.