repository->insert($clientName, $request, $model, $requestIp); } catch (\Throwable $e) { error_log('KiProtokoll logRequest failed: ' . $e->getMessage()); return null; } } /** * Complete a pending protokoll entry with response data. * Silent fail - Chat continues regardless. */ public function logSuccess( int $id, string $response, int $durationMs, ?int $tokensInput, ?int $tokensOutput ): void { try { $this->repository->complete($id, $response, $durationMs, $tokensInput, $tokensOutput); } catch (\Throwable $e) { error_log("KiProtokoll logSuccess failed for ID {$id}: " . $e->getMessage()); } } /** * Mark a protokoll entry as failed. * Silent fail - Chat continues regardless. */ public function logFailure(int $id, string $errorMessage): void { try { $this->repository->fail($id, $errorMessage); } catch (\Throwable $e) { error_log("KiProtokoll logFailure failed for ID {$id}: " . $e->getMessage()); } } /** * Clean up stale pending entries (cron job). * * @return int Number of cleaned up entries, or 0 on failure */ public function cleanupStale(int $minutesOld = 10): int { try { return $this->repository->cleanupStale($minutesOld); } catch (\Throwable $e) { error_log('KiProtokoll cleanupStale failed: ' . $e->getMessage()); return 0; } } }