CREATE TABLE IF NOT EXISTS ai_benchmark_runs ( id BIGSERIAL PRIMARY KEY, status VARCHAR(24) NOT NULL DEFAULT 'queued', models JSONB NOT NULL DEFAULT '[]'::jsonb, test_keys JSONB NOT NULL DEFAULT '[]'::jsonb, total_cases INTEGER NOT NULL DEFAULT 0, completed_cases INTEGER NOT NULL DEFAULT 0, created_by INTEGER REFERENCES users(user_id) ON DELETE SET NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), started_at TIMESTAMPTZ, completed_at TIMESTAMPTZ, error_text TEXT ); CREATE TABLE IF NOT EXISTS ai_benchmark_results ( id BIGSERIAL PRIMARY KEY, run_id BIGINT NOT NULL REFERENCES ai_benchmark_runs(id) ON DELETE CASCADE, model VARCHAR(160) NOT NULL, test_key VARCHAR(100) NOT NULL, test_name VARCHAR(200) NOT NULL, category VARCHAR(80) NOT NULL, score INTEGER NOT NULL DEFAULT 0, max_score INTEGER NOT NULL DEFAULT 0, duration_ms INTEGER NOT NULL DEFAULT 0, prompt_tokens INTEGER, response_tokens INTEGER, tokens_per_second NUMERIC(10, 2), passed_checks JSONB NOT NULL DEFAULT '[]'::jsonb, failed_checks JSONB NOT NULL DEFAULT '[]'::jsonb, response_json JSONB, response_text TEXT, error_text TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(run_id, model, test_key) ); CREATE INDEX IF NOT EXISTS idx_ai_benchmark_runs_created ON ai_benchmark_runs(created_at DESC); CREATE INDEX IF NOT EXISTS idx_ai_benchmark_results_run ON ai_benchmark_results(run_id, model);