|  | import pytz | 
					
						
						|  | from flask_login import current_user | 
					
						
						|  |  | 
					
						
						|  | from core.app.app_config.easy_ui_based_app.agent.manager import AgentConfigManager | 
					
						
						|  | from core.tools.tool_manager import ToolManager | 
					
						
						|  | from extensions.ext_database import db | 
					
						
						|  | from models.account import Account | 
					
						
						|  | from models.model import App, Conversation, EndUser, Message, MessageAgentThought | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class AgentService: | 
					
						
						|  | @classmethod | 
					
						
						|  | def get_agent_logs(cls, app_model: App, | 
					
						
						|  | conversation_id: str, | 
					
						
						|  | message_id: str) -> dict: | 
					
						
						|  | """ | 
					
						
						|  | Service to get agent logs | 
					
						
						|  | """ | 
					
						
						|  | conversation: Conversation = db.session.query(Conversation).filter( | 
					
						
						|  | Conversation.id == conversation_id, | 
					
						
						|  | Conversation.app_id == app_model.id, | 
					
						
						|  | ).first() | 
					
						
						|  |  | 
					
						
						|  | if not conversation: | 
					
						
						|  | raise ValueError(f"Conversation not found: {conversation_id}") | 
					
						
						|  |  | 
					
						
						|  | message: Message = db.session.query(Message).filter( | 
					
						
						|  | Message.id == message_id, | 
					
						
						|  | Message.conversation_id == conversation_id, | 
					
						
						|  | ).first() | 
					
						
						|  |  | 
					
						
						|  | if not message: | 
					
						
						|  | raise ValueError(f"Message not found: {message_id}") | 
					
						
						|  |  | 
					
						
						|  | agent_thoughts: list[MessageAgentThought] = message.agent_thoughts | 
					
						
						|  |  | 
					
						
						|  | if conversation.from_end_user_id: | 
					
						
						|  |  | 
					
						
						|  | executor = db.session.query(EndUser, EndUser.name).filter( | 
					
						
						|  | EndUser.id == conversation.from_end_user_id | 
					
						
						|  | ).first() | 
					
						
						|  | else: | 
					
						
						|  | executor = db.session.query(Account, Account.name).filter( | 
					
						
						|  | Account.id == conversation.from_account_id | 
					
						
						|  | ).first() | 
					
						
						|  |  | 
					
						
						|  | if executor: | 
					
						
						|  | executor = executor.name | 
					
						
						|  | else: | 
					
						
						|  | executor = 'Unknown' | 
					
						
						|  |  | 
					
						
						|  | timezone = pytz.timezone(current_user.timezone) | 
					
						
						|  |  | 
					
						
						|  | result = { | 
					
						
						|  | 'meta': { | 
					
						
						|  | 'status': 'success', | 
					
						
						|  | 'executor': executor, | 
					
						
						|  | 'start_time': message.created_at.astimezone(timezone).isoformat(), | 
					
						
						|  | 'elapsed_time': message.provider_response_latency, | 
					
						
						|  | 'total_tokens': message.answer_tokens + message.message_tokens, | 
					
						
						|  | 'agent_mode': app_model.app_model_config.agent_mode_dict.get('strategy', 'react'), | 
					
						
						|  | 'iterations': len(agent_thoughts), | 
					
						
						|  | }, | 
					
						
						|  | 'iterations': [], | 
					
						
						|  | 'files': message.files, | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  | agent_config = AgentConfigManager.convert(app_model.app_model_config.to_dict()) | 
					
						
						|  | agent_tools = agent_config.tools | 
					
						
						|  |  | 
					
						
						|  | def find_agent_tool(tool_name: str): | 
					
						
						|  | for agent_tool in agent_tools: | 
					
						
						|  | if agent_tool.tool_name == tool_name: | 
					
						
						|  | return agent_tool | 
					
						
						|  |  | 
					
						
						|  | for agent_thought in agent_thoughts: | 
					
						
						|  | tools = agent_thought.tools | 
					
						
						|  | tool_labels = agent_thought.tool_labels | 
					
						
						|  | tool_meta = agent_thought.tool_meta | 
					
						
						|  | tool_inputs = agent_thought.tool_inputs_dict | 
					
						
						|  | tool_outputs = agent_thought.tool_outputs_dict | 
					
						
						|  | tool_calls = [] | 
					
						
						|  | for tool in tools: | 
					
						
						|  | tool_name = tool | 
					
						
						|  | tool_label = tool_labels.get(tool_name, tool_name) | 
					
						
						|  | tool_input = tool_inputs.get(tool_name, {}) | 
					
						
						|  | tool_output = tool_outputs.get(tool_name, {}) | 
					
						
						|  | tool_meta_data = tool_meta.get(tool_name, {}) | 
					
						
						|  | tool_config = tool_meta_data.get('tool_config', {}) | 
					
						
						|  | if tool_config.get('tool_provider_type', '') != 'dataset-retrieval': | 
					
						
						|  | tool_icon = ToolManager.get_tool_icon( | 
					
						
						|  | tenant_id=app_model.tenant_id, | 
					
						
						|  | provider_type=tool_config.get('tool_provider_type', ''), | 
					
						
						|  | provider_id=tool_config.get('tool_provider', ''), | 
					
						
						|  | ) | 
					
						
						|  | if not tool_icon: | 
					
						
						|  | tool_entity = find_agent_tool(tool_name) | 
					
						
						|  | if tool_entity: | 
					
						
						|  | tool_icon = ToolManager.get_tool_icon( | 
					
						
						|  | tenant_id=app_model.tenant_id, | 
					
						
						|  | provider_type=tool_entity.provider_type, | 
					
						
						|  | provider_id=tool_entity.provider_id, | 
					
						
						|  | ) | 
					
						
						|  | else: | 
					
						
						|  | tool_icon = '' | 
					
						
						|  |  | 
					
						
						|  | tool_calls.append({ | 
					
						
						|  | 'status': 'success' if not tool_meta_data.get('error') else 'error', | 
					
						
						|  | 'error': tool_meta_data.get('error'), | 
					
						
						|  | 'time_cost': tool_meta_data.get('time_cost', 0), | 
					
						
						|  | 'tool_name': tool_name, | 
					
						
						|  | 'tool_label': tool_label, | 
					
						
						|  | 'tool_input': tool_input, | 
					
						
						|  | 'tool_output': tool_output, | 
					
						
						|  | 'tool_parameters': tool_meta_data.get('tool_parameters', {}), | 
					
						
						|  | 'tool_icon': tool_icon, | 
					
						
						|  | }) | 
					
						
						|  |  | 
					
						
						|  | result['iterations'].append({ | 
					
						
						|  | 'tokens': agent_thought.tokens, | 
					
						
						|  | 'tool_calls': tool_calls, | 
					
						
						|  | 'tool_raw': { | 
					
						
						|  | 'inputs': agent_thought.tool_input, | 
					
						
						|  | 'outputs': agent_thought.observation, | 
					
						
						|  | }, | 
					
						
						|  | 'thought': agent_thought.thought, | 
					
						
						|  | 'created_at': agent_thought.created_at.isoformat(), | 
					
						
						|  | 'files': agent_thought.files, | 
					
						
						|  | }) | 
					
						
						|  |  | 
					
						
						|  | return result |