from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool

from Gradio_UI import GradioUI


@tool
def my_custom_tool(arg1: str) -> str:
    """
    A tool that uses the provided argument as a search query and returns the search results 
    along with the current UTC time, all formatted in YAML.
    
    Args:
        arg1: The search query string.
    """
    # Initialize the DuckDuckGo search tool and perform the search using arg1.
    search_tool = DuckDuckGoSearchTool()
    # Assuming the search tool has a method 'search' that returns a list of results.
    search_results = search_tool.search(arg1)
    
    # Get the current time in UTC with timezone information.
    now_utc = datetime.datetime.now(pytz.utc)
    formatted_time = now_utc.strftime("%Y-%m-%d %H:%M:%S %Z")
    
    # Build a response dictionary with the search query, current time, and search results.
    response = {
        "search_query": arg1,
        "current_time": formatted_time,
        "search_results": search_results
    }
    
    # Convert the response dictionary to a YAML-formatted string.
    yaml_response = yaml.dump(response, default_flow_style=False)
    
    # Optionally, pass the result to a final answer tool or UI component if desired.
    # For instance, FinalAnswerTool could be used to format the final output.
    # final_answer = FinalAnswerTool(yaml_response)
    # return final_answer
    
    return yaml_response


@tool
def get_current_time_in_timezone(timezone: str) -> str:
    """A tool that fetches the current local time in a specified timezone.
    Args:
        timezone: A string representing a valid timezone (e.g., 'America/New_York').
    """
    try:
        # Create timezone object
        tz = pytz.timezone(timezone)
        # Get current time in that timezone
        local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
        return f"The current local time in {timezone} is: {local_time}"
    except Exception as e:
        return f"Error fetching time for timezone '{timezone}': {str(e)}"


final_answer = FinalAnswerTool()

# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder:
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud' 

model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='SmallDoge/Doge-160M-Instruct',# it is possible that this model may be overloaded
custom_role_conversions=None,
)


# Import tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

with open("prompts.yaml", 'r') as stream:
    prompt_templates = yaml.safe_load(stream)
    
agent = CodeAgent(
    model=model,
    tools=[final_answer, get_current_time_in_timezone], ## add your tools here (don't remove final answer)
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name=None,
    description=None,
    prompt_templates=prompt_templates
)


GradioUI(agent).launch()