|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
hf_user_id TEXT UNIQUE NOT NULL,
|
|
|
hf_username TEXT NOT NULL,
|
|
|
email TEXT,
|
|
|
token_quota INTEGER DEFAULT 100000,
|
|
|
tokens_used INTEGER DEFAULT 0,
|
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
|
last_login TIMESTAMP WITH TIME ZONE,
|
|
|
is_active BOOLEAN DEFAULT TRUE
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS usage_logs (
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
|
hf_user_id TEXT NOT NULL,
|
|
|
timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
|
query_text TEXT NOT NULL,
|
|
|
prompt_tokens INTEGER DEFAULT 0,
|
|
|
completion_tokens INTEGER DEFAULT 0,
|
|
|
total_tokens INTEGER DEFAULT 0,
|
|
|
model TEXT,
|
|
|
response_text TEXT,
|
|
|
error_message TEXT,
|
|
|
conversation_history JSONB,
|
|
|
is_image_response BOOLEAN DEFAULT FALSE,
|
|
|
image_path TEXT
|
|
|
);
|
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_users_hf_id ON users(hf_user_id);
|
|
|
CREATE INDEX IF NOT EXISTS idx_users_active ON users(is_active);
|
|
|
CREATE INDEX IF NOT EXISTS idx_logs_user_id ON usage_logs(user_id);
|
|
|
CREATE INDEX IF NOT EXISTS idx_logs_hf_user_id ON usage_logs(hf_user_id);
|
|
|
CREATE INDEX IF NOT EXISTS idx_logs_timestamp ON usage_logs(timestamp DESC);
|
|
|
CREATE INDEX IF NOT EXISTS idx_logs_error ON usage_logs(error_message) WHERE error_message IS NOT NULL;
|
|
|
|
|
|
|
|
|
CREATE OR REPLACE VIEW user_stats AS
|
|
|
SELECT
|
|
|
u.id,
|
|
|
u.hf_user_id,
|
|
|
u.hf_username,
|
|
|
u.token_quota,
|
|
|
u.tokens_used,
|
|
|
u.token_quota - u.tokens_used AS tokens_remaining,
|
|
|
ROUND(100.0 * u.tokens_used / NULLIF(u.token_quota, 0), 2) AS usage_percentage,
|
|
|
COUNT(l.id) AS total_queries,
|
|
|
COUNT(CASE WHEN l.error_message IS NOT NULL THEN 1 END) AS error_count,
|
|
|
MAX(l.timestamp) AS last_query_time
|
|
|
FROM users u
|
|
|
LEFT JOIN usage_logs l ON u.id = l.user_id
|
|
|
GROUP BY u.id, u.hf_user_id, u.hf_username, u.token_quota, u.tokens_used;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
COMMENT ON TABLE users IS 'Stores user authentication and token quota information';
|
|
|
COMMENT ON TABLE usage_logs IS 'Logs every query with token usage, response, and errors';
|
|
|
COMMENT ON VIEW user_stats IS 'Provides aggregated statistics for each user';
|
|
|
|