Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
652 changes: 0 additions & 652 deletions RELEASE_AUDIT.md

This file was deleted.

4 changes: 3 additions & 1 deletion backend/alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
fileConfig(config.config_file_name)

# Import models here when business contexts are created
target_metadata = None
from app.infrastructure.database.models.base import Base # noqa: E402

target_metadata = Base.metadata


def run_migrations_offline() -> None:
Expand Down
66 changes: 66 additions & 0 deletions backend/alembic/versions/001_create_evaluations_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""Create evaluations table.

Revision ID: 001
Revises:
Create Date: 2026-07-29
"""

from __future__ import annotations

from typing import TYPE_CHECKING

import sqlalchemy as sa

from alembic import op

if TYPE_CHECKING:
from collections.abc import Sequence


# revision identifiers
revision: str = "001"
down_revision: str | None = None
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
"""Create the evaluations table."""
op.create_table(
"evaluations",
sa.Column("id", sa.String(36), primary_key=True),
sa.Column("project_id", sa.String(36), nullable=False, index=True),
sa.Column("dataset_id", sa.String(36), nullable=True),
sa.Column("name", sa.String(255), nullable=False),
sa.Column("description", sa.Text, nullable=True),
sa.Column("provider", sa.String(100), nullable=False),
sa.Column("model", sa.String(100), nullable=False),
sa.Column("metrics", sa.JSON, nullable=False, server_default="[]"),
sa.Column("tags", sa.JSON, nullable=False, server_default="[]"),
sa.Column("configuration", sa.JSON, nullable=False, server_default="{}"),
sa.Column("status", sa.String(20), nullable=False, server_default="draft", index=True),
sa.Column("created_by", sa.String(100), nullable=True),
sa.Column("version", sa.Integer, nullable=False, server_default="1"),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
sa.Column(
"updated_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
sa.UniqueConstraint(
"project_id",
"name",
name="uq_evaluation_project_name",
),
)


def downgrade() -> None:
"""Drop the evaluations table."""
op.drop_table("evaluations")
88 changes: 88 additions & 0 deletions backend/alembic/versions/002_create_evaluation_runs_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
"""Create evaluation_runs table.

Revision ID: 002
Revises: 001
Create Date: 2026-07-29
"""

from __future__ import annotations

from typing import TYPE_CHECKING

import sqlalchemy as sa

from alembic import op

if TYPE_CHECKING:
from collections.abc import Sequence


# revision identifiers
revision: str = "002"
down_revision: str | None = "001"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
"""Create the evaluation_runs table."""
op.create_table(
"evaluation_runs",
sa.Column("id", sa.String(36), primary_key=True),
sa.Column(
"evaluation_id",
sa.String(36),
sa.ForeignKey("evaluations.id"),
nullable=True,
index=True,
),
sa.Column("evaluation_name", sa.String(255), nullable=False),
sa.Column("workflow_id", sa.String(255), nullable=True),
sa.Column("provider", sa.String(100), nullable=False),
sa.Column("model", sa.String(100), nullable=False),
sa.Column("status", sa.String(20), nullable=False, index=True),
sa.Column("priority", sa.String(20), nullable=False, server_default="normal"),
sa.Column("items_total", sa.Integer, nullable=False, server_default="0"),
sa.Column("items_completed", sa.Integer, nullable=False, server_default="0"),
sa.Column("items_failed", sa.Integer, nullable=False, server_default="0"),
sa.Column("token_input", sa.Integer, nullable=False, server_default="0"),
sa.Column("token_output", sa.Integer, nullable=False, server_default="0"),
sa.Column("cost", sa.Float, nullable=False, server_default="0"),
sa.Column(
"average_latency_ms",
sa.Integer,
nullable=False,
server_default="0",
),
sa.Column("failure_reason", sa.Text, nullable=True),
sa.Column("config", sa.JSON, nullable=False, server_default="{}"),
sa.Column("profile", sa.JSON, nullable=False, server_default="{}"),
sa.Column("metadata", sa.JSON, nullable=False, server_default="{}"),
sa.Column("started_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("cancelled_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("version", sa.Integer, nullable=False, server_default="1"),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
sa.Column(
"updated_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
)
op.create_index(
"ix_evaluation_runs_created_at",
"evaluation_runs",
["created_at"],
)


def downgrade() -> None:
"""Drop the evaluation_runs table."""
op.drop_index("ix_evaluation_runs_created_at", table_name="evaluation_runs")
op.drop_table("evaluation_runs")
70 changes: 70 additions & 0 deletions backend/alembic/versions/003_create_metric_results_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"""Create metric_results table.

Revision ID: 003
Revises: 002
Create Date: 2026-07-29
"""

from __future__ import annotations

from typing import TYPE_CHECKING

import sqlalchemy as sa

from alembic import op

if TYPE_CHECKING:
from collections.abc import Sequence


# revision identifiers
revision: str = "003"
down_revision: str | None = "002"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
"""Create the metric_results table."""
op.create_table(
"metric_results",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("run_id", sa.String(36), nullable=False, index=True),
sa.Column("item_id", sa.String(36), nullable=False, index=True),
sa.Column("metric_name", sa.String(100), nullable=False, index=True),
sa.Column("score", sa.Float, nullable=False, server_default="0"),
sa.Column("normalized_score", sa.Float, nullable=False, server_default="0"),
sa.Column("raw_output", sa.Text, nullable=False, server_default=""),
sa.Column("reasoning", sa.Text, nullable=False, server_default=""),
sa.Column("metadata", sa.JSON, nullable=False, server_default="{}"),
sa.Column(
"execution_time_ms",
sa.Integer,
nullable=False,
server_default="0",
),
sa.Column("error", sa.Text, nullable=True),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
)
op.create_index(
"ix_metric_results_run_metric",
"metric_results",
["run_id", "metric_name"],
)
op.create_index(
"ix_metric_results_run_item",
"metric_results",
["run_id", "item_id"],
)


def downgrade() -> None:
"""Drop the metric_results table."""
op.drop_index("ix_metric_results_run_item", table_name="metric_results")
op.drop_index("ix_metric_results_run_metric", table_name="metric_results")
op.drop_table("metric_results")
66 changes: 66 additions & 0 deletions backend/alembic/versions/004_create_agent_definitions_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""Create agent_definitions table.

Revision ID: 004
Revises: 003
Create Date: 2026-07-29
"""

from __future__ import annotations

from typing import TYPE_CHECKING

import sqlalchemy as sa

from alembic import op

if TYPE_CHECKING:
from collections.abc import Sequence


# revision identifiers
revision: str = "004"
down_revision: str | None = "003"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
"""Create the agent_definitions table."""
op.create_table(
"agent_definitions",
sa.Column("id", sa.String(36), primary_key=True),
sa.Column("project_id", sa.String(36), nullable=False, index=True),
sa.Column("name", sa.String(255), nullable=False),
sa.Column("description", sa.Text, nullable=True),
sa.Column("agent_type", sa.String(20), nullable=False, server_default="llm"),
sa.Column("model", sa.String(100), nullable=False),
sa.Column("provider", sa.String(100), nullable=False),
sa.Column("capabilities", sa.JSON, nullable=False, server_default="[]"),
sa.Column("config", sa.JSON, nullable=False, server_default="{}"),
sa.Column("endpoint", sa.Text, nullable=True),
sa.Column("status", sa.String(20), nullable=False, server_default="active", index=True),
sa.Column("created_by", sa.String(100), nullable=True),
sa.Column("version", sa.Integer, nullable=False, server_default="1"),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
sa.Column(
"updated_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
sa.UniqueConstraint(
"project_id",
"name",
name="uq_agent_project_name",
),
)


def downgrade() -> None:
"""Drop the agent_definitions table."""
op.drop_table("agent_definitions")
Loading
Loading