orbis-backend / database /init.sql
Deusxx1234's picture
Initial deployment to HF Spaces
c84fdae
-- Enable pgvector extension
CREATE EXTENSION IF NOT EXISTS vector;
-- Agents table: tracks personas and their configurations
CREATE TABLE IF NOT EXISTS agents (
id SERIAL PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
description TEXT,
current_version_id INT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Agent versions: versioned agent configs and prompts
CREATE TABLE IF NOT EXISTS agent_versions (
id SERIAL PRIMARY KEY,
agent_id INT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
version INT NOT NULL,
config JSONB NOT NULL, -- Model, temperature, system prompt overrides, etc.
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by TEXT,
UNIQUE(agent_id, version)
);
-- Prompt templates: versioned prompts per agent version
CREATE TABLE IF NOT EXISTS prompt_templates (
id SERIAL PRIMARY KEY,
agent_version_id INT NOT NULL REFERENCES agent_versions(id) ON DELETE CASCADE,
name TEXT NOT NULL, -- e.g., "system", "user_initial", "feedback"
prompt_text TEXT NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Trends: detected social trends
CREATE TABLE IF NOT EXISTS trends (
id SERIAL PRIMARY KEY,
topic TEXT NOT NULL,
source TEXT NOT NULL, -- "reddit", "twitter", "google_trends", etc.
source_url TEXT,
score FLOAT, -- Relevance score (0-1)
embedding VECTOR(1536), -- Embedding for deduplication
status TEXT DEFAULT 'pending_generation', -- pending_generation, generated, published, skipped, failed
raw_data JSONB, -- Store raw API response
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX ON trends(status);
CREATE INDEX ON trends(created_at DESC);
CREATE INDEX ON trends(source);
CREATE INDEX ON trends USING hnsw (embedding vector_cosine_ops);
-- Posts: generated social media posts
CREATE TABLE IF NOT EXISTS posts (
id SERIAL PRIMARY KEY,
trend_id INT REFERENCES trends(id) ON DELETE SET NULL,
agent_version_id INT NOT NULL REFERENCES agent_versions(id),
content TEXT NOT NULL,
image_url TEXT,
video_url TEXT,
status TEXT DEFAULT 'draft', -- draft, pending_approval, approved, rejected, scheduled, published, failed
-- Publishing metadata
platform TEXT, -- instagram, twitter, linkedin, etc.
platform_post_id TEXT, -- ID from platform's API
scheduled_at TIMESTAMP,
published_at TIMESTAMP,
approval_status TEXT DEFAULT 'pending', -- pending, approved, rejected
approval_notes TEXT,
approved_by TEXT,
approved_at TIMESTAMP,
-- Generated metadata
embedding VECTOR(1536), -- For similarity/dedup
token_count INT,
generation_cost FLOAT, -- Cost in USD
hallucination_score FLOAT, -- 0-1, higher = more hallucination risk
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX ON posts(status);
CREATE INDEX ON posts(approval_status);
CREATE INDEX ON posts(platform);
CREATE INDEX ON posts(published_at DESC);
CREATE INDEX ON posts(created_at DESC);
CREATE INDEX ON posts USING hnsw (embedding vector_cosine_ops);
-- Workflow executions: track Temporal workflow runs
CREATE TABLE IF NOT EXISTS workflow_executions (
id SERIAL PRIMARY KEY,
workflow_id TEXT NOT NULL,
workflow_name TEXT NOT NULL,
trend_id INT REFERENCES trends(id),
post_id INT REFERENCES posts(id),
status TEXT DEFAULT 'running', -- running, completed, failed, timed_out
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed_at TIMESTAMP,
error_message TEXT,
metadata JSONB,
UNIQUE(workflow_id)
);
CREATE INDEX ON workflow_executions(status);
CREATE INDEX ON workflow_executions(workflow_name);
CREATE INDEX ON workflow_executions(created_at DESC);
-- Media: store image/video metadata
CREATE TABLE IF NOT EXISTS media (
id SERIAL PRIMARY KEY,
post_id INT REFERENCES posts(id) ON DELETE CASCADE,
media_type TEXT NOT NULL, -- image, video
file_name TEXT NOT NULL,
file_size INT,
mime_type TEXT,
r2_key TEXT, -- Path in R2 bucket
r2_url TEXT,
-- Moderation
moderation_status TEXT DEFAULT 'pending', -- pending, approved, rejected, flagged
nsfw_score FLOAT, -- 0-1, higher = more likely NSFW
moderation_details JSONB, -- Results from AWS Rekognition, etc.
-- Thumbnails
thumbnail_url TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX ON media(post_id);
CREATE INDEX ON media(moderation_status);
-- Observability traces: store Langfuse trace references
CREATE TABLE IF NOT EXISTS observability_traces (
id SERIAL PRIMARY KEY,
trace_id TEXT UNIQUE,
post_id INT REFERENCES posts(id),
workflow_id TEXT REFERENCES workflow_executions(workflow_id),
trace_name TEXT,
input JSONB,
output JSONB,
metadata JSONB,
token_count INT,
cost_usd FLOAT,
duration_ms INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX ON observability_traces(post_id);
CREATE INDEX ON observability_traces(workflow_id);
CREATE INDEX ON observability_traces(created_at DESC);
-- API usage & costs: track quota and spending
CREATE TABLE IF NOT EXISTS api_usage (
id SERIAL PRIMARY KEY,
service TEXT NOT NULL, -- openai, anthropic, instagram, twitter, rekognition, etc.
request_count INT DEFAULT 0,
token_count INT DEFAULT 0,
cost_usd FLOAT DEFAULT 0,
period_start TIMESTAMP,
period_end TIMESTAMP,
UNIQUE(service, period_start, period_end)
);
-- System errors & alerts
CREATE TABLE IF NOT EXISTS system_alerts (
id SERIAL PRIMARY KEY,
alert_type TEXT NOT NULL, -- rate_limit, api_error, quality_degradation, etc.
service TEXT,
message TEXT NOT NULL,
severity TEXT DEFAULT 'warning', -- info, warning, error, critical
resolved BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
resolved_at TIMESTAMP
);
CREATE INDEX ON system_alerts(severity);
CREATE INDEX ON system_alerts(resolved);
CREATE INDEX ON system_alerts(created_at DESC);