主要修复: 1. 创建统一Redis连接管理器 (src/core/redis_manager.py) - 单例模式管理所有Redis连接 - 懒加载连接,避免重复初始化 - 线程安全的连接管理 2. 更新所有Redis使用模块 - TokenMonitor: 使用统一Redis管理器 - AISuccessMonitor: 移除重复Redis连接代码 - SystemOptimizer: 统一Redis连接管理 - ConversationHistoryManager: 使用统一Redis管理器 3. 修复DialogueManager重复初始化 - 使用懒加载属性(@property)避免重复创建监控器 - 只有在实际使用时才创建实例 4. 优化启动性能 - 避免重复的Redis连接创建 - 消除重复的TSP助手初始化 - 减少启动时的日志输出 技术改进: - 单例模式Redis管理器 - 懒加载组件初始化 - 统一连接管理 - 线程安全设计 解决启动卡顿问题,提升系统响应速度
159 lines
5.4 KiB
Python
159 lines
5.4 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
知识库管理蓝图
|
||
处理知识库相关的API路由
|
||
"""
|
||
|
||
import os
|
||
import tempfile
|
||
import uuid
|
||
from flask import Blueprint, request, jsonify
|
||
from src.main import TSPAssistant
|
||
from src.agent_assistant import TSPAgentAssistant
|
||
|
||
knowledge_bp = Blueprint('knowledge', __name__, url_prefix='/api/knowledge')
|
||
|
||
# 使用全局单例避免重复创建
|
||
_assistant = None
|
||
_agent_assistant = None
|
||
|
||
def get_assistant():
|
||
"""获取TSP助手实例(懒加载)"""
|
||
global _assistant
|
||
if _assistant is None:
|
||
_assistant = TSPAssistant()
|
||
return _assistant
|
||
|
||
def get_agent_assistant():
|
||
"""获取Agent助手实例(懒加载)"""
|
||
global _agent_assistant
|
||
if _agent_assistant is None:
|
||
_agent_assistant = TSPAgentAssistant()
|
||
return _agent_assistant
|
||
|
||
@knowledge_bp.route('')
|
||
def get_knowledge():
|
||
"""获取知识库列表"""
|
||
try:
|
||
# 获取分页参数
|
||
page = request.args.get('page', 1, type=int)
|
||
per_page = request.args.get('per_page', 10, type=int)
|
||
|
||
# 从数据库获取知识库数据
|
||
knowledge_entries = get_assistant().knowledge_manager.get_knowledge_entries(
|
||
page=page, per_page=per_page
|
||
)
|
||
|
||
return jsonify(knowledge_entries)
|
||
except Exception as e:
|
||
return jsonify({"error": str(e)}), 500
|
||
|
||
@knowledge_bp.route('/search')
|
||
def search_knowledge():
|
||
"""搜索知识库"""
|
||
try:
|
||
query = request.args.get('q', '')
|
||
# 这里应该调用知识库管理器的搜索方法
|
||
results = get_assistant().search_knowledge(query, top_k=5)
|
||
return jsonify(results.get('results', []))
|
||
except Exception as e:
|
||
return jsonify({"error": str(e)}), 500
|
||
|
||
@knowledge_bp.route('', methods=['POST'])
|
||
def add_knowledge():
|
||
"""添加知识库条目"""
|
||
try:
|
||
data = request.get_json()
|
||
success = get_assistant().knowledge_manager.add_knowledge_entry(
|
||
question=data['question'],
|
||
answer=data['answer'],
|
||
category=data['category'],
|
||
confidence_score=data['confidence_score']
|
||
)
|
||
return jsonify({"success": success, "message": "知识添加成功" if success else "添加失败"})
|
||
except Exception as e:
|
||
return jsonify({"error": str(e)}), 500
|
||
|
||
@knowledge_bp.route('/stats')
|
||
def get_knowledge_stats():
|
||
"""获取知识库统计"""
|
||
try:
|
||
stats = get_assistant().knowledge_manager.get_knowledge_stats()
|
||
return jsonify(stats)
|
||
except Exception as e:
|
||
return jsonify({"error": str(e)}), 500
|
||
|
||
@knowledge_bp.route('/upload', methods=['POST'])
|
||
def upload_knowledge_file():
|
||
"""上传文件并生成知识库"""
|
||
try:
|
||
if 'file' not in request.files:
|
||
return jsonify({"error": "没有上传文件"}), 400
|
||
|
||
file = request.files['file']
|
||
if file.filename == '':
|
||
return jsonify({"error": "没有选择文件"}), 400
|
||
|
||
# 保存文件到临时目录
|
||
import tempfile
|
||
import os
|
||
import uuid
|
||
|
||
# 创建唯一的临时文件名
|
||
temp_filename = f"upload_{uuid.uuid4()}{os.path.splitext(file.filename)[1]}"
|
||
temp_path = os.path.join(tempfile.gettempdir(), temp_filename)
|
||
|
||
try:
|
||
# 保存文件
|
||
file.save(temp_path)
|
||
|
||
# 使用Agent助手处理文件
|
||
result = get_agent_assistant().process_file_to_knowledge(temp_path, file.filename)
|
||
|
||
return jsonify(result)
|
||
|
||
finally:
|
||
# 确保删除临时文件
|
||
try:
|
||
if os.path.exists(temp_path):
|
||
os.unlink(temp_path)
|
||
except Exception as cleanup_error:
|
||
import logging
|
||
logger = logging.getLogger(__name__)
|
||
logger.warning(f"清理临时文件失败: {cleanup_error}")
|
||
|
||
except Exception as e:
|
||
import logging
|
||
logger = logging.getLogger(__name__)
|
||
logger.error(f"文件上传处理失败: {e}")
|
||
return jsonify({"error": str(e)}), 500
|
||
|
||
@knowledge_bp.route('/delete/<int:knowledge_id>', methods=['DELETE'])
|
||
def delete_knowledge(knowledge_id):
|
||
"""删除知识库条目"""
|
||
try:
|
||
success = get_assistant().knowledge_manager.delete_knowledge_entry(knowledge_id)
|
||
return jsonify({"success": success, "message": "删除成功" if success else "删除失败"})
|
||
except Exception as e:
|
||
return jsonify({"error": str(e)}), 500
|
||
|
||
@knowledge_bp.route('/verify/<int:knowledge_id>', methods=['POST'])
|
||
def verify_knowledge(knowledge_id):
|
||
"""验证知识库条目"""
|
||
try:
|
||
data = request.get_json() or {}
|
||
verified_by = data.get('verified_by', 'admin')
|
||
success = get_assistant().knowledge_manager.verify_knowledge_entry(knowledge_id, verified_by)
|
||
return jsonify({"success": success, "message": "验证成功" if success else "验证失败"})
|
||
except Exception as e:
|
||
return jsonify({"error": str(e)}), 500
|
||
|
||
@knowledge_bp.route('/unverify/<int:knowledge_id>', methods=['POST'])
|
||
def unverify_knowledge(knowledge_id):
|
||
"""取消验证知识库条目"""
|
||
try:
|
||
success = get_assistant().knowledge_manager.unverify_knowledge_entry(knowledge_id)
|
||
return jsonify({"success": success, "message": "取消验证成功" if success else "取消验证失败"})
|
||
except Exception as e:
|
||
return jsonify({"error": str(e)}), 500
|