Et enkelt API-kall er statsløst — Claude husker ingenting mellom kallene. En chatbot må selv holde styr på samtalehistorikken og sende den med i hvert API-kall. Dette er det viktigste konseptet å forstå for chatbot-utvikling.
session_start();
header("Content-Type: application/json");
$api_key = getenv("ANTHROPIC_API_KEY");
$handling = $_POST["handling"] ?? "send";
if ($handling === "nullstill") {
$_SESSION["historikk"] = [];
echo json_encode(["ok" => true]);
exit;
}
$melding = trim($_POST["melding"] ?? "");
if (!$melding) { echo json_encode(["feil" => "Tom melding"]); exit; }
if (!isset($_SESSION["historikk"])) $_SESSION["historikk"] = [];
$_SESSION["historikk"][] = ["role" => "user", "content" => $melding];
$historikk = array_slice($_SESSION["historikk"], -20);
$data = [
"model" => "claude-sonnet-4-20250514",
"max_tokens" => 1024,
"system" => "Du er en hjelpsom assistent for Kvisvik Nettutvikling. Svar alltid på norsk.",
"messages" => $historikk
];
$ch = curl_init("https://api.anthropic.com/v1/messages");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
"x-api-key: $api_key",
"anthropic-version: 2023-06-01",
"content-type: application/json"
]
]);
$respons = json_decode(curl_exec($ch), true);
$svar = $respons["content"][0]["text"] ?? "Feil i API-kall";
$_SESSION["historikk"][] = ["role" => "assistant", "content" => $svar];
echo json_encode(["svar" => $svar, "ant_meldinger" => count($_SESSION["historikk"])]);
<div id="chat-vindu"></div>
<input id="melding-felt" placeholder="Skriv melding...">
<button onclick="sendMelding()">Send</button>
<button onclick="nullstill()">Ny samtale</button>
<script>
async function sendMelding() {
var melding = document.getElementById("melding-felt").value.trim();
if (!melding) return;
leggTilMelding("Du", melding);
document.getElementById("melding-felt").value = "";
var fd = new FormData();
fd.append("melding", melding);
var res = await fetch("chat.php", { method: "POST", body: fd });
var data = await res.json();
leggTilMelding("Claude", data.svar);
}
function leggTilMelding(avsender, tekst) {
var div = document.createElement("div");
div.innerHTML = "<strong>" + avsender + ":</strong> " + tekst;
document.getElementById("chat-vindu").appendChild(div);
}
async function nullstill() {
var fd = new FormData();
fd.append("handling", "nullstill");
await fetch("chat.php", { method: "POST", body: fd });
document.getElementById("chat-vindu").innerHTML = "";
}
document.getElementById("melding-felt").addEventListener("keydown", function(e) {
if (e.key === "Enter") sendMelding();
});
</script>
For produksjon bør samtalehistorikk lagres i database — ikke session:
CREATE TABLE chat_historikk (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sesjon_id VARCHAR(64) NOT NULL,
rolle ENUM("user","assistant") NOT NULL,
innhold TEXT NOT NULL,
opprettet DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_sesjon (sesjon_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Alt godt er nå på vei til meg, og jeg tar det imot med takknemlighet.— Florence Scovel Shinn
Test deg selv — helt valgfritt, men morsomt! 🎯
Spørsmål 1 av 3
Hvorfor må en chatbot sende hele samtalehistorikken i hvert API-kall?
Spørsmål 2 av 3
Hvor skal kommunikasjonen med Anthropic API alltid skje?
Spørsmål 3 av 3
Hvor mange meldingsrunder bør du typisk beholde i historikken?