SmartWebAnalyzerPlus / tools /final_answer.py
MHamdan's picture
Initial commit with full functionality extend app req tools
5952adf
# tools/final_answer.py
from smolagents import Tool
from typing import Optional, Dict, Any
import json
import logging
logger = logging.getLogger(__name__)
class FinalAnswerTool(Tool):
"""Tool for providing final answers to user queries with improved error handling and validation."""
name = "final_answer"
description = "Tool for providing the final answer to the agent's task with structured output"
inputs: Dict[str, Any] = {
"answer": {
"type": "string",
"description": "The final answer to be returned in JSON format"
}
}
output_type = "string"
def __init__(self, description: Optional[str] = None):
super().__init__()
self.description = description or self.description
def validate_json(self, answer: str) -> bool:
"""Validate if the answer is proper JSON format."""
try:
if isinstance(answer, str):
json.loads(answer)
return True
except json.JSONDecodeError:
return False
def format_response(self, answer: str) -> str:
"""Format the response to ensure consistent structure."""
try:
if isinstance(answer, str):
# Try to parse as JSON first
if self.validate_json(answer):
return answer
# If not JSON, create a structured response
return json.dumps({
'clean_text': answer,
'summary': '',
'sentiment': '',
'topics': ''
})
# If answer is already a dict, convert to JSON
if isinstance(answer, dict):
return json.dumps(answer)
raise ValueError("Invalid answer format")
except Exception as e:
logger.error(f"Error formatting response: {str(e)}")
return json.dumps({
'error': str(e),
'clean_text': str(answer),
'summary': '',
'sentiment': '',
'topics': ''
})
def forward(self, answer: str) -> str:
"""Process and return the final answer with improved error handling.
Args:
answer: The answer text to be returned
Returns:
str: The processed answer in JSON format
"""
try:
return self.format_response(answer)
except Exception as e:
logger.error(f"Error in forward method: {str(e)}")
return json.dumps({
'error': str(e),
'clean_text': 'An error occurred while processing the response',
'summary': '',
'sentiment': '',
'topics': ''
})
def __call__(self, answer: str) -> str:
"""Alias for forward method to maintain compatibility"""
return self.forward(answer)