123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- 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:
- # 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
|