find($this->pressReleaseId); if ($pressRelease === null) { return; } $result = $this->classify($manager, $pressRelease); $pressRelease->forceFill([ 'classification' => $result->classification->value, 'classified_at' => now(), ])->save(); KiAudit::query()->create([ 'press_release_id' => $pressRelease->id, 'type' => KiAudit::TYPE_CLASSIFICATION, 'provider' => $result->provider, 'model' => $result->model, 'result' => $result->classification->value, 'reason' => $result->reasonText(), 'raw_response' => $result->rawResponse, 'created_at' => now(), ]); if (! $this->route) { return; } try { $service->routeByClassification($pressRelease, $result->classification, $result->reasonText()); } catch (BlacklistViolationException) { // publish() hat die PM bereits abgelehnt und den Autor benachrichtigt. } } /** * Klassifiziert über den aktiven (oder explizit gewählten) Treiber; bei * Fehler greift der deterministische Fallback, damit das Ergebnis * nachvollziehbar bleibt. */ private function classify(ClassificationManager $manager, PressRelease $pressRelease): ClassificationResult { $provider = $this->providerOverride ?: $manager->getDefaultDriver(); try { return $manager->driver($provider)->classify($pressRelease); } catch (\Throwable $exception) { Log::warning('KI-Klassifikation fiel auf den deterministischen Treiber zurück.', [ 'press_release_id' => $pressRelease->id, 'provider' => $provider, 'error' => $exception->getMessage(), ]); return $manager->driver('deterministic')->classify($pressRelease); } } }