priv/repo/migrations/20260822234211_create_account_chat_runs_and_events.exs

main at 58e6347eeb72 · 1 KB

defmodule OpenAgents.Repo.Migrations.CreateAccountChatRunsAndEvents do
  use Ecto.Migration

  def change do
    create table(:account_chat_runs, primary_key: false) do
      add :id, :binary_id, primary_key: true

      add :conversation_id, references(:conversations, type: :binary_id, on_delete: :delete_all),
        null: false

      add :status, :string, null: false
      add :reasoning_effort, :string, null: false
      add :user_content, :text, null: false
      add :assistant_content, :text
      add :completion, :map
      add :error, :text
      add :started_at, :utc_datetime_usec, null: false
      add :completed_at, :utc_datetime_usec
      timestamps(type: :utc_datetime_usec)
    end

    create index(:account_chat_runs, [:conversation_id, :inserted_at])

    create unique_index(:account_chat_runs, [:conversation_id],
             where: "status = 'streaming'",
             name: :account_chat_runs_one_streaming_per_conversation
           )

    create constraint(:account_chat_runs, :account_chat_runs_status,
             check: "status IN ('streaming', 'completed', 'failed')"
           )

    create table(:account_chat_events, primary_key: false) do
      add :id, :binary_id, primary_key: true

      add :run_id, references(:account_chat_runs, type: :binary_id, on_delete: :delete_all),
        null: false

      add :sequence, :integer, null: false
      add :kind, :string, null: false
      add :payload, :map, null: false, default: %{}
      add :observed_at, :utc_datetime_usec, null: false
      timestamps(type: :utc_datetime_usec, updated_at: false)
    end

    create unique_index(:account_chat_events, [:run_id, :sequence])
    create index(:account_chat_events, [:run_id, :observed_at])

    create constraint(:account_chat_events, :account_chat_events_positive_sequence,
             check: "sequence > 0"
           )
  end
end