Mastra: создание AI-агентов на JavaScript — Гайд
🤖

Mastra: создание AI-агентов на JavaScript

Полный гайд по фреймворку Mastra — современному TypeScript-инструменту для построения автономных AI-агентов, multi-agent оркестраций, RAG-систем и интеграции с LLM через единый унифицированный API. Узнайте, как за 5 минут поднять первого агента с инструментами, памятью и workflow.

Mastra JavaScript AI Agents TypeScript RAG MCP
Архитектура Mastra Agent 👤 User Input текст / голос / API 🧠 Mastra Agent • System Prompt • Model (GPT-4o / Claude) • Memory & Context • Tool Selection Logic вызов 🔧 Tools & MCP Servers HTTP, DB, File System, APIs запрос ☁️ LLM GPT-4o Claude Sonnet Gemini Groq / Mistral 📤 Response результат Ввод/Вывод Agent Core Tools LLM

1. Установка и настройка Mastra

Mastra распространяется как npm-пакет с собственным CLI для быстрого scaffolding. Фреймворк написан на TypeScript и рассчитан на среду Node.js (v18+), с поддержкой ESM из коробки. Вы можете инициализировать проект одной командой — CLI создаст структуру каталогов, конфигурационные файлы и базовый пример агента. Альтернативно можно добавить Mastra в уже существующий проект вручную. Фреймворк работает поверх Vercel AI SDK, обеспечивая унифицированный доступ к десяткам моделей через одного провайдера.

# Создание нового проекта Mastra (рекомендуемый способ)
npm create mastra@latest

# CLI задаст несколько вопросов:
# ? Project name: my-ai-agent
# ? Include example agent: Yes
# ? Package manager: npm / pnpm / yarn

✔ Scaffolding project in ./my-ai-agent ...
✔ Installing dependencies (mastra, @mastra/core, ai, zod) ...
✔ Done! Run: cd my-ai-agent && npm run dev

# Ручная установка в существующий проект
npm install mastra @mastra/core ai zod
npm install -D @types/node typescript tsx

# Структура проекта после инициализации:
my-ai-agent/
├── src/
│   ├── mastra/
│   │   ├── agents/       # Определения агентов
│   │   ├── tools/        # Пользовательские инструменты
│   │   └── workflows/    # Multi-agent сценарии
│   └── index.ts          # Точка входа
├── .env                  # API-ключи
├── tsconfig.json
└── package.json

После инициализации необходимо добавить API-ключ вашего LLM-провайдера в .env. Mastra поддерживает OpenAI (GPT-4o, GPT-4.1), Anthropic (Claude Sonnet, Claude Opus), Google (Gemini), Groq, Mistral и десятки других через адаптеры Vercel AI SDK. Переключение между моделями — замена одной строки в конфигурации агента.

# .env
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxxxxxx

// mastra.config.ts — конфигурация фреймворка
import { Mastra } from '@mastra/core';

export const mastra = new Mastra({
  agents: { /* ... */ },
  workflows: { /* ... */ },
  logger: true,       // подробное логирование
  telemetry: {         // опционально: отправка в Langfuse
    enabled: false,
  },
});

2. Создание первого агента

Базовый агент в Mastra определяется через класс Agent. Минимальная конфигурация включает: имя, инструкцию (system prompt) и модель. Этого достаточно, чтобы агент мог отвечать на сообщения, поддерживая контекст диалога. Инструкция — это промпт, который задаёт роль, тон и границы поведения агента: он может быть ассистентом, экспертом в доменной области, анализатором данных или творческим генератором. Агент автоматически управляет историей сообщений, обрезая её при достижении лимита токенов модели. Ключевое преимущество Mastra — агент возвращает потоковый ответ (stream), что позволяет отображать генерацию в реальном времени.

// src/mastra/agents/assistant.ts
import { Agent } from '@mastra/core/agent';
import { openai } from '@ai-sdk/openai';

export const assistant = new Agent({
  name: 'Assistant',
  instructions: `Ты — полезный AI-ассистент.
Ты отвечаешь на русском языке, если пользователь пишет по-русски.
Отвечай чётко, по делу, избегай воды.
Если ты не знаешь ответа — честно скажи об этом.`,
  model: openai('gpt-4o'),
});

// Использование агента — generate() с потоковым ответом
const result = await assistant.generate('Привет! Расскажи о фреймворке Mastra.', {
  maxSteps: 3,       // макс. число вызовов инструментов
  temperature: 0.7,
});

console.log(result.text);
// "Mastra — это современный TypeScript-фреймворк..."

// Потоковый вывод (streaming)
const stream = await assistant.stream('Напиши стих о программировании');
for await (const chunk of stream.textStream) {
  process.stdout.write(chunk);  // посимвольный вывод
}

3. Добавление инструментов и поддержка MCP

Инструменты (tools) — ключевой механизм, превращающий языковую модель из простого генератора текста в автономного агента, способного взаимодействовать с внешним миром. В Mastra инструменты описываются через Zod-схемы: вы определяете имя, описание и схему параметров, а фреймворк автоматически преобразует их в function-calling definitions для LLM. Когда модель принимает решение о вызове инструмента, Mastra исполняет вашу функцию, возвращает результат обратно в контекст LLM, и цикл продолжается до получения финального ответа. Протокол MCP (Model Context Protocol) от Anthropic позволяет подключать готовые серверы инструментов — доступ к файловой системе, базам данных, браузеру и другим сервисам — без написания кода.

// src/mastra/tools/weather.ts — пример пользовательского инструмента
import { createTool } from '@mastra/core/tools';
import { z } from 'zod';

export const weatherTool = createTool({
  id: 'get-weather',
  description: 'Получить текущую погоду для указанного города',
  inputSchema: z.object({
    city: z.string().describe('Название города'),
    units: z.enum(['celsius', 'fahrenheit']).default('celsius'),
  }),
  execute: async ({ context }) => {
    const { city, units } = context;
    // В реальном проекте — HTTP-запрос к API погоды
    const response = await fetch(`https://api.weather.example/${city}?units=${units}`);
    const data = await response.json();
    return {
      temperature: data.temp,
      conditions: data.conditions,
      humidity: data.humidity,
    };
  },
});

// Подключение инструментов к агенту
import { Agent } from '@mastra/core/agent';
import { weatherTool } from './tools/weather';

export const weatherAgent = new Agent({
  name: 'Weather Agent',
  instructions: 'Ты — метеоролог. Используй get-weather для получения данных.',
  model: openai('gpt-4o'),
  tools: { weatherTool },
});

MCP-серверы подключаются ещё проще — Mastra предоставляет нативный MCP-клиент. Вы указываете команду запуска сервера (например, npx @modelcontextprotocol/server-filesystem), и Mastra автоматически подтягивает список доступных инструментов, добавляя их в арсенал агента. Это открывает доступ к десяткам готовых MCP-серверов из экосистемы: работа с GitHub, PostgreSQL, Brave Search, Puppeteer и многими другими.

// src/mastra/agents/mcp-agent.ts — агент с MCP-инструментами
import { Agent } from '@mastra/core/agent';
import { anthropic } from '@ai-sdk/anthropic';

export const mcpAgent = new Agent({
  name: 'MCP Explorer',
  instructions: 'Ты исследуешь файловую систему и веб-ресурсы через MCP.',
  model: anthropic('claude-sonnet-4-20250514'),
  // Подключение MCP-серверов декларативно
  mcpServers: {
    filesystem: {
      command: 'npx',
      args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'],
    },
    braveSearch: {
      command: 'npx',
      args: ['-y', '@anthropic/mcp-server-brave-search'],
      env: { BRAVE_API_KEY: process.env.BRAVE_API_KEY },
    },
  },
});

4. Multi-agent workflows — оркестрация агентов

Одиночный агент хорош для простых задач, но реальные бизнес-сценарии требуют кооперации нескольких агентов с разными ролями. Mastra предоставляет систему Workflow — это направленные графы, в которых узлами выступают агенты, а рёбрами — правила передачи контекста. Каждый агент получает на вход результат предыдущего и может либо вернуть финальный ответ, либо делегировать задачу дальше по цепочке. Поддерживаются паттерны: последовательная цепочка (chain), голосование (voting), маршрутизация (router), конвейерная обработка (pipeline) и циклы с условием выхода. Workflow автоматически сериализуются — состояние можно сохранить и возобновить.

// src/mastra/workflows/content-pipeline.ts
import { createWorkflow } from '@mastra/core/workflows';
import { researcher } from '../agents/researcher';
import { writer } from '../agents/writer';
import { editor } from '../agents/editor';

export const contentPipeline = createWorkflow({
  name: 'Конвейер создания статьи',
  triggerSchema: z.object({
    topic: z.string().describe('Тема статьи'),
    audience: z.enum(['technical', 'business', 'general']),
  }),
})
  // Шаг 1: Researcher собирает факты и источники
  .step({
    id: 'research',
    agent: researcher,
    input: ({ trigger }) => (`Собери ключевые факты по теме: ${trigger.topic}`),
  })
  // Шаг 2: Writer создаёт черновик на основе исследования
  .step({
    id: 'draft',
    agent: writer,
    input: ({ steps, trigger }) => (
      `Напиши статью на тему "${trigger.topic}" для аудитории ${trigger.audience}.
Факты для использования:\n${steps.research.text}`
    ),
  })
  // Шаг 3: Editor проверяет и улучшает текст
  .step({
    id: 'review',
    agent: editor,
    input: ({ steps }) => (
      `Отредактируй статью, исправь ошибки, улучши стиль:\n\n${steps.draft.text}`
    ),
  })
  .commit();

// Запуск workflow
const result = await contentPipeline.run({
  topic: 'Будущее AI-агентов в 2026 году',
  audience: 'technical',
});

// result.steps.research.text  → исследование
// result.steps.draft.text     → черновик
// result.steps.review.text    → финальная статья

Более сложные сценарии включают условное ветвление: например, после шага «research» можно проверить качество собранных данных и либо перейти к написанию, либо вернуться на доисследование. Для этого используется метод .then() с функцией-предикатом, возвращающей идентификатор следующего шага. Mastra также поддерживает параллельное выполнение независимых шагов через .fanOut() — несколько агентов работают одновременно, а их результаты объединяются на следующем шаге. Это критично для сценариев, где время ответа важно: например, агент-классификатор и агент-суммаризатор могут обрабатывать входящий запрос параллельно.

5. Память, контекст и векторные хранилища

Контекстное окно LLM ограничено — большинство моделей не могут «помнить» разговор бесконечно. Mastra предлагает три уровня памяти: краткосрочную (in-memory история последних N сообщений), долгосрочную (персистентное хранение в PostgreSQL/Redis/SQLite) и семантическую (векторный поиск по прошлым диалогам через Pinecone, Qdrant, Chroma или pgvector). Система памяти автоматически инжектит релевантные фрагменты в промпт агента перед каждым вызовом — разработчику достаточно указать стратегию и лимиты. Для RAG (Retrieval-Augmented Generation) Mastra предоставляет встроенные адаптеры к популярным векторным базам и embedding-моделям, а также утилиты для чанкинга документов.

// src/mastra/agents/memory-agent.ts — агент с долгосрочной памятью
import { Agent } from '@mastra/core/agent';
import { Memory } from '@mastra/memory';
import { PostgresStore } from '@mastra/pg';

const memory = new Memory({
  storage: new PostgresStore({
    connectionString: process.env.DATABASE_URL,
  }),
  options: {
    lastMessages: 20,         // последние 20 сообщений всегда в контексте
    semanticRecall: {           // семантический поиск по истории
      topK: 5,                  // 5 релевантных фрагментов
      messageRange: { before: 5, after: 2 },
    },
    workingMemory: {            // рабочая память — важные факты
      enabled: true,
      template: `Важные факты о пользователе:
<working_memory />
Используй эти факты при ответе.`,
    },
  },
});

export const personalAssistant = new Agent({
  name: 'Personal Assistant',
  instructions: 'Ты — персональный ассистент. Помни предпочтения и контекст.',
  model: openai('gpt-4o'),
  memory,
});

// Каждый вызов автоматически обогащается историей
await personalAssistant.generate('Меня зовут Алекс, я веган.', {
  resourceId: 'user-42',   // идентификатор сессии
});
await personalAssistant.generate('Посоветуй ресторан.', {
  resourceId: 'user-42',   // агент вспомнит про веганство
});

6. Продвинутый пример: RAG-агент с векторным поиском

Retrieval-Augmented Generation (RAG) — один из самых востребованных паттернов в AI-разработке. Вместо того чтобы «вшивать» знания в системный промпт (что дорого и не масштабируется), RAG-агент при каждом запросе ищет релевантные документы в векторной базе и добавляет их в контекст. Mastra предоставляет готовые абстракции для полного RAG-пайплайна: загрузка документов → чанкинг → эмбеддинг → индексация в векторную БД → поиск при запросе → генерация ответа. В качестве векторного хранилища можно использовать Pinecone (облачный), Qdrant, Chroma (локальный) или pgvector. В этом примере мы построим агента технической поддержки, который ищет ответы в документации продукта.

// src/mastra/agents/rag-support.ts
import { Agent } from '@mastra/core/agent';
import { createVectorQueryTool } from '@mastra/rag';
import { PineconeVector } from '@mastra/pinecone';
import { openai } from '@ai-sdk/openai';

// Шаг 1: Инициализация векторного хранилища
const vectorStore = new PineconeVector({
  apiKey: process.env.PINECONE_API_KEY,
  indexName: 'product-docs',
});

// Шаг 2: Создание инструмента векторного поиска
const searchDocs = createVectorQueryTool({
  vectorStore,
  embeddingModel: openai.embedding('text-embedding-3-small'),
  id: 'search-documentation',
  description: 'Искать ответы в документации продукта',
  topK: 5,
  filter: { source: 'official-docs' }, // опциональный фильтр
});

// Шаг 3: Агент поддержки с RAG
export const supportAgent = new Agent({
  name: 'Support Agent',
  instructions: `Ты — агент технической поддержки продукта.
Отвечай, опираясь ТОЛЬКО на найденные документы.
Если в документации нет ответа — предложи создать тикет.
Всегда указывай источник информации (заголовок документа).`,
  model: openai('gpt-4o'),
  tools: { searchDocs },
});

// Шаг 4: Индексация документов (выполняется один раз или по расписанию)
import { MDocument } from '@mastra/rag';

async function indexDocs() {
  const doc = await MDocument.fromUrl('https://docs.example.com/api-reference.md');

  const chunks = await doc.chunk({
    strategy: 'recursive',     // рекурсивное разбиение
    size: 512,                // токенов на чанк
    overlap: 64,             // перекрытие между чанками
  });

  await vectorStore.upsert({
    indexName: 'product-docs',
    chunks,
    embeddingModel: openai.embedding('text-embedding-3-small'),
  });

  console.log(`Проиндексировано ${chunks.length} чанков`);
}

// Использование RAG-агента
const answer = await supportAgent.generate(
  'Как настроить OAuth-аутентификацию через Google?'
);
// Агент вызовет searchDocs → получит релевантные чанки → сгенерирует ответ

RAG-пайплайн можно расширить: добавить гибридный поиск (векторный + keyword BM25), реранкинг результатов с помощью Cohere или cross-encoder, кэширование частых запросов и мониторинг качества через встроенную телеметрию Mastra. Фреймворк также поддерживает стриминг RAG-ответов с указанием источников — пользователь видит не только ответ, но и документы, на которых он основан, что критично для enterprise-сценариев, где требуется аудируемость.

Итог: когда выбирать Mastra

Mastra — это зрелый, активно развивающийся фреймворк для построения AI-агентов на JavaScript/TypeScript. Его ключевые преимущества: единый API для десятков LLM-провайдеров (через Vercel AI SDK), нативная поддержка MCP для подключения готовых инструментов, гибкая система Workflow для multi-agent оркестрации, встроенная память с семантическим поиском и полноценный RAG-стек из коробки. Фреймворк подходит как для быстрого прототипирования (первый агент за 5 минут), так и для продакшен-систем: горизонтальное масштабирование через stateless- агенты, сохранение состояния в PostgreSQL, телеметрия и логирование.

Если ваша задача — построить агента, который не просто генерирует текст, а действует: вызывает API, читает файлы, ищет в базе знаний, координирует работу других агентов — Mastra будет отличным выбором. Фреймворк заполняет пробел между низкоуровневым AI SDK и высокоуровневыми no-code решениями, давая разработчику полный контроль и гибкость.

Полезные ссылки:

Версия гайда: июль 2026. Mastra постоянно обновляется — следите за официальным changelog и Discord-сообществом для получения актуальной информации о новых возможностях.