File size: 3,505 Bytes
9b5b26a
 
e35c5a9
9b5b26a
cefa173
 
9b5b26a
c19d193
6aae614
8fe992b
9b5b26a
 
 
5adb135
cefa173
 
 
9b5b26a
cefa173
 
 
9b5b26a
cefa173
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15318e3
9b5b26a
 
 
 
 
 
 
 
 
 
 
 
 
 
8c01ffb
 
6aae614
e121372
0206130
bf6d34c
9f15a38
00e2a8b
 
fe328e0
13d500a
8c01ffb
 
9b5b26a
df8019e
8c01ffb
861422e
 
9b5b26a
8c01ffb
8fe992b
7506013
8c01ffb
 
 
 
 
 
861422e
8fe992b
 
9b5b26a
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
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import json
import requests
import xml.etree.ElementTree as ET
import time
import pytz
import yaml
from tools.final_answer import FinalAnswerTool

from Gradio_UI import GradioUI

@tool
def get_boardgame_from_bgg(name: str) -> str: 
    
    """A tool to get boardgame details form Boardgamegeek community site using the BGG xml api
    
    Args:
        name: boardgame name

    Returns name, id, rank in BGG, description and link to selected boardgame
    """
    
    # search for game id 
    search_url = f"https://boardgamegeek.com/xmlapi2/search?query={name}&type=boardgame"
    response = requests.get(search_url)
    
    if response.status_code != 200:
        return '{"error": "BoardGameGeek could not be reached"})'
    
    root = ET.fromstring(response.content)
    items = root.findall(".//item")
    
    if not items:
        return '{"error": "game not found"}'
    
    # We asume first entry as correct result, human interaction to select entry in future version
    game_id = items[0].get('id')
    
    # giving bgg api some time to rest
    time.sleep(1)
    
    # get game detail
    details_url = f"https://boardgamegeek.com/xmlapi2/thing?id={game_id}&stats=1"
    response = requests.get(details_url)
    
    if response.status_code != 200:
        return '{"error": "game detail not found"}'
    
    root = ET.fromstring(response.content)
    
    # obtain basic information
    name = root.find(".//name[@type='primary']").get('value')
    description = root.find(".//description").text
    rank = root.find(".//rank[@name='boardgame']").get('value')
    
    return json.dumps({
        "name": name,
        "id": game_id,
        "description": description[:500] + "..." if description and len(description) > 500 else description,
        "rank": int(rank),
        "bgg_url": f"https://boardgamegeek.com/boardgame/{game_id}"
    })

@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()
model = HfApiModel(
max_tokens=1048,
temperature=0.5,
#model_id='Qwen/Qwen2.5-Coder-1.5B-Instruct',
#model_id='https://wxknx1kg971u7k1n.us-east-1.aws.endpoints.huggingface.cloud', # it is possible that this model may be overloaded
model_id='deepseek-ai/DeepSeek-R1-Distill-Qwen-32B',
custom_role_conversions=None,
)


# Import tool from Hub
image_generation_tool = load_tool("m-ric/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=[get_boardgame_from_bgg, DuckDuckGoSearchTool() , image_generation_tool, 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()