"""initial_schema Revision ID: e1909678e89e Revises: Create Date: 2026-04-07 01:50:18.571150 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision: str = 'e1909678e89e' down_revision: Union[str, None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table('response_cache', sa.Column('config_hash', sa.String(length=64), nullable=False), sa.Column('response', sa.Text(), nullable=False), sa.Column('model', sa.String(length=255), nullable=False), sa.Column('tokens_in', sa.Integer(), nullable=True), sa.Column('tokens_out', sa.Integer(), nullable=True), sa.Column('latency_ms', sa.Integer(), nullable=True), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.PrimaryKeyConstraint('config_hash') ) op.create_table('users', sa.Column('id', sa.Uuid(), nullable=False), sa.Column('username', sa.String(length=255), nullable=False), sa.Column('password_hash', sa.String(length=255), nullable=False), sa.Column('is_admin', sa.Boolean(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('username') ) op.create_table('webhook_configs', sa.Column('id', sa.Uuid(), nullable=False), sa.Column('event_type', sa.String(length=255), nullable=False), sa.Column('url', sa.String(length=2048), nullable=False), sa.Column('headers', sa.JSON(), nullable=True), sa.Column('is_active', sa.Boolean(), nullable=False), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('webhook_configs', schema=None) as batch_op: batch_op.create_index('ix_webhook_configs_event_type', ['event_type'], unique=False) op.create_table('projects', sa.Column('id', sa.Uuid(), nullable=False), sa.Column('name', sa.String(length=255), nullable=False), sa.Column('description', sa.Text(), nullable=True), sa.Column('owner_id', sa.Uuid(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['owner_id'], ['users.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) op.create_table('experiments', sa.Column('id', sa.Uuid(), nullable=False), sa.Column('project_id', sa.Uuid(), nullable=False), sa.Column('name', sa.String(length=255), nullable=False), sa.Column('description', sa.Text(), nullable=True), sa.Column('sample_data', sa.JSON(), nullable=True), sa.Column('pipeline_stages', sa.JSON(), nullable=True), sa.Column('scoring_config', sa.JSON(), nullable=True), sa.Column('parameter_space', sa.JSON(), nullable=True), sa.Column('status', sa.Enum('draft', 'running', 'paused', 'completed', name='experiment_status'), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('experiments', schema=None) as batch_op: batch_op.create_index('ix_experiments_project_id', ['project_id'], unique=False) batch_op.create_index('ix_experiments_status', ['status'], unique=False) op.create_table('runs', sa.Column('id', sa.Uuid(), nullable=False), sa.Column('experiment_id', sa.Uuid(), nullable=False), sa.Column('config_hash', sa.String(length=64), nullable=False), sa.Column('config', sa.JSON(), nullable=False), sa.Column('status', sa.Enum('pending', 'running', 'completed', 'failed', 'cached', name='run_status'), nullable=False), sa.Column('started_at', sa.DateTime(timezone=True), nullable=True), sa.Column('completed_at', sa.DateTime(timezone=True), nullable=True), sa.Column('duration_ms', sa.Integer(), nullable=True), sa.Column('tokens_in', sa.Integer(), nullable=True), sa.Column('tokens_out', sa.Integer(), nullable=True), sa.Column('cost_estimate', sa.Numeric(precision=12, scale=6), nullable=True), sa.ForeignKeyConstraint(['experiment_id'], ['experiments.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('runs', schema=None) as batch_op: batch_op.create_index('ix_runs_config_hash', ['config_hash'], unique=False) batch_op.create_index('ix_runs_experiment_id', ['experiment_id'], unique=False) batch_op.create_index('ix_runs_status', ['status'], unique=False) op.create_table('scores', sa.Column('id', sa.Uuid(), nullable=False), sa.Column('run_id', sa.Uuid(), nullable=False), sa.Column('scorer_name', sa.String(length=255), nullable=False), sa.Column('value', sa.Float(), nullable=False), sa.Column('metadata', sa.JSON(), nullable=True), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['run_id'], ['runs.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('scores', schema=None) as batch_op: batch_op.create_index('ix_scores_run_id', ['run_id'], unique=False) batch_op.create_index('ix_scores_scorer_name', ['scorer_name'], unique=False) op.create_table('stage_results', sa.Column('id', sa.Uuid(), nullable=False), sa.Column('run_id', sa.Uuid(), nullable=False), sa.Column('stage_index', sa.Integer(), nullable=False), sa.Column('prompt_sent', sa.Text(), nullable=False), sa.Column('response_raw', sa.Text(), nullable=False), sa.Column('model_used', sa.String(length=255), nullable=False), sa.Column('parameters', sa.JSON(), nullable=True), sa.Column('tokens_in', sa.Integer(), nullable=True), sa.Column('tokens_out', sa.Integer(), nullable=True), sa.Column('latency_ms', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['run_id'], ['runs.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('stage_results', schema=None) as batch_op: batch_op.create_index('ix_stage_results_run_id', ['run_id'], unique=False) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table('stage_results', schema=None) as batch_op: batch_op.drop_index('ix_stage_results_run_id') op.drop_table('stage_results') with op.batch_alter_table('scores', schema=None) as batch_op: batch_op.drop_index('ix_scores_scorer_name') batch_op.drop_index('ix_scores_run_id') op.drop_table('scores') with op.batch_alter_table('runs', schema=None) as batch_op: batch_op.drop_index('ix_runs_status') batch_op.drop_index('ix_runs_experiment_id') batch_op.drop_index('ix_runs_config_hash') op.drop_table('runs') with op.batch_alter_table('experiments', schema=None) as batch_op: batch_op.drop_index('ix_experiments_status') batch_op.drop_index('ix_experiments_project_id') op.drop_table('experiments') op.drop_table('projects') with op.batch_alter_table('webhook_configs', schema=None) as batch_op: batch_op.drop_index('ix_webhook_configs_event_type') op.drop_table('webhook_configs') op.drop_table('users') op.drop_table('response_cache') # ### end Alembic commands ###