Skip to content

Commit d681759

Browse files
committed
v0.76 - premium mode auto-switching
1 parent 0cc29de commit d681759

File tree

3 files changed

+96
-14
lines changed

3 files changed

+96
-14
lines changed

src/main.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ def run_asyncio_loop(self):
270270
asyncio.run(self.schedule_daily_reset())
271271

272272
# logging functionality
273-
def log_message(self, message_type, user_id=None, message='', source=None):
273+
def log_message(self, message_type, user_id=None, message='', source=None, model_info=None):
274274
"""
275275
Wrapper for the modules.log_message function to include source.
276276
@@ -285,7 +285,8 @@ def log_message(self, message_type, user_id=None, message='', source=None):
285285
user_id=user_id,
286286
message=message,
287287
chat_logging_enabled=self.chat_logging_enabled,
288-
source=source
288+
source=source,
289+
model_info=model_info
289290
)
290291

291292
# trim the chat history to meet up with max token limits

src/modules.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,14 @@ def check_global_rate_limit(max_requests_per_minute, global_request_count, rate_
171171

172172
# msg logging
173173
# Logging functionalities
174-
def log_message(message_type, user_id=None, message='', chat_logging_enabled=True, source=None):
174+
def log_message(
175+
message_type,
176+
user_id=None,
177+
message='',
178+
chat_logging_enabled=True,
179+
source=None,
180+
model_info=None
181+
):
175182
"""
176183
Logs messages with an optional source to identify external API origins.
177184
@@ -181,29 +188,42 @@ def log_message(message_type, user_id=None, message='', chat_logging_enabled=Tru
181188
message (str, optional): The message content. Defaults to ''.
182189
chat_logging_enabled (bool, optional): Flag to enable/disable logging. Defaults to True.
183190
source (str, optional): Source of the message (e.g., 'Calculator Module'). Defaults to None.
191+
model_info (str, optional): Additional info about the model/tier/usage to log with 'Bot' messages.
184192
"""
185193
if not chat_logging_enabled:
186194
return
187195

188-
# Get the 'ChatLogger' instance
189196
chat_logger = logging.getLogger('ChatLogger')
190197

191-
# Prepare the base log message
192198
if message_type == 'User':
193199
base_message = f"User ({user_id}): {message}"
200+
194201
elif message_type == 'Bot':
195-
base_message = f"Bot: {message}"
202+
# Construct the line for a 'Bot' message
203+
# Example: "Bot [to <user_id>, <model_info>] : <message>"
204+
if user_id is not None:
205+
if model_info:
206+
base_message = f"Bot [to {user_id}, {model_info}] : {message}"
207+
else:
208+
base_message = f"Bot [to {user_id}] : {message}"
209+
else:
210+
# If user_id is missing, just do "Bot: <message>"
211+
if model_info:
212+
base_message = f"Bot [{model_info}]: {message}"
213+
else:
214+
base_message = f"Bot: {message}"
215+
196216
else:
217+
# If neither 'User' nor 'Bot', just log a fallback line
197218
if user_id:
198219
base_message = f"Unknown message type '{message_type}' from User ({user_id}): {message}"
199220
else:
200221
base_message = f"Unknown message type '{message_type}': {message}"
201222

202-
# Append source if provided
203223
if source:
204224
base_message = f"{base_message} [Source: {source}]"
205225

206-
# Log the message
226+
# Actually write it to the chat logger
207227
if message_type in ['User', 'Bot']:
208228
chat_logger.info(base_message)
209229
else:

src/text_message_handler.py

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,18 @@
107107
DB_INITIALIZED_SUCCESSFULLY = False
108108
# --- End Import ---
109109

110+
# get today's usage regarding OpenAI API's responses (for auto-switching)
111+
def get_today_usage():
112+
"""
113+
Return (premium_used, mini_used) for today if DB is ready,
114+
or None if DB not ready or usage could not be retrieved.
115+
"""
116+
if not DB_INITIALIZED_SUCCESSFULLY or not DB_PATH:
117+
return None # Not ready
118+
usage_date = datetime.datetime.utcnow().strftime('%Y-%m-%d')
119+
daily_usage = _get_daily_usage_sync(DB_PATH, usage_date)
120+
return daily_usage # daily_usage is (premium_tokens, mini_tokens) or None
121+
110122
# model picker auto-switch
111123
def pick_model_auto_switch(bot):
112124
if not config_auto.has_section('ModelAutoSwitch'):
@@ -1128,19 +1140,68 @@ async def handle_message(bot, update: Update, context: CallbackContext, logger)
11281140
# escaped_reply = bot_reply
11291141
logger.info(f"[Debug] Reply message after escaping: {escaped_reply}")
11301142

1131-
# Log the bot's response
1143+
# new detailed logging in v0.76
1144+
try:
1145+
# 1) Attempt to read daily usage from DB:
1146+
usage_tuple = get_today_usage() # returns (premium_used, mini_used) or None
1147+
if usage_tuple:
1148+
premium_used, mini_used = usage_tuple
1149+
else:
1150+
premium_used, mini_used = None, None
1151+
1152+
# 2) read from config.ini for limits & model
1153+
premium_model = config_auto["ModelAutoSwitch"].get("PremiumModel", "")
1154+
fallback_model = config_auto["ModelAutoSwitch"].get("FallbackModel", "")
1155+
premium_limit = config_auto["ModelAutoSwitch"].getint("PremiumTokenLimit", 0)
1156+
fallback_limit = config_auto["ModelAutoSwitch"].getint("MiniTokenLimit", 0)
1157+
1158+
# 3) figure out if current model is 'premium' or 'mini'
1159+
if bot.model == premium_model and premium_model:
1160+
tier_str = "premium"
1161+
used_so_far = premium_used if premium_used is not None else "N/A"
1162+
limit_str = premium_limit if premium_limit else "N/A"
1163+
elif bot.model == fallback_model and fallback_model:
1164+
tier_str = "mini"
1165+
used_so_far = mini_used if mini_used is not None else "N/A"
1166+
limit_str = fallback_limit if fallback_limit else "N/A"
1167+
else:
1168+
tier_str = "?"
1169+
used_so_far = "N/A"
1170+
limit_str = "N/A"
1171+
1172+
if used_so_far == "N/A" or limit_str == "N/A":
1173+
usage_str = "N/A"
1174+
else:
1175+
usage_str = f"{used_so_far}/{limit_str}"
1176+
1177+
model_info = f"model={bot.model}, tier={tier_str}, usage={usage_str}"
1178+
1179+
except Exception as e:
1180+
bot.logger.warning(f"Could not build model_info: {e}")
1181+
# Fallback if something went wrong
1182+
model_info = "model=N/A, usage=N/A"
1183+
1184+
# pass the bot log with more info
11321185
bot.log_message(
11331186
message_type='Bot',
1187+
user_id=update.message.from_user.id,
11341188
message=bot_reply,
1189+
model_info=model_info
11351190
)
11361191

1137-
# # send the response
1138-
# await context.bot.send_message(
1139-
# chat_id=chat_id,
1140-
# text=escaped_reply,
1141-
# parse_mode=ParseMode.HTML
1192+
# # Log the bot's response
1193+
# bot.log_message(
1194+
# message_type='Bot',
1195+
# message=bot_reply,
11421196
# )
11431197

1198+
# # # send the response
1199+
# # await context.bot.send_message(
1200+
# # chat_id=chat_id,
1201+
# # text=escaped_reply,
1202+
# # parse_mode=ParseMode.HTML
1203+
# # )
1204+
11441205
escaped_reply = sanitize_html(escaped_reply)
11451206

11461207
message_parts = split_message(escaped_reply)

0 commit comments

Comments
 (0)