|
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 |