105 lines
4.6 KiB
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;
|