Files
group_fqcd_jr/alembic/versions/20260909_agent_platform_v31.py

122 lines
8.4 KiB
Python

"""create platform increment tables"""
from alembic import op
revision = "20260909_agent_platform_v31"
down_revision = None
branch_labels = None
depends_on = None
TABLES = [
"""CREATE TABLE domain_event_outbox (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, event_id CHAR(36) NOT NULL,
event_type VARCHAR(64) NOT NULL, aggregate_type VARCHAR(32) NOT NULL,
aggregate_id VARCHAR(64) NOT NULL, trace_id VARCHAR(64) NOT NULL,
payload JSON NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'pending',
retry_count INT UNSIGNED NOT NULL DEFAULT 0, next_retry_at DATETIME(6) NULL,
last_error VARCHAR(500) NULL, occurred_at DATETIME(6) NOT NULL,
published_at DATETIME(6) NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (id), UNIQUE KEY uk_domain_event_id (event_id),
KEY idx_domain_outbox_pending (status, next_retry_at, id),
CONSTRAINT chk_domain_outbox_status CHECK (status IN ('pending','published','failed','dead'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE request_idempotency (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL,
session_id VARCHAR(64) NOT NULL, agent_type VARCHAR(32) NOT NULL,
idempotency_key VARCHAR(64) NOT NULL, request_hash CHAR(64) NOT NULL,
trace_id VARCHAR(64) NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'processing',
result_message_id BIGINT UNSIGNED NULL, error_code VARCHAR(64) NULL,
locked_until DATETIME(6) NULL, expire_at DATETIME(6) NOT NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (id), UNIQUE KEY uk_idempotency_scope (user_id,agent_type,idempotency_key),
KEY idx_idempotency_expire (expire_at), KEY idx_idempotency_trace (trace_id),
CONSTRAINT chk_idempotency_status CHECK (status IN ('processing','completed','failed'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE agent_run (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, run_id CHAR(36) NOT NULL,
idempotency_id BIGINT UNSIGNED NOT NULL, session_id VARCHAR(64) NOT NULL,
user_id BIGINT UNSIGNED NOT NULL, agent_type VARCHAR(32) NOT NULL,
trace_id VARCHAR(64) NOT NULL, request_message_id BIGINT UNSIGNED NOT NULL,
result_message_id BIGINT UNSIGNED NULL, status VARCHAR(24) NOT NULL DEFAULT 'queued',
attempt_count INT UNSIGNED NOT NULL DEFAULT 0, worker_id VARCHAR(128) NULL,
locked_until DATETIME(6) NULL, result_version INT UNSIGNED NULL, error_code VARCHAR(64) NULL,
cancel_requested_at DATETIME(6) NULL, started_at DATETIME(6) NULL, completed_at DATETIME(6) NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (id), UNIQUE KEY uk_agent_run_id (run_id), UNIQUE KEY uk_agent_run_idempotency (idempotency_id),
UNIQUE KEY uk_agent_run_trace (trace_id), KEY idx_agent_run_worker_lease (status,locked_until),
CONSTRAINT chk_agent_run_status CHECK (status IN ('queued','running','succeeded','failed','cancel_requested','cancelled'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE config_release (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_no VARCHAR(64) NOT NULL,
title VARCHAR(128) NOT NULL, change_summary VARCHAR(1000) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'draft', created_by BIGINT UNSIGNED NOT NULL,
reviewer_id BIGINT UNSIGNED NULL, reviewed_at DATETIME(6) NULL, activated_at DATETIME(6) NULL,
supersedes_release_id BIGINT UNSIGNED NULL, rollback_of_release_id BIGINT UNSIGNED NULL,
active_slot TINYINT GENERATED ALWAYS AS (IF(status='active',1,NULL)) STORED,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(id), UNIQUE KEY uk_config_release_no(release_no), UNIQUE KEY uk_config_release_active_one(active_slot),
CONSTRAINT chk_config_release_status CHECK (status IN ('draft','validating','pending_review','approved','active','superseded','rejected','rolled_back')),
CONSTRAINT chk_config_release_separation CHECK (reviewer_id IS NULL OR reviewer_id <> created_by)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE platform_config_item (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_id BIGINT UNSIGNED NOT NULL,
namespace VARCHAR(64) NOT NULL, config_key VARCHAR(128) NOT NULL, value_json JSON NOT NULL,
schema_version VARCHAR(32) NOT NULL, checksum CHAR(64) NOT NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY(id),
UNIQUE KEY uk_config_item_release(release_id,namespace,config_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE model_endpoint_config (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, endpoint_code VARCHAR(64) NOT NULL,
provider VARCHAR(32) NOT NULL, model_name VARCHAR(128) NOT NULL, base_url VARCHAR(500) NOT NULL,
secret_ref VARCHAR(256) NOT NULL, capabilities JSON NOT NULL, allowed_data_levels JSON NOT NULL,
context_window INT UNSIGNED NOT NULL, timeout_ms INT UNSIGNED NOT NULL DEFAULT 15000,
status VARCHAR(16) NOT NULL DEFAULT 'disabled', created_by BIGINT UNSIGNED NOT NULL,
reviewer_id BIGINT UNSIGNED NULL, reviewed_at DATETIME(6) NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(id), UNIQUE KEY uk_model_endpoint_code(endpoint_code),
CONSTRAINT chk_model_endpoint_status CHECK (status IN ('draft','approved','active','disabled','archived'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE model_routing_rule (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_id BIGINT UNSIGNED NOT NULL,
rule_code VARCHAR(64) NOT NULL, agent_type VARCHAR(32) NOT NULL, task_type VARCHAR(48) NOT NULL,
model_policy VARCHAR(32) NOT NULL, primary_endpoint_id BIGINT UNSIGNED NOT NULL,
fallback_endpoint_ids JSON NULL, condition_json JSON NULL, max_attempts TINYINT UNSIGNED NOT NULL DEFAULT 2,
latency_budget_ms INT UNSIGNED NOT NULL DEFAULT 15000, priority INT NOT NULL DEFAULT 100,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY(id),
UNIQUE KEY uk_model_route_release(release_id,rule_code),
CONSTRAINT chk_model_route_attempts CHECK (max_attempts BETWEEN 1 AND 3)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE model_routing_fallback (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, routing_rule_id BIGINT UNSIGNED NOT NULL,
endpoint_id BIGINT UNSIGNED NOT NULL, fallback_order TINYINT UNSIGNED NOT NULL,
retryable_error_codes JSON NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY(id), UNIQUE KEY uk_model_fallback_order(routing_rule_id,fallback_order),
UNIQUE KEY uk_model_fallback_endpoint(routing_rule_id,endpoint_id),
CONSTRAINT chk_model_fallback_order CHECK (fallback_order BETWEEN 1 AND 2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
"""CREATE TABLE prompt_template_version (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_id BIGINT UNSIGNED NOT NULL,
prompt_code VARCHAR(64) NOT NULL, task_type VARCHAR(48) NOT NULL, agent_type VARCHAR(32) NULL,
version INT UNSIGNED NOT NULL, system_prompt MEDIUMTEXT NOT NULL, user_prompt_template MEDIUMTEXT NOT NULL,
input_schema JSON NULL, output_schema JSON NULL, checksum CHAR(64) NOT NULL, created_by BIGINT UNSIGNED NOT NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY(id),
UNIQUE KEY uk_prompt_version(prompt_code,version)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""",
]
def upgrade() -> None:
for statement in TABLES:
op.execute(statement)
def downgrade() -> None:
for table in ("prompt_template_version", "model_routing_fallback", "model_routing_rule",
"model_endpoint_config", "platform_config_item", "config_release", "agent_run",
"request_idempotency", "domain_event_outbox"):
op.drop_table(table)