Logs de uso de IA

Historial de llamadas a Gemini y Whisper con tokens, tiempos y costos.

{{-- Cards resumen --}} @php $costoGemini = $resumen->costo_gemini ?? 0; $costoWhisper = $resumen->costo_whisper ?? 0; $costoTotal = $costoGemini + $costoWhisper; @endphp

Total llamadas

{{ number_format($resumen->total_llamadas ?? 0) }}

{{ number_format($resumen->total_ok ?? 0) }} ok  ·  {{ number_format($resumen->total_errores ?? 0) }} errores

Tokens Gemini

{{ number_format(($resumen->total_input_tokens ?? 0) + ($resumen->total_output_tokens ?? 0)) }}

E: {{ number_format($resumen->total_input_tokens ?? 0) }} · S: {{ number_format($resumen->total_output_tokens ?? 0) }}

Audio Whisper

{{ number_format($resumen->total_segundos_whisper ?? 0) }}s

segundos transcritos

Costo Gemini

${{ number_format($costoGemini, 0, ',', '.') }}

$20.000 / millón tokens

Costo Total

${{ number_format($costoTotal, 0, ',', '.') }}

Whisper: ${{ number_format($costoWhisper, 0, ',', '.') }} · Prom: {{ number_format($resumen->avg_tiempo_ms ?? 0) }}ms

{{-- Filtros --}}
ó rango:
{{-- Tabla --}}
@forelse($logs as $log) @php $detalle = is_array($log->detalle) ? $log->detalle : []; $badgeServicio = match($log->servicio) { 'gemini_intent' => 'bg-blue-100 text-blue-700', 'gemini_vision' => 'bg-indigo-100 text-indigo-700', 'whisper' => 'bg-purple-100 text-purple-700', default => 'bg-gray-100 text-gray-600', }; $labelServicio = match($log->servicio) { 'gemini_intent' => 'Gemini Intent', 'gemini_vision' => 'Gemini Vision', 'whisper' => 'Whisper', default => $log->servicio, }; $costoFila = in_array($log->servicio, ['gemini_intent', 'gemini_vision']) ? (($log->input_tokens ?? 0) + ($log->output_tokens ?? 0)) / 1000000 * 20000 : ($log->costo ?? 0); @endphp @empty @endforelse
Fecha Servicio Canal Usuario Tokens E/S Audio Tiempo Costo COP Estado Detalle
{{ $log->created_at->format('d/m/Y') }}
{{ $log->created_at->format('H:i:s') }}
{{ $labelServicio }} {{ $log->canal }} {{ $log->usuario_id ? ('ID '.$log->usuario_id) : '—' }} @if($log->input_tokens || $log->output_tokens) {{ number_format($log->input_tokens ?? 0) }} / {{ number_format($log->output_tokens ?? 0) }} @else — @endif @if($log->audio_segundos) {{ $log->audio_segundos }}s @else — @endif {{ number_format($log->tiempo_ms) }}ms @if($costoFila > 0) ${{ number_format($costoFila, 0, ',', '.') }} @else — @endif @if($log->resultado === 'ok') OK @else Error @endif @if(isset($detalle['texto']) && $detalle['texto']) "{{ Str::limit($detalle['texto'], 60) }}" @elseif(isset($detalle['accion']) && $detalle['accion']) → {{ $detalle['accion'] }} @elseif(isset($detalle['banco'])) {{ $detalle['banco'] }} · ${{ number_format($detalle['valor'] ?? 0) }} @elseif(isset($detalle['error'])) {{ Str::limit($detalle['error'], 60) }} @else — @endif
No hay registros con los filtros seleccionados.
@if($logs->hasPages())
{{ $logs->links() }}
@endif