Salta al contenuto principale

Mastra framework: agentic TypeScript 2027

Articolo della serie Self-hosted Agentic Platforms. Pubblicazione prevista 06 October 2027.

Cosa ne pensi di questo articolo?

Mastra framework: agentic TypeScript 2027
Agentic PlatformsFoto:Pavel DanilyukPexels

In Breve

Articolo della serie Self-hosted Agentic Platforms. Pubblicazione prevista 06 October 2027.

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

LivelloComponenteResponsabilità
1. CoreAgent, LLM, ToolEntità base: agenti, provider LLM, tool integrati
2. ReasoningLoop, Planner, ExecutorCiclo di pensiero-azione, pianificazione, esecuzione
3. MemoryStore, Retriever, VectorDBPersistenza conversazione, embedding, RAG
4. OrchestrationWorkflow, MultiAgentCoordinazione tra agenti, workflow complessi

2.2 Flusso di Esecuzione di un Agente Mastra

Quando invochi un agente Mastra, accade questo:

  1. Input Parsing: il messaggio dell'utente viene normalizzato e tokenizzato
  2. Memory Retrieval: il sistema recupera contesto conversazionale e episodic memory
  3. Reasoning: l'LLM genera un piano di azione (pensiero interno, tool da invocare)
  4. Tool Execution: i tool identificati vengono invocati in parallelo/sequenza
  5. Reflection: l'agente riflette sui risultati e decide se continua il loop
  6. Response Formatting: il risultato finale viene strutturato e restituito
  7. 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

Installazione di Mastra via npm
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

Setup file .env
# 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.

Primo agente Mastra (TypeScript)
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:

Agente con history 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.

Definire e registrare tool custom
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

Setup memory con Redis
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.

Agente con reasoning loop
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.

Multi-agente workflow (TypeScript)
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:

docker-compose.yml per Mastra + Ollama
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

Discuti questo articolo nella community

Unisciti al gruppo Telegram per discutere con altri sviluppatori, fare domande e condividere le tue esperienze.

Ti è piaciuto questo articolo?

Esplora altri contenuti sul blog o scopri i miei progetti