File size: 5,879 Bytes
0567a2e 9b5b26a c19d193 0567a2e 8fe992b 0567a2e 9b5b26a 0567a2e 9b5b26a 0567a2e 9b5b26a 0567a2e 9b5b26a 0567a2e 9b5b26a 0567a2e 8c01ffb 0567a2e ae7a494 0567a2e ae7a494 0567a2e 8c01ffb 0567a2e 8c01ffb 0567a2e 9b5b26a 8c01ffb 0567a2e 861422e 0567a2e 8c01ffb 8fe992b 0567a2e 8c01ffb 0567a2e 8fe992b 0567a2e |
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 |
# -*- coding: utf-8 -*-
"""
Extended smolagents template
Adds a tool that finds the overlap in normal office-hours
(09:00-17:00 local time by default) for a list of time-zones,
so a distributed team can quickly see when they’re all online.
Teams: Kyrgyzstan (Asia/Bishkek), USA (pick any valid TZ,
e.g. America/New_York), Uzbekistan (Asia/Tashkent).
Usage inside the chat UI, for example:
find_overlapping_work_hours(
["Asia/Bishkek", "America/New_York", "Asia/Tashkent"],
start_local="09:00",
end_local="17:00"
)
"""
from smolagents import (
CodeAgent,
DuckDuckGoSearchTool,
InferenceClientModel,
load_tool,
tool,
)
import datetime
import pytz
import yaml
from typing import List
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
# --------------------------------------------------------------------------- #
# Example placeholder tool (left intact)
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 get_current_time_in_timezone(timezone: str) -> str:
"""Return the current wall-clock time for a given timezone.
Args:
timezone: IANA tz database string, e.g. 'America/New_York'.
"""
try:
tz = pytz.timezone(timezone)
now_local = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"Local time in {timezone}: {now_local}"
except Exception as exc:
return f"Error: {exc}"
# --------------------------------------------------------------------------- #
@tool
def find_overlapping_work_hours(
timezones: List[str],
start_local: str = "09:00",
end_local: str = "17:00",
) -> str:
"""Given several IANA time-zones, return the daily overlap of office hours.
Args:
timezones: List of tz names (e.g. ['Asia/Bishkek','America/New_York'])
start_local: Start of work day in HH:MM (24 h) for *each* zone
end_local: End of work day in HH:MM (24 h) for *each* zone
"""
try:
# Parse the local start/end once
start_h, start_m = map(int, start_local.split(":"))
end_h, end_m = map(int, end_local.split(":"))
if (end_h, end_m) <= (start_h, start_m):
return "End time must be after start time."
# For today’s date we’ll convert each zone’s window to UTC
today = datetime.date.today()
utc = pytz.utc
earliest_end_utc = datetime.datetime.min.replace(tzinfo=utc)
latest_start_utc = datetime.datetime.max.replace(tzinfo=utc)
details = []
for tz_name in timezones:
tz = pytz.timezone(tz_name)
local_start = tz.localize(
datetime.datetime(today.year, today.month, today.day, start_h, start_m)
)
local_end = tz.localize(
datetime.datetime(today.year, today.month, today.day, end_h, end_m)
)
start_utc = local_start.astimezone(utc)
end_utc = local_end.astimezone(utc)
# track overlap
if start_utc > latest_start_utc:
latest_start_utc = start_utc
if end_utc < earliest_end_utc or earliest_end_utc == datetime.datetime.min.replace(
tzinfo=utc
):
earliest_end_utc = end_utc
details.append(
f"{tz_name}: {local_start.strftime('%H:%M')}–{local_end.strftime('%H:%M')} "
f"(UTC {start_utc.strftime('%H:%M')}–{end_utc.strftime('%H:%M')})"
)
if earliest_end_utc <= latest_start_utc:
overlap_msg = "No common working window today."
else:
# Present the intersection in UTC and in each local zone for clarity
overlap_local = []
for tz_name in timezones:
tz = pytz.timezone(tz_name)
overlap_start_local = latest_start_utc.astimezone(tz).strftime("%H:%M")
overlap_end_local = earliest_end_utc.astimezone(tz).strftime("%H:%M")
overlap_local.append(f"{tz_name}: {overlap_start_local}–{overlap_end_local}")
overlap_msg = (
f"✅ Overlap (UTC): {latest_start_utc.strftime('%H:%M')}–"
f"{earliest_end_utc.strftime('%H:%M')}\n"
+ "\n".join(overlap_local)
)
return (
"Daily office hours\n"
+ "\n".join(details)
+ "\n\n"
+ overlap_msg
)
except Exception as exc:
return f"Error computing overlap: {exc}"
# --------------------------------------------------------------------------- #
# Required final-answer tool
final_answer = FinalAnswerTool()
# Inference model
model = InferenceClientModel(
max_tokens=2096,
temperature=0.5,
model_id="Qwen/Qwen2.5-Coder-32B-Instruct",
custom_role_conversions=None,
)
# Optional extra tool from the Hugging Face Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
# System prompt templates
with open("prompts.yaml", "r") as stream:
prompt_templates = yaml.safe_load(stream)
# Assemble the agent
agent = CodeAgent(
model=model,
tools=[
final_answer,
get_current_time_in_timezone,
find_overlapping_work_hours,
# my_custom_tool, # uncomment if you actually need it
# image_generation_tool, # idem
],
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates,
)
# Launch a small Gradio front-end
GradioUI(agent).launch()
|