69 lines
2.9 KiB
PHP
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);
|