{% extends "base.html" %} {% block breadcrumbs %} › {{ opts.app_label }} › {{ opts.verbose_name_plural }}{% endblock %} {% block title %}{{ opts.label }} — {{ site_title }}{% endblock %} {% block content %}

{{ opts.verbose_name_plural.title() }}

{{ opts.kind }} {{ opts.label }} {% if opts.description %}— {{ opts.description }}{% endif %}

Declaration

{% for f in schema.fields %} {% else %} {% endfor %}
FieldTypeRequiredDetail
{{ f.name }}{% if f.target %} target{% endif %} {{ f['class'] }} {{ 'yes' if f.required else 'no' }} {%- for k, v in f.items() if k not in ('name','class','kind','required','null','target') -%} {{ k }}={{ v | short(40) }}{% if not loop.last %}, {% endif %} {%- endfor -%}
No fields declared.
{% if summary %}

Configuration

{% for k, v in summary.items() %}
{{ k }}
{{ v | short(300) }}
{% endfor %}
{% endif %} {% if opts.kind == 'dataset' %}

Data preview

{% if message %}

{{ message }}

{% endif %}
{% if entry.get_search_fields() %} {% endif %} {% for name, values in filter_values.items() %} {% endfor %}
{% if periods %}

All dates {% for p in periods %} · {{ p }} {% endfor %}

{% endif %} {% if preview_error %}

Could not read the source: {{ preview_error }}

{% elif rows %}
{% if actions %}
Tick the rows to act on.
{% endif %}
{% if actions %}{% endif %} {% for c in columns %}{% endfor %} {% for row in rows %} {% if actions %} {% endif %} {% for c in columns %}{% endfor %} {% endfor %}
{{ c }}
{{ entry.render(row, c) }}
{% if page_no > 1 %}← previous{% endif %} page {{ page_no }} {% if has_next %}next →{% endif %}
{% else %}

No rows matched.

{% endif %}

Materialised versions

{% if versions %}
{% for v in versions %} {% endfor %}
VersionRowsSchemaContentNotesCreated
v{{ v.version }} {{ v.row_count | number }} {{ v.fingerprint }} {{ (v.content_hash or '')[:12] }} {{ v.notes | short(60) }} {{ v.created_at.strftime('%Y-%m-%d %H:%M') }}
{% else %}

Not materialised yet.

{% endif %}
{% endif %} {% if opts.kind == 'model' %}

Registered versions

{% if versions %}
{% for v in versions %} {% endfor %}
VersionStageMetricsParamsCreated
v{{ v.version }} {{ v.stage }} {% for k, val in (v.metrics or {}).items() %}{{ k }}={{ val | number }} {% endfor %} {{ v.params | short(80) }} {{ v.created_at.strftime('%Y-%m-%d %H:%M') }}
{% else %}

Not trained yet.

{% endif %}
{% if drift %}

Input drift

{{ drift.rows }} logged prediction{{ '' if drift.rows == 1 else 's' }} from the last {{ drift.days }} days, against what v{{ drift.version }} was trained on.

{% for column in drift.columns %} {% endfor %}
ColumnKindRowsPSIVerdict
{{ column.name }} {{ column.kind }} {{ column.count | number }} {{ '%.4f' | format(column.psi) }} {{ column.verdict }}

Population stability index: below 0.1 stable, 0.1–0.25 moderate, above 0.25 significant.

{% endif %} {% if importances %}

Feature importance

What v{{ importances.version }} weighted most heavily{% if importances.total > importances.rows | length %} — top {{ importances.rows | length }} of {{ importances.total }}{% endif %}.{% if importances.signed %} A hollow bar is a weight that argues the other way.{% endif %}

{% for row in importances.rows %} {% endfor %}
{{ row.name | short(48) }} {{ row.value | number }}
{% endif %} {% endif %} {% if eval_diff %}

Since the previous run

{{ eval_diff.left }} → {{ eval_diff.right }}, {{ eval_diff.cases }} shared case{{ '' if eval_diff.cases == 1 else 's' }}.

pass rate
{{ '%.4f' | format(eval_diff.pass_rate.left) }} → {{ '%.4f' | format(eval_diff.pass_rate.right) }} ({{ '%+.4f' | format(eval_diff.pass_rate.delta) }})
fixed
{{ eval_diff.fixed }} case{{ '' if eval_diff.fixed == 1 else 's' }} that had been failing
broke
{% if eval_diff.broke %}{{ eval_diff.broke }}{% else %}0{% endif %} case{{ '' if eval_diff.broke == 1 else 's' }} that had been passing
{% if eval_diff.significance.discordant %}
verdict
{{ eval_diff.significance.verdict }}
{% endif %}
{% if eval_diff.config.changed or eval_diff.config.version %}

What changed about it

{% if eval_diff.config.version %}
version
{{ eval_diff.config.version.was }} → {{ eval_diff.config.version.now }}
{% endif %} {% for key, entry in eval_diff.config.changed.items() %}
{{ key }}
{% if entry.long %}changed ({{ (entry.was or '') | length }} → {{ (entry.now or '') | length }} chars){% else %}{{ entry.was }} → {{ entry.now }}{% endif %}
{% endfor %}
{% elif eval_diff.config.identical %}

Nothing about the target changed — the difference is its own.

{% endif %} {% for side, cases in (('older', eval_diff.only_left), ('newer', eval_diff.only_right)) %} {% if cases %}

{{ cases | length }} case{{ '' if cases | length == 1 else 's' }} only in the {{ side }} run — a suite that changed is not the same suite: {{ cases[:5] | join(', ') }}{% if cases | length > 5 %}…{% endif %}

{% endif %} {% endfor %} {% if eval_diff.changes %}
{% for row in eval_diff.changes %} {% endfor %}
CaseWasNowBeforeAfterExpected
{{ row.case }} {{ row.was }} {{ row.now }} {{ row.left | short(40) }} {{ row.right | short(40) }} {{ row.expected | short(30) }}
{% endif %}
{% endif %} {% if opts.kind in ('model', 'eval') %}

Runs

{% if runs %}
{% for run in runs %} {% endfor %}
RunStatusSummaryStartedDuration
{{ run.short_id }} {{ run.status }} {% for k, val in (run.summary or {}).items() %}{{ k }}={{ val | number }} {% endfor %} {{ run.started_at.strftime('%Y-%m-%d %H:%M') }} {{ run.duration_s | duration }}
{% else %}

No runs yet.

{% endif %}
{% endif %} {% if opts.kind == 'agent' %} {% if agent_versions %}

Recorded versions

An agent's behaviour is its declaration, so a version is the declaration rather than a file. Tools are recorded by name: the code behind them comes from whatever is imported when the agent runs.

{% for v in agent_versions.rows %} {% endfor %}
VersionStageFingerprintToolsRecorded
v{{ v.version }} {{ v.stage }} {{ v.fingerprint[:12] }} {{ (v.tools or []) | join(', ') or '—' }} {{ v.created_at.strftime('%Y-%m-%d %H:%M') }} {% if agent_versions.current == v.version %}current{% endif %}
{% if agent_versions.current is none %}

The declaration has changed since the last recorded version — what is written down and what would run have parted company.

{% endif %}
{% endif %}

Recent traces

{% if traces %}
{% for t in traces %} {% endfor %}
TraceInputOutputStepsTokensStatus
{{ t.short_id }} {{ t.input | short(50) }} {{ t.output | short(50) }} {{ t.steps }} {{ t.total_tokens | number }} {{ t.status }}
{% else %}

This agent has not run yet.

{% endif %}
{% endif %} {% endblock %}