Mastra framework: agentic TypeScript 2027
Mastra è un framework open-source moderno per costruire applicazioni agentic sofisticate in TypeScript. Non è una libreria leggerissima: è un'intera piattaforma che semplifica orchestrazione multi-agente, integrazione di tool, memory management e reasoning avanzato. Se stai costruendo agenti che devono ragionare autonomamente, pianificare task complessi e operare in ambienti reali, Mastra è diventata una delle opzioni più mature della community open-source nel 2027.
In questo articolo esploreremo l'architettura core di Mastra, come impostare i tuoi primi agenti, come gestire la memoria persistente e il contesto conversazionale, come integrare tool custom e LLM on-premise (come Ollama), e quali sono le best practice per il deploy in produzione. Scoprirai perché Mastra è diversa dai framework competitors, e quando sceglierebbero Mastra invece di CrewAI, AutoGPT o Letta per il tuo progetto.
Cosa Imparerai
- Come funziona l'architettura core di Mastra
- Setup iniziale e creazione del tuo primo agente
- Integrazione di tool e plugin custom
- Memory management e contesto conversazionale
- Reasoning loop e decision making
- Orchestrazione multi-agente
- Integrazione LLM on-premise (Ollama, Mistral)
- Deploy e scaling in produzione
- Testing e debugging di agenti Mastra
- Best practice e anti-pattern comuni
1. Cos'è Mastra e Perché è Importante
1.1 La Proposta di Valore di Mastra
Mastra è un framework TypeScript-first per costruire agenti IA che ragionano e operano in modo autonomo. A differenza di framework "leggerissimi" che sono solo wrapper attorno agli LLM, Mastra fornisce:
- Orchestrazione nativa di multi-agent: comunicazione diretta tra agenti, gestione di risultati paralleli
- Tool system integrato: registrazione e invocazione di funzioni custom con type safety
- Memory persistence: contesto conversazionale, episodic memory, long-term knowledge
- Reasoning loop: pensiero, pianificazione, azione, riflessione iterativa
- Provider flexibility: supporta vari provider LLM (Ollama, Mistral e altri) e custom LLM
- Built-in observability: logging, tracing, debugging delle decisioni dell'agente
1.2 Quando Usare Mastra
Scegli Mastra quando:
- Costruisci sistemi agentic che richiedono reasoning complesso e multi-step
- Hai bisogno di orchestrazione affidabile tra più agenti specializzati
- Vuoi memory persistente e conversazioni long-running
- Preferisci un framework con opinioni forti (meno flessibilità, meno boilerplate)
- Stai usando LLM on-premise (Ollama) per privacy o cost control
2. Architettura Core di Mastra
2.1 I Componenti Principali
Mastra è costruita attorno a quattro componenti principali:
Architettura Mastra - Livelli
| Livello | Componente | Responsabilità |
|---|---|---|
| 1. Core | Agent, LLM, Tool | Entità base: agenti, provider LLM, tool integrati |
| 2. Reasoning | Loop, Planner, Executor | Ciclo di pensiero-azione, pianificazione, esecuzione |
| 3. Memory | Store, Retriever, VectorDB | Persistenza conversazione, embedding, RAG |
| 4. Orchestration | Workflow, MultiAgent | Coordinazione tra agenti, workflow complessi |
2.2 Flusso di Esecuzione di un Agente Mastra
Quando invochi un agente Mastra, accade questo:
- Input Parsing: il messaggio dell'utente viene normalizzato e tokenizzato
- Memory Retrieval: il sistema recupera contesto conversazionale e episodic memory
- Reasoning: l'LLM genera un piano di azione (pensiero interno, tool da invocare)
- Tool Execution: i tool identificati vengono invocati in parallelo/sequenza
- Reflection: l'agente riflette sui risultati e decide se continua il loop
- Response Formatting: il risultato finale viene strutturato e restituito
- Memory Update: la conversazione e i risultati vengono salvati nella store
3. Installazione e Setup Iniziale
3.1 Prerequisiti
Prima di iniziare, assicurati di avere:
- Node.js 18+ e npm/pnpm
- Un account con un LLM provider (o Ollama installato localmente)
- TypeScript 5.0+ (fortemente consigliato)
- Redis (per memoria distribuita, opzionale ma consigliato)
3.2 Installazione di Mastra
npm install mastra @mastra/core @mastra/sdk
# Se usi pnpm
pnpm add mastra @mastra/core @mastra/sdk
# Installa tipo TypeScript
npm install --save-dev @types/node
3.3 Configurazione Iniziale
# Se usi Ollama localmente (consigliato per privacy)
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.1:8b
# Se usi un LLM provider cloud (alternativa)
# (le chiavi API di provider cloud proprietari non sono supportate nel tuo setup)
# Redis per memory distribuita
REDIS_URL=redis://localhost:6379
4. Creare il Tuo Primo Agente Mastra
4.1 Un Agente Minimalista
Partiamo da un agente semplicissimo che risponde domande generiche usando un LLM on-premise.
import { Agent, OllamaProvider } from 'mastra';
// Inizializza il provider LLM (Ollama locale)
const llmProvider = new OllamaProvider({
baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
model: process.env.OLLAMA_MODEL || 'llama3.1:8b',
});
// Crea un agente semplice
const assistant = new Agent({
name: 'GeneralAssistant',
description: 'Un assistente generico che risponde domande',
llmProvider,
systemPrompt: `Tu sei un assistente tecnico esperto.
Rispondi in modo preciso, conciso e utile.
Se non conosci la risposta, ammettilo.`,
});
// Usa l'agente
async function main() {
const response = await assistant.run({
input: 'Qual è la differenza tra agenti e chatbot?',
});
console.log('Risposta:', response);
}
main();
4.2 Agente Stateful con Conversazione
Gli agenti reali hanno memoria. Vediamo come aggiungere contesto conversazionale:
import { Agent, Memory } from 'mastra';
const assistant = new Agent({
name: 'StatefulAssistant',
description: 'Assistente con memoria conversazionale',
llmProvider,
memory: new Memory({
type: 'redis',
connectionUrl: process.env.REDIS_URL,
}),
systemPrompt: `Sei un assistente che ricorda il contesto della conversazione.
Usa la history per fornire risposte coerenti e personalizzate.`,
});
// Conversa con storia
async function conversation() {
// Primo turno
let resp1 = await assistant.run({
input: 'Mi chiamo Marco e lavoro con TypeScript',
userId: 'user-123',
});
console.log('Bot:', resp1.output);
// Secondo turno — l'agente ricorda il nome
let resp2 = await assistant.run({
input: 'Quali framework mi consigli?',
userId: 'user-123', // Stesso utente
});
console.log('Bot:', resp2.output);
// Risponderà usando il contesto che Marco usa TypeScript
}
5. Integrazione di Tool Custom
5.1 Registrare un Tool
Gli agenti reali hanno bisogno di eseguire azioni: fare query a database, invocare API, eseguire calcoli. In Mastra si definiscono come Tool.
import { Agent, Tool } from 'mastra';
// Definisci un tool personalizzato
const weatherTool = new Tool({
name: 'get_weather',
description: 'Recupera la previsione meteo per una città',
parameters: {
city: {
type: 'string',
description: 'Nome della città',
},
},
execute: async (params: { city: string }) => {
// Simula una chiamata API
return {
city: params.city,
temperature: 22,
condition: 'Sereno',
humidity: 65,
};
},
});
const databaseTool = new Tool({
name: 'query_database',
description: 'Esegui una query sul database interno',
parameters: {
query: {
type: 'string',
description: 'Query SQL',
},
},
execute: async (params: { query: string }) => {
// Connessione al DB (pseudocodice)
const db = await connectToDatabase();
return db.query(params.query);
},
});
// Crea l'agente con i tool integrati
const smartAgent = new Agent({
name: 'SmartAssistant',
llmProvider,
tools: [weatherTool, databaseTool],
systemPrompt: `Usa i tool disponibili per rispondere alle domande.
Se ti chiedono il meteo, usa get_weather.
Se richiedono dati, usa query_database.`,
});
// L'agente decide autonomamente quale tool usare
async function queryWithTools() {
const resp = await smartAgent.run({
input: 'Com\'è il meteo a Milano?',
});
// Internamente: LLM decide di invocare get_weather
console.log(resp.output);
}
6. Memory Management e Contesto
6.1 Tipi di Memoria in Mastra
Mastra supporta tre tipi di memoria:
- Conversational Memory: history della conversazione corrente (short-term)
- Episodic Memory: eventi e risultati passati (medium-term, giorni/settimane)
- Semantic Memory: knowledge embeddings per RAG (long-term, permanent)
6.2 Configurare Memory Distribuita
import { Agent, RedisMemory, VectorStore } from 'mastra';
const agent = new Agent({
name: 'MemoryAgent',
llmProvider,
memory: {
conversational: new RedisMemory({
url: process.env.REDIS_URL,
ttl: 7 * 24 * 60 * 60, // 7 giorni
}),
semantic: new VectorStore({
provider: 'qdrant', // o altra provider
collection: 'agent-knowledge',
}),
},
systemPrompt: `Usa la tua memoria per fornire risposte consapevoli del contesto.`,
});
// Quando esegui l'agente, automaticamente:
// 1. Recupera conversazione recente
// 2. Fa embedding della query
// 3. Cerca documenti simili nel VectorStore
// 4. Aumenta il prompt con il contesto recuperato
7. Reasoning Avanzato e Decision Making
7.1 Ciclo di Reasoning Iterativo
Uno dei punti di forza di Mastra è il ciclo di reasoning iterativo. L'agente non semplicemente risponde: pensa, agisce, riflette e adatta la strategia.
import { Agent, ReasoningLoop } from 'mastra';
const complexAgent = new Agent({
name: 'ReasoningAgent',
llmProvider,
tools: [searchTool, calculateTool, validateTool],
reasoning: new ReasoningLoop({
maxIterations: 5,
reflexionPrompt: `Rifletti su ciò che hai fatto.
Sei sulla strada giusta? Hai bisogno di un approccio diverso?`,
stopCondition: (state) => {
// L'agente si ferma quando ha una risposta fiduciaria
return state.confidence > 0.85;
},
}),
});
async function complexTask() {
const result = await complexAgent.run({
input: 'Risolvi questo problema di ottimizzazione: ...',
metadata: {
complexity: 'high',
iterationBudget: 5,
},
});
console.log('Soluzione:', result.output);
console.log('Iterazioni usate:', result.iterationCount);
}
8. Orchestrazione Multi-Agente
8.1 Coordinare Agenti Specializzati
Per task complessi, è meglio delegare a più agenti specializzati. Mastra rende questa coordinazione trasparente.
import { Workflow, Agent } from 'mastra';
// Crea agenti specializzati
const dataAnalyst = new Agent({
name: 'DataAnalyst',
description: 'Specializzato in analisi dati',
llmProvider,
tools: [querySQLTool, plotGraphTool],
});
const researchAgent = new Agent({
name: 'Researcher',
description: 'Specializzato in ricerca e sintesi',
llmProvider,
tools: [searchWebTool, summarizeTool],
});
const reportWriter = new Agent({
name: 'ReportWriter',
description: 'Crea report formali',
llmProvider,
tools: [formatReportTool, exportPDFTool],
});
// Orchestra il workflow
const workflow = new Workflow({
name: 'DataReportWorkflow',
agents: [dataAnalyst, researchAgent, reportWriter],
steps: [
{
agent: dataAnalyst,
task: 'Analizza i dati di vendita Q1 2027',
outputKey: 'analysis',
},
{
agent: researchAgent,
task: 'Ricerca context di mercato basato sull\'analisi precedente',
inputKey: 'analysis',
outputKey: 'research',
},
{
agent: reportWriter,
task: 'Scrivi un report formale usando analysis e research',
inputKeys: ['analysis', 'research'],
outputKey: 'finalReport',
},
],
});
// Esegui il workflow
async function generateReport() {
const result = await workflow.execute({
input: { /* parametri iniziali */ },
});
console.log('Report generato:', result.finalReport);
}
9. Deploy e Scaling in Produzione
9.1 Struttura di un'App Mastra in Produzione
In produzione, un'applicazione Mastra tipicamente:
- Gira come servizio backend (Node.js + Express/Fastify)
- Usa Redis per memory distribuita e caching
- Ha un database permanente (PostgreSQL) per episodic memory
- Si collega a un LLM provider (Ollama locale o cloud)
- Implementa rate limiting e monitoring
9.2 Setup con Docker
Qui sotto un esempio di deploy containerizzato con Ollama locale:
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
environment:
- OLLAMA_MODELS=/root/.ollama/models
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
postgres:
image: postgres:16
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: postgres
volumes:
- pg_data:/var/lib/postgresql/data
mastra-app:
build: .
ports:
- "3000:3000"
environment:
OLLAMA_BASE_URL: http://ollama:11434
REDIS_URL: redis://redis:6379
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/mastra
depends_on:
- ollama
- redis
- postgres
volumes:
ollama_data:
redis_data:
pg_data:
10. Best Practice e Anti-Pattern Comuni
10.1 DO: Diviedi Task Complessi
Non chiedere a un singolo agente di risolvere problemi troppo complessi. Dividi il lavoro tra agenti specializzati.
10.2 DON'T: Loop Infiniti
Sempre imposta un limite massimo di iterazioni nel reasoning loop. Un agente che ragiona all'infinito è un agente che consuma token infinitamente.
10.3 DO: Monitora i Costi (o la Privacy)
Se usi Ollama, i costi sono zero (GPU locale). Se usi un LLM cloud, monitora le token generate. Mastra fornisce built-in analytics per tracking.
10.4 DON'T: Dimenticare Error Handling
Tool invocation può fallire (network error, malformed response, ecc.). Sempre implementa fallback e retry logic.
11. Domande Frequenti (FAQ)
Q: Mastra è veramente open-source?
Sì, Mastra è completamente open-source (MIT license). Il codice è su GitHub, puoi contributare e forkare liberamente.
Q: Posso usare Mastra senza un LLM provider cloud?
Assolutamente. Mastra supporta nativamente Ollama (o qualsiasi server LLM con API standard). Installa Ollama localmente, scarica un modello come llama3.1:8b, e sei pronto.
Q: Quanto è veloce un agente Mastra?
Dipende dall'LLM usato. Con Ollama e llama3.1:8b su GPU moderno (RTX 4090), expect ~50-200ms per inference. Con agenti multi-step che fanno tool invocation, add 100-300ms per tool execution. Complessivamente, un task medio prende 1-5 secondi. Per task complessi, fino a 30-60 secondi.
Q: Mastra scalerà quando ho migliaia di agenti?
Mastra è stato testato fino a 10.000 agenti concorrenti in ambienti distribuiti. Usa Redis per coordinazione e PostgreSQL per persistenza, che sono già pensate per scale orizzontale. Il bottleneck reale è l'LLM provider (Ollama), non Mastra.
Q: Come differse Mastra da CrewAI?
CrewAI è più leggero, Mastra è più completo. Mastra ha memory integrata, reasoning loop esplicito, e orchestrazione multi-agente nativa. CrewAI è più semplice per MVP veloce. Se stai costruendo un sistema agentic serio e long-running, Mastra è superiore. Se fai prototipi rapidi, CrewAI è più agile.

Commenti
Caricamento commenti...
Accedi per commentare