agent_manager.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import asyncio
  2. import time
  3. import hashlib
  4. from typing import Dict, Optional
  5. from core.agent import create_langchain_agent
  6. from utils.logger import chat_logger
  7. class AgentManager:
  8. def __init__(self):
  9. self._local_agent_cache = {} # 仅缓存agent配置,不缓存实例
  10. self._is_shutdown = False
  11. async def initialize(self):
  12. """异步初始化管理器"""
  13. self._is_shutdown = False
  14. chat_logger.info("🔧🔧🔧🔧 Agent管理器初始化完成")
  15. async def shutdown(self):
  16. """异步关闭管理器"""
  17. self._is_shutdown = True
  18. self._local_agent_cache.clear()
  19. chat_logger.info("🧹🧹🧹🧹 Agent管理器已关闭")
  20. def _get_agent_config_key(
  21. self, thread_id: str, username: str, backend_url: str, token: str
  22. ) -> str:
  23. """生成agent配置的缓存key"""
  24. key_data = f"{thread_id}:{username}:{backend_url}:{token}"
  25. return hashlib.md5(key_data.encode()).hexdigest()
  26. def _get_user_identifier(self, username: str, token: str) -> str:
  27. """生成用户标识符"""
  28. if not username or username == "default":
  29. username_part = "anonymous"
  30. else:
  31. username_part = username
  32. if token and len(token) >= 8:
  33. token_part = token[:8]
  34. else:
  35. token_part = "notoken"
  36. return f"{username_part}_{token_part}"
  37. async def get_agent_instance(
  38. self, thread_id: str, username: str, backend_url: str, token: str
  39. ):
  40. if self._is_shutdown:
  41. raise RuntimeError("Agent管理器已关闭")
  42. clean_username = username or "anonymous"
  43. clean_backend = backend_url or ""
  44. clean_token = token or ""
  45. user_id = self._get_user_identifier(clean_username, clean_token)
  46. config_key = self._get_agent_config_key(
  47. thread_id, clean_username, clean_backend, clean_token
  48. )
  49. # 检查本地配置缓存
  50. current_time = time.time()
  51. if config_key in self._local_agent_cache:
  52. agent_instance, timestamp = self._local_agent_cache[config_key]
  53. if current_time - timestamp <= 300: # 5分钟本地缓存
  54. chat_logger.info(f"使用本地缓存的agent配置: 用户={user_id}")
  55. return agent_instance
  56. chat_logger.info(f"创建新的agent实例: 用户={user_id}")
  57. agent_instance = await self._create_agent_async(
  58. backend_url=clean_backend,
  59. token=clean_token,
  60. username=clean_username,
  61. thread_id=thread_id,
  62. )
  63. # 缓存agent配置到本地
  64. self._local_agent_cache[config_key] = (agent_instance, current_time)
  65. chat_logger.info(f"Agent配置已缓存: 用户={user_id}")
  66. return agent_instance
  67. async def _create_agent_async(
  68. self, backend_url: str, token: str, username: str, thread_id: str
  69. ):
  70. """创建agent实例"""
  71. def sync_create_agent():
  72. return create_langchain_agent(
  73. backend_url=backend_url,
  74. token=token,
  75. username=username,
  76. thread_id=thread_id,
  77. )
  78. loop = asyncio.get_event_loop()
  79. return await loop.run_in_executor(None, sync_create_agent)
  80. async def clear_user_agent(
  81. self, thread_id: str, username: str, backend_url: str, token: str
  82. ):
  83. """清除特定用户的agent配置缓存"""
  84. config_key = self._get_agent_config_key(thread_id, username, backend_url, token)
  85. # 清除本地缓存
  86. if config_key in self._local_agent_cache:
  87. del self._local_agent_cache[config_key]
  88. user_id = self._get_user_identifier(username, token)
  89. chat_logger.info(f"已清除用户Agent配置缓存: {user_id}")
  90. async def get_cache_status(self):
  91. """获取缓存状态"""
  92. if self._is_shutdown:
  93. return {"status": "shutdown", "cache_size": 0}
  94. return {
  95. "local_config_cache_size": len(self._local_agent_cache),
  96. "status": "active",
  97. "message": "",
  98. }
  99. async def clear_cache(self):
  100. """清空本地配置缓存"""
  101. local_count = len(self._local_agent_cache)
  102. self._local_agent_cache.clear()
  103. chat_logger.info(f"清空本地配置缓存: {local_count}个配置")
  104. return local_count
  105. # 全局实例
  106. agent_manager = AgentManager()