From 6ca085ffc5c36f9139caf78e77e8ca655bf72e28 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Tue, 16 Jun 2026 19:20:14 +0200 Subject: [PATCH] =?UTF-8?q?feat(cra):=20Datenblatt-Analyse-Frontend=20(Gre?= =?UTF-8?q?nzen-Extraktion=20+=20R=C3=BCckfragen)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DatasheetExtract auf /sdk/cra: Datenblatt einfügen (oder Beispiel OWIS/Zwick) → POST /extract-datasheet → gefuellte ISO-12100-Grenzen mit Quellen-Zitat + deterministisch erkannte Schnittstellen/Einheiten + gezielte Rückfragen fuer leere Pflichtfelder (foreseeable_misuses, person_groups, …). Vorstufe fuer 'Projekt anlegen' → IACE-Grenzen-Prefill. Co-Authored-By: Claude Opus 4.7 --- .../sdk/cra/_components/DatasheetExtract.tsx | 133 ++++++++++++++++++ .../sdk/cra/_components/readiness-presets.ts | 27 ++++ admin-compliance/app/sdk/cra/page.tsx | 3 + 3 files changed, 163 insertions(+) create mode 100644 admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx diff --git a/admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx b/admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx new file mode 100644 index 00000000..afd98aa5 --- /dev/null +++ b/admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx @@ -0,0 +1,133 @@ +'use client' + +import { useState } from 'react' +import { DATASHEET_EXAMPLES } from './readiness-presets' + +interface Followup { key: string; label: string; question: string } +interface ExtractResult { + limits: Record + provenance: Record + detected: { interfaces: string[]; units: string[] } + filled: string[] + missing: string[] + followup: Followup[] +} + +const FIELD_LABEL: Record = { + machine_designation: 'Maschinenbezeichnung', machine_type: 'Maschinentyp', manufacturer: 'Hersteller', + year_of_construction: 'Baujahr', general_description: 'Allgemeine Beschreibung', + intended_purpose: 'Verwendungszweck', area_of_use: 'Einsatzbereich', operating_modes: 'Betriebsarten', + variants: 'Varianten', foreseeable_misuses: 'Vorhersehbare Fehlanwendungen', + spatial_limits: 'Räumliche Grenzen', temporal_limits: 'Zeitliche Grenzen', + operating_conditions: 'Betriebsbedingungen', energy_supply: 'Energieversorgung', + mechanical_interfaces: 'Mechanische Schnittstellen', electrical_interfaces: 'Elektrische Schnittstellen', + software_interfaces: 'Software-Schnittstellen', pneumatic_hydraulic_interfaces: 'Pneumatik/Hydraulik', + person_groups: 'Personengruppen', qualification_requirements: 'Qualifikationsanforderungen', +} + +export function DatasheetExtract() { + const [text, setText] = useState('') + const [res, setRes] = useState(null) + const [loading, setLoading] = useState(false) + const [answers, setAnswers] = useState>({}) + + const run = async () => { + setLoading(true) + try { + const r = await fetch('/api/v1/cra/extract-datasheet', { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ text }), + }) + setRes(r.ok ? await r.json() : null) + setAnswers({}) + } finally { setLoading(false) } + } + + return ( +
+

Datenblatt-Analyse → Maschinengrenzen

+

+ Datenblatt einfügen — wir füllen die ISO-12100-Grenzen automatisch (lokales KI-Modell, Datenhoheit) + und fragen gezielt nach, was nicht im Datenblatt steht. Jeder übernommene Wert trägt seine Quelle. +

+ +
+ Beispiel laden: + {DATASHEET_EXAMPLES.map((d) => ( + + ))} +
+ +