mathidot's picture
add tool function to query price of asset
47afa16
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
import json
from tools.final_answer import FinalAnswerTool
import yfinance as yf
from Gradio_UI import GradioUI
@tool
def query_market_asset(symbol: str) -> str:
"""A universal market data tool to query the current price or level of ANY asset.
Supported asset classes include major indices, stocks, ETFs, crypto, and forex.
Args:
symbol: The specific ticker symbol used by Yahoo Finance. Examples:
- Indices (requires '^'): '^GSPC' (S&P 500), '^VIX' (Volatility Index), '^DJI' (Dow Jones), '^IXIC' (Nasdaq)
- Equities / ETFs: 'AAPL' (Apple), 'SPY' (SPDR S&P 500 ETF), 'TLT' (20+ Yr Treasury Bond)
- Crypto: 'BTC-USD' (Bitcoin), 'ETH-USD' (Ethereum)
- Forex: 'EURUSD=X' (EUR/USD rate), 'USDCNH=X' (USD/Offshore RMB)
Returns:
A JSON-formatted string containing the current price, high/low, timestamp, and asset info.
"""
symbol = symbol.strip().upper()
try:
ticker = yf.Ticker(symbol)
data = ticker.history(period="1d", interval="1m")
if not data.empty:
latest_row = data.iloc[-1]
current_price = float(latest_row['Close'])
open_price = float(latest_row['Open'])
high_price = float(latest_row['High'])
low_price = float(latest_row['Low'])
volume = int(latest_row['Volume'])
timestamp = str(data.index[-1])
result = {
"status": "success",
"symbol": symbol,
"current_price": round(current_price, 4),
"open": round(open_price, 4),
"high": round(high_price, 4),
"low": round(low_price, 4),
"volume": volume,
"timestamp": timestamp,
"data_type": "intraday_1m"
}
else:
info = ticker.info
current_price = info.get("regularMarketPrice") or info.get("previousClose") or info.get("ask") or info.get("bid")
if current_price:
result = {
"status": "success",
"symbol": symbol,
"current_price": round(float(current_price), 4),
"open": info.get("regularMarketOpen") or info.get("open"),
"high": info.get("regularMarketDayHigh") or info.get("dayHigh"),
"low": info.get("regularMarketDayLow") or info.get("dayLow"),
"volume": info.get("regularMarketVolume") or info.get("volume", 0),
"short_name": info.get("shortName", ""),
"data_type": "cached_info"
}
else:
result = {
"status": "error",
"symbol": symbol,
"message": "No price data could be resolved for this asset."
}
except Exception as e:
result = {
"status": "error",
"symbol": symbol,
"message": f"Exception occurred while querying: {str(e)}"
}
return json.dumps(result, ensure_ascii=False, indent=2)
@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()
# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder:
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
custom_role_conversions=None,
)
# Import tool from Hub
image_generation_tool = load_tool("agents-course/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_current_time_in_timezone, 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()