presseportale/app/Models/KiAudit.php
Kevin Adametz 0e5cd20626 images: KI-Vorab-Check für Titelbilder — Vision-Sichtung mit definiertem Ausgang je Befund, Admin-Queue, Protokoll und Archiv-Snapshot (Bildkennzeichnung Block K)
Decision-Update Abschnitt 12 (E15, S24): Sichtung auf offensichtliche
Probleme, keine Rechteprüfung, öffentlich weiterhin „automatisierte Prüfung".

- ImagePrecheckManager mit openai- und deterministic-Treiber (Muster der
  Text-Prüfstrecke), Bild auf 1024 px, Metadaten gestrippt, JPEG als Data-URI,
  Antwortschema 12.4; Fehler → Ausgang `error`, durchlassen mit Vermerk.
- Auswertung 12.3: reject (Stock-Wasserzeichen, Nacktheit/Gewalt, Dokument
  ab 0,85), queue (Screenshot, fremdes Logo, Kennzeichen ab 0,6 sowie
  Ablehnungskategorien 0,6–0,85), hint (Personen, „wirkt KI" nur bei „ohne
  KI", technischer Mangel). Stufe 1 wertet nur das Wasserzeichen; die KI setzt
  nie die Kennzeichnung (E9). Herabstufung per Config (12.8).
- Uploader: Check vor jedem Schreiben, Ablehnung speichert nichts und
  landet als ki_audits `image_precheck` an der PM; Hash-Bindung zwischen
  Vorprüfung im Formular und Speichern; Spalten precheck*, Snapshot
  `precheck_snapshot` im Bestätigungsprotokoll, Archiv-Payload erweitert.
- Queue: Bild zurückgehalten (withheld_at), Meldung läuft weiter; Admin
  entscheidet mit Vermerk (Freigabe/Ablehnung → ki_audits
  `image_precheck_review`); Ansicht „Bild-Sichtung" in der PM-Liste,
  Sichtungsblock auf der PM-Seite, Systemstatus-Zähler.
- Formular v2: Ablehnungsgrund unter dem Dateifeld, Hinweise nach der
  Dateiauswahl, „wird kurz gesichtet" an der Karte; API 422 mit Grund,
  Warnung `image_under_review`.
- Config images.precheck (IMAGE_PRECHECK aus, STAGE 1); 17 Tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-22 13:27:31 +00:00

67 lines
1.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Models;
use Database\Factories\KiAuditFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* Audit-Log jeder KI-Entscheidung (Klassifikation / Content-Score).
*
* Schreibt für jede Bewertung einen unveränderlichen Eintrag inkl.
* Anbieter, Modell, Ergebnis, Begründung und Roh-Antwort – für
* Nachvollziehbarkeit und Nachweispflicht (DSGVO).
*
* `content_hash` bindet das Ergebnis an die geprüfte Inhaltsversion
* (Audit F07); `discarded_at` markiert Ergebnisse, die beim Eintreffen nicht
* mehr zum aktuellen Inhalt passten und deshalb nicht übernommen wurden.
*/
class KiAudit extends Model
{
/** @use HasFactory<KiAuditFactory> */
use HasFactory;
public $timestamps = false;
public const TYPE_CLASSIFICATION = 'classification';
public const TYPE_CONTENT_SCORE = 'content_score';
/** KI-Vorab-Check eines Bildes (Bildkennzeichnung Block K); `raw_response.image_id` ist null bei Ablehnung vor dem Speichern. */
public const TYPE_IMAGE_PRECHECK = 'image_precheck';
/** Menschliche Entscheidung zur Bild-Sichtung (approved|rejected) mit Vermerk in `reason`. */
public const TYPE_IMAGE_PRECHECK_REVIEW = 'image_precheck_review';
protected $fillable = [
'press_release_id',
'type',
'provider',
'model',
'result',
'reason',
'raw_response',
'content_hash',
'discarded_at',
'created_at',
];
protected function casts(): array
{
return [
'raw_response' => 'array',
'created_at' => 'datetime',
'discarded_at' => 'datetime',
];
}
/**
* @return BelongsTo<PressRelease, $this>
*/
public function pressRelease(): BelongsTo
{
return $this->belongsTo(PressRelease::class);
}
}