From 87fd0d9b78c83e880a0d9fd620c0f2975c73a362 Mon Sep 17 00:00:00 2001 From: Mehmet S Date: Tue, 17 Sep 2024 12:48:17 +0000 Subject: [PATCH] chore: update token_limiter --- private/app/php/stream-api.php | 86 +++++++++++++++++---------- private/resources/language/de_DE.json | 1 + private/resources/language/en_US.json | 1 + 3 files changed, 55 insertions(+), 33 deletions(-) diff --git a/private/app/php/stream-api.php b/private/app/php/stream-api.php index cf22447..6ca2613 100644 --- a/private/app/php/stream-api.php +++ b/private/app/php/stream-api.php @@ -39,8 +39,9 @@ $requestPayload = json_decode($requestPayload, true); $requestPayload['stream_options']['include_usage'] = true; $requestPayload = json_encode($requestPayload); -//if environment variable = true -check_token_limit(); +if ((isset($env) ? strtolower($env['TOKEN_DB']) : strtolower(getenv('TOKEN_DB'))) == "true") { + check_token_limit(); +} $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiUrl); @@ -54,7 +55,10 @@ 'Content-Type: application/json' ]); curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) { - get_tokens($data); + if (strtolower(isset($env) ? $env['TOKEN_DB'] : getenv('TOKEN_DB')) == "true") { + get_tokens($data); + } + echo $data; if (ob_get_level() > 0) { ob_flush(); @@ -73,51 +77,58 @@ function get_tokens($data){ - $pattern = '/"usage":\{"prompt_tokens":[0-9]+,"completion_tokens":[0-9]+,"total_tokens":[0-9]+\}/'; - if (preg_match_all($pattern, $data, $matches)) { - $last_match = end($matches[0]); - $numberpattern = '/[0-9]+/'; - if (preg_match_all($numberpattern, $last_match, $numbers)){ - - $prompt_tokens = $numbers[0][0]; - $completion_tokens = $numbers[0][1]; - $total_tokens = $numbers[0][2]; - - $host = getenv("DB_HOST"); - $db = getenv("DB_DB"); - $table = getenv('DB_TABLE'); - $user = getenv("DB_USER"); - $pass = getenv("DB_PASS"); - $port = getenv("DB_PORT"); - $dsn = "pgsql:host=$host;port=$port;dbname=$db"; + $jsonstrings= explode("data: ", $data); + foreach ($jsonstrings as &$jsonstring) { + $json = json_decode($jsonstring, true); + if (!isset($json) || $json['usage'] == null) { + continue; + } + + $prompt_tokens = $json['usage']['prompt_tokens']; + $completion_tokens = $json['usage']['completion_tokens']; + $total_tokens = $json['usage']['total_tokens']; + + $host = getenv("DB_HOST"); + $db = getenv("DB_DB"); + $table = getenv('DB_TABLE'); + $user = getenv("DB_USER"); + $pass = getenv("DB_PASS"); + $port = getenv("DB_PORT"); + $dsn = "pgsql:host=$host;port=$port;dbname=$db"; try{ $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - $sql = "INSERT INTO $table (username,datum,prompt_tokens,completion_tokens,total_tokens) VALUES(:username,:datum,:prompt,:completion,:total) ON CONFLICT (username,datum) DO UPDATE SET prompt_tokens = $table.prompt_tokens + EXCLUDED.prompt_tokens, completion_tokens = $table.completion_tokens + EXCLUDED.completion_tokens, total_tokens = $table.total_tokens + EXCLUDED.total_tokens;"; + $sql = "INSERT INTO $table (username,datum,prompt_tokens,completion_tokens,total_tokens,model) VALUES(:username,:datum,:prompt,:completion,:total,:model) ON CONFLICT (username,datum,model) DO UPDATE SET prompt_tokens = $table.prompt_tokens + EXCLUDED.prompt_tokens, completion_tokens = $table.completion_tokens + EXCLUDED.completion_tokens, total_tokens = $table.total_tokens + EXCLUDED.total_tokens, model = $table.model;"; $stmt=$pdo->prepare($sql); - $stmt->bindParam(':username',$username); $stmt->bindParam(':datum',$datum); $stmt->bindParam(':prompt',$prompt); $stmt->bindParam(':completion',$completion); $stmt->bindParam(':total',$total); + $stmt->bindParam(':model',$model); $username = $_SESSION['username']; $datum = date("Y-m-d"); $prompt = $prompt_tokens; $completion = $completion_tokens; $total = $total_tokens; + global $requestPayload; + $model = json_decode($requestPayload, true)['model']; $stmt->execute(); } catch (PDOException $e) { error_log($e->getMessage(),0); } - } - - } + } + unset($jsonstring); } function check_token_limit(){ + $max_tokens = getenv("TOKEN_LIMIT"); + if ($max_tokens <= 0) { + return; + } + $host = getenv("DB_HOST"); $db = getenv("DB_DB"); $table = getenv('DB_TABLE'); @@ -125,13 +136,11 @@ function check_token_limit(){ $pass = getenv("DB_PASS"); $port = getenv("DB_PORT"); $dsn = "pgsql:host=$host;port=$port;dbname=$db"; - $max_tokens = //environment variable - + try { - $pdo = new PDO($dsn, $user, $pass); - $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - // TODO: change query; last 3days - $sql = "SELECT total_tokens FROM $table WHERE username = :username AND datum = :datum"; + $pdo = new PDO($dsn, $user, $pass); + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $sql = "SELECT SUM(total_tokens) AS total_tokens FROM $table WHERE datum >= (:datum ::date - INTERVAL '2 day')::date AND username = :username GROUP BY username;"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':username', $username); $stmt->bindParam(':datum', $datum); @@ -141,7 +150,19 @@ function check_token_limit(){ $result = $stmt->fetch(PDO::FETCH_ASSOC); if ($result && $result['total_tokens'] >= $max_tokens) { - error_log("Fehlermeldung: Die Gesamtzahl der Tokens überschreitet."); + $message = $_SESSION['translation']['tokenUsedMessage']; + $response = [ + 'error' => true, + 'choices' => [['delta' => ['content' => $message]]] + ]; + + echo "data: " . json_encode($response) . "\n\n"; + + if (ob_get_level() > 0) { + ob_flush(); + } + flush(); + exit; } } catch (PDOException $e) { @@ -149,5 +170,4 @@ function check_token_limit(){ exit; } - } \ No newline at end of file diff --git a/private/resources/language/de_DE.json b/private/resources/language/de_DE.json index 8b2ace0..8d0f2e8 100644 --- a/private/resources/language/de_DE.json +++ b/private/resources/language/de_DE.json @@ -134,6 +134,7 @@ "tableExpertiseMessage": "You are a helpful assistant working at a university in Germany and you are an expert in the field of organisation.", "theme": "Theme", "timeManagementAssistanceRequest": "Ich suche nach Unterstützung beim Zeitmanagement. Ich habe Schwierigkeiten, meine Zeit effektiv zu nutzen und meine Aufgaben in angemessener Zeit zu erledigen. Ich bin mir nicht sicher, wie ich meine Zeit besser organisieren kann, um meine Ziele zu erreichen und Stress zu vermeiden. Könntest du mir bitte helfen, meine aktuelle Zeitnutzung zu bewerten und mir Ratschläge und Tipps zur Verbesserung meines Zeitmanagements geben? Ich suche auch nach Strategien, um meine Prioritäten zu setzen und meine Zeit besser zu planen, um meine Produktivität zu steigern und meine Ziele zu erreichen.", + "tokenUsedMessage": "Sie haben alle ihre Token aufgebraucht.", "unableToSaveRegistration": "Ihre Anmeldung konnte nicht gespeichert werden.
Bitte versuchen Sie es erneut.
", "usageNoticeTitle": "Nutzungshinweis", "usage_guideline": "

Willkommen zum Leitfaden für den Umgang mit HM-KI, das auf der OpenAI API basiert. Dieser Leitfaden soll allen Hochschulangehörigen - Studierenden, Lehrenden und Mitarbeitenden - eine klare Richtlinie bieten, wie mit dieser Technologie verantwortungsbewusst umgegangen werden soll. Bitte beachten Sie, dass dieser Leitfaden die Nutzungsbedingungen von OpenAI ergänzt und keinen Anspruch auf Vollständigkeit erhebt. Es liegt in der Verantwortung der Nutzerinnen und Nutzer, die Nutzungsbedingungen einzuhalten.

Allgemeine Bestimmungen

Was verboten ist:

Was zu beachten ist:

Sie sind verantwortlich für den von Ihnen bereitgestellten Input und den daraus resultierenden Output. Sie müssen sicherstellen, dass Ihr Input keine Rechte verletzt und dass Sie über alle notwendigen Rechte, Lizenzen und Genehmigungen für die Bereitstellung des Inputs verfügen.

Genauigkeit:

Die Nutzung der Dienste kann zu ungenauem oder fehlerhaftem Output führen. Es ist wichtig, dass Sie den Output kritisch prüfen und nicht als alleinige Quelle der Wahrheit verwenden.Ihre Eingaben werden nicht von der HM, aber von OpenAI für 30 Tage gespeichert, um einen eventuellen Missbrauch festzustellen. Nach 30 Tagen werden die Daten gelöscht. Ihre Eingaben werden nicht verwendet, um das Produkt sicherer oder besser zu machen.

Spezifische Bestimmungen

Für Studierende:

Für Lehrende:

Für Mitarbeitende:

Dieser Leitfaden dient als Orientierungshilfe für den verantwortungsbewussten Umgang mit HM-KI. Es ist wichtig, dass alle Nutzer*innen die genannten Bestimmungen verstehen und befolgen, um einen sicheren und ethischen Einsatz dieser Technologie zu gewährleisten. Die Hochschule kann diesen Service nur anbieten, wenn Sie keine persönlichen Daten eingeben. Ungeachtet dieses Leitfadens gelten die Nutzungsbedingungen von OpenAI.

", diff --git a/private/resources/language/en_US.json b/private/resources/language/en_US.json index 53df930..df3d722 100644 --- a/private/resources/language/en_US.json +++ b/private/resources/language/en_US.json @@ -134,6 +134,7 @@ "tableExpertiseMessage": "You are a helpful assistant working at a university in Germany and you are an expert in the field of organisation.", "theme": "Theme", "timeManagementAssistanceRequest": "I am looking for support with time management. I struggle to use my time effectively and complete my tasks in a timely manner. I am not sure how I can better organize my time to achieve my goals and avoid stress. Could you please help me assess my current time usage and provide me with advice and tips for improving my time management? I am also looking for strategies to set my priorities and plan my time better in order to increase my productivity and reach my goals.", + "tokenUsedMessage": "You have used up all your tokens.", "unableToSaveRegistration": "Your registration could not be saved.
Please try again.
", "usageNoticeTitle": "Usage Notice", "usage_guideline": "

Welcome to the guide for using HM_AI, which is based on the OpenAI API. This guide is intended for all university affiliates - students, teachers, and staff - to provide a clear guideline on how to handle this technology responsibly. Please note that this guide supplements the terms of use of OpenAI and does not claim to be exhaustive. It is the users' responsibility to comply with these terms.

General Provisions

What is prohibited:

What to consider:

You are responsible for the input you provide and the resulting output. You must ensure that your input does not infringe any rights and that you have all necessary rights, licenses, and permissions to provide it.

Accuracy:

Using the services can lead to inaccurate or incorrect output. It is important that you critically examine the output and not use it as the sole source of truth. Your inputs are not stored by HAWK, but by OpenAI for 30 days to detect any misuse. After 30 days, the data is deleted. Your inputs are not used to improve the product's safety or quality.

Specific Provisions

For students:

For teachers:

For staff:

This guide serves as an orientation aid for the responsible handling of HM-AI. It is important that all users understand and follow these provisions to ensure safe and ethical use of this technology. The university can only offer this service if you do not enter personal data. Regardless of this guide, the OpenAI Terms of Use apply.

",