"""add stateful OpenAI Responses records Revision ID: 20260826_0024 Revises: 20260818_0023 """ from __future__ import annotations from collections.abc import Sequence from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql revision: str = "20260826_0024" down_revision: str | Sequence[str] | None = "20260818_0023" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.create_table( "openai_responses", sa.Column("id", sa.String(length=40), nullable=False), sa.Column("api_key_id", sa.String(length=40), nullable=False), sa.Column("assistant_id", sa.String(length=40), nullable=True), sa.Column("conversation_id", sa.String(length=40), nullable=False), sa.Column("previous_response_id", sa.String(length=40), nullable=True), sa.Column( "status", sa.String(length=16), server_default="in_progress", nullable=False ), sa.Column( "input_items", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'[]'::jsonb"), nullable=False, ), sa.Column( "output_items", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'[]'::jsonb"), nullable=False, ), sa.Column( "context_messages", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'[]'::jsonb"), nullable=False, ), sa.Column( "runtime_state", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False, ), sa.Column( "error", postgresql.JSONB(astext_type=sa.Text()), nullable=True ), sa.Column( "dynamic_variables", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False, ), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True), sa.Column( "updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.ForeignKeyConstraint( ["api_key_id"], ["realtime_api_keys.id"], ondelete="CASCADE" ), sa.ForeignKeyConstraint( ["assistant_id"], ["assistants.id"], ondelete="SET NULL" ), sa.ForeignKeyConstraint( ["conversation_id"], ["conversation_sessions.id"], ondelete="CASCADE" ), sa.ForeignKeyConstraint( ["previous_response_id"], ["openai_responses.id"], ondelete="SET NULL" ), sa.PrimaryKeyConstraint("id"), ) for column in ( "api_key_id", "assistant_id", "conversation_id", "previous_response_id", "status", ): op.create_index( f"ix_openai_responses_{column}", "openai_responses", [column] ) def downgrade() -> None: op.drop_table("openai_responses")