{% 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 }} {% 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

{% for ex in exchanges %}
#{{ ex.exchange_index + 1 }} {% if ex.offset_ms is not none %} {{ "%.1f"|format(ex.offset_ms / 1000.0) }}s {% endif %} {% if ex.started_at %} {{ ex.started_at[-12:-4] if ex.started_at|length > 12 else ex.started_at }} {% endif %}
User

{{ ex.user_transcript or "—" }}

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

{{ ex.assistant_transcript }}

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

No exchanges recorded for this call

{% endif %} {% endblock %}