llm-gateway/packages/gateway/src/db/migrations/002-tokenvault-cost-tracking.sql
Rene Fichtmueller 2ca77d0aee feat: Phase 2F — Multi-Agent Integration (ADRs + Client Fallback + Tests)
- ADR-0001: Multi-Agent Coworking Architecture with LLM Gateway Orchestrator
- ADR-0002: Tier Assignment Strategy for Model Selection (cost-first escalation)
- ADR-0003: Confidence Gate Thresholds & Learning Cycle Intervals (6h/12h/24h cycles)
- ADR-0004: External Provider Fallback Chain Ordering (Cerebras → Groq → Mistral)
- Enhanced client SDK: Offline Ollama fallback, health checks, exponential backoff retry
- Integration tests: claude-code-integration.test.ts (14 test cases)
- PHASE_2F_DEPLOYMENT.md: Pre-deployment checklist, automated deploy, rollback plan
- Post-deployment verification procedures for health, client fallback, metrics
2026-04-19 21:39:44 +02:00

190 lines
6.1 KiB
SQL

-- Migration: Add Tokenvault & Cost Tracking Tables
-- Created: 2026-04-19
-- Purpose: Track token compression and cost analytics
-- Enable JSON extension if not already enabled
CREATE EXTENSION IF NOT EXISTS json;
-- Table: Token compression metrics (LeanCTX, RTK)
CREATE TABLE IF NOT EXISTS tokenvault_metrics (
id SERIAL PRIMARY KEY,
file_path VARCHAR(255),
mode VARCHAR(50),
tokens_before INT NOT NULL,
tokens_after INT NOT NULL,
savings_pct DECIMAL(5,2) NOT NULL,
tool_used VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_tool_created (tool_used, created_at),
INDEX idx_created (created_at)
);
-- Table: Cost analytics per task
CREATE TABLE IF NOT EXISTS cost_analytics (
id SERIAL PRIMARY KEY,
call_id VARCHAR(50),
project VARCHAR(100),
task_type VARCHAR(50),
model VARCHAR(100),
agent_id VARCHAR(50),
tokens_in INT NOT NULL DEFAULT 0,
tokens_out INT NOT NULL DEFAULT 0,
tokens_compressed INT NOT NULL DEFAULT 0,
cost_usd DECIMAL(10,6) NOT NULL DEFAULT 0,
cost_saved_usd DECIMAL(10,6) NOT NULL DEFAULT 0,
provider VARCHAR(50),
confidence_score DECIMAL(3,2),
request_hash VARCHAR(64),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_project_created (project, created_at),
INDEX idx_agent_created (agent_id, created_at),
INDEX idx_model_created (model, created_at),
INDEX idx_call_id (call_id)
);
-- Table: Compression savings summary (daily aggregate)
CREATE TABLE IF NOT EXISTS compression_summary (
id SERIAL PRIMARY KEY,
date DATE NOT NULL,
tool VARCHAR(50) NOT NULL,
total_tokens_before INT NOT NULL,
total_tokens_after INT NOT NULL,
total_savings_pct DECIMAL(5,2),
count INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_date_tool (date, tool)
);
-- Table: Cost alerts configuration
CREATE TABLE IF NOT EXISTS cost_alert_config (
id SERIAL PRIMARY KEY,
user_id VARCHAR(100),
project VARCHAR(100),
alert_type VARCHAR(50),
threshold DECIMAL(8,2),
threshold_type VARCHAR(20),
enabled BOOLEAN DEFAULT TRUE,
weekly_budget_usd DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Table: Alert history
CREATE TABLE IF NOT EXISTS alert_log (
id SERIAL PRIMARY KEY,
alert_type VARCHAR(50),
severity VARCHAR(20),
message TEXT,
metadata JSON,
acknowledged BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_severity_created (severity, created_at),
INDEX idx_created (created_at)
);
-- Create additional indexes
CREATE INDEX IF NOT EXISTS idx_cost_analytics_week
ON cost_analytics(created_at DESC)
WHERE created_at > DATE_SUB(NOW(), INTERVAL 7 DAY);
CREATE INDEX IF NOT EXISTS idx_compression_daily
ON tokenvault_metrics(created_at DESC)
WHERE created_at > DATE_SUB(NOW(), INTERVAL 1 DAY);
-- Add cost tracking to batch_jobs table
ALTER TABLE batch_jobs
ADD COLUMN IF NOT EXISTS total_cost_usd DECIMAL(10,6) NOT NULL DEFAULT 0,
ADD COLUMN IF NOT EXISTS total_saved_usd DECIMAL(10,6) NOT NULL DEFAULT 0,
ADD INDEX idx_batch_jobs_cost_created (total_cost_usd, created_at DESC);
-- Table: Fallback chain execution metrics
CREATE TABLE IF NOT EXISTS fallback_chain_metrics (
id SERIAL PRIMARY KEY,
call_id VARCHAR(50),
task_type VARCHAR(50),
primary_model VARCHAR(100) NOT NULL,
fallback_step INT NOT NULL,
fallback_model VARCHAR(100),
provider VARCHAR(50),
success BOOLEAN NOT NULL,
tokens_in INT NOT NULL DEFAULT 0,
tokens_out INT NOT NULL DEFAULT 0,
latency_ms INT NOT NULL,
reason_switched VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_call_created (call_id, created_at),
INDEX idx_model_created (primary_model, created_at),
INDEX idx_task_created (task_type, created_at)
);
-- Table: Model performance metrics (for learning engine)
CREATE TABLE IF NOT EXISTS model_performance (
id SERIAL PRIMARY KEY,
model VARCHAR(100) NOT NULL,
task_type VARCHAR(50),
success_rate DECIMAL(5,2),
avg_latency_ms INT,
avg_tokens_in INT,
avg_tokens_out INT,
total_calls INT DEFAULT 0,
total_failures INT DEFAULT 0,
confidence_avg DECIMAL(3,2),
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_model_task (model, task_type),
INDEX idx_success_rate (success_rate DESC),
INDEX idx_latency (avg_latency_ms ASC)
);
-- Table: Learning engine cycle logs
CREATE TABLE IF NOT EXISTS learning_cycles (
id SERIAL PRIMARY KEY,
cycle_id VARCHAR(50) NOT NULL UNIQUE,
cycle_duration VARCHAR(20),
improvements_found INT DEFAULT 0,
routing_changes INT DEFAULT 0,
template_updates INT DEFAULT 0,
model_rankings_updated BOOLEAN DEFAULT FALSE,
confidence_threshold_adjusted DECIMAL(3,2),
metrics JSON,
status VARCHAR(50),
started_at TIMESTAMP,
completed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_cycle_duration (cycle_duration, completed_at DESC),
INDEX idx_status (status),
INDEX idx_completed (completed_at DESC)
);
-- Table: Routing decisions and performance
CREATE TABLE IF NOT EXISTS routing_decisions (
id SERIAL PRIMARY KEY,
call_id VARCHAR(50),
task_type VARCHAR(50) NOT NULL,
caller VARCHAR(100),
routing_model VARCHAR(100) NOT NULL,
routing_tier VARCHAR(20),
actual_model_used VARCHAR(100),
was_fallback BOOLEAN DEFAULT FALSE,
success BOOLEAN NOT NULL,
confidence_final DECIMAL(3,2),
tokens_in INT,
tokens_out INT,
latency_ms INT,
cost_usd DECIMAL(10,6),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_task_created (task_type, created_at),
INDEX idx_routing_model (routing_model, created_at),
INDEX idx_success (success, created_at)
);
-- Initialize default alert config for Rene
INSERT INTO cost_alert_config
(user_id, alert_type, threshold, threshold_type, enabled, weekly_budget_usd)
VALUES
('rene', 'compression_below', 40, 'percent', TRUE, 50),
('rene', 'external_api', 0, 'usd', TRUE, NULL),
('rene', 'weekly_budget', 50, 'usd', TRUE, 50)
ON DUPLICATE KEY UPDATE enabled = VALUES(enabled);