token-metrics 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- token_metrics-0.1.0/PKG-INFO +9 -0
- token_metrics-0.1.0/pyproject.toml +3 -0
- token_metrics-0.1.0/setup.cfg +4 -0
- token_metrics-0.1.0/setup.py +10 -0
- token_metrics-0.1.0/token_metrics/__init__.py +3 -0
- token_metrics-0.1.0/token_metrics/tracker.py +109 -0
- token_metrics-0.1.0/token_metrics.egg-info/PKG-INFO +9 -0
- token_metrics-0.1.0/token_metrics.egg-info/SOURCES.txt +9 -0
- token_metrics-0.1.0/token_metrics.egg-info/dependency_links.txt +1 -0
- token_metrics-0.1.0/token_metrics.egg-info/requires.txt +1 -0
- token_metrics-0.1.0/token_metrics.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import uuid
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TokenUtilizationSystem:
|
|
7
|
+
def __init__(self, db_path="user_database.json"):
|
|
8
|
+
self.db_path = db_path
|
|
9
|
+
self.default_limit = 1_000_000
|
|
10
|
+
self.users = self._load_db()
|
|
11
|
+
|
|
12
|
+
def _load_db(self):
|
|
13
|
+
if os.path.exists(self.db_path):
|
|
14
|
+
with open(self.db_path, 'r', encoding='utf-8') as f:
|
|
15
|
+
return json.load(f)
|
|
16
|
+
return {}
|
|
17
|
+
|
|
18
|
+
def _save_db(self):
|
|
19
|
+
safe = {}
|
|
20
|
+
for uid, data in self.users.items():
|
|
21
|
+
safe[uid] = {
|
|
22
|
+
"name": data["name"],
|
|
23
|
+
"input_tokens_used": data["input_tokens_used"],
|
|
24
|
+
"output_tokens_used": data["output_tokens_used"],
|
|
25
|
+
"token_balance": data["token_balance"]
|
|
26
|
+
}
|
|
27
|
+
with open(self.db_path, 'w', encoding='utf-8') as f:
|
|
28
|
+
json.dump(safe, f, indent=4)
|
|
29
|
+
|
|
30
|
+
def register(self, name):
|
|
31
|
+
"""
|
|
32
|
+
Register a new user or return existing user's ID.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
name (str): User's name
|
|
36
|
+
Returns:
|
|
37
|
+
user_id (str)
|
|
38
|
+
"""
|
|
39
|
+
for uid, data in self.users.items():
|
|
40
|
+
if data['name'].lower() == name.lower():
|
|
41
|
+
return uid
|
|
42
|
+
|
|
43
|
+
user_id = f"USR-{uuid.uuid4().hex[:6].upper()}"
|
|
44
|
+
self.users[user_id] = {
|
|
45
|
+
"name": name,
|
|
46
|
+
"input_tokens_used": 0,
|
|
47
|
+
"output_tokens_used": 0,
|
|
48
|
+
"token_balance": self.default_limit
|
|
49
|
+
}
|
|
50
|
+
self._save_db()
|
|
51
|
+
return user_id
|
|
52
|
+
|
|
53
|
+
def track(self, user_id, input_tokens, output_tokens):
|
|
54
|
+
"""
|
|
55
|
+
Track token usage after a chat response.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
user_id (str): ID returned from register()
|
|
59
|
+
input_tokens (int): prompt_tokens from your LLM response
|
|
60
|
+
output_tokens (int): completion_tokens from your LLM response
|
|
61
|
+
Returns:
|
|
62
|
+
dict with updated usage, or error string if limit exceeded
|
|
63
|
+
"""
|
|
64
|
+
user = self.users.get(user_id)
|
|
65
|
+
if not user:
|
|
66
|
+
return "Error: User not found."
|
|
67
|
+
|
|
68
|
+
if user['token_balance'] <= 0:
|
|
69
|
+
return "Token limit of 1,000,000 reached. Please upgrade to Premium."
|
|
70
|
+
|
|
71
|
+
user['input_tokens_used'] += input_tokens
|
|
72
|
+
user['output_tokens_used'] += output_tokens
|
|
73
|
+
user['token_balance'] = max(0, user['token_balance'] - (input_tokens + output_tokens))
|
|
74
|
+
self._save_db()
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
"input_tokens_used": user['input_tokens_used'],
|
|
78
|
+
"output_tokens_used": user['output_tokens_used'],
|
|
79
|
+
"remaining_balance": user['token_balance']
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
def get_usage(self, user_id):
|
|
83
|
+
"""
|
|
84
|
+
Get token usage stats for a user.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
user_id (str): ID returned from register()
|
|
88
|
+
"""
|
|
89
|
+
user = self.users.get(user_id)
|
|
90
|
+
if not user:
|
|
91
|
+
return "Error: User not found."
|
|
92
|
+
return {
|
|
93
|
+
"name": user["name"],
|
|
94
|
+
"input_tokens_used": user["input_tokens_used"],
|
|
95
|
+
"output_tokens_used": user["output_tokens_used"],
|
|
96
|
+
"token_balance": user["token_balance"]
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
def has_balance(self, user_id):
|
|
100
|
+
"""
|
|
101
|
+
Check if user still has token balance remaining.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
user_id (str): ID returned from register()
|
|
105
|
+
Returns:
|
|
106
|
+
bool
|
|
107
|
+
"""
|
|
108
|
+
user = self.users.get(user_id)
|
|
109
|
+
return bool(user and user['token_balance'] > 0)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
pyproject.toml
|
|
2
|
+
setup.py
|
|
3
|
+
token_metrics/__init__.py
|
|
4
|
+
token_metrics/tracker.py
|
|
5
|
+
token_metrics.egg-info/PKG-INFO
|
|
6
|
+
token_metrics.egg-info/SOURCES.txt
|
|
7
|
+
token_metrics.egg-info/dependency_links.txt
|
|
8
|
+
token_metrics.egg-info/requires.txt
|
|
9
|
+
token_metrics.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
litellm
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
token_metrics
|