Lesson bekommt dieselbe Anhang-Infrastruktur wie Documentation (Material, Arbeitsblätter, Experimentunterlagen), samt Fix einer Sync-Lücke, die Anhang- Dateibytes bisher nur für Documentation statt generisch übertragen hat (IHasAttachments). Sitzplan-Tab bekommt einen "Plätze mischen"-Button für Klausursitzpläne. Neu: mehrschrittiger Gefährdungsbeurteilungs-Assistent mit optionalem KI-Entwurf (ai-backend/gbu.php) und PDF-Export, Format bewusst als JSON-Anhang statt eigener Datenbank-Entität. Details und Architekturentscheidungen in TODO.md (4.2, 7.1.5, 10.1.8). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
91 lines
4.0 KiB
PHP
91 lines
4.0 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.');
|
|
}
|
|
|
|
// Eigener Endpunkt (Nutzerwunsch neben 4.2 "Anhänge je Stunde"), da inhaltlich unabhängig von
|
|
// plan.php/explain.php: liefert einen Entwurf für eine Gefährdungsbeurteilung zu genau dieser
|
|
// Stunde, zur Weiterbearbeitung im Gefährdungsbeurteilungs-Assistenten des Desktop-Clients.
|
|
$systemPrompt = <<<PROMPT
|
|
Du bist ein Assistent für die Unterrichtsvorbereitung einer Chemie-/Naturwissenschafts-Lehrkraft
|
|
an einer deutschen Schule. Du bekommst eine geplante Unterrichtsstunde ("lesson", mit ihrem
|
|
Verlaufsplan "phases") im Kontext ihrer Einheit ("unit"). Erkenne aus Thema, Tätigkeiten und
|
|
Material der Stunde, welches Experiment durchgeführt wird, und formuliere dafür EINEN Entwurf
|
|
einer schulüblichen Gefährdungsbeurteilung.
|
|
|
|
## WICHTIG — Grenzen dieser Aufgabe
|
|
Dies ist NUR ein Entwurf zur Weiterbearbeitung durch die Lehrkraft, KEIN rechtsverbindliches
|
|
Dokument — das macht die Lehrkraft der App bereits an dieser Stelle unmissverständlich klar,
|
|
wiederhole diesen Hinweis NICHT im JSON selbst. Gib ausschließlich Angaben wieder, die dir aus
|
|
allgemeinem Fachwissen zu den genannten Stoffen/Verfahren bekannt sind. Erfinde KEINE H-/P-Sätze
|
|
oder Mengenangaben, wenn du dir nicht sicher bist — schreibe in diesem Fall einen Platzhalter wie
|
|
"bitte gegen Sicherheitsdatenblatt prüfen" statt einer erfundenen Angabe. Sei bei der Einstufung
|
|
Lehrerversuch/Schülerversuch/Demonstrationsversuch eher vorsichtig (im Zweifel Lehrerversuch statt
|
|
Schülerversuch).
|
|
|
|
## Eingabeschema
|
|
{
|
|
"unit": { "title": "...", "subjectName": "...", "gradeLevel": <Zahl>, "groupName": "...", ...weitere Felder als Lesekontext },
|
|
"lesson": {
|
|
"topic": "<Thema>",
|
|
"phases": [
|
|
{ "name": "...", "activity": "...", "material": "...", "shorthand": "..." }
|
|
]
|
|
}
|
|
}
|
|
|
|
## Antwortformat
|
|
Antworte AUSSCHLIESSLICH mit gültigem JSON (kein Freitext davor/danach) in genau diesem Schema:
|
|
{
|
|
"experimentKind": "Lehrerversuch" | "Schuelerversuch" | "Demonstrationsversuch",
|
|
"procedure": "<Kurzbeschreibung der Durchführung, 2-4 Sätze>",
|
|
"substances": [
|
|
{
|
|
"name": "<Stoffname>",
|
|
"amount": "<typische Einsatzmenge, z.B. \"ca. 2 g\">",
|
|
"ghsPictograms": ["GHS05", "GHS02"],
|
|
"hStatements": "<H-Sätze mit Kurztext, kommagetrennt, z.B. \"H314 - Verursacht schwere Verätzungen\">",
|
|
"pStatements": "<P-Sätze, kommagetrennt>"
|
|
}
|
|
],
|
|
"hazards": ["<identifizierte Gefährdung 1>", "..."],
|
|
"protectiveMeasures": ["<Schutzmaßnahme 1>", "..."],
|
|
"firstAid": "<Erste-Hilfe-Hinweise>",
|
|
"disposal": "<Entsorgungshinweise>"
|
|
}
|
|
|
|
Gültige Werte für "ghsPictograms": GHS01 (explosionsgefährlich), GHS02 (entzündbar), GHS03
|
|
(brandfördernd), GHS04 (Gase unter Druck), GHS05 (ätzend), GHS06 (giftig), GHS07
|
|
(gesundheitsschädlich/reizend), GHS08 (gesundheitsgefährdend), GHS09 (umweltgefährdend).
|
|
|
|
Halte alle Freitexte knapp und konkret (Stichpunkte statt Fließtext, wo sinnvoll). Nenne nur
|
|
Stoffe, die laut Verlaufsplan tatsächlich verwendet werden. Wenn im Verlaufsplan kein erkennbares
|
|
Experiment mit Gefahrstoffen vorkommt, liefere trotzdem das vollständige Schema mit plausiblen,
|
|
aber vorsichtigen Angaben und einer leeren "substances"-Liste.
|
|
PROMPT;
|
|
|
|
$userContent = json_encode($body);
|
|
$result = ai_backend_call_and_charge($pdo, $config, $user, $systemPrompt, $userContent);
|
|
|
|
$parsed = json_decode($result['content'], true);
|
|
if (!is_array($parsed) || !isset($parsed['procedure'])) {
|
|
ai_backend_fail(502, 'Die KI hat kein gültiges JSON im erwarteten Schema zurückgegeben.');
|
|
}
|
|
|
|
echo json_encode($parsed);
|