File size: 5,578 Bytes
106b13a
 
 
 
 
 
82005cb
106b13a
 
 
 
 
2bff543
 
 
106b13a
2bff543
 
106b13a
2bff543
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106b13a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82005cb
15db64f
106b13a
 
 
 
 
 
 
 
 
07baf4f
106b13a
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from tools.web_search import DuckDuckGoSearchTool

from Gradio_UI import GradioUI

# Below is an example of a tool that does nothing. Amaze us with your creativity !
@tool
def animal_mixer(animal1: str, animal2: str) -> str:
    """A tool that mixes characteristics of two animals and determines if it can generate an image.
    
    Args:
        animal1: The first animal to mix
        animal2: The second animal to mix
    """
    # List of common animals
    common_animals = [
        "dog", "cat", "lion", "tiger", "elephant", "giraffe", "monkey", 
        "horse", "cow", "pig", "sheep", "rabbit", "mouse", "rat", 
        "bear", "wolf", "fox", "deer", "eagle", "hawk", "owl", 
        "duck", "chicken", "snake", "crocodile", "turtle", "frog", 
        "dolphin", "whale", "shark", "octopus", "crab"
    ]
    
    # Verify if both animals are real/common
    animal1_real = animal1.lower() in common_animals
    animal2_real = animal2.lower() in common_animals
    
    # Create description of the mix
    if animal1_real and animal2_real:
        description = f"The mix between {animal1} and {animal2} would have: "
        description += f"the head of {animal1} with the body of {animal2}, "
        description += f"combining features like {get_feature(animal1)} and {get_feature(animal2)}."
        
        # Determine if the mix is fantastic
        if is_fantastic_combination(animal1, animal2):
            return description + f"\n\nWould you like to see an image of this fantastic combination? I can create it using image_generation_tool."
        else:
            return description
    else:
        # If any is not recognized as a real animal
        not_recognized = []
        if not animal1_real:
            not_recognized.append(animal1)
        if not animal2_real:
            not_recognized.append(animal2)
        
        return f"I don't recognize {'the following animals' if len(not_recognized) > 1 else 'the following animal'}: {', '.join(not_recognized)}. Please try with real animals."

def get_feature(animal):
    """Returns a distinctive feature of the animal."""
    features = {
        "dog": "loyalty and sense of smell",
        "cat": "agility and night vision",
        "lion": "mane and powerful roar",
        "tiger": "stripes and strength",
        # Add more features for other animals
    }
    return features.get(animal.lower(), "unique features")

def is_fantastic_combination(animal1, animal2):
    """Determines if the combination of animals results in something fantastic."""
    fantastic_pairs = [
        ("lion", "eagle"),  # griffin
        ("horse", "human"),  # centaur
        ("fish", "human"),  # mermaid
        ("snake", "bird"),  # quetzalcoatl
        ("horse", "eagle"),  # pegasus
        # Add more combinations considered fantastic
    ]
    
    # Check if the combination exists in any order
    return (animal1.lower(), animal2.lower()) in fantastic_pairs or (animal2.lower(), animal1.lower()) in fantastic_pairs or has_extreme_habitat_difference(animal1, animal2)

def has_extreme_habitat_difference(animal1, animal2):
    """Checks if the animals have extremely different habitats."""
    water_animals = ["dolphin", "whale", "shark", "octopus", "fish"]
    air_animals = ["eagle", "hawk", "owl", "bat"]
    
    is_water1 = animal1.lower() in water_animals
    is_water2 = animal2.lower() in water_animals
    is_air1 = animal1.lower() in air_animals
    is_air2 = animal2.lower() in air_animals
    
    # If one is aquatic and the other aerial, the combination is fantastic
    return (is_water1 and is_air2) or (is_water2 and is_air1)

@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='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
custom_role_conversions=None,
)

# Add results DuckDuckGoSearchTool
web_search_tool = DuckDuckGoSearchTool()  # Number of search results can be ajust here

# 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, image_generation_tool, web_search_tool, 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()