Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
76d5e23
refactor: extract the artifact list out of the explainer plot
Irozuku Aug 3, 2026
7639697
feat: add the evaluation reports backend
Irozuku Aug 3, 2026
11bc78c
feat: add the evaluation reports view
Irozuku Aug 3, 2026
0138b40
fix: drag reports onto the central panel as reports
Irozuku Aug 3, 2026
2a504f8
fix: edit the colorscale of heatmaps that own it
Irozuku Aug 3, 2026
f16e3ca
feat: add a reverse toggle to the colorscale selector
Irozuku Aug 3, 2026
696014c
feat: persist plot edits made to a report
Irozuku Aug 3, 2026
f04f38b
fix: keep a plot edit when a grouped selector changes entry
Irozuku Aug 3, 2026
be2073d
feat: show a report's job status as a dot on its card
Irozuku Aug 3, 2026
b1c3554
feat: confirm before deleting a report
Irozuku Aug 3, 2026
64f7974
fix: order reports oldest first so new ones land at the bottom
Irozuku Aug 3, 2026
dbd509b
feat: match the explainer list interaction on the reports tab
Irozuku Aug 3, 2026
c6e82b8
perf: stop the reports tab flashing a spinner on every refresh
Irozuku Aug 3, 2026
955efd2
perf: stop ancestor re-renders relayouting every mounted plot
Irozuku Aug 3, 2026
00fa06e
feat: one report covers every evaluation partition
Irozuku Aug 4, 2026
70f96cc
feat: add a parameterless report on the click, without a dialog
Irozuku Aug 4, 2026
6f16121
Merge branch 'develop' into feat/evaluation-reports
Irozuku Sep 7, 2026
257fc1b
refactor: reuse the shared plot override body in reports
Irozuku Sep 7, 2026
615d1ce
feat: report on the partitions of any evaluation strategy
Irozuku Sep 7, 2026
5d758a5
fix: undo a plot edit on a report or explainer
Irozuku Sep 7, 2026
dfa2e73
fix: report only on partitions a run can actually predict
Irozuku Sep 7, 2026
0db6393
feat: add forecasting and translation evaluation reports
Irozuku Sep 7, 2026
2a35a08
fix: make parameters and created fields nullable in Report model
Irozuku Sep 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""merge reports and develop heads

Revision ID: b7e4d2a19c63
Revises: a5f2c71e9d40, e6c3b91a7d48
Create Date: 2026-09-07 12:00:00.000000

"""

from typing import Sequence, Union

# revision identifiers, used by Alembic.
revision: str = "b7e4d2a19c63"
down_revision: Union[str, Sequence[str], None] = ("a5f2c71e9d40", "e6c3b91a7d48")
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
pass


def downgrade() -> None:
pass
57 changes: 57 additions & 0 deletions DashAI/alembic/versions/e6c3b91a7d48_add_report_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"""add report table

Revision ID: e6c3b91a7d48
Revises: c4e8a1d20f3b
Create Date: 2026-07-30

"""

from typing import Sequence, Union

import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision: str = "e6c3b91a7d48"
down_revision: Union[str, None] = "c4e8a1d20f3b"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
"""Create the table holding evaluation reports of a run."""
op.create_table(
"report",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("run_id", sa.Integer(), nullable=False),
sa.Column("huey_id", sa.String(), nullable=True),
sa.Column("report_name", sa.String(), nullable=False),
sa.Column("parameters", sa.JSON(), nullable=True),
sa.Column("artifacts_path", sa.String(), nullable=True),
sa.Column("plot_overrides", sa.JSON(), nullable=True),
sa.Column("created", sa.DateTime(), nullable=True),
sa.Column(
"status",
sa.Enum(
"NOT_STARTED",
"DELIVERED",
"STARTED",
"FINISHED",
"ERROR",
name="reportstatus",
),
nullable=False,
),
sa.ForeignKeyConstraint(
["run_id"],
["run.id"],
name=op.f("fk_report_run_id_run"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_report")),
)


def downgrade() -> None:
"""Drop the report table."""
op.drop_table("report")
2 changes: 2 additions & 0 deletions DashAI/back/api/api_v1/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from DashAI.back.api.api_v1.endpoints.predict import router as predict
from DashAI.back.api.api_v1.endpoints.prompts import router as prompts
from DashAI.back.api.api_v1.endpoints.rag import router as rag
from DashAI.back.api.api_v1.endpoints.reports import router as reports
from DashAI.back.api.api_v1.endpoints.runs import router as runs
from DashAI.back.api.api_v1.endpoints.statistical_tests import (
router as statistical_tests,
Expand All @@ -38,6 +39,7 @@
api_router_v1.include_router(documents, prefix="/document")
api_router_v1.include_router(model_sessions, prefix="/model-session")
api_router_v1.include_router(explainers, prefix="/explainer")
api_router_v1.include_router(reports, prefix="/report")
api_router_v1.include_router(explorers, prefix="/explorer")
api_router_v1.include_router(jobs, prefix="/job")
api_router_v1.include_router(runs, prefix="/run")
Expand Down
Empty file modified DashAI/back/api/api_v1/endpoints/explainers.py
100644 → 100755
Empty file.
Loading
Loading