{% extends "base.html" %} {% from "macros.html" import src_link, item_href, event_link, flags %} {% set c = view.call %} {% block title %}Turn {{ view.number }}{% endblock %} {% block crumbs %} › {{ src_link(source) }} › {{ c.work_item or "agent" }} › {% if view.run %}{{ view.run.kind }} {{ view.run.role }} › {% endif %}turn {{ view.number }}{% endblock %} {% block main %}

Turn {{ view.number }}{% if c.purpose %}: {{ c.purpose }}{% endif %} {{ flags(view.flags) }}

{{ c.outcome }}
Role{{ c.role or "—" }}Time{{ c.at|when }}, {{ "%.2f"|format(c.seconds) }}s
Model asked{{ c.model }}Answered by{{ c.answered_by or "—" }}
Tokens{{ c.tokens_in|num }} in · {{ c.tokens_out|num }} outPrompt reuse (server){{ view.reused or "not reported" }}
Estimate{{ c.estimate|num }} tokens (factor {{ c.factor }})Route{{ c.route or "—" }}, HTTP {{ c.status or "—" }}
OutcomeFitting{% if c.trim %}{{ c.trim|pretty }}{% else %}nothing cut{% endif %}
{% if c.error %}
{{ c.error }}
{% endif %}

The reply

{% if view.reply.reasoning %}
Reasoning ({{ view.reply.reasoning|length|num }} characters)
{{ view.reply.reasoning }}
{% endif %} {% if view.reply.text %}
{{ view.reply.text }}
{% endif %} {% for tool, args in view.reply.calls %}
tool call {{ tool }}
{{ args|pretty }}
{% endfor %} {% if not view.reply.text and not view.reply.calls and not view.reply.reasoning %}

No reply recorded.

{% endif %} {% if view.reply.finish %}

Finish reason: {{ view.reply.finish }}

{% endif %}

The request

{% if view.settings %} {% for k, v in view.settings.items() %}{% endfor %}
{{ k }}{{ v|pretty }}
{% endif %} {% if view.tools %}
{{ view.tools|length }} tools offered{% if view.tools_changed %} changed since the turn before{% endif %}

{{ view.tools|join(", ") }}

{% endif %} {% if view.compared %}

Messages marked new weren't in the turn before. first change marks where this request first differs from the last one: prompt reuse can't go past it. The server reused {{ view.reused or "an unreported number of" }} tokens.

{% endif %} {% if view.match_note %}

{{ view.match_note }}

{% endif %} {% for m in view.messages %}
{{ m.role }}{% if m.index >= 0 %} #{{ m.index }}{% endif %} {% if m.new %}new{% endif %} {% if m.first_change %}first change{% endif %} {% if m.tool_call_id %}result of {{ m.tool_call_id }}{% endif %} {{ m.text|length|num }} characters
{% if m.role == "system" %}
System prompt
{{ m.text }}
{% elif m.text %}
{{ m.text }}
{% endif %} {% for id, tool, args in m.tool_calls %}
tool call {{ tool }} {{ id }}
{{ args|pretty }}
{% endfor %} {% if m.events %} {% endif %}
{% endfor %} {% if view.unmatched %}

Events sent{% if view.match_note %}, not matched to messages{% else %} but replaced by a compaction{% endif %}

{% endif %} {% if view.compacted %}

Replaced by compaction

{{ view.compacted|length }} events of the log stood behind a compaction in this request: {% for e, comp in view.compacted %}{{ event_link(source, e) }}{% if comp %} → {{ event_link(source, comp) }}{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}

{% endif %} {% if view.dropped %}

Dropped by fitting

{% endif %}

Raw

Request JSON, exactly as sent ({{ view.raw_request|length|num }} characters)
{{ view.raw_request or "(not recorded)" }}
Response JSON, as received ({{ view.raw_response|length|num }} characters)
{{ view.raw_response or "(not recorded)" }}
{% endblock %}