🤖 自动格式化代码 [skip ci]
This commit is contained in:
@@ -16,149 +16,126 @@ from src.chat.focus_chat.hfc_version_manager import set_hfc_version, get_hfc_ver
|
||||
|
||||
def test_performance_logger():
|
||||
"""测试性能记录器功能"""
|
||||
|
||||
|
||||
# 设置测试版本号
|
||||
test_version = "v1.2.3_test"
|
||||
set_hfc_version(test_version)
|
||||
print(f"设置测试版本号: {test_version}")
|
||||
print(f"当前版本号: {get_hfc_version()}")
|
||||
|
||||
|
||||
# 创建测试用的性能记录器
|
||||
test_chat_id = "test_chat_123"
|
||||
logger = HFCPerformanceLogger(test_chat_id, test_version)
|
||||
|
||||
|
||||
print(f"测试 HFC 性能记录器 - Chat ID: {test_chat_id}, Version: {logger.version}")
|
||||
|
||||
|
||||
# 模拟记录几个循环的数据
|
||||
test_cycles = [
|
||||
{
|
||||
"cycle_id": 1,
|
||||
"action_type": "reply",
|
||||
"total_time": 2.5,
|
||||
"step_times": {
|
||||
"观察": 0.1,
|
||||
"并行调整动作、处理": 1.2,
|
||||
"规划器": 0.8,
|
||||
"执行动作": 0.4
|
||||
},
|
||||
"step_times": {"观察": 0.1, "并行调整动作、处理": 1.2, "规划器": 0.8, "执行动作": 0.4},
|
||||
"reasoning": "用户询问天气,需要回复",
|
||||
"success": True
|
||||
"success": True,
|
||||
},
|
||||
{
|
||||
"cycle_id": 2,
|
||||
"action_type": "no_reply",
|
||||
"total_time": 1.8,
|
||||
"step_times": {
|
||||
"观察": 0.08,
|
||||
"并行调整动作、处理": 0.9,
|
||||
"规划器": 0.6,
|
||||
"执行动作": 0.22
|
||||
},
|
||||
"step_times": {"观察": 0.08, "并行调整动作、处理": 0.9, "规划器": 0.6, "执行动作": 0.22},
|
||||
"reasoning": "无需回复的日常对话",
|
||||
"success": True
|
||||
"success": True,
|
||||
},
|
||||
{
|
||||
"cycle_id": 3,
|
||||
"action_type": "reply",
|
||||
"total_time": 3.2,
|
||||
"step_times": {
|
||||
"观察": 0.12,
|
||||
"并行调整动作、处理": 1.5,
|
||||
"规划器": 1.1,
|
||||
"执行动作": 0.48
|
||||
},
|
||||
"step_times": {"观察": 0.12, "并行调整动作、处理": 1.5, "规划器": 1.1, "执行动作": 0.48},
|
||||
"reasoning": "用户提出复杂问题,需要详细回复",
|
||||
"success": True
|
||||
"success": True,
|
||||
},
|
||||
{
|
||||
"cycle_id": 4,
|
||||
"action_type": "no_reply",
|
||||
"total_time": 1.5,
|
||||
"step_times": {
|
||||
"观察": 0.07,
|
||||
"并行调整动作、处理": 0.8,
|
||||
"规划器": 0.5,
|
||||
"执行动作": 0.13
|
||||
},
|
||||
"step_times": {"观察": 0.07, "并行调整动作、处理": 0.8, "规划器": 0.5, "执行动作": 0.13},
|
||||
"reasoning": "群聊中的无关对话",
|
||||
"success": True
|
||||
"success": True,
|
||||
},
|
||||
{
|
||||
"cycle_id": 5,
|
||||
"action_type": "error",
|
||||
"total_time": 0.5,
|
||||
"step_times": {
|
||||
"观察": 0.05,
|
||||
"并行调整动作、处理": 0.2,
|
||||
"规划器": 0.15,
|
||||
"执行动作": 0.1
|
||||
},
|
||||
"step_times": {"观察": 0.05, "并行调整动作、处理": 0.2, "规划器": 0.15, "执行动作": 0.1},
|
||||
"reasoning": "处理过程中出现错误",
|
||||
"success": False
|
||||
}
|
||||
"success": False,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
# 记录测试数据
|
||||
for cycle_data in test_cycles:
|
||||
logger.record_cycle(cycle_data)
|
||||
print(f"已记录循环 {cycle_data['cycle_id']}: {cycle_data['action_type']} ({cycle_data['total_time']:.1f}s)")
|
||||
|
||||
|
||||
# 获取当前会话统计
|
||||
current_stats = logger.get_current_session_stats()
|
||||
print("\n=== 当前会话统计 ===")
|
||||
print(json.dumps(current_stats, ensure_ascii=False, indent=2))
|
||||
|
||||
|
||||
# 完成会话
|
||||
logger.finalize_session()
|
||||
print(f"\n=== 会话已完成 ===")
|
||||
print("\n=== 会话已完成 ===")
|
||||
print(f"日志文件: {logger.session_file}")
|
||||
print(f"统计文件: {logger.stats_file}")
|
||||
|
||||
|
||||
# 检查生成的文件
|
||||
if logger.session_file.exists():
|
||||
print(f"\n会话文件大小: {logger.session_file.stat().st_size} 字节")
|
||||
|
||||
|
||||
if logger.stats_file.exists():
|
||||
print(f"统计文件大小: {logger.stats_file.stat().st_size} 字节")
|
||||
|
||||
|
||||
# 读取并显示统计数据
|
||||
with open(logger.stats_file, 'r', encoding='utf-8') as f:
|
||||
with open(logger.stats_file, "r", encoding="utf-8") as f:
|
||||
stats_data = json.load(f)
|
||||
|
||||
print(f"\n=== 最终统计数据 ===")
|
||||
|
||||
print("\n=== 最终统计数据 ===")
|
||||
if test_chat_id in stats_data:
|
||||
chat_stats = stats_data[test_chat_id]
|
||||
print(f"Chat ID: {test_chat_id}")
|
||||
print(f"最后更新: {chat_stats['last_updated']}")
|
||||
print(f"总记录数: {chat_stats['overall']['total_records']}")
|
||||
print(f"平均总时间: {chat_stats['overall']['avg_total_time']:.2f}秒")
|
||||
|
||||
print(f"\n各步骤平均时间:")
|
||||
for step, avg_time in chat_stats['overall']['avg_step_times'].items():
|
||||
|
||||
print("\n各步骤平均时间:")
|
||||
for step, avg_time in chat_stats["overall"]["avg_step_times"].items():
|
||||
print(f" {step}: {avg_time:.3f}秒")
|
||||
|
||||
print(f"\n按动作类型统计:")
|
||||
for action, action_stats in chat_stats['by_action'].items():
|
||||
print(f" {action}: {action_stats['count']}次 ({action_stats['percentage']:.1f}%), 平均{action_stats['avg_total_time']:.2f}秒")
|
||||
|
||||
print("\n按动作类型统计:")
|
||||
for action, action_stats in chat_stats["by_action"].items():
|
||||
print(
|
||||
f" {action}: {action_stats['count']}次 ({action_stats['percentage']:.1f}%), 平均{action_stats['avg_total_time']:.2f}秒"
|
||||
)
|
||||
|
||||
|
||||
def test_version_manager():
|
||||
"""测试版本号管理功能"""
|
||||
print("\n=== 测试版本号管理器 ===")
|
||||
|
||||
|
||||
# 测试默认版本
|
||||
print(f"默认版本: {get_hfc_version()}")
|
||||
|
||||
|
||||
# 测试设置版本
|
||||
test_versions = ["v2.0.0", "1.5.0", "v1.0.0.beta", "v1.0.build123"]
|
||||
for version in test_versions:
|
||||
success = set_hfc_version(version)
|
||||
print(f"设置版本 '{version}': {'成功' if success else '失败'} -> {get_hfc_version()}")
|
||||
|
||||
|
||||
# 测试自动生成版本
|
||||
auto_version = auto_generate_hfc_version()
|
||||
print(f"自动生成版本: {auto_version}")
|
||||
|
||||
|
||||
# 测试基于现有版本的自动生成
|
||||
auto_version2 = auto_generate_hfc_version("v2.1.0")
|
||||
print(f"基于v2.1.0自动生成: {auto_version2}")
|
||||
@@ -166,4 +143,4 @@ def test_version_manager():
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_version_manager()
|
||||
test_performance_logger()
|
||||
test_performance_logger()
|
||||
|
||||
@@ -7,7 +7,6 @@ import sys
|
||||
import json
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any
|
||||
|
||||
# 添加项目根目录到Python路径
|
||||
@@ -27,30 +26,30 @@ def display_chat_stats(chat_id: str, stats: Dict[str, Any]):
|
||||
print(f"\n=== Chat ID: {chat_id} ===")
|
||||
print(f"版本: {stats.get('version', 'unknown')}")
|
||||
print(f"最后更新: {stats['last_updated']}")
|
||||
|
||||
overall = stats['overall']
|
||||
print(f"\n📊 总体统计:")
|
||||
|
||||
overall = stats["overall"]
|
||||
print("\n📊 总体统计:")
|
||||
print(f" 总记录数: {overall['total_records']}")
|
||||
print(f" 平均总时间: {format_time(overall['avg_total_time'])}")
|
||||
|
||||
print(f"\n⏱️ 各步骤平均时间:")
|
||||
for step, avg_time in overall['avg_step_times'].items():
|
||||
|
||||
print("\n⏱️ 各步骤平均时间:")
|
||||
for step, avg_time in overall["avg_step_times"].items():
|
||||
print(f" {step}: {format_time(avg_time)}")
|
||||
|
||||
print(f"\n🎯 按动作类型统计:")
|
||||
by_action = stats['by_action']
|
||||
|
||||
|
||||
print("\n🎯 按动作类型统计:")
|
||||
by_action = stats["by_action"]
|
||||
|
||||
# 按比例排序
|
||||
sorted_actions = sorted(by_action.items(), key=lambda x: x[1]['percentage'], reverse=True)
|
||||
|
||||
sorted_actions = sorted(by_action.items(), key=lambda x: x[1]["percentage"], reverse=True)
|
||||
|
||||
for action, action_stats in sorted_actions:
|
||||
print(f" 📌 {action}:")
|
||||
print(f" 次数: {action_stats['count']} ({action_stats['percentage']:.1f}%)")
|
||||
print(f" 平均总时间: {format_time(action_stats['avg_total_time'])}")
|
||||
|
||||
if action_stats['avg_step_times']:
|
||||
print(f" 步骤时间:")
|
||||
for step, step_time in action_stats['avg_step_times'].items():
|
||||
|
||||
if action_stats["avg_step_times"]:
|
||||
print(" 步骤时间:")
|
||||
for step, step_time in action_stats["avg_step_times"].items():
|
||||
print(f" {step}: {format_time(step_time)}")
|
||||
|
||||
|
||||
@@ -58,27 +57,29 @@ def display_comparison(stats_data: Dict[str, Dict[str, Any]]):
|
||||
"""显示多个聊天的对比数据"""
|
||||
if len(stats_data) < 2:
|
||||
return
|
||||
|
||||
print(f"\n=== 多聊天对比 ===")
|
||||
|
||||
|
||||
print("\n=== 多聊天对比 ===")
|
||||
|
||||
# 创建对比表格
|
||||
chat_ids = list(stats_data.keys())
|
||||
|
||||
print(f"\n📊 总体对比:")
|
||||
|
||||
print("\n📊 总体对比:")
|
||||
print(f"{'Chat ID':<20} {'版本':<12} {'记录数':<8} {'平均时间':<12} {'最常见动作':<15}")
|
||||
print("-" * 70)
|
||||
|
||||
|
||||
for chat_id in chat_ids:
|
||||
stats = stats_data[chat_id]
|
||||
overall = stats['overall']
|
||||
|
||||
overall = stats["overall"]
|
||||
|
||||
# 找到最常见的动作
|
||||
most_common_action = max(stats['by_action'].items(), key=lambda x: x[1]['count'])
|
||||
most_common_action = max(stats["by_action"].items(), key=lambda x: x[1]["count"])
|
||||
most_common_name = most_common_action[0]
|
||||
most_common_pct = most_common_action[1]['percentage']
|
||||
|
||||
version = stats.get('version', 'unknown')
|
||||
print(f"{chat_id:<20} {version:<12} {overall['total_records']:<8} {format_time(overall['avg_total_time']):<12} {most_common_name}({most_common_pct:.0f}%)")
|
||||
most_common_pct = most_common_action[1]["percentage"]
|
||||
|
||||
version = stats.get("version", "unknown")
|
||||
print(
|
||||
f"{chat_id:<20} {version:<12} {overall['total_records']:<8} {format_time(overall['avg_total_time']):<12} {most_common_name}({most_common_pct:.0f}%)"
|
||||
)
|
||||
|
||||
|
||||
def view_session_logs(chat_id: str = None, latest: bool = False):
|
||||
@@ -87,50 +88,50 @@ def view_session_logs(chat_id: str = None, latest: bool = False):
|
||||
if not log_dir.exists():
|
||||
print("❌ 日志目录不存在")
|
||||
return
|
||||
|
||||
|
||||
if chat_id:
|
||||
pattern = f"{chat_id}_*.json"
|
||||
else:
|
||||
pattern = "*.json"
|
||||
|
||||
|
||||
log_files = list(log_dir.glob(pattern))
|
||||
|
||||
|
||||
if not log_files:
|
||||
print(f"❌ 没有找到匹配的日志文件: {pattern}")
|
||||
return
|
||||
|
||||
|
||||
if latest:
|
||||
# 按文件修改时间排序,取最新的
|
||||
log_files.sort(key=lambda f: f.stat().st_mtime, reverse=True)
|
||||
log_files = log_files[:1]
|
||||
|
||||
|
||||
for log_file in log_files:
|
||||
print(f"\n=== 会话日志: {log_file.name} ===")
|
||||
|
||||
|
||||
try:
|
||||
with open(log_file, 'r', encoding='utf-8') as f:
|
||||
with open(log_file, "r", encoding="utf-8") as f:
|
||||
records = json.load(f)
|
||||
|
||||
|
||||
if not records:
|
||||
print(" 空文件")
|
||||
continue
|
||||
|
||||
|
||||
print(f" 记录数: {len(records)}")
|
||||
print(f" 时间范围: {records[0]['timestamp']} ~ {records[-1]['timestamp']}")
|
||||
|
||||
|
||||
# 统计动作分布
|
||||
action_counts = {}
|
||||
total_time = 0
|
||||
|
||||
|
||||
for record in records:
|
||||
action = record['action_type']
|
||||
action = record["action_type"]
|
||||
action_counts[action] = action_counts.get(action, 0) + 1
|
||||
total_time += record['total_time']
|
||||
|
||||
total_time += record["total_time"]
|
||||
|
||||
print(f" 总耗时: {format_time(total_time)}")
|
||||
print(f" 平均耗时: {format_time(total_time / len(records))}")
|
||||
print(f" 动作分布: {dict(action_counts)}")
|
||||
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ 读取文件失败: {e}")
|
||||
|
||||
@@ -141,30 +142,30 @@ def main():
|
||||
parser.add_argument("--logs", action="store_true", help="查看会话日志文件")
|
||||
parser.add_argument("--latest", action="store_true", help="只显示最新的日志文件")
|
||||
parser.add_argument("--compare", action="store_true", help="显示多聊天对比")
|
||||
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
if args.logs:
|
||||
view_session_logs(args.chat_id, args.latest)
|
||||
return
|
||||
|
||||
|
||||
# 读取统计数据
|
||||
stats_file = Path("data/hfc/time.json")
|
||||
if not stats_file.exists():
|
||||
print("❌ 统计数据文件不存在,请先运行一些HFC循环以生成数据")
|
||||
return
|
||||
|
||||
|
||||
try:
|
||||
with open(stats_file, 'r', encoding='utf-8') as f:
|
||||
with open(stats_file, "r", encoding="utf-8") as f:
|
||||
stats_data = json.load(f)
|
||||
except Exception as e:
|
||||
print(f"❌ 读取统计数据失败: {e}")
|
||||
return
|
||||
|
||||
|
||||
if not stats_data:
|
||||
print("❌ 统计数据为空")
|
||||
return
|
||||
|
||||
|
||||
if args.chat_id:
|
||||
if args.chat_id in stats_data:
|
||||
display_chat_stats(args.chat_id, stats_data[args.chat_id])
|
||||
@@ -175,10 +176,10 @@ def main():
|
||||
# 显示所有聊天的统计数据
|
||||
for chat_id, stats in stats_data.items():
|
||||
display_chat_stats(chat_id, stats)
|
||||
|
||||
|
||||
if args.compare:
|
||||
display_comparison(stats_data)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user