agent_service.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import pytz
  2. from flask_login import current_user
  3. from core.app.app_config.easy_ui_based_app.agent.manager import AgentConfigManager
  4. from core.tools.tool_manager import ToolManager
  5. from extensions.ext_database import db
  6. from models.account import Account
  7. from models.model import App, Conversation, EndUser, Message, MessageAgentThought
  8. class AgentService:
  9. @classmethod
  10. def get_agent_logs(cls, app_model: App,
  11. conversation_id: str,
  12. message_id: str) -> dict:
  13. """
  14. Service to get agent logs
  15. """
  16. conversation: Conversation = db.session.query(Conversation).filter(
  17. Conversation.id == conversation_id,
  18. Conversation.app_id == app_model.id,
  19. ).first()
  20. if not conversation:
  21. raise ValueError(f"Conversation not found: {conversation_id}")
  22. message: Message = db.session.query(Message).filter(
  23. Message.id == message_id,
  24. Message.conversation_id == conversation_id,
  25. ).first()
  26. if not message:
  27. raise ValueError(f"Message not found: {message_id}")
  28. agent_thoughts: list[MessageAgentThought] = message.agent_thoughts
  29. if conversation.from_end_user_id:
  30. # only select name field
  31. executor = db.session.query(EndUser, EndUser.name).filter(
  32. EndUser.id == conversation.from_end_user_id
  33. ).first()
  34. else:
  35. executor = db.session.query(Account, Account.name).filter(
  36. Account.id == conversation.from_account_id
  37. ).first()
  38. if executor:
  39. executor = executor.name
  40. else:
  41. executor = 'Unknown'
  42. timezone = pytz.timezone(current_user.timezone)
  43. result = {
  44. 'meta': {
  45. 'status': 'success',
  46. 'executor': executor,
  47. 'start_time': message.created_at.astimezone(timezone).isoformat(),
  48. 'elapsed_time': message.provider_response_latency,
  49. 'total_tokens': message.answer_tokens + message.message_tokens,
  50. 'agent_mode': app_model.app_model_config.agent_mode_dict.get('strategy', 'react'),
  51. 'iterations': len(agent_thoughts),
  52. },
  53. 'iterations': [],
  54. 'files': message.files,
  55. }
  56. agent_config = AgentConfigManager.convert(app_model.app_model_config.to_dict())
  57. agent_tools = agent_config.tools
  58. def find_agent_tool(tool_name: str):
  59. for agent_tool in agent_tools:
  60. if agent_tool.tool_name == tool_name:
  61. return agent_tool
  62. for agent_thought in agent_thoughts:
  63. tools = agent_thought.tools
  64. tool_labels = agent_thought.tool_labels
  65. tool_meta = agent_thought.tool_meta
  66. tool_inputs = agent_thought.tool_inputs_dict
  67. tool_outputs = agent_thought.tool_outputs_dict
  68. tool_calls = []
  69. for tool in tools:
  70. tool_name = tool
  71. tool_label = tool_labels.get(tool_name, tool_name)
  72. tool_input = tool_inputs.get(tool_name, {})
  73. tool_output = tool_outputs.get(tool_name, {})
  74. tool_meta_data = tool_meta.get(tool_name, {})
  75. tool_config = tool_meta_data.get('tool_config', {})
  76. if tool_config.get('tool_provider_type', '') != 'dataset-retrieval':
  77. tool_icon = ToolManager.get_tool_icon(
  78. tenant_id=app_model.tenant_id,
  79. provider_type=tool_config.get('tool_provider_type', ''),
  80. provider_id=tool_config.get('tool_provider', ''),
  81. )
  82. if not tool_icon:
  83. tool_entity = find_agent_tool(tool_name)
  84. if tool_entity:
  85. tool_icon = ToolManager.get_tool_icon(
  86. tenant_id=app_model.tenant_id,
  87. provider_type=tool_entity.provider_type,
  88. provider_id=tool_entity.provider_id,
  89. )
  90. else:
  91. tool_icon = ''
  92. tool_calls.append({
  93. 'status': 'success' if not tool_meta_data.get('error') else 'error',
  94. 'error': tool_meta_data.get('error'),
  95. 'time_cost': tool_meta_data.get('time_cost', 0),
  96. 'tool_name': tool_name,
  97. 'tool_label': tool_label,
  98. 'tool_input': tool_input,
  99. 'tool_output': tool_output,
  100. 'tool_parameters': tool_meta_data.get('tool_parameters', {}),
  101. 'tool_icon': tool_icon,
  102. })
  103. result['iterations'].append({
  104. 'tokens': agent_thought.tokens,
  105. 'tool_calls': tool_calls,
  106. 'tool_raw': {
  107. 'inputs': agent_thought.tool_input,
  108. 'outputs': agent_thought.observation,
  109. },
  110. 'thought': agent_thought.thought,
  111. 'created_at': agent_thought.created_at.isoformat(),
  112. 'files': agent_thought.files,
  113. })
  114. return result