Introduzione
Questa sezione documenta il Node Agent basato su LangGraph che espone un server HTTP/Socket.IO per chat in tempo reale, caricamento documenti/prodotti e integrazione con servizi esterni (Laravel app, Hatchet worker, Qdrant).
Architettura
- Server HTTP (Express): inizializzato in
src/server.ts, applica CORS, parsing JSON, statici, routing HTTP dasrc/server/serverHttp.tse gestore errori globale. - Socket.IO: avviato da
initializeSocketServerinsrc/server/socketServer.tscon autenticazione JWT; gestisce eventicreate_thread,chat_message,load_thread_messagese streaming chunk della risposta. - LangGraph App: definita in
src/index.tscome grafo di stato con nodiagentetools, model OpenAI (gpt-4o-mini) e strumenti dinamici in base alla configurazione (documenti, e‑commerce). Supporta checkpointer PostgreSQL opzionale. - Code di background:
src/utils/queue.tsaccoda eventi (es.chat:message,embed:*) verso il Worker Hatchet tramiteWORKER_URLe salva in background gli ultimi messaggi della conversazione. - Integrazioni:
- Laravel:
src/services/laravelService.ts(limiti messaggi, creazione conversazioni, storage check, info client/IP, Woo tokens). - Qdrant: client REST in
src/index.tse servizi/tool dedicati (agentTools/qdrantService.ts,services/productRagSearchService.ts). - Traduzioni/i18n:
src/translations/*,src/services/i18n.ts.
- Laravel:
Flusso di esecuzione
- Il client crea un thread via HTTP (
POST /create-thread/:agentId) o via socket (create_thread). - Il client invia un messaggio (
chat_messagesu socket) con configurazioneconfigurable(es.thread_id,agent_id,collection_name,language,companyName, flaghasDocuments,websiteUrl/baseFeedUrl, ecc.). - L’App LangGraph costruisce il system prompt con regole e abilita i tool necessari, poi invoca il modello. Se il modello effettua tool calls, la conversazione passa al nodo
toolse ritorna all’agentfino a risposta finale. - Le risposte vengono streammate via Socket.IO in eventi:
typing,chat_response_start,chat_response_chunk,chat_response_end. - Se attivo, il checkpointer PostgreSQL memorizza lo stato del thread. Un task asincrono invia all’
Hatcheti messaggi utente/assistant più recenti.
Endpoint principali (HTTP)
POST /create-thread/:agentId: crea un nuovo thread e registra la conversazione su Laravel.GET /thread/:threadId/messages: carica i messaggi del thread (se presenti nel checkpointer).POST /upload/files/:collectionName: carica file (PDF, TXT, DOCX, CSV, XLS/XLSX, JSON, XML, YAML) e accoda il task su Worker.POST /upload/url/:collectionName: embeddizza contenuti da URL/sitemap e accoda il task.POST /upload/products/:collectionName: avvia l’elaborazione prodotti per e‑commerce.GET /queue/tasks/:taskUuid: stato avanzamento di un task nella coda.POST /queue/tasks/:taskUuid/cancel: annulla un task.POST /estimate/sitemap: stima dimensione sitemap.DELETE /collections/:collectionName/:resourceUuid: elimina documenti per risorsa.DELETE /collections/:collectionNameeDELETE /upload/:vectorStoreUuid: eliminazione collezioni.GET /healtheGET /health/simple: health checks.
Le rotte sono protette da JWT eccetto alcuni endpoint pubblici (es. /health, /api/qdrant/*, queue monitor). Il middleware valida i token e scarta richieste non autorizzate.
Socket events
create_thread→{ agentId, type }→thread_created.chat_message→ messaggio e configurazione → streamtyping/chat_response_*.load_thread_messages→ restituisce lo storico dal checkpointer.
Autenticazione via io.use(validateToken) con JWT (companyId nel payload). Ogni socket riceve socketId usato per arricchire i metadati (IP/domino) salvati su Laravel.
Configurazione
langgraph.jsondefinisce il grafoagent(./src/index.ts:app) e.envrichiesto.- Variabili chiave:
OPENAI_API_KEY,JWT_SECRET,WORKER_URL,LARAVEL_APP_URL,QDRANT_URL,QDRANT_API_KEY,DB_URI,ENABLE_CHECKPOINTER. - Avvio sviluppo:
pnpm dev(porta interna 3000, log inlogs/).
Strumenti (Tools)
Caricati dinamicamente da src/agentTools/index.ts:
- Documenti:
searchDocumentsTool. - E‑commerce:
semanticProductSearchTool,productWebSearchTool(render HTML card), categorie/attributi/termini,storePaymentsMethodsTool.
Sicurezza e validazione
- Validazione schema request con Zod (
utils/validation.ts), errori coerenti e gestore errori globale. - Log strutturati con Winston (
utils/logger.ts). - Limiti upload: 1GB per file, MIME type consentiti, cartella
uploads/creata al boot.
Note operative
- Il Worker Hatchet gira separatamente e gestisce le code; questo server delega via HTTP a
WORKER_URL. - Lo stato conversazioni è persistito se
ENABLE_CHECKPOINTER=trueeDB_URIè configurato (PostgreSQL).
Flusso Documenti & RAG
- Upload file/URL → Task al Worker → estrazione testo + embedding → inserimento in Qdrant.
- Il tool
searchDocumentsinterroga Qdrant con l’embedding della query e restituisce passaggi pertinenti. - Per i prodotti: similarità su Qdrant e (se configurato) reranking con Jina per migliorare la rilevanza.
Flusso Prodotti & Card
productSemanticSearchrecupera gli ID dei prodotti candidati dalla collezione Qdrant.productWebSearchinterroga WooCommerce, adatta i dati e genera card HTML standardizzate pronte all’uso.
Osservabilità
- Health: endpoint
/health(dettagliato) e/health/simple(sintetico). - Monitor coda: pagina
/queue/monitorper visualizzare lo stato dei task. - Log: file e console tramite Winston con livello configurabile (
LOG_LEVEL).