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. print(f"config_key: {config_key}")
  50. # 检查本地配置缓存
  51. current_time = time.time()
  52. if config_key in self._local_agent_cache:
  53. agent_instance, timestamp = self._local_agent_cache[config_key]
  54. if current_time - timestamp <= 300: # 5分钟本地缓存
  55. chat_logger.info(f"使用本地缓存的agent配置: 用户={user_id}")
  56. return agent_instance
  57. chat_logger.info(f"创建新的agent实例: 用户={user_id}")
  58. agent_instance = await self._create_agent_async(
  59. backend_url=clean_backend,
  60. token=clean_token,
  61. username=clean_username,
  62. thread_id=thread_id,
  63. )
  64. # 缓存agent配置到本地
  65. self._local_agent_cache[config_key] = (agent_instance, current_time)
  66. chat_logger.info(f"Agent配置已缓存: 用户={user_id}")
  67. return agent_instance
  68. async def _create_agent_async(
  69. self, backend_url: str, token: str, username: str, thread_id: str
  70. ):
  71. """创建agent实例"""
  72. def sync_create_agent():
  73. return create_langchain_agent(
  74. backend_url=backend_url,
  75. token=token,
  76. username=username,
  77. thread_id=thread_id,
  78. )
  79. loop = asyncio.get_event_loop()
  80. return await loop.run_in_executor(None, sync_create_agent)
  81. async def clear_user_agent(
  82. self, thread_id: str, username: str, backend_url: str, token: str
  83. ):
  84. """清除特定用户的agent配置缓存"""
  85. config_key = self._get_agent_config_key(thread_id, username, backend_url, token)
  86. # 清除本地缓存
  87. if config_key in self._local_agent_cache:
  88. del self._local_agent_cache[config_key]
  89. user_id = self._get_user_identifier(username, token)
  90. chat_logger.info(f"已清除用户Agent配置缓存: {user_id}")
  91. async def get_cache_status(self):
  92. """获取缓存状态"""
  93. if self._is_shutdown:
  94. return {"status": "shutdown", "cache_size": 0}
  95. return {
  96. "local_config_cache_size": len(self._local_agent_cache),
  97. "status": "active",
  98. "message": "",
  99. }
  100. async def clear_cache(self):
  101. """清空本地配置缓存"""
  102. local_count = len(self._local_agent_cache)
  103. self._local_agent_cache.clear()
  104. chat_logger.info(f"清空本地配置缓存: {local_count}个配置")
  105. return local_count
  106. # 全局实例
  107. agent_manager = AgentManager()