Files
assist/src/main.py
zhaojie c3560b43fd docs: update README and CLAUDE.md to v2.2.0
- Added documentation for audit tracking (IP address, invocation method).
- Updated database model descriptions for enhanced WorkOrder and Conversation fields.
- Documented the new UnifiedConfig system.
- Reflected enhanced logging transparency for knowledge base parsing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 00:08:09 +08:00

522 lines
19 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import logging
import sys
import os
from typing import Dict, Any, List, Optional
from datetime import datetime, timedelta
# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.config.unified_config import get_config
from src.utils.helpers import setup_logging
from src.core.database import db_manager
from src.core.llm_client import QwenClient
from src.knowledge_base.knowledge_manager import KnowledgeManager
from src.dialogue.dialogue_manager import DialogueManager
from src.analytics.analytics_manager import AnalyticsManager
from src.analytics.alert_system import AlertSystem
from src.analytics.monitor_service import MonitorService
from src.analytics.token_monitor import TokenMonitor
from src.analytics.ai_success_monitor import AISuccessMonitor
from src.core.system_optimizer import SystemOptimizer
from src.core.models import WorkOrder
class TSPAssistant:
"""TSP助手主类"""
def __init__(self):
# 设置日志
config = get_config()
setup_logging(config.server.log_level, "logs/tsp_assistant.log")
self.logger = logging.getLogger(__name__)
# 初始化各个管理器
self.llm_client = QwenClient()
self.knowledge_manager = KnowledgeManager()
self.dialogue_manager = DialogueManager()
self.analytics_manager = AnalyticsManager()
self.alert_system = AlertSystem()
self.monitor_service = MonitorService()
self.token_monitor = TokenMonitor()
self.ai_success_monitor = AISuccessMonitor()
self.system_optimizer = SystemOptimizer()
def test_system(self) -> Dict[str, Any]:
"""测试系统各个组件"""
results = {
"database": False,
"llm_api": False,
"knowledge_base": False,
"overall": False
}
try:
# 测试数据库连接
if db_manager.test_connection():
results["database"] = True
self.logger.info("数据库连接测试成功")
else:
self.logger.error("数据库连接测试失败")
# 测试LLM API连接
if self.llm_client.test_connection():
results["llm_api"] = True
self.logger.info("LLM API连接测试成功")
else:
self.logger.error("LLM API连接测试失败")
# 测试知识库
knowledge_stats = self.knowledge_manager.get_knowledge_stats()
if knowledge_stats:
results["knowledge_base"] = True
self.logger.info("知识库测试成功")
else:
self.logger.warning("知识库为空或测试失败")
# 整体状态
results["overall"] = all([results["database"], results["llm_api"]])
except Exception as e:
self.logger.error(f"系统测试失败: {e}")
return results
def process_message(self, message: str, user_id: str = None, work_order_id: int = None) -> Dict[str, Any]:
"""处理用户消息"""
try:
result = self.dialogue_manager.process_user_message(
user_message=message,
user_id=user_id,
work_order_id=work_order_id
)
if "error" in result:
self.logger.error(f"处理消息失败: {result['error']}")
return result
except Exception as e:
self.logger.error(f"处理消息异常: {e}")
return {"error": f"处理异常: {str(e)}"}
def create_work_order(self, title: str, description: str, category: str, priority: str = "medium") -> Dict[str, Any]:
"""创建工单"""
try:
result = self.dialogue_manager.create_work_order(
title=title,
description=description,
category=category,
priority=priority
)
if "error" in result:
self.logger.error(f"创建工单失败: {result['error']}")
return result
except Exception as e:
self.logger.error(f"创建工单异常: {e}")
return {"error": f"创建异常: {str(e)}"}
def update_work_order(self, work_order_id: int, **kwargs) -> bool:
"""更新工单"""
try:
return self.dialogue_manager.update_work_order(work_order_id, **kwargs)
except Exception as e:
self.logger.error(f"更新工单异常: {e}")
return False
def search_knowledge(self, query: str, top_k: int = 3) -> Dict[str, Any]:
"""搜索知识库"""
try:
results = self.knowledge_manager.search_knowledge(query, top_k)
return {
"results": results,
"count": len(results)
}
except Exception as e:
self.logger.error(f"搜索知识库异常: {e}")
return {"error": f"搜索异常: {str(e)}"}
def add_knowledge(self, question: str, answer: str, category: str, confidence_score: float = 0.5) -> bool:
"""添加知识库条目"""
try:
return self.knowledge_manager.add_knowledge_entry(question, answer, category, confidence_score)
except Exception as e:
self.logger.error(f"添加知识库异常: {e}")
return False
def generate_analytics(self, date_range: str = "today") -> Dict[str, Any]:
"""生成分析报告"""
try:
from src.utils.helpers import parse_date_range
start_date, end_date = parse_date_range(date_range)
# 生成每日分析
analytics_results = []
current_date = start_date
while current_date <= end_date:
result = self.analytics_manager.generate_daily_analytics(current_date)
if "error" not in result:
analytics_results.append(result)
current_date += timedelta(days=1)
# 获取汇总统计
summary = self.analytics_manager.get_analytics_summary((end_date - start_date).days + 1)
return {
"period": f"{start_date}{end_date}",
"daily_analytics": analytics_results,
"summary": summary
}
except Exception as e:
self.logger.error(f"生成分析报告异常: {e}")
return {"error": f"生成异常: {str(e)}"}
def get_alerts(self) -> Dict[str, Any]:
"""获取预警信息"""
try:
active_alerts = self.analytics_manager.get_active_alerts()
return {
"active_alerts": active_alerts,
"count": len(active_alerts)
}
except Exception as e:
self.logger.error(f"获取预警异常: {e}")
return {"error": f"获取异常: {str(e)}"}
def get_system_status(self) -> Dict[str, Any]:
"""获取系统状态"""
try:
from src.utils.helpers import get_memory_usage
# 系统测试
test_results = self.test_system()
# 知识库统计
knowledge_stats = self.knowledge_manager.get_knowledge_stats()
# 内存使用
memory_usage = get_memory_usage()
# 活跃预警
alerts = self.alert_system.get_active_alerts()
# 系统健康状态
health_status = self.monitor_service.get_system_health()
return {
"system_status": test_results,
"knowledge_base": knowledge_stats,
"memory_usage": memory_usage,
"active_alerts": len(alerts),
"health_score": health_status.get("health_score", 0),
"health_status": health_status.get("status", "unknown"),
"timestamp": datetime.now().isoformat()
}
except Exception as e:
self.logger.error(f"获取系统状态异常: {e}")
return {"error": f"获取状态异常: {str(e)}"}
def start_monitoring(self):
"""启动监控服务"""
try:
self.monitor_service.start()
self.logger.info("监控服务已启动")
return True
except Exception as e:
self.logger.error(f"启动监控服务失败: {e}")
return False
def stop_monitoring(self):
"""停止监控服务"""
try:
self.monitor_service.stop()
self.logger.info("监控服务已停止")
return True
except Exception as e:
self.logger.error(f"停止监控服务失败: {e}")
return False
def check_alerts(self) -> List[Dict[str, Any]]:
"""检查预警"""
try:
return self.alert_system.check_all_rules()
except Exception as e:
self.logger.error(f"检查预警失败: {e}")
return []
def get_active_alerts(self) -> List[Dict[str, Any]]:
"""获取活跃预警"""
try:
return self.alert_system.get_active_alerts()
except Exception as e:
self.logger.error(f"获取活跃预警失败: {e}")
return []
def create_alert(self, alert_type: str, title: str, description: str, level: str = "medium") -> Dict[str, Any]:
"""创建预警"""
try:
from ..core.database import db_manager
from ..core.models import Alert
from datetime import datetime
with db_manager.get_session() as session:
alert = Alert(
rule_name=f"手动预警_{datetime.now().strftime('%Y%m%d_%H%M%S')}",
alert_type=alert_type,
level=level,
message=f"{title}: {description}",
is_active=True,
created_at=datetime.now()
)
session.add(alert)
session.commit()
self.logger.info(f"创建预警成功: {title}")
return {
"id": alert.id,
"title": title,
"description": description,
"level": level,
"alert_type": alert_type,
"created_at": alert.created_at.isoformat()
}
except Exception as e:
self.logger.error(f"创建预警异常: {e}")
return {"error": f"创建异常: {str(e)}"}
def resolve_alert(self, alert_id: int) -> bool:
"""解决预警"""
try:
return self.alert_system.resolve_alert(alert_id)
except Exception as e:
self.logger.error(f"解决预警失败: {e}")
return False
def get_alert_statistics(self) -> Dict[str, Any]:
"""获取预警统计"""
try:
return self.alert_system.get_alert_statistics()
except Exception as e:
self.logger.error(f"获取预警统计失败: {e}")
return {}
def get_workorders(self, limit: int = 100) -> List[Dict[str, Any]]:
"""获取最近的工单列表(按创建时间倒序)"""
try:
with db_manager.get_session() as session:
q = session.query(WorkOrder).order_by(WorkOrder.created_at.desc())
if limit:
q = q.limit(limit)
rows = q.all()
results: List[Dict[str, Any]] = []
for w in rows:
results.append({
"id": w.id,
"order_id": w.order_id,
"title": w.title,
"description": w.description,
"category": w.category,
"priority": w.priority,
"status": w.status,
"created_at": w.created_at.isoformat() if w.created_at else None,
"updated_at": w.updated_at.isoformat() if w.updated_at else None,
"resolution": w.resolution,
"satisfaction_score": w.satisfaction_score
})
return results
except Exception as e:
self.logger.error(f"获取工单列表失败: {e}")
return []
def get_system_health(self) -> Dict[str, Any]:
"""获取系统健康状态"""
try:
return self.monitor_service.get_system_health()
except Exception as e:
self.logger.error(f"获取系统健康状态失败: {e}")
return {"error": f"获取健康状态失败: {str(e)}"}
def get_token_usage_stats(self, user_id: str = None, days: int = 7) -> Dict[str, Any]:
"""获取Token使用统计"""
try:
if user_id:
return self.token_monitor.get_user_token_stats(user_id, days)
else:
return self.token_monitor.get_system_token_stats(days)
except Exception as e:
self.logger.error(f"获取Token使用统计失败: {e}")
return {"error": f"获取Token统计失败: {str(e)}"}
def get_ai_performance_stats(self, model_name: str = None, hours: int = 24) -> Dict[str, Any]:
"""获取AI性能统计"""
try:
if model_name:
return self.ai_success_monitor.get_model_performance(model_name, hours)
else:
return self.ai_success_monitor.get_system_performance(hours)
except Exception as e:
self.logger.error(f"获取AI性能统计失败: {e}")
return {"error": f"获取AI性能统计失败: {str(e)}"}
def get_cost_trend(self, days: int = 30) -> List[Dict[str, Any]]:
"""获取成本趋势"""
try:
return self.token_monitor.get_cost_trend(days)
except Exception as e:
self.logger.error(f"获取成本趋势失败: {e}")
return []
def get_performance_trend(self, days: int = 7) -> List[Dict[str, Any]]:
"""获取性能趋势"""
try:
return self.ai_success_monitor.get_performance_trend(days)
except Exception as e:
self.logger.error(f"获取性能趋势失败: {e}")
return []
def get_user_conversation_history(
self,
user_id: str,
work_order_id: Optional[int] = None,
limit: int = 10,
offset: int = 0
) -> List[Dict[str, Any]]:
"""获取用户对话历史"""
try:
return self.dialogue_manager.get_user_conversation_history(
user_id=user_id,
work_order_id=work_order_id,
limit=limit,
offset=offset
)
except Exception as e:
self.logger.error(f"获取用户对话历史失败: {e}")
return []
def delete_conversation(self, conversation_id: int) -> bool:
"""删除对话记录"""
try:
return self.dialogue_manager.delete_conversation(conversation_id)
except Exception as e:
self.logger.error(f"删除对话记录失败: {e}")
return False
def delete_user_conversations(self, user_id: str, work_order_id: Optional[int] = None) -> int:
"""删除用户的所有对话记录"""
try:
return self.dialogue_manager.delete_user_conversations(user_id, work_order_id)
except Exception as e:
self.logger.error(f"删除用户对话记录失败: {e}")
return 0
def cleanup_old_data(self, days: int = 30) -> Dict[str, int]:
"""清理旧数据"""
try:
results = {}
# 清理对话历史
conversation_cleaned = self.dialogue_manager.history_manager.cleanup_old_conversations(days)
results["conversations"] = conversation_cleaned
# 清理Token监控数据
token_cleaned = self.token_monitor.cleanup_old_data(days)
results["token_data"] = token_cleaned
# 清理AI成功率监控数据
ai_cleaned = self.ai_success_monitor.cleanup_old_data(days)
results["ai_data"] = ai_cleaned
self.logger.info(f"数据清理完成: {results}")
return results
except Exception as e:
self.logger.error(f"清理旧数据失败: {e}")
return {}
def check_rate_limit(self, user_id: str) -> bool:
"""检查用户请求频率限制"""
try:
return self.system_optimizer.check_rate_limit(user_id)
except Exception as e:
self.logger.error(f"检查频率限制失败: {e}")
return True
def check_input_security(self, user_input: str) -> Dict[str, Any]:
"""检查输入安全性"""
try:
return self.system_optimizer.check_input_security(user_input)
except Exception as e:
self.logger.error(f"检查输入安全性失败: {e}")
return {"is_safe": True, "message": "安全检查异常"}
def check_cost_limit(self, estimated_cost: float) -> bool:
"""检查成本限制"""
try:
return self.system_optimizer.check_cost_limit(estimated_cost)
except Exception as e:
self.logger.error(f"检查成本限制失败: {e}")
return True
def get_system_optimization_status(self) -> Dict[str, Any]:
"""获取系统优化状态"""
try:
return self.system_optimizer.get_system_status()
except Exception as e:
self.logger.error(f"获取系统优化状态失败: {e}")
return {"status": "error", "message": str(e)}
def optimize_response_time(self, response_time: float) -> Dict[str, Any]:
"""优化响应时间"""
try:
return self.system_optimizer.optimize_response_time(response_time)
except Exception as e:
self.logger.error(f"优化响应时间失败: {e}")
return {}
def main():
"""主函数"""
# 创建TSP助手实例
assistant = TSPAssistant()
# 测试系统
test_results = assistant.test_system()
print("系统测试结果:", test_results)
if not test_results["overall"]:
print("系统初始化失败,请检查配置")
return
print("TSP助手启动成功")
# 示例用法
# 创建工单
work_order = assistant.create_work_order(
title="测试工单",
description="这是一个测试工单",
category="技术问题",
priority="medium"
)
print("创建工单:", work_order)
# 处理消息
if "work_order_id" in work_order:
response = assistant.process_message(
message="我的账户无法登录",
work_order_id=work_order["work_order_id"]
)
print("处理消息:", response)
# 获取系统状态
status = assistant.get_system_status()
print("系统状态:", status)
if __name__ == "__main__":
main()