8-stage TypeScript pipeline with Apify scraping, Claude AI analysis, real-time dashboard with SSE, PostgreSQL cost tracking, and Apify budget controls. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
36 lines
1.5 KiB
SQL
36 lines
1.5 KiB
SQL
-- Social Listening Pipeline — Cost Tracking Schema
|
|
|
|
CREATE TABLE IF NOT EXISTS runs (
|
|
id SERIAL PRIMARY KEY,
|
|
client_name TEXT NOT NULL,
|
|
category TEXT NOT NULL,
|
|
platforms TEXT[] NOT NULL DEFAULT '{}',
|
|
brief_json JSONB NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'running', -- running | completed | failed
|
|
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
finished_at TIMESTAMPTZ,
|
|
total_cost_usd NUMERIC(10,6) NOT NULL DEFAULT 0,
|
|
claude_cost_usd NUMERIC(10,6) NOT NULL DEFAULT 0,
|
|
apify_cost_usd NUMERIC(10,6) NOT NULL DEFAULT 0,
|
|
total_input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
total_output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
report_path TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS cost_events (
|
|
id SERIAL PRIMARY KEY,
|
|
run_id INTEGER NOT NULL REFERENCES runs(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
stage INTEGER NOT NULL,
|
|
stage_name TEXT NOT NULL,
|
|
source TEXT NOT NULL, -- 'claude' | 'apify'
|
|
label TEXT NOT NULL, -- e.g. 'CM Review', 'TikTok hashtag: hm'
|
|
model TEXT, -- claude model name or apify actor id
|
|
input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
cost_usd NUMERIC(10,6) NOT NULL DEFAULT 0,
|
|
metadata JSONB -- extra info (run_id for apify, etc.)
|
|
);
|
|
|
|
CREATE INDEX idx_cost_events_run_id ON cost_events(run_id);
|
|
CREATE INDEX idx_runs_started_at ON runs(started_at DESC);
|