iconsulting/packages/services/llm-gateway/sql/init-gateway-tables.sql

105 lines
4.6 KiB
SQL

-- ===========================================
-- LLM Gateway Database Tables
-- ===========================================
-- 1. API Keys for external users
CREATE TABLE IF NOT EXISTS gateway_api_keys (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID,
key_hash VARCHAR(64) NOT NULL UNIQUE,
key_prefix VARCHAR(12) NOT NULL,
name VARCHAR(100) NOT NULL,
owner VARCHAR(200) NOT NULL DEFAULT '',
permissions JSONB NOT NULL DEFAULT '{"allowedModels": ["*"], "allowStreaming": true, "allowTools": true}',
rate_limit_rpm INTEGER NOT NULL DEFAULT 60,
rate_limit_tpd INTEGER NOT NULL DEFAULT 1000000,
monthly_budget DECIMAL(10,2),
enabled BOOLEAN NOT NULL DEFAULT true,
expires_at TIMESTAMP,
last_used_at TIMESTAMP,
created_by UUID,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_gateway_api_keys_hash ON gateway_api_keys (key_hash);
CREATE INDEX IF NOT EXISTS idx_gateway_api_keys_tenant ON gateway_api_keys (tenant_id);
CREATE INDEX IF NOT EXISTS idx_gateway_api_keys_enabled ON gateway_api_keys (enabled);
-- 2. Injection rules (regulatory content to inject into system prompts)
CREATE TABLE IF NOT EXISTS gateway_injection_rules (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID,
name VARCHAR(100) NOT NULL,
description TEXT,
position VARCHAR(10) NOT NULL DEFAULT 'append' CHECK (position IN ('prepend', 'append')),
content TEXT NOT NULL,
match_models JSONB NOT NULL DEFAULT '["*"]',
match_key_ids JSONB,
priority INTEGER NOT NULL DEFAULT 0,
enabled BOOLEAN NOT NULL DEFAULT true,
created_by UUID,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_gateway_injection_rules_tenant ON gateway_injection_rules (tenant_id);
CREATE INDEX IF NOT EXISTS idx_gateway_injection_rules_enabled ON gateway_injection_rules (tenant_id, enabled);
-- 3. Content filter rules (message auditing)
CREATE TABLE IF NOT EXISTS gateway_content_rules (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID,
name VARCHAR(100) NOT NULL,
type VARCHAR(20) NOT NULL DEFAULT 'keyword' CHECK (type IN ('keyword', 'regex')),
pattern TEXT NOT NULL,
action VARCHAR(20) NOT NULL DEFAULT 'block' CHECK (action IN ('block', 'warn', 'log')),
reject_message TEXT,
priority INTEGER NOT NULL DEFAULT 0,
enabled BOOLEAN NOT NULL DEFAULT true,
created_by UUID,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_gateway_content_rules_tenant ON gateway_content_rules (tenant_id);
CREATE INDEX IF NOT EXISTS idx_gateway_content_rules_enabled ON gateway_content_rules (tenant_id, enabled);
-- 4. Usage logs (token consumption tracking)
CREATE TABLE IF NOT EXISTS gateway_usage_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
api_key_id UUID NOT NULL REFERENCES gateway_api_keys(id) ON DELETE CASCADE,
model VARCHAR(100) NOT NULL,
provider VARCHAR(20) NOT NULL,
input_tokens INTEGER NOT NULL DEFAULT 0,
output_tokens INTEGER NOT NULL DEFAULT 0,
total_tokens INTEGER NOT NULL DEFAULT 0,
cost_usd DECIMAL(10,6),
duration_ms INTEGER NOT NULL DEFAULT 0,
status_code INTEGER NOT NULL DEFAULT 200,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_gateway_usage_logs_key ON gateway_usage_logs (api_key_id);
CREATE INDEX IF NOT EXISTS idx_gateway_usage_logs_created ON gateway_usage_logs (created_at);
CREATE INDEX IF NOT EXISTS idx_gateway_usage_logs_key_created ON gateway_usage_logs (api_key_id, created_at);
-- 5. Audit logs (request/response auditing)
CREATE TABLE IF NOT EXISTS gateway_audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
api_key_id UUID NOT NULL REFERENCES gateway_api_keys(id) ON DELETE CASCADE,
request_method VARCHAR(10) NOT NULL,
request_path VARCHAR(200) NOT NULL,
request_model VARCHAR(100),
request_ip VARCHAR(50) NOT NULL DEFAULT '',
content_filtered BOOLEAN NOT NULL DEFAULT false,
filter_rule_id UUID,
injection_applied BOOLEAN NOT NULL DEFAULT false,
response_status INTEGER NOT NULL DEFAULT 200,
duration_ms INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_gateway_audit_logs_key ON gateway_audit_logs (api_key_id);
CREATE INDEX IF NOT EXISTS idx_gateway_audit_logs_created ON gateway_audit_logs (created_at);
CREATE INDEX IF NOT EXISTS idx_gateway_audit_logs_filtered ON gateway_audit_logs (content_filtered) WHERE content_filtered = true;