- Restructure chat as apps/mobile, apps/web, apps/landing, backend - Add NestJS backend for secure Azure OpenAI API calls - Remove exposed API key from mobile app (security fix) - Add shared chat-types package - Create SvelteKit web app scaffold - Create Astro landing page scaffold - Update pnpm workspace configuration - Add project-level CLAUDE.md documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
5.8 KiB
Token-Erfassung und Kostenabrechnung
Dieses Dokument beschreibt das System zur Erfassung und Abrechnung von Token-Nutzung in der Chat-Anwendung.
Übersicht
Die Anwendung verfolgt die Nutzung von LLM-Tokens (Large Language Models) und berechnet daraus die entstehenden Kosten. Dies ermöglicht:
- Transparenz über die Ressourcennutzung
- Kostenerfassung pro Benutzer, Konversation und Modell
- Analysen zur Optimierung der Anwendung
- Grundlage für nutzungsbasierte Abrechnungsmodelle
Datenbank-Schema
Die usage_logs Tabelle
Speichert Informationen über jeden LLM-API-Aufruf:
CREATE TABLE public.usage_logs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
conversation_id UUID REFERENCES conversations(id) ON DELETE CASCADE,
message_id UUID REFERENCES messages(id) ON DELETE CASCADE,
user_id UUID REFERENCES auth.users(id),
model_id UUID REFERENCES models(id),
prompt_tokens INTEGER NOT NULL,
completion_tokens INTEGER NOT NULL,
total_tokens INTEGER NOT NULL,
estimated_cost DECIMAL(10, 6) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
Modell-Kosteninformationen
Die models-Tabelle wurde um ein cost_settings-Feld erweitert, das die Kosten pro Token für jedes Modell enthält:
ALTER TABLE public.models ADD COLUMN cost_settings JSONB DEFAULT '{"prompt_per_1k_tokens": 0.0001, "completion_per_1k_tokens": 0.0002}'::jsonb;
Beispiel für cost_settings:
{
"prompt_per_1k_tokens": 0.003, // Kosten pro 1000 Prompt-Tokens in Dollar
"completion_per_1k_tokens": 0.006 // Kosten pro 1000 Completion-Tokens in Dollar
}
Implementierung
Erfassung der Token-Nutzung
-
API-Aufruf:
- Jeder Aufruf eines LLM-Modells über
services/openai.tsgibt Token-Nutzungsinformationen zurück - Diese werden aus der API-Antwort in
utils/api.tsextrahiert
- Jeder Aufruf eines LLM-Modells über
-
Speicherung:
- Die Funktion
logTokenUsageinservices/openai.tsspeichert die Token-Nutzung in der Datenbank - Sie berechnet auch die geschätzten Kosten basierend auf den Modellpreisen
- Die Funktion
export async function logTokenUsage(
usage: TokenUsage,
conversationId: string,
messageId: string,
userId: string,
modelId: string
): Promise<void>
- Kostenberechnung:
- Die Funktion
calculateTokenCostinservices/openai.tsberechnet die Kosten pro Anfrage - Sie berücksichtigt unterschiedliche Preise für Prompt- und Completion-Tokens
- Die Funktion
export async function calculateTokenCost(
promptTokens: number,
completionTokens: number,
modelId: string
): Promise<number>
Abfrage und Analyse
Die folgenden SQL-Funktionen sind für die Abfrage der Token-Nutzung verfügbar:
-
Nutzung nach Modell:
SELECT * FROM get_user_model_usage(user_id);- Gibt die Summe der Token und Kosten pro Modell für einen Benutzer zurück
-
Nutzung nach Zeitraum:
SELECT * FROM get_user_usage_by_period(user_id, 'day');- Akzeptiert 'day', 'month' oder 'year' als Zeitraum
- Gibt die Summe der Token und Kosten pro Zeiteinheit zurück
-
Nutzung pro Konversation:
SELECT * FROM get_conversation_usage(conversation_id);- Gibt die Token-Nutzung für jede Nachricht in einer Konversation zurück
API-Endpunkte
Die API-Endpunkte für den Zugriff auf die Token-Nutzungsdaten sind:
-
GET /api/usage
- Parameter:
userId(erforderlich),period(optional, Standard: 'month') - Gibt die Token-Nutzung eines Benutzers zurück (nach Modell und Zeitraum)
- Parameter:
-
GET /api/usage/conversation
- Parameter:
conversationId(erforderlich) - Gibt die Token-Nutzung für eine bestimmte Konversation zurück
- Parameter:
Modellpreise (Standardwerte)
Die Standardpreise für verschiedene Modelle sind:
| Modell | Prompt-Tokens (pro 1K) | Completion-Tokens (pro 1K) |
|---|---|---|
| GPT-O3-Mini | $0.0001 | $0.0002 |
| GPT-4o-mini | $0.0001 | $0.0002 |
| GPT-4o | $0.003 | $0.006 |
| GPT-4 | $0.003 | $0.006 |
| GPT-3.5 | $0.0001 | $0.0002 |
| Claude | $0.0008 | $0.0024 |
Verwendungsbeispiele
Token-Nutzung im Code
// Beispiel: Abfrage der Token-Nutzung eines Benutzers
const { data } = await supabase.rpc('get_user_model_usage', { user_id: userId });
console.log('Token-Nutzung nach Modell:', data);
// Beispiel: Abfrage der Token-Nutzung nach Monat
const { data } = await supabase.rpc('get_user_usage_by_period', {
user_id: userId,
period: 'month'
});
console.log('Monatliche Token-Nutzung:', data);
Anzeige in der Benutzeroberfläche
Die Token-Nutzungsdaten können in der Benutzeroberfläche auf verschiedene Weise angezeigt werden:
-
Nutzungsübersicht auf der Profilseite:
- Gesamtkosten und Token-Nutzung
- Aufschlüsselung nach Modellen
-
Detaillierte Nutzungsstatistiken:
- Diagramme zur Visualisierung der Nutzung über die Zeit
- Vergleich der Nutzung verschiedener Modelle
-
Konversationsdetails:
- Anzeige der Token-Nutzung pro Konversation
- Kosten einzelner Nachrichten
Hinweise zur Erweiterung
Limits und Warnungen
Das System kann um folgende Funktionen erweitert werden:
- Nutzungslimits pro Benutzer oder Organisation
- Warnungen, wenn bestimmte Kostenschwellen überschritten werden
- Automatische Deaktivierung teurer Modelle bei Erreichen bestimmter Limits
Export und Berichte
Die Token-Nutzungsdaten können für Berichte exportiert werden:
- Monatliche Kostenabrechnungen pro Benutzer
- Exportformate: CSV, PDF, JSON
- Automatisierte Berichterstellung
Integration mit Abrechnungssystemen
Die Token-Nutzungsdaten können in Abrechnungssysteme integriert werden:
- Berechnung von Kosten für verschiedene Benutzer oder Teams
- Integration mit Stripe oder anderen Zahlungsabwicklern
- Implementierung von unterschiedlichen Preismodellen (Flatrate, Pay-per-Use, etc.)