File size: 6,842 Bytes
67ed0c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d03367b
 
9b5b26a
 
67ed0c5
c19d193
67ed0c5
685045c
d03367b
9b5b26a
1912e17
9b5b26a
d03367b
 
 
1912e17
d03367b
 
 
 
 
00f7a0b
 
d03367b
 
 
 
 
 
 
 
 
 
 
 
 
9b5b26a
67ed0c5
9b5b26a
 
 
 
 
 
 
d03367b
 
 
1912e17
38530fa
d03367b
1912e17
d03367b
 
 
 
 
 
 
 
9b5b26a
 
 
 
 
 
 
 
 
 
 
 
8c01ffb
d03367b
 
 
 
 
 
 
 
1912e17
 
 
 
d03367b
 
8c01ffb
d03367b
 
 
ae7a494
d03367b
 
 
 
 
8c01ffb
d03367b
 
 
 
 
 
8c01ffb
d03367b
 
 
 
 
 
 
 
8c01ffb
8fe992b
d03367b
8c01ffb
 
 
 
 
 
d03367b
8fe992b
 
67ed0c5
8c01ffb
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# old and defaulyt code:
# 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

# # Below is an example of a tool that does nothing. Amaze us with your creativity !
# @tool
# def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type
#     #Keep this format for the description / args / args description but feel free to modify the tool
#     """A tool that does nothing yet 
#     Args:
#         arg1: the first argument
#         arg2: the second argument
#     """
#     return "What magic will you build ?"

# @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,
# )


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

# new code: (by gemini + me + Agents course)
# 1. Import spaces at the top
import datetime
import pytz
import requests
import yaml
import spaces
from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool, load_tool, tool, FinalAnswerTool #, InferenceClientModel, 
#from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
from duckduckgo_search import DDGS # or: from ddgs import DDGS

# Gloable vars and important stuff:

search_tool = DuckDuckGoSearchTool() #for search tool # the easy way.
#search_results = _ddg_search(query)
final_answer = FinalAnswerTool() #final answer tool
# image generation tool
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

# our llm:
model = HfApiModel(
#model = InferenceClientModel( 
    max_tokens=2096,
    temperature=0.5,
    model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
    custom_role_conversions=None,
)

# in `prompts.yml` we have sys_prompt.
with open("prompts.yaml", 'r') as stream:
    prompt_templates = yaml.safe_load(stream) 


# Tools (user def tools):

@tool
def my_custom_tool(arg1: str, arg2: int) -> str:
    """A tool that does nothing yet 
    Args:
        arg1: the first argument
        arg2: the second argument
    """
    return "What magic will you build ?"

@tool
def hbty(b_day: str) -> str: #hbty = Happy Birthday to you
    """
    A tool for wishing Happy Birthday, If use query or inputs have or contain keyword "birthday" or "bday".
    A tool that generates a happy birthday greeting whenever the user mentions 'birthday', 'bday', or asks about birthdays.
    Args:
        b_day: A string containing a question or statement to check for birthday keywords like 'birthday' or 'bday'.
    """
    #return "Happy Birthday To You !!!! :)"
    cleaned_input = b_day.lower()
    if "birthday" in cleaned_input or "bday" in cleaned_input:
        return "Happy Birthday To You !!!! :)"
    else:
        return "No birthday mentioned in the statement."

@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:
        tz = pytz.timezone(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)}"

@tool
def get_search_results(query: str) -> str:
    """A tool that fetches the data from the internet, for a specific search query.
    Args:
        query: A string representing a valid question or request for example, 'What is the capitol of india?'
    """
    try:
        # DuckDuckGoSearchTool is callable directly with the query string
        #search_results = _ddg_search(query)
        #return search_results
        results = ddg_client.text(query, max_results=5)
        return str(results)
    except Exception as e:
        return f"Error executing search query '{query}': {str(e)}"

@tool
def generate_code_snippet(language: str, task_description: str) -> str:
    """Generates a clean code snippet in a requested programming language for a specific task.

    Args:
        language: The programming language to write (e.g., 'python', 'cpp', 'javascript', 'sql').
        task_description: A clear description of what the code should do.
    """
    prompt = f"Write a clean, efficient {language} code snippet to fulfill this task: {task_description}. Provide brief comments."

    try:
        # Call the model to generate code
        response = model([{"role": "user", "content": prompt}])
        return response.content
    except Exception as e:
        return f"Error generating code: {str(e)}"


# Runner code:
# 2. Decorate the agent execution function for ZeroGPU
@spaces.GPU
def run_agent(prompt):
    return agent.run(prompt)

# our agent:
agent = CodeAgent(
    model=model,
    tools=[final_answer,generate_code_snippet,get_search_results,get_current_time_in_timezone,hbty,my_custom_tool,search_tool,image_generation_tool], # 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 # Pass system prompt to CodeAgent
)

# Launch Gradio UI
GradioUI(agent).launch()