from typing import Dict from smolagents.tools import Tool import yfinance as yf import matplotlib.pyplot as plt from io import BytesIO import base64 import matplotlib class StockChartTool(Tool): name = "stock_chart" description = "Generates a stock price chart for the given ticker symbol. Returns the chart as a base64 encoded PNG image." inputs = {'ticker': {'type': 'string', 'description': 'The stock ticker symbol (e.g., AAPL, MSFT).'}} output_type = "string" # Base64 encoded image string def forward(self, ticker: str) -> str: try: data = yf.download(ticker, period="30d") # Download 30 days of data if data.empty: return "Error: No data found for that ticker." plt.figure(figsize=(10, 6)) plt.plot(data['Close']) plt.title(f"{ticker} Stock Price (Last 30 Days)") plt.xlabel("Date") plt.ylabel("Closing Price") plt.grid(True) img_buf = BytesIO() plt.savefig(img_buf, format='png') img_buf.seek(0) img_base64 = base64.b64encode(img_buf.getvalue()).decode('utf-8') plt.close() # Important to close the plot to release memory return f"Stock Price Plot" except Exception as e: return f"Error generating chart: {e}" def __init__(self, *args, **kwargs): self.is_initialized = False # Add this line to avoid the warning