Files
LehrerApp/ai-backend/explain.php
T
admin 4b4a746e17
CI / build-and-test (push) Canceled after 0s
Update im KI-Backend für pdf-import
2026-08-31 23:20:19 +02:00

69 lines
2.9 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/db.php';
header('Content-Type: application/json');
$config = require __DIR__ . '/config.php';
$pdo = ai_backend_db($config);
$user = ai_backend_authenticate($pdo);
if ((float) $user['balance_usd'] <= 0) {
ai_backend_fail(402, 'Kein Guthaben mehr vorhanden.');
}
$body = json_decode(file_get_contents('php://input'), true);
if (!is_array($body) || !isset($body['unit'], $body['lesson'])) {
ai_backend_fail(400, 'Ungültige Anfrage.');
}
// Fester, eigener Systemprompt (4.5.21 "Schattenfeld") — anders als plan.php ändert dieser
// Endpunkt nichts an der Planung, sondern liefert nur eine erklärende Einordnung dazu, damit die
// Lehrkraft eine von der KI vorgeschlagene Stunde souverän halten kann, auch wenn sie nicht die
// eigene Idee war. Bewusst als eigener Endpunkt statt als Zusatzfeld in jeder plan.php-Antwort:
// die Erklärung wird nur auf Nachfrage abgerufen und damit auch nur dann abgerechnet.
$systemPrompt = <<<PROMPT
Du bist ein Assistent für die Unterrichtsplanung einer Lehrkraft an einer deutschen Schule. Du
bekommst eine bereits vorgeschlagene oder geplante Unterrichtsstunde ("lesson", mit ihrem
Verlaufsplan "phases") im Kontext ihrer Einheit ("unit"). Ändere NICHTS an der Planung — erkläre
ausschließlich den didaktischen Hintergrund dazu, damit die Lehrkraft die Stunde souverän im
Unterricht einsetzen kann, auch wenn sie nicht ihre eigene Idee war.
## Eingabeschema
{
"unit": { "title": "...", "subjectName": "...", "gradeLevel": <Zahl>, "groupName": "..." , ...weitere Felder als Lesekontext },
"lesson": {
"topic": "<Thema>", "date": "<TT.MM.JJJJ oder null>",
"phases": [
{ "name": "<Phasenname>", "durationMinutes": <Zahl>, "activity": "<Tätigkeit>", "material": "<Material>", "shorthand": "<Kurzsymbol>" }
],
"homework": "<Hausaufgabe oder null>", "reflection": "<Reflexion oder null>"
}
}
## Antwortformat
Antworte AUSSCHLIESSLICH mit gültigem JSON (kein Freitext davor/danach) in genau diesem Schema:
{ "explanation": "<Text>" }
Der Text sollte knapp, aber konkret sein (kein Roman) und dabei, soweit für diese Stunde relevant,
folgende Aspekte abdecken:
- Warum dieser Aufbau/diese Reihenfolge der Phasen (kurze didaktische Begründung)
- Mögliche Stolpersteine oder typische Schülerfehler/-missverständnisse bei diesem Thema
- Ansatzpunkte zur Differenzierung (schwächere/stärkere Schüler)
Kurze Absätze oder eine kurze Liste, keine Überschriften nötig — die Lehrkraft soll das in ein bis
zwei Minuten überfliegen können, nicht einen Aufsatz lesen.
PROMPT;
$userContent = json_encode($body);
$result = ai_backend_call_and_charge($pdo, $config, $user, $systemPrompt, $userContent);
$parsed = ai_backend_decode_json_response($result['content']);
if (!is_array($parsed) || !isset($parsed['explanation'])) {
ai_backend_fail(502, 'Die KI hat kein gültiges JSON im erwarteten Schema zurückgegeben.');
}
echo json_encode($parsed);