🎹
🎹 Movimento 3 di 4 📖 Capitolo 20 di 42 ⏱️ ~8 min lettura 📊 Livello: Avanzato

La Chat Contestuale – Dialogare con il Team AI

Il nostro sistema era un motore potente e autonomo, ma la sua interfaccia era ancora rudimentale. L'utente poteva vedere gli obiettivi e i deliverable, ma l'interazione era limitata. Per realizzare pienamente la nostra visione di un "team di colleghi digitali", dovevamo dare all'utente un modo per dialogare con il sistema in modo naturale.

Non volevamo una semplice chatbot. Volevamo un vero e proprio Project Manager Conversazionale, un'interfaccia in grado di capire le richieste dell'utente nel contesto del progetto e di tradurle in azioni concrete.

La Decisione Architetturale: Un Agente Conversazionale Dedicato

Invece di aggiungere logica di chat sparsa nei nostri endpoint, abbiamo seguito il nostro pattern di specializzazione e abbiamo creato un nuovo agente fisso: il SimpleConversationalAgent.

Codice di riferimento: backend/ai_agents/conversational_simple.py

Perché un Agente Conversazionale Separato?

La decisione di creare un agente conversazionale dedicato non è stata casuale, ma risponde a tre esigenze architetturali fondamentali:

1. Separazione delle Responsabilità: Gli agenti del nostro team (Director, AnalystAgent, etc.) sono ottimizzati per task specifici e complessi. Chiedere loro di "fare anche la chat" avrebbe violato il principio di singola responsabilità e diluito la loro specializzazione.

2. Context Management Pipeline: La conversazione richiede una gestione sofisticata del contesto che va oltre il semplice task execution. Deve mantenere la storia della conversazione, capire riferimenti impliciti ("aumenta il budget" presuppone che esista un budget attuale) e tradurre richieste in linguaggio naturale in azioni strutturate.

3. User Experience Consistency: Un agente conversazionale dedicato ci permette di garantire un'esperienza utente coerente, indipendentemente dalla complessità del task sottostante che verrà eseguito.

Questo agente è unico per due caratteristiche tecniche fondamentali:

  1. È Statefull: A differenza degli altri agenti che sono per lo più stateless (ricevono un task, lo eseguono e finiscono), l'agente conversazionale mantiene una cronologia della conversazione corrente, grazie alla primitiva Session dell'SDK.
  2. È un Orchestratore di Tool: Il suo scopo principale non è generare contenuti, ma capire l'intento dell'utente e orchestrare l'esecuzione dei tool appropriati per soddisfarlo.

Architettura delle Chat: Fixed vs Dynamic

Nel nostro sistema, non esiste una singola chat, ma una architettura di chat specializzate che riflette la natura diversificata delle interazioni con il team AI:

Chat Fisse (Fixed Chats): Gestione dei Sistemi

Chat Dinamiche (Dynamic Chats): Gestione degli Obiettivi

Questa separazione permette all'utente di avere conversazioni contestuali: quando parla nella Team Chat, sa che può chiedere di aggiungere un "Senior Data Scientist" e il sistema capirà automaticamente il contesto.

Slash Commands: Accesso Rapido alle Funzionalità

Oltre alla conversazione naturale, abbiamo implementato un sistema di comandi slash che permette agli utenti di accedere rapidamente alle funzionalità più comuni. Quando l'utente digita "/" nell'input della chat, il sistema mostra un menu di comandi disponibili:

Comando Descrizione Esempio d'uso
/show_project_status Mostra una panoramica completa del progetto Metriche, obiettivi, stato attuale
/show_team_status Visualizza composizione e attività del team Membri attivi, task in corso, performance
/show_goal_progress Controlla il progresso degli obiettivi Percentuale di completamento per ogni goal
/show_deliverables Vedi deliverable completati e asset Tutti gli output del progetto con stato
/approve_all_feedback Approva tutte le richieste di feedback pendenti Azione bulk per approvazioni multiple
/add_team_member Aggiungi un nuovo membro al team Con ruolo specifico e competenze
/create_goal Crea un nuovo obiettivo di progetto Definisci nuovi target con metriche
/fix_workspace_issues Riavvia task falliti e risolvi problemi Diagnostica automatica e riparazione

Perché i Slash Commands?

Artefatti Standard: Gestione Completa del Workspace

Oltre alla conversazione, il sistema fornisce artefatti standard che permettono all'utente di gestire ogni aspetto del workspace attraverso interfacce dedicate:

1. Team Management Artifacts

2. Project Orchestration Artifacts

3. Tools & Integrations Artifacts

4. Quality Assurance Artifacts

Questi artefatti non sono semplici "dashboard", ma interfacce di controllo attive che permettono all'utente di modificare configurazioni, approvare azioni e interagire direttamente con il sistema senza dover sempre passare attraverso la conversazione.

Flusso di una Conversazione:

Architettura del Sistema

graph TD A[Utente Invia Messaggio:
Aggiungi 1000€ al budget] --> B{Endpoint Conversazionale} B --> C[Carica Contesto del Workspace
e della Conversazione] C --> D{ConversationalAgent
analizza l'intento} D -->|Intento: modify_budget| E{AI decide di usare il tool
modify_configuration} E --> F[SDK formatta la chiamata al tool
con i parametri amount: 1000, operation: increase] F --> G{Executor esegue il tool} G -->|Tool aggiorna il DB| H[Risultato dell'azione] H --> I{ConversationalAgent
formula la risposta} I --> J[Risposta all'Utente:
Ok, ho aumentato il budget.
Il nuovo totale è 4000€.]

Architettura del Sistema

graph TD A[Utente Invia Messaggio:
Aggiungi 1000€ al budget] --> B{Endpoint Conversazionale} B --> C[Carica Contesto del Workspace
e della Conversazione] C --> D{ConversationalAgent
analizza l'intento} D -->|Intento: modify_budget| E{AI decide di usare il tool
modify_configuration} E --> F[SDK formatta la chiamata al tool
con i parametri amount: 1000, operation: increase] F --> G{Executor esegue il tool} G -->|Tool aggiorna il DB| H[Risultato dell'azione] H --> I{ConversationalAgent
formula la risposta} I --> J[Risposta all'Utente:
Ok, ho aumentato il budget.
Il nuovo totale è 4000€.]

Il Cuore del Sistema: Il Service Layer Agnostico

Una delle sfide più grandi era come permettere all'agente conversazionale di eseguire azioni (come modificare il budget) senza accoppiarlo strettamente alla logica del database.

La soluzione è stata creare un Service Layer agnostico.

Codice di riferimento: backend/services/workspace_service.py (ipotetico)

Abbiamo creato un'interfaccia (WorkspaceServiceInterface) che definisce le azioni di business di alto livello (es. update_budget, add_agent_to_team). Poi, abbiamo creato un'implementazione concreta di questa interfaccia per Supabase (SupabaseWorkspaceService).

L'agente conversazionale non sa nulla di Supabase. Chiama semplicemente workspace_service.update_budget(...). Questo rispetta il Pilastro #14 (Tool/Service-Layer Modulare) e ci permetterebbe in futuro di cambiare database modificando solo una classe, senza toccare la logica dell'agente.

"War Story": La Chat Smemorata

Le nostre prime versioni della chat erano frustranti. L'utente chiedeva: "Qual è lo stato del progetto?", l'AI rispondeva. Poi l'utente chiedeva: "E quali sono i rischi?", e l'AI rispondeva: "Quale progetto?". La conversazione non aveva memoria.

Logbook del Disastro (29 Luglio):

USER: "Mostrami i membri del team."
AI: "Certo, il team è composto da Marco, Elena e Sara."
USER: "Ok, aggiungi un QA Specialist."
AI: "A quale team vuoi aggiungerlo?"

La Lezione Appresa: Il Contesto è Tutto.

Una conversazione senza contesto non è una conversazione, è una serie di scambi isolati. La soluzione è stata implementare un robusto Context Management Pipeline.

  1. Caricamento del Contesto Iniziale: Quando l'utente apre una chat, carichiamo un "contesto di base" con le informazioni chiave del workspace.
  2. Arricchimento Continuo: Ad ogni messaggio, il contesto viene aggiornato non solo con la cronologia dei messaggi, ma anche con i risultati delle azioni eseguite.
  3. Summarization per Contesti Lunghi: Per evitare di superare i limiti di token dei modelli, abbiamo implementato una logica che, per conversazioni molto lunghe, "riassume" i messaggi più vecchi, mantenendo solo le informazioni salienti.

Questo ha trasformato la nostra chat da una semplice interfaccia di comandi a un vero e proprio dialogo intelligente e contestuale.

📝 Key Takeaways del Capitolo:

Tratta la Chat come un Agente, non come un Endpoint: Un'interfaccia conversazionale robusta richiede un agente dedicato che gestisca lo stato, l'intento e l'orchestrazione dei tool.

Disaccoppia le Azioni dalla Logica di Business: Usa un Service Layer per evitare che i tuoi agenti conversazionali siano strettamente legati all'implementazione del tuo database.

Il Contesto è il Re della Conversazione: Investi tempo nella creazione di una pipeline di gestione del contesto solida. È la differenza tra una chatbot frustrante e un assistente intelligente.

Progetta per la Memoria a Lungo e Breve Termine: Usa le Session dell'SDK per la memoria a breve termine (la conversazione attuale) e il tuo WorkspaceMemory per la conoscenza a lungo termine.

Conclusione del Capitolo

Con un'interfaccia conversazionale intelligente, avevamo finalmente un modo intuitivo per l'utente di interagire con la potenza del nostro sistema. Ma non bastava. Per guadagnare veramente la fiducia dell'utente, dovevamo fare un passo in più: dovevamo aprire la "scatola nera" e mostrargli come l'AI arrivava alle sue conclusioni. Era il momento di implementare il Deep Reasoning.