ai_client.php (ESTENSIONE: nuova funzione per il contesto)
🔄 Recuperare e inviare tutta la cronologia
<?php
// aggiunta ad ai_client.php, la funzione chiamaAI() del Passo 3 resta invariata
function recuperaCronologia(PDO $pdo, int $conversazioneId): array {
$stmt = $pdo->prepare("
SELECT ruolo, contenuto FROM messaggi
WHERE conversazione_id = :id ORDER BY creato_il ASC
");
$stmt->execute(['id' => $conversazioneId]);
$righe = $stmt->fetchAll(PDO::FETCH_ASSOC);
return array_map(fn(array $r): array => [
'role' => $r['ruolo'], 'content' => $r['contenuto']
], $righe);
}
function chiamaAIConContesto(array $cronologia, string $apiKey): array {
try {
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json', "x-api-key: $apiKey", 'anthropic-version: 2023-06-01'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'model' => 'claude-sonnet-5', 'max_tokens' => 1024, 'messages' => $cronologia
]));
$risposta = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
return ['errore' => true, 'messaggio' => "Servizio momentaneamente occupato, riprova"];
}
$dati = json_decode($risposta, true);
return ['errore' => false, 'testo' => $dati['content'][0]['text'] ?? ''];
} catch (Exception $e) {
return ['errore' => true, 'messaggio' => 'Servizio AI non disponibile'];
}
}
?>
💡 chiamaAI() del Passo 3 non viene toccata: chiamaAIConContesto() è una NUOVA funzione più completa, che sostituirà la prima nell'uso ma resta un esempio didattico di come si è partiti dalla versione semplice.
chat.php (MODIFICA rispetto al Passo 5: usare cronologia e mostrare la conversazione)
<?php
// ... session_start(), controllo login, connessione, conversazioneId come al Passo 5 ...
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$messaggio = $_POST['messaggio'] ?? '';
$stmt = $pdo->prepare("INSERT INTO messaggi (conversazione_id, ruolo, contenuto) VALUES (:cid, 'user', :contenuto)");
$stmt->execute(['cid' => $conversazioneId, 'contenuto' => $messaggio]);
$cronologia = recuperaCronologia($pdo, $conversazioneId);
$risultato = chiamaAIConContesto($cronologia, $apiKey);
if (!$risultato['errore']) {
$stmt->execute(['cid' => $conversazioneId, 'contenuto' => $risultato['testo']]);
}
}
// nuovo: mostriamo l'intera conversazione, non solo l'ultimo scambio
$storico = recuperaCronologia($pdo, $conversazioneId);
?>
<?php foreach ($storico as $m): ?>
<p><strong><?= $m['role'] === 'user' ? 'Tu' : 'Assistente' ?>:</strong> <?= htmlspecialchars($m['content']) ?></p>
<?php endforeach; ?>
<form method="post">
<input type="text" name="messaggio" required>
<button type="submit">Invia</button>
</form>
✅ Checkpoint — a questo punto hai: la funzione recuperaCronologia() scritta sopra viene riusata DUE volte in questo stesso file — prima per costruire il contesto da inviare all'API, poi per mostrare l'intera conversazione a schermo. L'assistente ora "ricorda" gli scambi precedenti.