Spaces:
Paused
Paused
| 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: | |
| 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: | |
| # only select name field | |
| 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.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 | |