{# ── Header ── #}
{# ── Verdict ── #}
Deepfake Probability
|
{{ fake_score }}
/ 100
|
{{ verdict.label }}
Severity: {{ verdict.severity }}
Model: {{ verdict.model_label }} ({{ '%.1f' | format(verdict.model_confidence * 100) }}% confidence)
|
{% if donut_b64 %}
|
{% endif %}
{# ── LLM Explanation ── #}
{% if llm_summary and llm_summary.paragraph %}
AI Explanation
{{ llm_summary.paragraph }}
{% if llm_summary.bullets %}
{% for b in llm_summary.bullets %}- {{ b }}
{% endfor %}
{% endif %}
{% if llm_summary.model_used %}
via {{ llm_summary.model_used }}
{% endif %}
{% endif %}
{# ══════════ IMAGE ══════════ #}
{% if media_type == 'image' %}
{# EXIF #}
{% if explainability.exif %}
EXIF Metadata
| Field | Value | Trust Signal |
{% if explainability.exif.make %}
| Camera Make | {{ explainability.exif.make }} | +real |
{% endif %}
{% if explainability.exif.model %}
| Camera Model | {{ explainability.exif.model }} | |
{% endif %}
{% if explainability.exif.datetime_original %}
| Date Taken | {{ explainability.exif.datetime_original }} | +real |
{% endif %}
{% if explainability.exif.software %}
| Software | {{ explainability.exif.software }} |
{% if 'photoshop' in explainability.exif.software | lower %}+fake{% endif %} |
{% endif %}
{% if explainability.exif.lens_model %}
| Lens Model | {{ explainability.exif.lens_model }} | |
{% endif %}
{% if explainability.exif.gps_info %}
| GPS | {{ explainability.exif.gps_info }} | |
{% endif %}
| Trust adjustment |
{% if explainability.exif.trust_adjustment > 0 %}
+{{ explainability.exif.trust_adjustment }} (fake signal)
{% elif explainability.exif.trust_adjustment < 0 %}
{{ explainability.exif.trust_adjustment }} (real signal)
{% else %}
neutral
{% endif %}
|
{% endif %}
{# Artifact indicators #}
{% if explainability.artifact_indicators %}
Artifact Indicators
| Type | Severity | Confidence | Description |
{% for ind in explainability.artifact_indicators %}
| {{ ind.type }} |
{{ ind.severity }} |
{{ '%.0f' | format(ind.confidence * 100) }}% |
{{ ind.description }} |
{% endfor %}
{% else %}
Artifact Indicators
No artifacts detected.
{% endif %}
{# VLM Detailed Breakdown #}
{% if explainability.vlm_breakdown %}
Detailed Breakdown
{% if explainability.vlm_breakdown.model_used %}
Scored by {{ explainability.vlm_breakdown.model_used }}
{% endif %}
| Component | Score | Bar | Notes |
{% set bd = explainability.vlm_breakdown %}
{% for comp_key, comp_label in [
('facial_symmetry', 'Facial Symmetry'),
('skin_texture', 'Skin Texture'),
('lighting_consistency', 'Lighting Consistency'),
('background_coherence', 'Background Coherence'),
('anatomy_hands_eyes', 'Anatomy / Hands & Eyes'),
('context_objects', 'Context & Objects')
] %}
{% set comp = bd[comp_key] %}
{% set sc2 = comp.score if comp else 75 %}
{% set bar_cls = 'vlm-real' if sc2 >= 70 else ('vlm-warn' if sc2 >= 40 else 'vlm-fake') %}
| {{ comp_label }} |
{{ sc2 }}/100 |
|
{{ comp.notes if comp else '' }} |
{% endfor %}
{% endif %}
{% endif %}{# end image #}
{# ══════════ VIDEO ══════════ #}
{% if media_type == 'video' %}
Frame-Level Analysis
| Metric | Value |
| Frames sampled | {{ explainability.num_frames_sampled }} |
| Frames with face | {{ explainability.num_face_frames }} |
| Suspicious frames | {{ explainability.num_suspicious_frames }} |
| Mean suspicious prob | {{ '%.1f' | format(explainability.mean_suspicious_prob * 100) }}% |
| Max suspicious prob | {{ '%.1f' | format(explainability.max_suspicious_prob * 100) }}% |
| Insufficient faces | {{ explainability.insufficient_faces }} |
{% endif %}
{# ══════════ TEXT ══════════ #}
{% if media_type == 'text' %}
{# Language + truth-override #}
{% if explainability.detected_language and explainability.detected_language != 'en' %}
Language
Detected: {{ explainability.detected_language | upper }} — analysed via multilingual model
{% endif %}
{% if explainability.truth_override and explainability.truth_override.applied %}
Truth-override applied.
Corroborated by {{ explainability.truth_override.source_name }}
({{ '%.0f' | format(explainability.truth_override.similarity * 100) }}% similarity).
Fake probability reduced from {{ '%.1f' | format(explainability.truth_override.fake_prob_before * 100) }}%
to {{ '%.1f' | format(explainability.truth_override.fake_prob_after * 100) }}%.
{% endif %}
Text Classification
| Metric | Value |
| Fake probability | {{ '%.1f' | format(explainability.fake_probability * 100) }}% |
| Top label | {{ explainability.top_label }} |
| Sensationalism score | {{ explainability.sensationalism.score }}/100 ({{ explainability.sensationalism.level }}) |
| Exclamations | {{ explainability.sensationalism.exclamation_count }} |
| ALL CAPS words | {{ explainability.sensationalism.caps_word_count }} |
| Clickbait matches | {{ explainability.sensationalism.clickbait_matches }} |
| Emotional words | {{ explainability.sensationalism.emotional_word_count }} |
{% if explainability.manipulation_indicators %}
Manipulation Indicators ({{ explainability.manipulation_indicators | length }})
| Pattern | Severity | Matched text |
{% for m in explainability.manipulation_indicators %}
| {{ m.pattern_type }} |
{{ m.severity }} |
{{ m.matched_text }} |
{% endfor %}
{% endif %}
{% if explainability.keywords %}
Extracted Keywords
{% for kw in explainability.keywords %}{{ kw }}{% endfor %}
{% endif %}
{% endif %}{# end text #}
{# ══════════ SCREENSHOT ══════════ #}
{% if media_type == 'screenshot' %}
{% if explainability.detected_language and explainability.detected_language != 'en' %}
Detected language: {{ explainability.detected_language | upper }}
{% endif %}
{% if explainability.truth_override and explainability.truth_override.applied %}
Truth-override applied. {{ explainability.truth_override.source_name }}
({{ '%.0f' | format(explainability.truth_override.similarity * 100) }}% similarity)
{% endif %}
Extracted Text
{{ explainability.ocr_boxes | length }} OCR regions detected
| {{ explainability.extracted_text }} |
Analysis Summary
| Metric | Value |
| Fake probability | {{ '%.1f' | format(explainability.fake_probability * 100) }}% |
| Sensationalism | {{ explainability.sensationalism.score }}/100 ({{ explainability.sensationalism.level }}) |
| Suspicious phrases | {{ explainability.suspicious_phrases | length }} |
| Layout anomalies | {{ explainability.layout_anomalies | length }} |
{% if explainability.suspicious_phrases %}
Suspicious Phrases
| Text | Pattern | Severity |
{% for p in explainability.suspicious_phrases %}
| {{ p.text }} |
{{ p.pattern_type }} |
{{ p.severity }} |
{% endfor %}
{% endif %}
{% endif %}{# end screenshot #}
{# ══════════ SOURCES (all types) ══════════ #}
{% if trusted_sources %}
Trusted Source Cross-Reference ({{ trusted_sources | length }})
| Source | Title | Relevance |
{% for s in trusted_sources %}
| {{ s.source_name }} |
{{ s.title }} |
{{ '%.0f' | format(s.relevance_score * 100) }}% |
{% endfor %}
{% endif %}
{% if contradicting_evidence %}
Contradicting Evidence ({{ contradicting_evidence | length }})
| Source | Title | Type |
{% for c in contradicting_evidence %}
| {{ c.source_name }} | {{ c.title }} | {{ c.type }} |
{% endfor %}
{% endif %}
{# ══════════ PROCESSING ══════════ #}
Processing Summary
Model: {{ processing_summary.model_used }} · Duration: {{ processing_summary.total_duration_ms }} ms
{{ processing_summary.stages_completed | join(' → ') }}
{# ══════════ FOOTER ══════════ #}