Agent, типизированные инструменты, память, workflow и MCP, а модель подключает через LanguageModel-интерфейс Vercel AI SDK. Его выбирают команды, у которых AI-логика живёт рядом с продуктом на Node.js, и те, кому нужен агентный backend без Python-зависимостей.
Mastra не тащит с собой ни провайдеров моделей, ни HTTP-клиента собственной разработки — модель передаётся объектом. Значит, интеграция сводится к фабрике OpenAI-совместимого провайдера с вашим baseURL.
От настройки зависят ровно две вещи:
baseURL = "https://speshu.ai/api/v1" и API-ключ. Mastra работает поверх Vercel AI SDK, а этот SDK имеет штатный OpenAI-совместимый провайдер createOpenAI из пакета @ai-sdk/openai — отдельная интеграция в Mastra не нужна. Схема «любой OpenAI-совместимый baseURL» стабильна во всех версиях, в отличие от конкретных классов Mastra, которые между релизами переезжают.Установка
zod обязателен: им объявляются inputSchema инструментов. Пакет ai Mastra подтягивает сам, вручную ставить не нужно.
Подключение
1
Положите ключ и идентификатор модели в окружение
Ключ создаётся на speshu.ai/profile. Идентификатор модели не зашивайте в код — состав каталога меняется, и зашитый в коде идентификатор молча устаревает до В своём коде выбирайте модель по
404 model_not_found:context_length, cost_completion и наличию зрения, а не по первому элементу массива. Формат ответа — в разделе Каталог моделей.2
Создайте провайдера
TypeScript
3
Соберите агента и зарегистрируйте в Mastra
Agent принимает instructions, model, tools и memory. Экземпляр Mastra нужен для dev-сервера и для вызова агента по имени из HTTP-роута.TypeScript
4
Проверьте агента
TypeScript
Версии. Примеры выше рассчитаны на Mastra 1.x с AI SDK v5:
createOpenAI возвращает вызываемый объект провайдера, поэтому модель получается как speshu(modelId). В Mastra 0.10 (AI SDK v4) класс Agent импортируется из @mastra/core/agent так же, но результат генерации и поток отдаются другими полями — они менялись между мажорными версиями. Импорт Agent из @mastra/core/agent и конструктор new Mastra({ agents }) — самая устойчивая часть API; на неё и опирайтесь.Инструменты
Инструмент — это функция с Zod-схемой аргументов. Mastra сам превращает её в JSON Schema, а цикл вызова (модель вернулаtool_calls → вы выполнили функцию → отдали результат) берёт на себя.
TypeScript
tools: { getOrderStatus } и всё. Формат вызова на стороне API — tools[] с type: "function", разбор — в гайде Вызов функций.
Продвинутые сценарии
Потоковая передача
Потоковая передача
supportAgent.stream(...) возвращает тот же SSE, что и stream: true на /api/v1/chat/completions. В Mastra 1.x полный текст лежит в stream.text, в Mastra 0.10 — в stream.textStream. Формат кадров, кадр со списанием и правило «[DONE] может не быть последней строкой» разобраны в Потоковой передаче.Структурированный вывод
Структурированный вывод
Mastra прокидывает
output в AI SDK: в Mastra 1.x это Output.object({ schema }), в 0.10 — experimental_output из ai. JSON Schema, валидация и поведение при нарушении схемы — в гайде Структурированный вывод.Генерация медиа
Генерация медиа
У Mastra нет встроенного инструмента под медиа-задачи SpeShu.AI — это отдельный асинхронный API, и удобнее вызвать его напрямую из своего инструмента или роута. Создание задачи, Идентификатор медиа-модели
Idempotency-Key и цикл опроса — в Создании задачи, статусы — в Статусе задачи.TypeScript
nano-banana-2 зашивать в код можно: каталог GET /api/v1/media/models публичный и стабильный. А вот деньги списываются при создании задачи, поэтому не повторяйте POST вслепую — тот же Idempotency-Key вернёт исходную задачу, новый создаст вторую.Если что-то не работает
404 на baseURL без суффикса /v1
404 на baseURL без суффикса /v1
Нужен ровно
https://speshu.ai/api/v1. Провайдер сам дописывает /chat/completions, и без /v1 итоговый путь уходит на несуществующий маршрут. То же самое с лишним слэшем в конце: https://speshu.ai/api/v1/ даёт .../v1//chat/completions.404 model_not_found
404 model_not_found
SPESHU_MODEL пустой, обрезан или устарел. Перечитайте GET /api/v1/models и подставьте id как есть — с префиксом вроде openai/, без кавычек. Массив models.data в Mastra не кэшируется между процессами, так что это почти всегда означает, что переменную окружения не обновили.Ответ приходит целиком в конце вместо потока
Ответ приходит целиком в конце вместо потока
Значит, поток не включился: у
Agent нет отдельного флага — поток идёт от вызова agent.stream(). В Mastra 0.10 поверх @ai-sdk/openai в createOpenAI нет параметра совместимости, который заставлял бы клиент читать SSE построчно; обновление до 1.x и AI SDK v5 снимает вопрос. Формат кадров — в Потоковой передаче.Всё остальное
Всё остальное
Полная таблица кодов, три формата ошибок и цикл повторов — на странице Ошибки. Таймауты и квоты — в разделе Лимиты, расход в рублях — в гайде по учёту средств.
Что дальше
Начало работы
Полный маршрут: ключ, баланс, первый запрос
Вызов функций
Как модель вызывает инструмент и что она получает в ответ
Потоковая передача
SSE,
[DONE] и кадр со списаниемКаталог моделей
Идентификаторы, контекст и цены
