feat: token count implement
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
-- AI Usage Logs: Track token consumption per user for billing and limits
|
||||
CREATE TABLE ai_usage_logs (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
|
||||
|
||||
-- Token counts
|
||||
tokens_used INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
|
||||
-- Request metadata
|
||||
endpoint VARCHAR(255), -- e.g., "/lessons/generate-quiz"
|
||||
model VARCHAR(100), -- e.g., "llama3.2:3b", "gpt-4o"
|
||||
request_type VARCHAR(50), -- "transcription", "quiz-generation", "chat", "summary"
|
||||
request_metadata JSONB, -- Additional context about the request
|
||||
|
||||
-- Cost estimation (optional, can be calculated later)
|
||||
estimated_cost_usd NUMERIC(10, 6),
|
||||
|
||||
-- Timestamps
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Indexes for performance
|
||||
CREATE INDEX idx_ai_usage_user ON ai_usage_logs(user_id);
|
||||
CREATE INDEX idx_ai_usage_org ON ai_usage_logs(organization_id);
|
||||
CREATE INDEX idx_ai_usage_created ON ai_usage_logs(created_at);
|
||||
CREATE INDEX idx_ai_usage_endpoint ON ai_usage_logs(endpoint);
|
||||
CREATE INDEX idx_ai_usage_type ON ai_usage_logs(request_type);
|
||||
|
||||
-- Function to log AI usage
|
||||
CREATE OR REPLACE FUNCTION log_ai_usage(
|
||||
p_user_id UUID,
|
||||
p_org_id UUID,
|
||||
p_tokens INTEGER,
|
||||
p_input_tokens INTEGER,
|
||||
p_output_tokens INTEGER,
|
||||
p_endpoint VARCHAR,
|
||||
p_model VARCHAR,
|
||||
p_request_type VARCHAR,
|
||||
p_metadata JSONB
|
||||
)
|
||||
RETURNS UUID AS $$
|
||||
DECLARE
|
||||
v_log_id UUID;
|
||||
v_cost NUMERIC(10, 6);
|
||||
BEGIN
|
||||
-- Calculate estimated cost (OpenAI-like pricing)
|
||||
v_cost := (p_input_tokens::NUMERIC * 0.000001) + (p_output_tokens::NUMERIC * 0.000003);
|
||||
|
||||
INSERT INTO ai_usage_logs (
|
||||
user_id, organization_id, tokens_used, input_tokens, output_tokens,
|
||||
endpoint, model, request_type, request_metadata, estimated_cost_usd
|
||||
)
|
||||
VALUES (
|
||||
p_user_id, p_org_id, p_tokens, p_input_tokens, p_output_tokens,
|
||||
p_endpoint, p_model, p_request_type, p_metadata, v_cost
|
||||
)
|
||||
RETURNING id INTO v_log_id;
|
||||
|
||||
RETURN v_log_id;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Daily aggregation view for reporting
|
||||
CREATE VIEW ai_usage_daily AS
|
||||
SELECT
|
||||
DATE(created_at) as usage_date,
|
||||
user_id,
|
||||
organization_id,
|
||||
request_type,
|
||||
SUM(tokens_used) as total_tokens,
|
||||
SUM(input_tokens) as total_input,
|
||||
SUM(output_tokens) as total_output,
|
||||
COUNT(*) as request_count,
|
||||
SUM(estimated_cost_usd) as total_cost
|
||||
FROM ai_usage_logs
|
||||
GROUP BY DATE(created_at), user_id, organization_id, request_type;
|
||||
|
||||
-- Comments
|
||||
COMMENT ON TABLE ai_usage_logs IS 'Tracks AI token usage per user for billing, limits, and analytics';
|
||||
COMMENT ON COLUMN ai_usage_logs.tokens_used IS 'Total tokens (input + output)';
|
||||
COMMENT ON COLUMN ai_usage_logs.input_tokens IS 'Tokens in the prompt/request';
|
||||
COMMENT ON COLUMN ai_usage_logs.output_tokens IS 'Tokens in the AI response';
|
||||
COMMENT ON COLUMN ai_usage_logs.estimated_cost_usd IS 'Estimated cost based on OpenAI-like pricing';
|
||||
Reference in New Issue
Block a user