"""add workflow_graph_state and system_event_log tables Revision ID: 0002_graph_and_logs Revises: 0001_initial Create Date: 2026-06-02 00:00:00 """ from typing import Sequence, Union import sqlalchemy as sa from sqlalchemy.dialects import postgresql from alembic import op revision: str = "0002_graph_and_logs" down_revision: Union[str, None] = "0001_initial" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( "workflow_graph_state", sa.Column("trace_id", sa.String(64), primary_key=True, comment="对应的工作流 Trace ID"), sa.Column("history", postgresql.JSONB(), nullable=False, server_default="[]", comment="pydantic_graph history JSON"), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()), ) op.create_table( "system_event_log", sa.Column("id", sa.Integer, primary_key=True, autoincrement=True), sa.Column("trace_id", sa.String(64), nullable=False, comment="关联的工作流 trace_id"), sa.Column("event_type", sa.String(50), nullable=False, comment="事件类型"), sa.Column("level", sa.String(10), nullable=False, server_default="info", comment="日志级别"), sa.Column("node_name", sa.String(100), nullable=True, comment="相关节点名称"), sa.Column("message", sa.Text, nullable=False, comment="日志消息正文"), sa.Column("extra_data", postgresql.JSONB(), nullable=True, comment="附加元数据"), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()), ) op.create_index("ix_system_event_log_trace_id", "system_event_log", ["trace_id"]) op.create_index("ix_system_event_log_event_type", "system_event_log", ["event_type"]) op.create_index("ix_system_event_log_level", "system_event_log", ["level"]) op.create_index("ix_system_event_log_created_at", "system_event_log", ["created_at"]) def downgrade() -> None: op.drop_table("system_event_log") op.drop_table("workflow_graph_state")