AutoRAG_llama3_groq / phi /tools /openbb_tools.py
AmmarFahmy
adding all files
105b369
import json
from os import getenv
from typing import Optional, Literal, Any
from phi.tools import Toolkit
from phi.utils.log import logger
try:
from openbb import obb as openbb_app
except ImportError:
raise ImportError("`openbb` not installed. Please install using `pip install 'openbb[all]'`.")
class OpenBBTools(Toolkit):
def __init__(
self,
obb: Optional[Any] = None,
openbb_pat: Optional[str] = None,
provider: Literal["benzinga", "fmp", "intrinio", "polygon", "tiingo", "tmx", "yfinance"] = "yfinance",
stock_price: bool = True,
search_symbols: bool = False,
company_news: bool = False,
company_profile: bool = False,
price_targets: bool = False,
):
super().__init__(name="yfinance_tools")
self.obb = obb or openbb_app
try:
if openbb_pat or getenv("OPENBB_PAT"):
self.obb.account.login(pat=openbb_pat or getenv("OPENBB_PAT")) # type: ignore
except Exception as e:
logger.error(f"Error logging into OpenBB: {e}")
self.provider: Literal["benzinga", "fmp", "intrinio", "polygon", "tiingo", "tmx", "yfinance"] = provider
if stock_price:
self.register(self.get_stock_price)
if search_symbols:
self.register(self.search_company_symbol)
if company_news:
self.register(self.get_company_news)
if company_profile:
self.register(self.get_company_profile)
if price_targets:
self.register(self.get_price_targets)
def get_stock_price(self, symbol: str) -> str:
"""Use this function to get the current stock price for a stock symbol or list of symbols.
Args:
symbol (str): The stock symbol or list of stock symbols.
Eg: "AAPL" or "AAPL,MSFT,GOOGL"
Returns:
str: The current stock prices or error message.
"""
try:
result = self.obb.equity.price.quote(symbol=symbol, provider=self.provider).to_polars() # type: ignore
clean_results = []
for row in result.to_dicts():
clean_results.append(
{
"symbol": row.get("symbol"),
"last_price": row.get("last_price"),
"currency": row.get("currency"),
"name": row.get("name"),
"high": row.get("high"),
"low": row.get("low"),
"open": row.get("open"),
"close": row.get("close"),
"prev_close": row.get("prev_close"),
"volume": row.get("volume"),
"ma_50d": row.get("ma_50d"),
"ma_200d": row.get("ma_200d"),
}
)
return json.dumps(clean_results, indent=2, default=str)
except Exception as e:
return f"Error fetching current price for {symbol}: {e}"
def search_company_symbol(self, company_name: str) -> str:
"""Use this function to get a list of ticker symbols for a company.
Args:
company_name (str): The name of the company.
Returns:
str: A JSON string containing the ticker symbols.
"""
logger.debug(f"Search ticker for {company_name}")
result = self.obb.equity.search(company_name).to_polars() # type: ignore
clean_results = []
if len(result) > 0:
for row in result.to_dicts():
clean_results.append({"symbol": row.get("symbol"), "name": row.get("name")})
return json.dumps(clean_results, indent=2, default=str)
def get_price_targets(self, symbol: str) -> str:
"""Use this function to get consensus price target and recommendations for a stock symbol or list of symbols.
Args:
symbol (str): The stock symbol or list of stock symbols.
Eg: "AAPL" or "AAPL,MSFT,GOOGL"
Returns:
str: JSON containing consensus price target and recommendations.
"""
try:
result = self.obb.equity.estimates.consensus(symbol=symbol, provider=self.provider).to_polars() # type: ignore
return json.dumps(result.to_dicts(), indent=2, default=str)
except Exception as e:
return f"Error fetching company news for {symbol}: {e}"
def get_company_news(self, symbol: str, num_stories: int = 10) -> str:
"""Use this function to get company news for a stock symbol or list of symbols.
Args:
symbol (str): The stock symbol or list of stock symbols.
Eg: "AAPL" or "AAPL,MSFT,GOOGL"
num_stories (int): The number of news stories to return. Defaults to 10.
Returns:
str: JSON containing company news and press releases.
"""
try:
result = self.obb.news.company(symbol=symbol, provider=self.provider, limit=num_stories).to_polars() # type: ignore
clean_results = []
if len(result) > 0:
for row in result.to_dicts():
row.pop("images")
clean_results.append(row)
return json.dumps(clean_results[:num_stories], indent=2, default=str)
except Exception as e:
return f"Error fetching company news for {symbol}: {e}"
def get_company_profile(self, symbol: str) -> str:
"""Use this function to get company profile and overview for a stock symbol or list of symbols.
Args:
symbol (str): The stock symbol or list of stock symbols.
Eg: "AAPL" or "AAPL,MSFT,GOOGL"
Returns:
str: JSON containing company profile and overview.
"""
try:
result = self.obb.equity.profile(symbol=symbol, provider=self.provider).to_polars() # type: ignore
return json.dumps(result.to_dicts(), indent=2, default=str)
except Exception as e:
return f"Error fetching company profile for {symbol}: {e}"