""" MemorySummarizer - Usa Claude per sintetizzare blocchi di conversazione """ import anthropic import json from typing import List, Dict class MemorySummarizer: """Usa Claude per sintetizzare blocchi di conversazione""" def __init__(self, client: anthropic.Anthropic, model_name: str): self.client = client self.model_name = model_name def extract_user_info(self, messages: List[Dict]) -> Dict: """Estrae informazioni strutturate dall'utente dalle conversazioni""" # Costruisci prompt per estrazione conversation_text = self._format_messages(messages) prompt = f"""Analizza questa conversazione e estrai SOLO le informazioni fattuali sull'utente. Conversazione: {conversation_text} Restituisci un JSON con questa struttura (compila solo i campi per cui hai info certe): {{ "name": "nome utente o null", "family": {{ "spouse": "nome coniuge o null", "children": ["nome1", "nome2"] o [], "other": "altre info familiari" }}, "residence": "città/indirizzo o null", "company": "azienda dove lavora o null", "role": "ruolo professionale o null", "colleagues": ["nome1", "nome2"] o [], "interests": ["interesse1", "interesse2"] o [] }} IMPORTANTE: Se non hai informazioni certe per un campo, usa null o []. Non inventare. Rispondi SOLO con il JSON, senza testo aggiuntivo.""" try: response = self.client.messages.create( model=self.model_name, max_tokens=500, temperature=0.3, # Bassa per precisione messages=[{"role": "user", "content": prompt}] ) # Estrai JSON dalla risposta response_text = response.content[0].text.strip() # Rimuovi eventuali markdown code blocks if response_text.startswith("```"): # Trova inizio e fine del blocco JSON lines = response_text.split("\n") json_lines = [] in_json = False for line in lines: if line.startswith("```"): in_json = not in_json continue if in_json: json_lines.append(line) response_text = "\n".join(json_lines) extracted = json.loads(response_text) return extracted except (json.JSONDecodeError, Exception) as e: print(f"[WARNING] Errore estrazione info utente: {e}") # Ritorna struttura vuota in caso di errore return { "name": None, "family": {}, "residence": None, "company": None, "role": None, "colleagues": [], "interests": [] } def create_conversation_summary(self, messages: List[Dict]) -> str: """Crea un riassunto narrativo di un blocco di conversazione""" conversation_text = self._format_messages(messages) prompt = f"""Riassumi questa conversazione in 2-4 frasi concise, concentrandoti su: - Cosa ha chiesto l'utente - Cosa gli hai risposto - Eventuali conclusioni o nuove informazioni emerse Conversazione: {conversation_text} Riassunto:""" try: response = self.client.messages.create( model=self.model_name, max_tokens=300, temperature=0.5, messages=[{"role": "user", "content": prompt}] ) return response.content[0].text.strip() except Exception as e: print(f"[WARNING] Errore creazione summary: {e}") # Fallback: summary minimale return f"Conversazione di {len(messages)} messaggi (summary non disponibile)" def _format_messages(self, messages: List[Dict]) -> str: """Formatta messaggi per prompt""" lines = [] for msg in messages: role = "Utente" if msg["role"] == "user" else "Marco Aurelio" content = msg.get("content", "") # Tronca messaggi molto lunghi if len(content) > 500: content = content[:500] + "..." lines.append(f"{role}: {content}") return "\n\n".join(lines)