promptlooper/alembic/versions/e1909678e89e_initial_schema.py

165 lines
7.5 KiB
Python

"""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 ###