File size: 3,329 Bytes
3121027
9b5b26a
 
c19d193
6aae614
b43ab58
 
66459aa
3121027
ebaf70b
5591fd4
3121027
23f40a4
 
 
 
 
 
 
 
 
3121027
 
 
 
 
 
 
 
5591fd4
 
23f40a4
 
3121027
5591fd4
23f40a4
 
3121027
 
23f40a4
5591fd4
 
23f40a4
 
 
5591fd4
23f40a4
3121027
401f9bf
 
 
 
 
b43ab58
 
 
 
401f9bf
 
b43ab58
 
 
 
 
 
 
3121027
b43ab58
 
 
3121027
b43ab58
 
 
 
 
 
 
 
 
 
 
66459aa
b43ab58
 
 
 
 
 
 
 
 
3121027
b43ab58
3121027
23f40a4
3121027
b43ab58
 
23f40a4
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
from smolagents import CodeAgent, HfApiModel, load_tool, tool
import datetime
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from tools.book_tool import BookSearchTool, BookDetailsTool
from tools.arxiv_tool import ArxivSearchTool, LatestPapersTool
from tools.web_search import DuckDuckGoSearchTool
from Gradio_UI import GradioUI

@tool
def calculator(operation: str) -> str:
    """A simple calculator tool that safely evaluates basic math expressions.
    
    Args:
        operation: The mathematical expression to evaluate (e.g., "2 + 2", "5 * 3"). 
                  Supports basic operations (+, -, *, /) and parentheses.
    
    Returns:
        str: The result of the calculation or an error message
    """
    try:
        allowed_chars = set("0123456789+-*/ .()")
        if not all(c in allowed_chars for c in operation):
            return "Error: Only basic math operations allowed"
        result = eval(operation, {"__builtins__": {}})
        return f"Result: {result}"
    except Exception as e:
        return f"Error calculating {operation}: {str(e)}"

@tool
def get_current_time_in_timezone(timezone: str) -> str:
    """Get the current time in a specified timezone.
    
    Args:
        timezone: The name of the timezone to get time for (e.g., 'America/New_York', 
                 'Asia/Tokyo', 'UTC'). Must be a valid timezone string.
    
    Returns:
        str: The current time in the specified timezone or an error message
    """
    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)}"

def initialize_agent():
    """Initialize and return the CodeAgent with all tools."""
    
    # Initialize tools
    final_answer = FinalAnswerTool()
    book_search = BookSearchTool()
    book_details = BookDetailsTool()
    arxiv_search = ArxivSearchTool()
    latest_papers = LatestPapersTool()
    web_search = DuckDuckGoSearchTool(max_results=5)  # Initialize DDG search with 5 results
    
    # Initialize the model
    model = HfApiModel(
        max_tokens=2096,
        temperature=0.5,
        model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
        custom_role_conversions=None,
    )

    # Load prompt templates
    with open("prompts.yaml", 'r') as stream:
        prompt_templates = yaml.safe_load(stream)

    # Initialize agent with all tools
    agent = CodeAgent(
        model=model,
        tools=[
            final_answer,
            calculator,
            get_current_time_in_timezone,
            book_search,
            book_details,
            arxiv_search,
            latest_papers,
            web_search
        ],
        max_steps=8,
        verbosity_level=1,
        grammar=None,
        planning_interval=None,
        name="ResearchAssistant",
        description="An AI assistant specialized in helping users discover and research books, papers, and web content on AI and machine learning.",
        prompt_templates=prompt_templates
    )

    return agent

# Launch Gradio UI
if __name__ == "__main__":
    # Initialize and launch the agent
    agent = initialize_agent()
    GradioUI(agent).launch()