From b1aba10c6c9e3384501164e7a1c95576d410f14e Mon Sep 17 00:00:00 2001 From: Berack96 Date: Tue, 21 Oct 2025 12:22:27 +0200 Subject: [PATCH] CryptoSymbolsTools integrazione nel sistema di strumenti. --- src/app/agents/core.py | 2 +- src/app/api/tools/__init__.py | 4 ++-- src/app/api/tools/symbols_tool.py | 11 ++++++----- tests/tools/test_crypto_symbols.py | 27 +++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 tests/tools/test_crypto_symbols.py diff --git a/src/app/agents/core.py b/src/app/agents/core.py index ca0f8d5..4a685cb 100644 --- a/src/app/agents/core.py +++ b/src/app/agents/core.py @@ -96,7 +96,7 @@ class PipelineInputs: return Team( model=self.team_leader_model.get_model(TEAM_LEADER_INSTRUCTIONS), name="CryptoAnalysisTeam", - tools=[ReasoningTools(), PlanMemoryTool()], + tools=[ReasoningTools(), PlanMemoryTool(), CryptoSymbolsTools()], members=[market_agent, news_agent, social_agent], ) diff --git a/src/app/api/tools/__init__.py b/src/app/api/tools/__init__.py index bd0c3cd..4205d91 100644 --- a/src/app/api/tools/__init__.py +++ b/src/app/api/tools/__init__.py @@ -1,6 +1,6 @@ from app.api.tools.market_tool import MarketAPIsTool from app.api.tools.social_tool import SocialAPIsTool from app.api.tools.news_tool import NewsAPIsTool -from app.api.tools.symbols_tool import CryptoSymbols +from app.api.tools.symbols_tool import CryptoSymbolsTools -__all__ = ["MarketAPIsTool", "NewsAPIsTool", "SocialAPIsTool", "CryptoSymbols"] \ No newline at end of file +__all__ = ["MarketAPIsTool", "NewsAPIsTool", "SocialAPIsTool", "CryptoSymbolsTools"] \ No newline at end of file diff --git a/src/app/api/tools/symbols_tool.py b/src/app/api/tools/symbols_tool.py index d4700a2..60e3ebf 100644 --- a/src/app/api/tools/symbols_tool.py +++ b/src/app/api/tools/symbols_tool.py @@ -13,7 +13,7 @@ logging = logging.getLogger("crypto_symbols") BASE_URL = "https://finance.yahoo.com/markets/crypto/all/" -class CryptoSymbols(Toolkit): +class CryptoSymbolsTools(Toolkit): """ Classe per ottenere i simboli delle criptovalute tramite Yahoo Finance. """ @@ -23,9 +23,10 @@ class CryptoSymbols(Toolkit): 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="Tool to get cryptocurrency symbols and search them by name.", tools=[ self.get_all_symbols, - self.get_symbol_by_name, + self.get_symbols_by_name, ], ) @@ -37,7 +38,7 @@ class CryptoSymbols(Toolkit): """ return self.final_table['Symbol'].tolist() if not self.final_table.empty else [] - def get_symbol_by_name(self, query: str) -> list[str]: + def get_symbols_by_name(self, query: str) -> list[tuple[str, str]]: """ Cerca i simboli che contengono la query. Args: @@ -47,7 +48,7 @@ class CryptoSymbols(Toolkit): """ query_lower = query.lower() positions = self.final_table['Name'].str.lower().str.contains(query_lower) - return self.final_table[positions]['Symbol'].tolist() + return self.final_table[positions][['Symbol', 'Name']].apply(tuple, axis=1).tolist() async def fetch_crypto_symbols(self, force_refresh: bool = False) -> None: """ @@ -98,5 +99,5 @@ class CryptoSymbols(Toolkit): if __name__ == "__main__": - crypto_symbols = CryptoSymbols() + crypto_symbols = CryptoSymbolsTools() asyncio.run(crypto_symbols.fetch_crypto_symbols(force_refresh=True)) diff --git a/tests/tools/test_crypto_symbols.py b/tests/tools/test_crypto_symbols.py new file mode 100644 index 0000000..1472cc3 --- /dev/null +++ b/tests/tools/test_crypto_symbols.py @@ -0,0 +1,27 @@ +import pytest +from app.api.tools import CryptoSymbolsTools + +@pytest.mark.tools +class TestCryptoSymbolsTools: + + def test_get_symbols(self): + tool = CryptoSymbolsTools() + symbols = tool.get_all_symbols() + assert isinstance(symbols, list) + assert "BTC-USD" in symbols + + def test_get_symbol_by_name(self): + tool = CryptoSymbolsTools() + results = tool.get_symbols_by_name("Bitcoin") + assert isinstance(results, list) + assert ("BTC-USD", "Bitcoin USD") in results + + results = tool.get_symbols_by_name("Banana") + assert isinstance(results, list) + assert ("BANANA28886-USD", "BananaCoin USD") in results + + def test_get_symbol_by_invalid_name(self): + tool = CryptoSymbolsTools() + results = tool.get_symbols_by_name("InvalidName") + assert isinstance(results, list) + assert not results