烦 优化好的完整版发我 我不会改# E:\AI_System\web_ui\server.py
import sys
import os
import time
import logging
import json
import traceback
import threading
import platform
import psutil
import datetime
from pathlib import Path
from functools import wraps
from concurrent.futures import ThreadPoolExecutor
import logging.handlers
# 在导入其他模块前添加核心配置路径
sys.path.insert(0, str(Path(__file__).parent.parent / 'core'))
from core.config import CoreConfig as SystemConfig
# 全局配置实例
system_config = SystemConfig()
# 初始化日志系统
# E:\AI_System\web_ui\server.py
# E:\AI_System\web_ui\server.py
import logging
from logging.handlers import RotatingFileHandler
from flask import Flask
from core import system_config, env_manager
def setup_logger() -> logging.Logger:
"""配置并返回日志系统"""
logger = logging.getLogger('WebServer')
# 清除所有现有处理器,避免重复日志
for handler in logger.handlers[:]:
logger.removeHandler(handler)
# 安全获取配置项
debug_mode = system_config.get('DEBUG', False)
log_level = logging.DEBUG if debug_mode else logging.INFO
log_file = system_config.get('logging.file', 'web_server.log')
max_log_size = system_config.get('logging.max_size', 10) # MB
backup_count = system_config.get('logging.backup_count', 5)
# 设置日志级别
logger.setLevel(log_level)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(log_level)
# 创建文件处理器(带日志轮转)
file_handler = RotatingFileHandler(
filename=log_file,
maxBytes=max_log_size * 1024 * 1024, # MB to bytes
backupCount=backup_count,
encoding='utf-8'
)
file_handler.setLevel(logging.DEBUG) # 文件记录所有调试信息
# 创建格式化器
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(process)d - %(thread)d - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 应用格式化器
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加处理器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 设置根日志器
root_logger = logging.getLogger()
root_logger.setLevel(log_level)
root_logger.addHandler(console_handler)
root_logger.addHandler(file_handler)
# 配置第三方库日志器
third_party_loggers = ['werkzeug', 'engineio', 'socketio', 'urllib3']
for log_name in third_party_loggers:
lib_logger = logging.getLogger(log_name)
lib_logger.setLevel(logging.WARNING) # 只记录警告及以上
lib_logger.propagate = False # 不传播给根日志器
lib_logger.addHandler(file_handler) # 只记录到文件
# 记录日志系统初始化完成
logger.info("✅ 日志系统初始化完成")
logger.info(f"📝 日志级别: {'DEBUG' if debug_mode else 'INFO'}")
logger.info(f"📁 日志文件: {log_file}")
return logger
# 初始化Flask应用
app = Flask(__name__)
app.debug = system_config.get('DEBUG', False)
# 初始化日志系统
logger = setup_logger()
# 环境管理器使用示例
def create_environment():
"""创建新环境示例"""
try:
env_name = "production"
env_config = {
"python_version": "3.9",
"packages": ["flask", "numpy", "pandas"],
"system_dependencies": ["libssl-dev", "zlib1g-dev"]
}
env_path = env_manager.create_environment(env_name, env_config)
logger.info(f"✅ 创建环境 '{env_name}' 成功 | 路径: {env_path}")
# 激活环境
env_manager.activate_environment(env_name)
logger.info(f"🔌 已激活环境 '{env_name}'")
except Exception as e:
logger.error(f"❌ 环境创建失败: {str(e)}")
# 发送错误通知
send_error_notification(f"环境创建失败: {str(e)}")
# 启动时创建环境
if __name__ == "__main__":
create_environment()
app.run(host=system_config.get('server.host', '0.0.0.0'),
port=system_config.get('server.port', 5000))
def setup_logger():
"""配置日志系统"""
logger = logging.getLogger('WebServer')
# 安全获取 DEBUG 配置
debug_mode = system_config.get('DEBUG', False)
# 设置日志级别
logger.setLevel(logging.DEBUG if debug_mode else logging.INFO)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG if debug_mode else logging.INFO)
# 创建文件处理器
log_file = system_config.get('logging.file', 'web_server.log')
file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setLevel(logging.DEBUG)
# 创建格式化器
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加处理器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 设置全局日志级别
logging.basicConfig(
level=logging.DEBUG if debug_mode else logging.INFO,
handlers=[console_handler, file_handler]
)
return logger
# 在文件开头导入系统配置
from core import system_config
# 使用配置设置 Flask 调试模式
app = Flask(__name__)
app.debug = system_config.get('DEBUG', False)
# ... 其他代码 ...
# 设置其他日志器
for log_name in ['werkzeug', 'engineio', 'socketio']:
lib_logger = logging.getLogger(log_name)
lib_logger.setLevel(logging.WARNING)
lib_logger.propagate = False
lib_logger.addHandler(file_handler)
lib_logger.addHandler(console_handler)
return logger
# 全局日志实例
logger = setup_logger()
# ========== 环境管理器重构 ==========
class EnvironmentManager:
"""重构后的环境管理器"""
def __init__(self):
self.state = {
'temperature': 22.5,
'humidity': 45.0,
'light_level': 75,
'objects': [],
'last_updated': datetime.datetime.now().isoformat()
}
self.healthy = True
self.lock = threading.Lock()
self.running = False
self.update_thread = None
self.observers = [] # 状态变更观察者
def start(self):
"""启动环境状态更新线程"""
if self.running:
return
self.running = True
self.update_thread = threading.Thread(target=self._update_loop, daemon=True)
self.update_thread.start()
logger.info("✅ 环境管理器已启动")
def stop(self):
"""停止环境管理器"""
self.running = False
if self.update_thread:
self.update_thread.join(timeout=5)
logger.info("🛑 环境管理器已停止")
def register_observer(self, callback):
"""注册状态变更观察者"""
self.observers.append(callback)
logger.debug(f"注册环境状态观察者: {callback.__name__}")
def _notify_observers(self):
"""通知所有观察者状态变更"""
for observer in self.observers:
try:
observer(self.state)
except Exception as e:
logger.error(f"通知环境观察者失败: {str(e)}")
def _update_loop(self):
"""环境状态更新循环"""
while self.running:
try:
with self.lock:
# 模拟环境变化
self.state['temperature'] = round(20 + 5 * (time.time() % 10) / 10, 1)
self.state['humidity'] = round(40 + 10 * (time.time() % 10) / 10, 1)
self.state['light_level'] = round(70 + 10 * (time.time() % 10) / 10, 1)
self.state['last_updated'] = datetime.datetime.now().isoformat()
# 通知观察者
self._notify_observers()
except Exception as e:
logger.error(f"环境更新失败: {str(e)}")
time.sleep(1.0)
def get_state(self):
"""获取当前环境状态"""
with self.lock:
return self.state.copy()
def execute_action(self, action, params):
"""执行环境动作"""
logger.info(f"执行环境动作: {action} 参数: {params}")
try:
if action == "adjust_temperature":
return self._adjust_temperature(params)
elif action == "adjust_light":
return self._adjust_light(params)
elif action == "add_object":
return self._add_object(params)
elif action == "remove_object":
return self._remove_object(params)
else:
logger.warning(f"未知环境动作: {action}")
return False
except Exception as e:
logger.error(f"执行环境动作失败: {str(e)}")
return False
def _adjust_temperature(self, params):
"""调整温度"""
value = params.get('value')
if value is None:
logger.warning("缺少温度值参数")
return False
try:
value = float(value)
except ValueError:
logger.warning(f"无效的温度值: {value}")
return False
if 10 <= value <= 40:
with self.lock:
self.state['temperature'] = value
return True
logger.warning(f"温度值超出范围 (10-40): {value}")
return False
def _adjust_light(self, params):
"""调整光照强度"""
level = params.get('level')
if level is None:
logger.warning("缺少光照强度参数")
return False
try:
level = float(level)
except ValueError:
logger.warning(f"无效的光照强度: {level}")
return False
if 0 <= level <= 100:
with self.lock:
self.state['light_level'] = level
return True
logger.warning(f"光照强度超出范围 (0-100): {level}")
return False
def _add_object(self, params):
"""添加环境对象"""
obj_name = params.get('name')
if not obj_name:
logger.warning("缺少对象名称")
return False
obj_type = params.get('type', 'object')
position = params.get('position', 'unknown')
# 检查是否已存在
with self.lock:
for obj in self.state['objects']:
if obj['name'] == obj_name:
logger.warning(f"对象已存在: {obj_name}")
return False
# 添加新对象
self.state['objects'].append({
'name': obj_name,
'type': obj_type,
'position': position,
'added_at': datetime.datetime.now().isoformat()
})
return True
def _remove_object(self, params):
"""移除环境对象"""
obj_name = params.get('name')
if not obj_name:
logger.warning("缺少对象名称")
return False
# 查找并移除对象
with self.lock:
for i, obj in enumerate(self.state['objects']):
if obj['name'] == obj_name:
del self.state['objects'][i]
return True
logger.warning(f"未找到对象: {obj_name}")
return False
def is_healthy(self):
"""检查环境健康状态"""
# 简单检查:确保所有值在合理范围内
with self.lock:
temp = self.state['temperature']
light = self.state['light_level']
if temp < 10 or temp > 40:
logger.warning(f"温度超出健康范围: {temp}℃")
return False
if light < 0 or light > 100:
logger.warning(f"光照强度超出健康范围: {light}%")
return False
return self.healthy and self.running
# ========== 系统初始化器重构 ==========
class SystemInitializer:
"""重构后的系统初始化器"""
def __init__(self):
self.start_time = time.time()
self.components = {
'ai_core': None,
'hardware_manager': None,
'life_scheduler': None,
'ai_agent': None,
'environment_manager': None
}
logger.info(f"系统初始化器创建, 基础目录: {system_config.BASE_DIR}")
def initialize_system_paths(self):
"""初始化系统路径"""
# 添加项目根目录到 sys.path
if str(system_config.BASE_DIR) not in sys.path:
sys.path.insert(0, str(system_config.BASE_DIR))
logger.info(f"项目根目录: {system_config.BASE_DIR}")
# 添加子目录
sub_dirs = ['agent', 'core', 'utils', 'config', 'cognitive_arch', 'environment']
for sub_dir in sub_dirs:
full_path = system_config.BASE_DIR / sub_dir
if full_path.exists() and full_path.is_dir():
if str(full_path) not in sys.path:
sys.path.insert(0, str(full_path))
logger.info(f"添加路径: {full_path}")
else:
logger.warning(f"目录不存在: {full_path} - 已跳过")
def initialize_environment_manager(self):
"""初始化环境管理器"""
try:
self.components['environment_manager'] = EnvironmentManager()
self.components['environment_manager'].start()
logger.info("✅ 环境管理器初始化成功")
return self.components['environment_manager']
except Exception as e:
logger.error(f"❌ 环境管理器初始化失败: {str(e)}")
logger.error(traceback.format_exc())
logger.warning("⚠️ 环境交互功能将不可用")
return None
def initialize_ai_core(self):
"""初始化AI核心"""
logger.info("✅ AI核心初始化")
# 简化实现
self.components['ai_core'] = type('AICore', (), {
'status': 'running',
'get_state': lambda: {
"status": "running",
"model": system_config.DEFAULT_MODEL,
"last_update": datetime.datetime.now().isoformat()
}
})()
return self.components['ai_core']
def initialize_hardware_manager(self):
"""初始化硬件管理器"""
logger.info("✅ 硬件管理器初始化")
# 简化实现
self.components['hardware_manager'] = type('HardwareManager', (), {
'get_status': lambda: {
"cpu_usage": psutil.cpu_percent(),
"memory_usage": psutil.virtual_memory().percent,
"gpu_usage": 0,
"disk_usage": psutil.disk_usage('/').percent,
"timestamp": datetime.datetime.now().isoformat()
}
})()
return self.components['hardware_manager']
def initialize_life_scheduler(self):
"""初始化生活调度器"""
logger.info("✅ 生活调度器初始化")
# 简化实现
self.components['life_scheduler'] = type('LifeScheduler', (), {
'get_status': lambda: {
"current_activity": "thinking",
"next_activity": "learning",
"energy": 85,
"last_update": datetime.datetime.now().isoformat()
}
})()
return self.components['life_scheduler']
def initialize_ai_agent(self):
"""初始化AI智能体"""
logger.info("🚀 开始初始化AI智能体")
try:
# 动态导入智能体模块
from agent.autonomous_agent import AutonomousAgent
# 创建智能体实例
self.components['ai_agent'] = AutonomousAgent()
# 将环境管理器传递给智能体(如果存在)
if self.components['environment_manager']:
# 检查智能体是否有设置环境的方法
if hasattr(self.components['ai_agent'], 'set_environment'):
self.components['ai_agent'].set_environment(
self.components['environment_manager']
)
logger.info("✅ 已将环境管理器连接到智能体")
else:
logger.warning("智能体没有set_environment方法,无法连接环境管理器")
# 启动智能体后台任务
if hasattr(self.components['ai_agent'], 'start'):
self.components['ai_agent'].start()
logger.info("🚦 智能体后台任务已启动")
else:
logger.warning("智能体没有start方法,无法启动后台任务")
logger.info("✅ AI智能体初始化完成")
return True
except Exception as e:
logger.error(f"❌ AI智能体初始化失败: {str(e)}")
logger.error(traceback.format_exc())
# 创建回退的模拟智能体
logger.warning("⚠️ 使用模拟智能体作为回退方案")
self.components['ai_agent'] = type('MockAgent', (), {
'process_input': lambda self, input, user_id:
f"智能体初始化失败,使用模拟模式: 收到消息 '{input}'"
})()
return False
def start_evolution_monitor(self):
"""启动进化监视器"""
logger.info("✅ 进化监视器启动")
# 简化实现
def monitor():
while True:
logger.debug("进化监视器运行中...")
time.sleep(60)
threading.Thread(target=monitor, daemon=True).start()
def initialize_all(self):
"""初始化所有系统组件"""
logger.info("=" * 50)
logger.info("🚀 开始初始化AI系统")
logger.info("=" * 50)
self.initialize_system_paths()
self.initialize_ai_core()
self.initialize_hardware_manager()
self.initialize_life_scheduler()
self.initialize_ai_agent()
self.initialize_environment_manager()
self.start_evolution_monitor()
logger.info("✅ 所有系统组件初始化完成")
return self.components
# ========== Web应用工厂重构 ==========
def create_app():
# 创建Flask应用
app = Flask(
__name__,
template_folder=str(system_config.TEMPLATE_DIR),
static_folder=str(system_config.STATIC_DIR),
static_url_path='/static'
)
app.secret_key = system_config.SECRET_KEY
# 初始化限流器
limiter = Limiter(
key_func=get_remote_address,
app=app,
default_limits=["200 per day", "50 per hour"],
storage_uri="memory://"
)
app.config['LIMITER'] = limiter
# 初始化系统组件
system_initializer = SystemInitializer()
components = system_initializer.initialize_all()
app.config['SYSTEM_COMPONENTS'] = components
app.config['START_TIME'] = system_initializer.start_time
# 配置SocketIO
socketio = SocketIO(
app,
async_mode=system_config.ASYNC_MODE,
logger=logger.getEffectiveLevel() <= logging.DEBUG,
engineio_logger=logger.getEffectiveLevel() <= logging.DEBUG
)
setup_websocket_handlers(socketio, components['environment_manager'])
app.config['SOCKETIO'] = socketio
# 注册路由和错误处理
register_routes(app)
register_error_handlers(app)
# 创建基础模板文件
create_base_templates()
return app, socketio
# ========== WebSocket处理 ==========
def setup_websocket_handlers(socketio, env_manager):
@socketio.on('connect')
def handle_connect():
logger.info('客户端已连接')
socketio.emit('system_status', {'status': 'ready'})
# 注册环境状态观察者
if env_manager:
env_manager.register_observer(lambda state: socketio.emit('environment_update', state))
@socketio.on('disconnect')
def handle_disconnect():
logger.info('客户端已断开连接')
@socketio.on('user_message')
def handle_user_message(data):
user_id = data.get('user_id', 'guest')
message = data.get('message', '')
logger.info(f"收到来自 {user_id} 的消息: {message}")
# 使用线程池处理消息
def process_message():
try:
components = current_app.config['SYSTEM_COMPONENTS']
if components['ai_agent']:
return components['ai_agent'].process_input(message, user_id)
else:
return f"已收到您的消息: {message}"
except Exception as e:
logger.error(f"消息处理失败: {str(e)}")
return "处理消息时出错"
future = ThreadPoolExecutor().submit(process_message)
try:
response = future.result(timeout=10)
socketio.emit('agent_response', {
'user_id': user_id,
'response': response
})
except TimeoutError:
socketio.emit('agent_response', {
'user_id': user_id,
'response': "处理超时,请重试"
})
# ========== 路由注册 ==========
def register_routes(app):
@app.route('/')
def home():
"""根路由显示欢迎页面"""
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return render_template('index.html',
current_time=current_time,
host=request.host,
version="1.0")
# 环境路由
@app.route('/environment')
def environment_view():
return render_template('environment_view.html')
@app.route('/api/environment/state', methods=['GET'])
@app.config['LIMITER'].limit("10 per minute")
def get_environment_state():
env_manager = app.config['SYSTEM_COMPONENTS'].get('environment_manager')
if not env_manager:
return jsonify({"success": False, "error": "环境管理器未初始化"}), 503
try:
state = env_manager.get_state()
return jsonify(state)
except Exception as e:
app.logger.error(f"获取环境状态失败: {traceback.format_exc()}")
return jsonify({"success": False, "error": str(e)}), 500
@app.route('/api/environment/action', methods=['POST'])
@app.config['LIMITER'].limit("5 per minute")
def execute_environment_action():
env_manager = app.config['SYSTEM_COMPONENTS'].get('environment_manager')
if not env_manager:
return jsonify({"success": False, "error": "环境管理器未初始化"}), 503
try:
data = request.json
action = data.get('action')
params = data.get('params', {})
if not action:
return jsonify({"success": False, "error": "缺少动作参数"}), 400
success = env_manager.execute_action(action, params)
return jsonify({"success": success, "action": action})
except Exception as e:
app.logger.error(f"执行环境动作失败: {traceback.format_exc()}")
return jsonify({"success": False, "error": str(e)}), 500
# 静态文件路由
@app.route('/static/<path:filename>')
def static_files(filename):
return send_from_directory(app.static_folder, filename)
# 健康检查路由
@app.route('/health')
def health_check():
components = app.config['SYSTEM_COMPONENTS']
status = {
"ai_core": components['ai_core'] is not None,
"hardware_manager": components['hardware_manager'] is not None,
"life_scheduler": components['life_scheduler'] is not None,
"ai_agent": components['ai_agent'] is not None,
"environment_manager": components['environment_manager'] and components['environment_manager'].is_healthy(),
"timestamp": datetime.datetime.now().isoformat()
}
return jsonify(status)
# 系统状态路由
@app.route('/status')
@app.config['LIMITER'].exempt
def status():
components = app.config['SYSTEM_COMPONENTS']
system_info = {
"uptime": time.time() - app.config['START_TIME'],
"ai_core_status": components['ai_core'].get_state() if components['ai_core'] else "uninitialized",
"hardware_status": components['hardware_manager'].get_status() if components[
'hardware_manager'] else "uninitialized",
"life_scheduler_status": components['life_scheduler'].get_status() if components[
'life_scheduler'] else "uninitialized",
"environment_status": components['environment_manager'].get_state() if components[
'environment_manager'] else "uninitialized",
"platform": platform.platform(),
"python_version": sys.version,
"memory_usage": psutil.virtual_memory().percent,
"cpu_usage": psutil.cpu_percent(),
"thread_count": threading.active_count(),
"process_id": os.getpid(),
"timestamp": datetime.datetime.now().isoformat()
}
return jsonify(system_info)
# 其他路由保持不变...
# ========== 主程序入口 ==========
if __name__ == '__main__':
app, socketio = create_app()
# 启动服务器
if os.environ.get('ENV') == 'production':
# 生产环境使用Waitress服务器
from waitress import serve
logger.info(f"🚀 生产服务器启动: http://{system_config.HOST}:{system_config.PORT}")
serve(app, host=system_config.HOST, port=system_config.PORT, threads=8)
else:
# 开发环境使用内置服务器
logger.info(f"🚀 开发服务器启动: http://{system_config.HOST}:{system_config.PORT}")
socketio.run(
app,
host=system_config.HOST,
port=system_config.PORT,
debug=system_config.DEBUG,
use_reloader=False
)