0005_agent_runtime.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import sqlalchemy as sa
  2. from alembic import op
  3. from sqlalchemy.dialects.mysql import BIGINT, BINARY, DATETIME
  4. revision = "0005_agent_runtime"
  5. down_revision = "0004_fulfillment"
  6. branch_labels = None
  7. depends_on = None
  8. def identifier(name, primary=False):
  9. return sa.Column(name, BINARY(16), primary_key=primary, nullable=False)
  10. def upgrade():
  11. op.create_table(
  12. "agent_runs",
  13. identifier("id", True),
  14. identifier("tenant_id"),
  15. identifier("actor_id"),
  16. identifier("store_id"),
  17. sa.Column("token_hash", BINARY(32), nullable=False),
  18. sa.Column("request_key", sa.String(64, collation="utf8mb4_bin"), nullable=False),
  19. sa.Column("request_hash", BINARY(32), nullable=False),
  20. sa.Column("messages", sa.JSON(), nullable=False),
  21. sa.Column("status", sa.String(16), nullable=False),
  22. sa.Column("next_node", sa.String(16), nullable=False),
  23. sa.Column("graph_version", sa.String(64), nullable=False),
  24. sa.Column("model_name", sa.String(128), nullable=False),
  25. sa.Column("model_url", sa.String(512), nullable=False),
  26. sa.Column("model_credential_env", sa.String(128), nullable=False),
  27. sa.Column("model_calls", sa.Integer(), nullable=False),
  28. sa.Column("step", sa.Integer(), nullable=False),
  29. sa.Column("lease_token", BIGINT(unsigned=True), nullable=False),
  30. sa.Column("lease_until", DATETIME(fsp=6), nullable=True),
  31. sa.Column("created_at", DATETIME(fsp=6), nullable=False),
  32. sa.Column("deadline_at", DATETIME(fsp=6), nullable=False),
  33. sa.Column("error_code", sa.String(64), nullable=True),
  34. sa.UniqueConstraint("tenant_id", "id", name="uq_agent_run_tenant_id"),
  35. sa.UniqueConstraint("tenant_id", "actor_id", "request_key", name="uq_agent_run_request"),
  36. sa.ForeignKeyConstraint(
  37. ["tenant_id", "actor_id"], ["principals.tenant_id", "principals.id"]
  38. ),
  39. sa.ForeignKeyConstraint(["tenant_id", "store_id"], ["stores.tenant_id", "stores.id"]),
  40. sa.CheckConstraint(
  41. "status IN ('QUEUED','RUNNING','COMPLETED','FAILED','CANCELLED')",
  42. name=op.f("ck_agent_runs_status"),
  43. ),
  44. )
  45. op.create_index("ix_agent_runs_due", "agent_runs", ["status", "created_at", "id"])
  46. op.create_table(
  47. "model_attempts",
  48. identifier("id", True),
  49. identifier("tenant_id"),
  50. identifier("run_id"),
  51. sa.Column("status", sa.String(16), nullable=False),
  52. sa.Column("usage", sa.JSON(), nullable=True),
  53. sa.Column("created_at", DATETIME(fsp=6), nullable=False),
  54. sa.ForeignKeyConstraint(["tenant_id", "run_id"], ["agent_runs.tenant_id", "agent_runs.id"]),
  55. )
  56. def downgrade():
  57. op.drop_table("model_attempts")
  58. op.drop_table("agent_runs")