diff --git a/src/app/api/tools/symbols_tool.py b/src/app/api/tools/symbols_tool.py index 9bf03e4..f183d74 100644 --- a/src/app/api/tools/symbols_tool.py +++ b/src/app/api/tools/symbols_tool.py @@ -13,38 +13,27 @@ logging = logging.getLogger("crypto_symbols") BASE_URL = "https://finance.yahoo.com/markets/crypto/all/" - class CryptoSymbolsTools(Toolkit): """ Class for obtaining cryptocurrency symbols via Yahoo Finance. - (This class-level docstring is for developers). """ def __init__(self, cache_file: str = 'resources/cryptos.csv'): self.cache_file = cache_file - try: - self.final_table = pd.read_csv(self.cache_file) if os.path.exists(self.cache_file) else pd.DataFrame( - columns=['Symbol', 'Name']) - except Exception: - self.final_table = pd.DataFrame(columns=['Symbol', 'Name']) - + self.final_table = pd.read_csv(self.cache_file) if os.path.exists(self.cache_file) else pd.DataFrame() # type: ignore Toolkit.__init__(self, # type: ignore - name="Crypto Symbols Tool", - instructions="A utility tool to find and verify the correct cryptocurrency symbols (tickers). " \ - "Use this to translate a cryptocurrency name (e.g., 'Bitcoin') into its official symbol " \ - "(e.g., 'BTC-USD') *before* delegating tasks to the MarketAgent.", - tools=[ - self.get_all_symbols, - self.get_symbols_by_name, - ], - ) + name="Crypto Symbols Tool", + instructions="Tool to get cryptocurrency symbols and search them by name.", + tools=[ + self.get_all_symbols, + self.get_symbols_by_name, + ], + ) def get_all_symbols(self) -> list[str]: """ Returns a complete list of all available cryptocurrency symbols (tickers). - - Warning: This list can be very long. Prefer 'get_symbols_by_name' - if you are searching for a specific asset. + The list could be very long, prefer using 'get_symbols_by_name' for specific searches. Returns: list[str]: A comprehensive list of all supported crypto symbols (e.g., "BTC-USD", "ETH-USD"). @@ -54,32 +43,19 @@ class CryptoSymbolsTools(Toolkit): def get_symbols_by_name(self, query: str) -> list[tuple[str, str]]: """ Searches the cryptocurrency database for assets matching a name or symbol. - Use this to find the exact, correct symbol for a cryptocurrency name. - (e.g., query="Bitcoin" might return [("BTC-USD", "Bitcoin USD")]). - Args: query (str): The name, partial name, or symbol to search for (e.g., "Bitcoin", "ETH"). - Returns: list[tuple[str, str]]: A list of tuples, where each tuple contains the (symbol, full_name) of a matching asset. Returns an empty list if no matches are found. """ - if self.final_table.empty or 'Name' not in self.final_table.columns or 'Symbol' not in self.final_table.columns: - return [] - - try: - # Cerca sia nel nome che nel simbolo, ignorando maiuscole/minuscole - mask = self.final_table['Name'].str.contains(query, case=False, na=False) | \ - self.final_table['Symbol'].str.contains(query, case=False, na=False) - - filtered_df = self.final_table[mask] - - # Converte il risultato in una lista di tuple - return list(zip(filtered_df['Symbol'], filtered_df['Name'])) - except Exception: - return [] + query_lower = query.lower() + positions = self.final_table['Name'].str.lower().str.contains(query_lower) | \ + self.final_table['Symbol'].str.lower().str.contains(query_lower) + filtered_df = self.final_table[positions] + return list(zip(filtered_df['Symbol'], filtered_df['Name'])) async def fetch_crypto_symbols(self, force_refresh: bool = False) -> None: """