Spaces:
Sleeping
Sleeping
| # 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) |