File size: 4,600 Bytes
1f88cb4
1e430e2
9b5b26a
 
 
c19d193
e45608f
08f0c47
1f88cb4
6aae614
9b5b26a
 
1f88cb4
9b5b26a
1e430e2
 
9b5b26a
1e430e2
9b5b26a
1e430e2
 
 
 
 
 
 
1f88cb4
6dce7e4
 
 
 
 
 
 
1f88cb4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6dce7e4
1f88cb4
6dce7e4
1e430e2
6dce7e4
 
 
 
1f88cb4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e4dc3c5
1f88cb4
 
 
 
 
 
 
 
 
 
 
 
 
 
6dce7e4
6aae614
ae7a494
1f88cb4
e121372
1f88cb4
 
 
 
13d500a
8c01ffb
1f88cb4
 
 
 
 
 
 
8c01ffb
 
8fe992b
6dce7e4
 
 
53f2ae0
 
1f88cb4
8c01ffb
 
 
 
b6c5f68
6dce7e4
861422e
8fe992b
 
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
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
from smolagents.agent_types import AgentImage
import datetime
import requests
import pytz
import yaml
from PIL import Image
import os
import io
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI

# Preserving original definition with added robustness
@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)}"

# Preserving original description with fixed search handling
@tool
def travel_recommendations_for_city(city: str) -> str:
    """A tool that provides tourist recommendations for a given city.
    Args:
        city: A string representing a specific city (e.g., 'Nairobi/Johannesburg').
    """
    search = DuckDuckGoSearchTool()
    try:
        # Handle compound city names
        city = city.split('/')[0].strip()
        results = search(f"Top things to do in {city}")
        
        if not results:
            return f"Couldn't find any recommendations for {city}."
            
        # Extract content from different possible fields
        recommendations = []
        for r in results[:5]:
            content = r.get('body') or r.get('snippet') or r.get('title') or "No description available"
            recommendations.append(f"- {content}")
            
        return f"Here are some things to do in {city}:\n" + "\n".join(recommendations)
    except Exception as e:
        return f"Error fetching recommendations: {str(e)}"

# Preserving original description with enhanced image handling
@tool
def generate_travel_brochure_image(description: str) -> AgentImage:
    """A tool that generates a travel brochure image based on a description.
    Args:
        description: A string representing text to be converted into a brochure.
    """
    try:
        image_path = image_generation_tool(description)
        print(f"[DEBUG] image_generation_tool returned: {image_path}")

        # Handle different return types from image tool
        if isinstance(image_path, Image.Image):
            return AgentImage(image_path)
            
        elif isinstance(image_path, str):
            if image_path.startswith(('http://', 'https://')):
                # Download from URL
                response = requests.get(image_path, timeout=10)
                response.raise_for_status()
                return AgentImage(Image.open(io.BytesIO(response.content)))
                
            elif os.path.exists(image_path):
                return AgentImage(Image.open(image_path))
                
        raise ValueError("Image generation failed - invalid return format")
        
    except Exception as e:
        return f"Image generation error: {str(e)}"

# Load image tool with error handling
try:
    image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
except Exception as e:
    print(f"Error loading image tool: {str(e)}")
    # Fallback to stable diffusion if available
    try:
        image_generation_tool = load_tool("stabilityai/stable-diffusion")
        print("Using stable-diffusion fallback")
    except:
        raise RuntimeError("No working image generation tool available")

final_answer = FinalAnswerTool()

# Using reliable endpoint as suggested
model = HfApiModel(
    max_tokens=2096,
    temperature=0.5,
    model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud',
    custom_role_conversions=None,
)

# Load prompts with fallback
try:
    with open("prompts.yaml", 'r') as stream:
        prompt_templates = yaml.safe_load(stream)
except Exception as e:
    print(f"Error loading prompts: {str(e)}")
    prompt_templates = {}

agent = CodeAgent(
    model=model,
    tools=[
        get_current_time_in_timezone,
        travel_recommendations_for_city,
        generate_travel_brochure_image,
        final_answer
    ],
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name="travel_brochure_agent",
    description="Provides local time, travel tips, and generates a brochure image.",
    prompt_templates=prompt_templates
)

GradioUI(agent).launch()