find($this->pressReleaseId); if ($pressRelease === null) { return; } $analyzedHash = $this->contentHash ?? $pressRelease->content_hash; $result = $this->score($manager, $pressRelease); $tier = PressReleaseContentTier::fromScore($result->score); $currentHash = PressRelease::withoutGlobalScope(PortalScope::class)->whereKey($pressRelease->id)->value('content_hash'); if ($analyzedHash !== null && $currentHash !== null && $currentHash !== $analyzedHash) { KiAudit::query()->create([ 'press_release_id' => $pressRelease->id, 'type' => KiAudit::TYPE_CONTENT_SCORE, 'provider' => $result->provider, 'model' => $result->model, 'result' => (string) $result->score, 'reason' => 'Verworfen: Inhalt wurde während der Bewertung geändert.', 'raw_response' => ['breakdown' => $result->breakdown] + $result->rawResponse, 'content_hash' => $analyzedHash, 'discarded_at' => now(), 'created_at' => now(), ]); self::dispatch($pressRelease->id, $this->providerOverride, $currentHash)->onQueue('classification'); return; } $pressRelease->forceFill([ 'content_score' => $result->score, 'content_tier' => $tier->value, 'scored_at' => now(), ])->save(); KiAudit::query()->create([ 'press_release_id' => $pressRelease->id, 'type' => KiAudit::TYPE_CONTENT_SCORE, 'provider' => $result->provider, 'model' => $result->model, 'result' => (string) $result->score, 'reason' => $tier->label(), 'raw_response' => ['breakdown' => $result->breakdown] + $result->rawResponse, 'content_hash' => $analyzedHash, 'created_at' => now(), ]); } /** * Bewertet über den aktiven (oder explizit gewählten) Treiber; bei Fehler * greift der deterministische Fallback. */ private function score(ContentScoreManager $manager, PressRelease $pressRelease): ContentScoreResult { $provider = $this->providerOverride ?: $manager->getDefaultDriver(); try { return $manager->driver($provider)->score($pressRelease); } catch (\Throwable $exception) { Log::warning('Content-Score fiel auf den deterministischen Treiber zurück.', [ 'press_release_id' => $pressRelease->id, 'provider' => $provider, 'error' => $exception->getMessage(), ]); return $manager->driver('deterministic')->score($pressRelease); } } }