OpenDeepResearch / scripts /time_tools.py
Leonardo
Sync local Space with Hub
eaaf050 verified
#!/usr/bin/env python
# coding=utf-8
# Copyright 2024 The Footscray Coding Collective. All rights reserved.
from datetime import datetime
from typing import Optional
import pytz
from smolagents import tool
@tool
def get_temporal_context(
timezone_str: str = "US/Eastern", market: str = "US", date_str: Optional[str] = None
) -> str:
"""
Provides a concise overview of the current temporal context, including date, time, and market status.
Args:
timezone_str: The timezone to display time in (default: US/Eastern)
market: Market identifier (US, EU, ASIA) (default: US)
date_str: Date in YYYY-MM-DD format (optional, defaults to current date if not provided)
Returns:
A formatted string containing the current date, time, year, trading day status, and market hours status.
"""
try:
# Get current time information using pytz
try:
tz = pytz.timezone(timezone_str)
except pytz.exceptions.UnknownTimeZoneError:
return f"Error: Unknown timezone '{timezone_str}'. Try using standard timezone names like 'US/Eastern'."
now = datetime.now(tz)
current_date = now.strftime("%Y-%m-%d")
current_time = now.strftime("%H:%M:%S")
current_year = now.year
weekday_name = now.strftime("%A")
time_info = f"""Current Time Information:
- Date: {current_date} ({weekday_name})
- Time: {current_time} ({timezone_str})
- Year: {current_year}
"""
# Get Market hours Information
if market == "US":
# Convert time to US/Eastern for US market check
eastern_tz = pytz.timezone("US/Eastern")
eastern_now = now.astimezone(eastern_tz)
is_weekday_us = eastern_now.weekday() < 5
us_minutes = eastern_now.hour * 60 + eastern_now.minute
us_market_open = 9 * 60 + 30 # 9:30 AM ET
us_market_close = 16 * 60 # 4:00 PM ET
if is_weekday_us and us_market_open <= us_minutes < us_market_close:
market_status = "Open"
else:
market_status = "Closed"
market_hours_info = f"US Markets (NYSE, NASDAQ): {market_status}"
elif market == "EU":
# Convert time to London for EU market check
london_tz = pytz.timezone("Europe/London")
london_now = now.astimezone(london_tz)
is_weekday_eu = london_now.weekday() < 5
eu_minutes = london_now.hour * 60 + london_now.minute
eu_market_open = 8 * 60 # 8:00 AM London
eu_market_close = 16 * 60 + 30 # 4:30 PM London
if is_weekday_eu and eu_market_open <= eu_minutes < eu_market_close:
market_status = "Open"
else:
market_status = "Closed"
market_hours_info = f"European Markets (LSE, Euronext): {market_status}"
elif market == "ASIA":
# Convert time to Tokyo for Asian market check
tokyo_tz = pytz.timezone("Asia/Tokyo")
tokyo_now = now.astimezone(tokyo_tz)
is_weekday_tokyo = tokyo_now.weekday() < 5
tokyo_minutes = tokyo_now.hour * 60 + tokyo_now.minute
tokyo_morning_open = 9 * 60 # 9:00 AM Tokyo
tokyo_morning_close = 11 * 60 + 30 # 11:30 AM Tokyo
tokyo_afternoon_open = 12 * 60 + 30 # 12:30 PM Tokyo
tokyo_afternoon_close = 15 * 60 # 3:00 PM Tokyo
is_tokyo_session = (
tokyo_morning_open <= tokyo_minutes < tokyo_morning_close
) or (tokyo_afternoon_open <= tokyo_minutes < tokyo_afternoon_close)
if is_weekday_tokyo and is_tokyo_session:
market_status = "Open"
else:
market_status = "Closed"
market_hours_info = (
"Asian Markets (Tokyo Stock Exchange, Shanghai Stock Exchange, "
f"Australian Securities Exchange): {market_status}"
)
else:
return f"Error: Invalid market '{market}'. Supported markets are 'US', 'EU', and 'ASIA'."
# Get Trading Day Information
if date_str:
try:
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
# Apply timezone to date_obj
date_obj = tz.localize(date_obj)
except ValueError:
return (
f"Error: Invalid date format '{date_str}'. Use YYYY-MM-DD format."
)
else:
date_obj = now
date_str = now.strftime("%Y-%m-%d")
is_weekend = date_obj.weekday() > 4
trading_day = "No" if is_weekend else "Yes"
trading_info = f"Trading Day: {trading_day}"
# Combine all information
final_result = f"""{time_info}
{market_hours_info}
- {trading_info}
"""
return final_result
except Exception as e:
return f"Error retrieving temporal context: {str(e)}"
__all__ = ["get_temporal_context"]