Skip to main content

AI Agent per Admin Panel πŸ€–

Priorità: 🟑 Media
Effort Stimato: 2-3 settimane
Stato: Proposta

Problema​

Attualmente per investigare problemi sui device (es. "perchΓ© questo device era offline?") Γ¨ necessario:

  1. Controllare manualmente i logs su Grafana
  2. Query manuali su Redis e PostgreSQL
  3. Verificare i vari microservizi coinvolti
  4. Correlare manualmente le informazioni

Questo processo richiede conoscenza tecnica approfondita e molto tempo.

Soluzione Proposta​

Integrare un AI Agent direttamente nell'admin panel che puΓ²:

  • Rispondere a domande in linguaggio naturale
  • Interrogare automaticamente database, API e logs
  • Fornire analisi contestuali sui device
  • Suggerire azioni correttive

Architettura​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Admin Panel (React) β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚ β”‚ Device Card β”‚β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚β”‚
β”‚ β”‚ β”‚ Device Info β”‚ β”‚ πŸ€– AI Assistant β”‚ β”‚β”‚
β”‚ β”‚ β”‚ ID: xxx-985 β”‚ β”‚ β”‚ β”‚β”‚
β”‚ β”‚ β”‚ Status: Online β”‚ β”‚ "PerchΓ© questo device era β”‚ β”‚β”‚
β”‚ β”‚ β”‚ Last seen: ... β”‚ β”‚ offline ieri alle 14:00?" β”‚ β”‚β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚β”‚
β”‚ β”‚ β”‚ β†’ Risposta con analisi logs, β”‚ β”‚β”‚
β”‚ β”‚ β”‚ eventi, e dati Redis β”‚ β”‚β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ AI Agent Microservice (Python) β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ LLM Client β”‚ β”‚ Tools β”‚ β”‚ Context Builder β”‚ β”‚
β”‚ β”‚ (OpenAI/ β”‚ β”‚ - query_db β”‚ β”‚ - Device context β”‚ β”‚
β”‚ β”‚ Anthropic) β”‚ β”‚ - call_api β”‚ β”‚ - User permissions β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ - get_logs β”‚ β”‚ - History β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Devices β”‚ β”‚ Positionsβ”‚ β”‚ Redis β”‚
β”‚ API β”‚ β”‚ API β”‚ β”‚ (Logs) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Componenti Tecnici​

1. AI Agent Microservice​

Nuovo microservice Python che segue la Clean Architecture esistente:

services/ai-agent/
β”œβ”€β”€ src/
β”‚ β”œβ”€β”€ application/
β”‚ β”‚ β”œβ”€β”€ use_cases/
β”‚ β”‚ β”‚ β”œβ”€β”€ process_query.py # Main use case
β”‚ β”‚ β”‚ └── stream_response.py # SSE streaming
β”‚ β”‚ └── ports/
β”‚ β”‚ β”œβ”€β”€ llm_port.py # LLM abstraction
β”‚ β”‚ └── tool_port.py # Tool abstraction
β”‚ β”œβ”€β”€ domain/
β”‚ β”‚ β”œβ”€β”€ entities/
β”‚ β”‚ β”‚ β”œβ”€β”€ conversation.py
β”‚ β”‚ β”‚ └── tool_call.py
β”‚ β”‚ └── services/
β”‚ β”‚ └── context_builder.py
β”‚ β”œβ”€β”€ infrastructure/
β”‚ β”‚ β”œβ”€β”€ adapters/
β”‚ β”‚ β”‚ β”œβ”€β”€ openai_adapter.py
β”‚ β”‚ β”‚ β”œβ”€β”€ anthropic_adapter.py
β”‚ β”‚ β”‚ └── tools/
β”‚ β”‚ β”‚ β”œβ”€β”€ database_tool.py
β”‚ β”‚ β”‚ β”œβ”€β”€ api_tool.py
β”‚ β”‚ β”‚ β”œβ”€β”€ redis_tool.py
β”‚ β”‚ β”‚ └── loki_tool.py
β”‚ β”‚ └── api/
β”‚ β”‚ └── routes.py
β”‚ └── main.py
β”œβ”€β”€ tests/
β”œβ”€β”€ Dockerfile
└── pyproject.toml

2. Tools Disponibili​

ToolDescrizioneEsempio Query
query_devicesInterroga il database devices"Trova device con IMEI xxx"
query_positionsUltime posizioni di un device"Dove si trovava ieri?"
query_eventsEventi/allarmi di un device"Quali allarmi ha generato?"
query_redisStato presence in Redis"È online adesso?"
query_logsCerca nei logs Loki"Errori nelle ultime 24h"
send_commandInvia comando al device"Invia comando di localizzazione"

3. Frontend Component​

// components/AIAssistant.tsx
interface AIAssistantProps {
deviceId?: string; // Contesto device opzionale
userId?: string; // Contesto utente opzionale
initialContext?: string; // Contesto iniziale
}

const AIAssistant: React.FC<AIAssistantProps> = ({ deviceId, userId }) => {
const [messages, setMessages] = useState<Message[]>([]);
const [isLoading, setIsLoading] = useState(false);

const sendMessage = async (content: string) => {
// SSE streaming per risposte real-time
const response = await fetch('/api/ai-agent/chat', {
method: 'POST',
body: JSON.stringify({
message: content,
context: { deviceId, userId },
}),
});

// Handle SSE stream...
};

return (
<div className="ai-assistant">
<ChatHistory messages={messages} />
<ChatInput onSend={sendMessage} isLoading={isLoading} />
</div>
);
};

Tecnologie​

ComponenteOpzione ConsigliataAlternative
LLM ProviderOpenAI GPT-4Anthropic Claude, Google Gemini
FrameworkLangChainLlamaIndex, custom implementation
StreamingServer-Sent Events (SSE)WebSocket
CachingRedisIn-memory

Stima Costi​

Costi Infrastruttura​

  • Nessun costo aggiuntivo GKE (pod piccolo, ~100m CPU, 256Mi RAM)

Costi API LLM (stima mensile)​

ScenarioQuery/meseCosto Stimato
Uso leggero500~$10-15
Uso medio2000~$40-60
Uso intenso5000~$100-150

Basato su GPT-4 Turbo pricing (~$0.01/1K input, ~$0.03/1K output)

Considerazioni di Sicurezza​

Accesso e Permessi​

  • βœ… Solo utenti admin possono usare l'agent
  • βœ… Le query sono limitate ai device dell'account
  • βœ… Audit log di tutte le interazioni
  • βœ… Rate limiting per prevenire abusi

Dati Sensibili​

  • ⚠️ Non inviare dati sensibili al LLM
  • ⚠️ Sanitizzare output prima di mostrare
  • ⚠️ Mascherare IMEI/numeri telefono nei logs

Esempio di Interazione​

πŸ‘€ Admin: "PerchΓ© il device S21L-985 era offline ieri pomeriggio?"

πŸ€– Agent pensando...
1. πŸ” Query devices API β†’ Device trovato, owner: user@example.com
2. πŸ” Query positions β†’ Ultima posizione: 14:23:45
3. πŸ” Query Redis presence β†’ Gap dalle 14:23 alle 15:10
4. πŸ” Query logs Loki β†’ Trovato: "ws-consumer lag warning"

πŸ€– Agent: "Il device S21L-985 Γ¨ risultato offline dalle 14:23 alle 15:10
di ieri. L'analisi dei logs mostra che il consumer WebSocket aveva
accumulato un lag di 45 minuti nella lettura del presence stream.

πŸ“Š Timeline:
- 14:23:45 - Ultima posizione ricevuta
- 14:25:00 - Device marcato offline (timeout 10 min)
- 15:10:22 - Consumer riavviato automaticamente
- 15:10:30 - Device tornato online

πŸ’‘ Suggerimento: Considera di aumentare le repliche del ws-consumer
o implementare un circuit breaker per gestire meglio i picchi di carico."

Roadmap Implementazione​

Fase 1: MVP (1 settimana)​

  • Setup microservice base
  • Integrazione OpenAI/Anthropic
  • Tool base: query_devices, query_positions
  • UI chat semplice nell'admin

Fase 2: Espansione (1 settimana)​

  • Aggiunta tools: query_events, query_redis
  • Streaming SSE
  • Context awareness (device selezionato)
  • History conversazioni

Fase 3: Polish (1 settimana)​

  • Query logs Loki
  • Comandi device (send_command)
  • Caching risposte
  • Rate limiting e audit

Risorse Utili​