164 lines
6.3 KiB
SQL
164 lines
6.3 KiB
SQL
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_calls (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text NOT NULL UNIQUE,
|
|
asterisk_channel_id text,
|
|
route text NOT NULL DEFAULT 'unknown',
|
|
caller_number_masked text,
|
|
language text,
|
|
region_code text,
|
|
state text,
|
|
started_at timestamptz NOT NULL,
|
|
ended_at timestamptz,
|
|
duration_ms bigint,
|
|
end_reason text,
|
|
handoff_status text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_calls_started_at ON ai_calls(started_at);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_calls_route ON ai_calls(route);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_calls_language_region ON ai_calls(language, region_code);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_calls_state ON ai_calls(state);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_call_events (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text NOT NULL,
|
|
event_type text NOT NULL,
|
|
event_source text NOT NULL,
|
|
state_before text,
|
|
state_after text,
|
|
severity text NOT NULL DEFAULT 'info',
|
|
message text,
|
|
reason_code text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_call_events_call_id_created_at ON ai_call_events(call_id, created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_call_events_type ON ai_call_events(event_type);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_call_events_severity ON ai_call_events(severity);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_transcript_events (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text NOT NULL,
|
|
speaker text NOT NULL CHECK (speaker IN ('user','assistant','system','tool')),
|
|
event_type text NOT NULL,
|
|
language text,
|
|
text_redacted text,
|
|
text_raw_encrypted text,
|
|
text_hash text,
|
|
char_count int NOT NULL DEFAULT 0,
|
|
redaction_applied boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_transcript_events_call_id_created_at ON ai_transcript_events(call_id, created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_transcript_events_speaker ON ai_transcript_events(speaker);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_transcript_events_language ON ai_transcript_events(language);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_tool_audit (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text NOT NULL,
|
|
tool_call_id text,
|
|
tool_name text NOT NULL,
|
|
state text,
|
|
language text,
|
|
region_code text,
|
|
allowed boolean NOT NULL,
|
|
denied boolean NOT NULL DEFAULT false,
|
|
reason_code text,
|
|
args_redacted jsonb NOT NULL DEFAULT '{}',
|
|
result_redacted jsonb NOT NULL DEFAULT '{}',
|
|
duration_ms bigint,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_tool_audit_call_id_created_at ON ai_tool_audit(call_id, created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_tool_audit_tool_name ON ai_tool_audit(tool_name);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_tool_audit_denied ON ai_tool_audit(denied);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_kb_audit (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text,
|
|
query_redacted text NOT NULL,
|
|
language text NOT NULL,
|
|
region_code text NOT NULL,
|
|
result_count int NOT NULL DEFAULT 0,
|
|
top_score double precision,
|
|
cross_language_fallback_used boolean NOT NULL DEFAULT false,
|
|
citations_count int NOT NULL DEFAULT 0,
|
|
no_answer boolean NOT NULL DEFAULT false,
|
|
duration_ms bigint,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_kb_audit_call_id_created_at ON ai_kb_audit(call_id, created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_kb_audit_language_region ON ai_kb_audit(language, region_code);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_kb_audit_no_answer ON ai_kb_audit(no_answer);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_handoff_audit (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text NOT NULL,
|
|
handoff_id text,
|
|
mode text NOT NULL,
|
|
status text NOT NULL,
|
|
reason_code text,
|
|
transfer_attempted boolean NOT NULL DEFAULT false,
|
|
transfer_succeeded boolean NOT NULL DEFAULT false,
|
|
target_redacted text,
|
|
summary_redacted text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_handoff_audit_call_id_created_at ON ai_handoff_audit(call_id, created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_handoff_audit_status ON ai_handoff_audit(status);
|
|
CREATE INDEX IF NOT EXISTS idx_ai_handoff_audit_mode ON ai_handoff_audit(mode);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_provider_audit (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text,
|
|
provider text NOT NULL,
|
|
event_type text NOT NULL,
|
|
severity text NOT NULL DEFAULT 'info',
|
|
error_redacted text,
|
|
input_audio_bytes bigint NOT NULL DEFAULT 0,
|
|
output_audio_bytes bigint NOT NULL DEFAULT 0,
|
|
events_received bigint NOT NULL DEFAULT 0,
|
|
events_sent bigint NOT NULL DEFAULT 0,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_media_audit (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
call_id text,
|
|
event_type text NOT NULL,
|
|
severity text NOT NULL DEFAULT 'info',
|
|
codec text,
|
|
inbound_frames bigint NOT NULL DEFAULT 0,
|
|
inbound_bytes bigint NOT NULL DEFAULT 0,
|
|
outbound_frames bigint NOT NULL DEFAULT 0,
|
|
outbound_bytes bigint NOT NULL DEFAULT 0,
|
|
xoff_count bigint NOT NULL DEFAULT 0,
|
|
xon_count bigint NOT NULL DEFAULT 0,
|
|
error_redacted text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS ai_audit_retention_runs (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
dry_run boolean NOT NULL DEFAULT true,
|
|
status text NOT NULL,
|
|
started_at timestamptz NOT NULL DEFAULT now(),
|
|
finished_at timestamptz,
|
|
calls_deleted int NOT NULL DEFAULT 0,
|
|
events_deleted int NOT NULL DEFAULT 0,
|
|
transcripts_deleted int NOT NULL DEFAULT 0,
|
|
tool_audit_deleted int NOT NULL DEFAULT 0,
|
|
error text,
|
|
metadata jsonb NOT NULL DEFAULT '{}'
|
|
);
|