managarten/apps/chat/apps/mobile/scripts/create_usage_functions.sql
Wuesteon ff80aeec1f refactor: restructure
monorepo with apps/ and services/
  directories
2025-11-26 03:03:24 +01:00

144 lines
No EOL
3.7 KiB
PL/PgSQL

-- Funktionen zum Abfragen der Token-Nutzung
-- 1. Funktion zum Abrufen der Token-Nutzung eines Benutzers, gruppiert nach Modell
CREATE OR REPLACE FUNCTION get_user_model_usage(user_id UUID)
RETURNS TABLE (
model_id UUID,
model_name TEXT,
total_prompt_tokens BIGINT,
total_completion_tokens BIGINT,
total_tokens BIGINT,
total_cost DECIMAL(10, 6)
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
RETURN QUERY
SELECT
ul.model_id,
m.name AS model_name,
SUM(ul.prompt_tokens)::BIGINT AS total_prompt_tokens,
SUM(ul.completion_tokens)::BIGINT AS total_completion_tokens,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
JOIN
models m ON ul.model_id = m.id
WHERE
ul.user_id = get_user_model_usage.user_id
GROUP BY
ul.model_id, m.name
ORDER BY
total_cost DESC;
END;
$$;
-- 2. Funktion zum Abrufen der Token-Nutzung eines Benutzers nach Zeitraum
CREATE OR REPLACE FUNCTION get_user_usage_by_period(user_id UUID, period TEXT)
RETURNS TABLE (
time_period TEXT,
total_tokens BIGINT,
total_cost DECIMAL(10, 6)
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
IF period = 'day' THEN
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY-MM-DD') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
ELSIF period = 'month' THEN
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY-MM') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
ELSIF period = 'year' THEN
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
ELSE
-- Fallback auf tägliche Ansicht
RETURN QUERY
SELECT
TO_CHAR(ul.created_at, 'YYYY-MM-DD') AS time_period,
SUM(ul.total_tokens)::BIGINT AS total_tokens,
SUM(ul.estimated_cost)::DECIMAL(10, 6) AS total_cost
FROM
usage_logs ul
WHERE
ul.user_id = get_user_usage_by_period.user_id
GROUP BY
time_period
ORDER BY
time_period DESC;
END IF;
END;
$$;
-- 3. Funktion zum Abrufen der Token-Nutzung einer bestimmten Konversation
CREATE OR REPLACE FUNCTION get_conversation_usage(conversation_id UUID)
RETURNS TABLE (
message_id UUID,
created_at TIMESTAMP WITH TIME ZONE,
prompt_tokens BIGINT,
completion_tokens BIGINT,
total_tokens BIGINT,
estimated_cost DECIMAL(10, 6)
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
RETURN QUERY
SELECT
ul.message_id,
ul.created_at,
ul.prompt_tokens::BIGINT,
ul.completion_tokens::BIGINT,
ul.total_tokens::BIGINT,
ul.estimated_cost::DECIMAL(10, 6)
FROM
usage_logs ul
WHERE
ul.conversation_id = get_conversation_usage.conversation_id
ORDER BY
ul.created_at;
END;
$$;
-- Erteile Berechtigungen für die Funktionen
GRANT EXECUTE ON FUNCTION get_user_model_usage TO authenticated;
GRANT EXECUTE ON FUNCTION get_user_usage_by_period TO authenticated;
GRANT EXECUTE ON FUNCTION get_conversation_usage TO authenticated;