{% extends "dashboard/base.html" %} {% block title %}Call Detail - Cyborg Dashboard{% endblock %} {% block content %}
← Back to Calls

Call Detail

{{ call.status }}
{{ call.phone_number or "Unknown" }} · {{ call.started_at_display }} {% if call.duration_seconds %} · {{ "%.1f"|format(call.duration_seconds) }}s {% endif %} · {{ call.exchange_count }} exchange{{ "s" if call.exchange_count != 1 else "" }}
{% if call.recording_path %}

Recording

L: caller · R: assistant
{% endif %} {% if exchanges %}

Timeline

offsets from call start
{% for ex in exchanges %}
#{{ ex.exchange_index + 1 }} {{ ex.offset_display }} {% if ex.time_display != "—" %} ({{ ex.time_display }}) {% endif %}
User

{{ ex.user_transcript or "—" }}

{% if ex.e2e_ms %} {% set stt = ex.stt_ms or 0 %} {% set llm_raw = ex.openclaw_ms or 0 %} {% set ttfp_raw = ex.tts_first_chunk_ms or 0 %} {% set e2e = ex.e2e_ms or 0 %} {% set llm = [llm_raw - stt, 0]|max %} {% set ttfp = [ttfp_raw - llm_raw, 0]|max %} {% set bar_total = [e2e, 1]|max %} {% set stt_pct = (stt / bar_total * 100)|round(1) %} {% set llm_pct = (llm / bar_total * 100)|round(1) %} {% set ttfp_pct = (ttfp / bar_total * 100)|round(1) %}
Latency
STT {{ stt }}ms
LLM {{ llm }}ms
TTFP {{ ttfp }}ms
STT: {{ stt }}ms LLM: {{ llm_raw }}ms TTFP: {{ ttfp_raw }}ms E2E: {{ e2e }}ms
{% endif %} {% if ex.assistant_transcript %}
Assistant

{{ ex.assistant_transcript }}

{% endif %}
{% endfor %}
{% else %}

No exchanges recorded for this call

{% endif %} {% endblock %}