From ff0e7cd6024a507f743787117d544cb2ccdbb777 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Tue, 13 May 2025 14:18:15 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/utils/statistic.py | 125 ++++++++++++++++----------------- 1 file changed, 60 insertions(+), 65 deletions(-) diff --git a/src/plugins/utils/statistic.py b/src/plugins/utils/statistic.py index 4c11ba3d8..6a0b95964 100644 --- a/src/plugins/utils/statistic.py +++ b/src/plugins/utils/statistic.py @@ -109,13 +109,13 @@ def _format_online_time(online_seconds: int) -> str: minutes = (total_oneline_time.seconds // 60) % 60 seconds = total_oneline_time.seconds % 60 if days > 0: - # 如果在线时间超过1天,则格式化为“X天X小时X分钟” + # 如果在线时间超过1天,则格式化为"X天X小时X分钟" total_oneline_time_str = f"{total_oneline_time.days}天{hours}小时{minutes}分钟{seconds}秒" elif hours > 0: - # 如果在线时间超过1小时,则格式化为“X小时X分钟X秒” + # 如果在线时间超过1小时,则格式化为"X小时X分钟X秒" total_oneline_time_str = f"{hours}小时{minutes}分钟{seconds}秒" else: - # 其他情况格式化为“X分钟X秒” + # 其他情况格式化为"X分钟X秒" total_oneline_time_str = f"{minutes}分钟{seconds}秒" return total_oneline_time_str @@ -151,7 +151,7 @@ class StatisticOutputTask(AsyncTask): local_storage["deploy_time"] = now.timestamp() self.stat_period: List[Tuple[str, timedelta, str]] = [ - ("all_time", now - deploy_time, "自部署以来"), # 必须保留“all_time” + ("all_time", now - deploy_time, "自部署以来"), # 必须保留"all_time" ("last_7_days", timedelta(days=7), "最近7天"), ("last_24_hours", timedelta(days=1), "最近24小时"), ("last_hour", timedelta(hours=1), "最近1小时"), @@ -511,37 +511,64 @@ class StatisticOutputTask(AsyncTask): """ # format总在线时间 + # 按模型分类统计 + model_rows = "\n".join([ + f"" + f"{model_name}" + f"{count}" + f"{stat_data[IN_TOK_BY_MODEL][model_name]}" + f"{stat_data[OUT_TOK_BY_MODEL][model_name]}" + f"{stat_data[TOTAL_TOK_BY_MODEL][model_name]}" + f"{stat_data[COST_BY_MODEL][model_name]:.4f} ¥" + f"" + for model_name, count in sorted(stat_data[REQ_CNT_BY_MODEL].items()) + ]) + # 按请求类型分类统计 + type_rows = "\n".join([ + f"" + f"{req_type}" + f"{count}" + f"{stat_data[IN_TOK_BY_TYPE][req_type]}" + f"{stat_data[OUT_TOK_BY_TYPE][req_type]}" + f"{stat_data[TOTAL_TOK_BY_TYPE][req_type]}" + f"{stat_data[COST_BY_TYPE][req_type]:.4f} ¥" + f"" + for req_type, count in sorted(stat_data[REQ_CNT_BY_TYPE].items()) + ]) + # 按用户分类统计 + user_rows = "\n".join([ + f"" + f"{user_id}" + f"{count}" + f"{stat_data[IN_TOK_BY_USER][user_id]}" + f"{stat_data[OUT_TOK_BY_USER][user_id]}" + f"{stat_data[TOTAL_TOK_BY_USER][user_id]}" + f"{stat_data[COST_BY_USER][user_id]:.4f} ¥" + f"" + for user_id, count in sorted(stat_data[REQ_CNT_BY_USER].items()) + ]) + # 聊天消息统计 + chat_rows = "\n".join([ + f"{self.name_mapping[chat_id][0]}{count}" + for chat_id, count in sorted(stat_data[MSG_CNT_BY_CHAT].items()) + ]) # 生成HTML return f""" -
-

+

+

统计时段: {start_time.strftime("%Y-%m-%d %H:%M:%S")} ~ {now.strftime("%Y-%m-%d %H:%M:%S")}

-

总在线时间: {_format_online_time(stat_data[ONLINE_TIME])}

-

总消息数: {stat_data[TOTAL_MSG_CNT]}

-

总请求数: {stat_data[TOTAL_REQ_CNT]}

-

总花费: {stat_data[TOTAL_COST]:.4f} ¥

+

总在线时间: {_format_online_time(stat_data[ONLINE_TIME])}

+

总消息数: {stat_data[TOTAL_MSG_CNT]}

+

总请求数: {stat_data[TOTAL_REQ_CNT]}

+

总花费: {stat_data[TOTAL_COST]:.4f} ¥

按模型分类统计

- { - "\n".join( - [ - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - for model_name, count in sorted(stat_data[REQ_CNT_BY_MODEL].items()) - ] - ) - } + {model_rows}
模型名称调用次数输入Token输出TokenToken总量累计花费
{model_name}{count}{stat_data[IN_TOK_BY_MODEL][model_name]}{stat_data[OUT_TOK_BY_MODEL][model_name]}{stat_data[TOTAL_TOK_BY_MODEL][model_name]}{stat_data[COST_BY_MODEL][model_name]:.4f} ¥
@@ -551,21 +578,7 @@ class StatisticOutputTask(AsyncTask): 请求类型调用次数输入Token输出TokenToken总量累计花费 - { - "\n".join( - [ - f"" - f"{req_type}" - f"{count}" - f"{stat_data[IN_TOK_BY_TYPE][req_type]}" - f"{stat_data[OUT_TOK_BY_TYPE][req_type]}" - f"{stat_data[TOTAL_TOK_BY_TYPE][req_type]}" - f"{stat_data[COST_BY_TYPE][req_type]:.4f} ¥" - f"" - for req_type, count in sorted(stat_data[REQ_CNT_BY_TYPE].items()) - ] - ) - } + {type_rows} @@ -575,21 +588,7 @@ class StatisticOutputTask(AsyncTask): 用户名称调用次数输入Token输出TokenToken总量累计花费 - { - "\n".join( - [ - f"" - f"{user_id}" - f"{count}" - f"{stat_data[IN_TOK_BY_USER][user_id]}" - f"{stat_data[OUT_TOK_BY_USER][user_id]}" - f"{stat_data[TOTAL_TOK_BY_USER][user_id]}" - f"{stat_data[COST_BY_USER][user_id]:.4f} ¥" - f"" - for user_id, count in sorted(stat_data[REQ_CNT_BY_USER].items()) - ] - ) - } + {user_rows} @@ -599,14 +598,7 @@ class StatisticOutputTask(AsyncTask): 联系人/群组名称消息数量 - { - "\n".join( - [ - f"{self.name_mapping[chat_id][0]}{count}" - for chat_id, count in sorted(stat_data[MSG_CNT_BY_CHAT].items()) - ] - ) - } + {chat_rows}
@@ -622,6 +614,9 @@ class StatisticOutputTask(AsyncTask): _format_stat_data(stat["all_time"], "all_time", datetime.fromtimestamp(local_storage["deploy_time"])) ) + joined_tab_list = "\n".join(tab_list) + joined_tab_content = "\n".join(tab_content_list) + html_template = ( """ @@ -734,10 +729,10 @@ class StatisticOutputTask(AsyncTask):

统计截止时间: {now.strftime("%Y-%m-%d %H:%M:%S")}

- {"\n".join(tab_list)} + {joined_tab_list}
- {"\n".join(tab_content_list)} + {joined_tab_content}
""" + """