diff --git a/README.md b/README.md index aae9a60..ea778b6 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ uv pip install -e . A questo punto si può già modificare il codice e, quando necessario, far partire il progetto tramite il comando: ```sh -uv run python src/app +uv run src/app ``` # **Applicazione** @@ -106,10 +106,11 @@ src └── app ├── __main__.py ├── agents <-- Agenti, modelli, prompts e simili - ├── base <-- Classi base per le API - ├── markets <-- Market data provider (Es. Binance) - ├── news <-- News data provider (Es. NewsAPI) - ├── social <-- Social data provider (Es. Reddit) + ├── api <-- Tutte le API esterne + │ ├── base <-- Classi base per le API + │ ├── markets <-- Market data provider (Es. Binance) + │ ├── news <-- News data provider (Es. NewsAPI) + │ └── social <-- Social data provider (Es. Reddit) └── utils <-- Codice di utilità generale ``` diff --git a/src/app/agents/pipeline.py b/src/app/agents/pipeline.py index a7d1001..ce32c06 100644 --- a/src/app/agents/pipeline.py +++ b/src/app/agents/pipeline.py @@ -2,7 +2,7 @@ from agno.run.agent import RunOutput from app.agents.models import AppModels from app.agents.team import create_team_with from app.agents.predictor import PREDICTOR_INSTRUCTIONS, PredictorInput, PredictorOutput, PredictorStyle -from app.base.markets import ProductInfo +from app.api.base.markets import ProductInfo class Pipeline: diff --git a/src/app/agents/predictor.py b/src/app/agents/predictor.py index 69a92af..4c5bb1a 100644 --- a/src/app/agents/predictor.py +++ b/src/app/agents/predictor.py @@ -1,6 +1,6 @@ from enum import Enum from pydantic import BaseModel, Field -from app.base.markets import ProductInfo +from app.api.base.markets import ProductInfo class PredictorStyle(Enum): diff --git a/src/app/agents/team.py b/src/app/agents/team.py index 27b9cae..04bcab6 100644 --- a/src/app/agents/team.py +++ b/src/app/agents/team.py @@ -1,8 +1,8 @@ from agno.team import Team from app.agents import AppModels -from app.markets import MarketAPIsTool -from app.news import NewsAPIsTool -from app.social import SocialAPIsTool +from app.api.markets import MarketAPIsTool +from app.api.news import NewsAPIsTool +from app.api.social import SocialAPIsTool def create_team_with(models: AppModels, coordinator: AppModels | None = None) -> Team: diff --git a/src/app/base/__init__.py b/src/app/api/base/__init__.py similarity index 100% rename from src/app/base/__init__.py rename to src/app/api/base/__init__.py diff --git a/src/app/base/markets.py b/src/app/api/base/markets.py similarity index 100% rename from src/app/base/markets.py rename to src/app/api/base/markets.py diff --git a/src/app/base/news.py b/src/app/api/base/news.py similarity index 100% rename from src/app/base/news.py rename to src/app/api/base/news.py diff --git a/src/app/base/social.py b/src/app/api/base/social.py similarity index 100% rename from src/app/base/social.py rename to src/app/api/base/social.py diff --git a/src/app/markets/__init__.py b/src/app/api/markets/__init__.py similarity index 92% rename from src/app/markets/__init__.py rename to src/app/api/markets/__init__.py index bf2d344..2b0de19 100644 --- a/src/app/markets/__init__.py +++ b/src/app/api/markets/__init__.py @@ -1,9 +1,9 @@ from agno.tools import Toolkit -from app.base.markets import MarketWrapper, Price, ProductInfo -from app.markets.binance import BinanceWrapper -from app.markets.coinbase import CoinBaseWrapper -from app.markets.cryptocompare import CryptoCompareWrapper -from app.markets.yfinance import YFinanceWrapper +from app.api.base.markets import MarketWrapper, Price, ProductInfo +from app.api.markets.binance import BinanceWrapper +from app.api.markets.coinbase import CoinBaseWrapper +from app.api.markets.cryptocompare import CryptoCompareWrapper +from app.api.markets.yfinance import YFinanceWrapper from app.utils import aggregate_history_prices, aggregate_product_info, WrapperHandler __all__ = [ "MarketAPIsTool", "BinanceWrapper", "CoinBaseWrapper", "CryptoCompareWrapper", "YFinanceWrapper", "ProductInfo", "Price" ] diff --git a/src/app/markets/binance.py b/src/app/api/markets/binance.py similarity index 98% rename from src/app/markets/binance.py rename to src/app/api/markets/binance.py index ffd31bb..a29a674 100644 --- a/src/app/markets/binance.py +++ b/src/app/api/markets/binance.py @@ -1,7 +1,7 @@ import os from typing import Any from binance.client import Client # type: ignore -from app.base.markets import ProductInfo, MarketWrapper, Price +from app.api.base.markets import ProductInfo, MarketWrapper, Price def extract_product(currency: str, ticker_data: dict[str, Any]) -> ProductInfo: diff --git a/src/app/markets/coinbase.py b/src/app/api/markets/coinbase.py similarity index 98% rename from src/app/markets/coinbase.py rename to src/app/api/markets/coinbase.py index c59382b..13016f6 100644 --- a/src/app/markets/coinbase.py +++ b/src/app/api/markets/coinbase.py @@ -3,7 +3,7 @@ from enum import Enum from datetime import datetime, timedelta from coinbase.rest import RESTClient # type: ignore from coinbase.rest.types.product_types import Candle, GetProductResponse, Product # type: ignore -from app.base.markets import ProductInfo, MarketWrapper, Price +from app.api.base.markets import ProductInfo, MarketWrapper, Price def extract_product(product_data: GetProductResponse | Product) -> ProductInfo: diff --git a/src/app/markets/cryptocompare.py b/src/app/api/markets/cryptocompare.py similarity index 97% rename from src/app/markets/cryptocompare.py rename to src/app/api/markets/cryptocompare.py index 5431267..a6c5d70 100644 --- a/src/app/markets/cryptocompare.py +++ b/src/app/api/markets/cryptocompare.py @@ -1,7 +1,7 @@ import os from typing import Any import requests -from app.base.markets import ProductInfo, MarketWrapper, Price +from app.api.base.markets import ProductInfo, MarketWrapper, Price def extract_product(asset_data: dict[str, Any]) -> ProductInfo: diff --git a/src/app/markets/yfinance.py b/src/app/api/markets/yfinance.py similarity index 97% rename from src/app/markets/yfinance.py rename to src/app/api/markets/yfinance.py index 2670eda..f63192e 100644 --- a/src/app/markets/yfinance.py +++ b/src/app/api/markets/yfinance.py @@ -1,6 +1,6 @@ import json from agno.tools.yfinance import YFinanceTools -from app.base.markets import MarketWrapper, ProductInfo, Price +from app.api.base.markets import MarketWrapper, ProductInfo, Price def extract_product(stock_data: dict[str, str]) -> ProductInfo: diff --git a/src/app/news/__init__.py b/src/app/api/news/__init__.py similarity index 92% rename from src/app/news/__init__.py rename to src/app/api/news/__init__.py index b0cb553..e9701b8 100644 --- a/src/app/news/__init__.py +++ b/src/app/api/news/__init__.py @@ -1,10 +1,10 @@ from agno.tools import Toolkit from app.utils import WrapperHandler -from app.base.news import NewsWrapper, Article -from app.news.news_api import NewsApiWrapper -from app.news.googlenews import GoogleNewsWrapper -from app.news.cryptopanic_api import CryptoPanicWrapper -from app.news.duckduckgo import DuckDuckGoWrapper +from app.api.base.news import NewsWrapper, Article +from app.api.news.news_api import NewsApiWrapper +from app.api.news.googlenews import GoogleNewsWrapper +from app.api.news.cryptopanic_api import CryptoPanicWrapper +from app.api.news.duckduckgo import DuckDuckGoWrapper __all__ = ["NewsAPIsTool", "NewsApiWrapper", "GoogleNewsWrapper", "CryptoPanicWrapper", "DuckDuckGoWrapper", "Article"] diff --git a/src/app/news/cryptopanic_api.py b/src/app/api/news/cryptopanic_api.py similarity index 98% rename from src/app/news/cryptopanic_api.py rename to src/app/api/news/cryptopanic_api.py index 1e16078..b1810b7 100644 --- a/src/app/news/cryptopanic_api.py +++ b/src/app/api/news/cryptopanic_api.py @@ -2,7 +2,7 @@ import os from typing import Any import requests from enum import Enum -from app.base.news import NewsWrapper, Article +from app.api.base.news import NewsWrapper, Article class CryptoPanicFilter(Enum): diff --git a/src/app/news/duckduckgo.py b/src/app/api/news/duckduckgo.py similarity index 96% rename from src/app/news/duckduckgo.py rename to src/app/api/news/duckduckgo.py index 8108239..d854a2d 100644 --- a/src/app/news/duckduckgo.py +++ b/src/app/api/news/duckduckgo.py @@ -1,7 +1,7 @@ import json from typing import Any from agno.tools.duckduckgo import DuckDuckGoTools -from app.base.news import Article, NewsWrapper +from app.api.base.news import Article, NewsWrapper def extract_article(result: dict[str, Any]) -> Article: diff --git a/src/app/news/googlenews.py b/src/app/api/news/googlenews.py similarity index 96% rename from src/app/news/googlenews.py rename to src/app/api/news/googlenews.py index 0041c7f..613484f 100644 --- a/src/app/news/googlenews.py +++ b/src/app/api/news/googlenews.py @@ -1,6 +1,6 @@ from typing import Any from gnews import GNews # type: ignore -from app.base.news import Article, NewsWrapper +from app.api.base.news import Article, NewsWrapper def extract_article(result: dict[str, Any]) -> Article: diff --git a/src/app/news/news_api.py b/src/app/api/news/news_api.py similarity index 97% rename from src/app/news/news_api.py rename to src/app/api/news/news_api.py index b5bf375..3c229f3 100644 --- a/src/app/news/news_api.py +++ b/src/app/api/news/news_api.py @@ -1,7 +1,7 @@ import os from typing import Any import newsapi # type: ignore -from app.base.news import Article, NewsWrapper +from app.api.base.news import Article, NewsWrapper def extract_article(result: dict[str, Any]) -> Article: diff --git a/src/app/social/__init__.py b/src/app/api/social/__init__.py similarity index 95% rename from src/app/social/__init__.py rename to src/app/api/social/__init__.py index 261bcba..0e84809 100644 --- a/src/app/social/__init__.py +++ b/src/app/api/social/__init__.py @@ -1,7 +1,7 @@ from agno.tools import Toolkit from app.utils import WrapperHandler -from app.base.social import SocialPost, SocialWrapper -from app.social.reddit import RedditWrapper +from app.api.base.social import SocialPost, SocialWrapper +from app.api.social.reddit import RedditWrapper __all__ = ["SocialAPIsTool", "RedditWrapper", "SocialPost"] diff --git a/src/app/social/reddit.py b/src/app/api/social/reddit.py similarity index 96% rename from src/app/social/reddit.py rename to src/app/api/social/reddit.py index eeca968..e098ee3 100644 --- a/src/app/social/reddit.py +++ b/src/app/api/social/reddit.py @@ -1,7 +1,7 @@ import os from praw import Reddit # type: ignore from praw.models import Submission # type: ignore -from app.base.social import SocialWrapper, SocialPost, SocialComment +from app.api.base.social import SocialWrapper, SocialPost, SocialComment MAX_COMMENTS = 5 diff --git a/src/app/utils/market_aggregation.py b/src/app/utils/market_aggregation.py index 7f9f32c..2915c30 100644 --- a/src/app/utils/market_aggregation.py +++ b/src/app/utils/market_aggregation.py @@ -1,5 +1,5 @@ import statistics -from app.base.markets import ProductInfo, Price +from app.api.base.markets import ProductInfo, Price def aggregate_history_prices(prices: dict[str, list[Price]]) -> list[Price]: diff --git a/tests/agents/test_predictor.py b/tests/agents/test_predictor.py index 9a2ac11..2dda67e 100644 --- a/tests/agents/test_predictor.py +++ b/tests/agents/test_predictor.py @@ -1,7 +1,7 @@ import pytest from app.agents import AppModels from app.agents.predictor import PREDICTOR_INSTRUCTIONS, PredictorInput, PredictorOutput, PredictorStyle -from app.base.markets import ProductInfo +from app.api.base.markets import ProductInfo def unified_checks(model: AppModels, input: PredictorInput) -> None: llm = model.get_agent(PREDICTOR_INSTRUCTIONS, output_schema=PredictorOutput) # type: ignore[arg-type] diff --git a/tests/api/test_binance.py b/tests/api/test_binance.py index b4ea0bb..fde26ac 100644 --- a/tests/api/test_binance.py +++ b/tests/api/test_binance.py @@ -1,5 +1,5 @@ import pytest -from app.markets.binance import BinanceWrapper +from app.api.markets.binance import BinanceWrapper @pytest.mark.market @pytest.mark.api diff --git a/tests/api/test_coinbase.py b/tests/api/test_coinbase.py index e114f4c..f022375 100644 --- a/tests/api/test_coinbase.py +++ b/tests/api/test_coinbase.py @@ -1,6 +1,6 @@ import os import pytest -from app.markets import CoinBaseWrapper +from app.api.markets import CoinBaseWrapper @pytest.mark.market @pytest.mark.api diff --git a/tests/api/test_cryptocompare.py b/tests/api/test_cryptocompare.py index 23deaf3..689a732 100644 --- a/tests/api/test_cryptocompare.py +++ b/tests/api/test_cryptocompare.py @@ -1,6 +1,6 @@ import os import pytest -from app.markets import CryptoCompareWrapper +from app.api.markets import CryptoCompareWrapper @pytest.mark.market @pytest.mark.api diff --git a/tests/api/test_cryptopanic_api.py b/tests/api/test_cryptopanic_api.py index 3c29bdb..51015f8 100644 --- a/tests/api/test_cryptopanic_api.py +++ b/tests/api/test_cryptopanic_api.py @@ -1,6 +1,6 @@ import os import pytest -from app.news import CryptoPanicWrapper +from app.api.news import CryptoPanicWrapper @pytest.mark.limited diff --git a/tests/api/test_duckduckgo_news.py b/tests/api/test_duckduckgo_news.py index f1de9c6..34eb362 100644 --- a/tests/api/test_duckduckgo_news.py +++ b/tests/api/test_duckduckgo_news.py @@ -1,5 +1,5 @@ import pytest -from app.news import DuckDuckGoWrapper +from app.api.news import DuckDuckGoWrapper @pytest.mark.news diff --git a/tests/api/test_google_news.py b/tests/api/test_google_news.py index 0b7241c..7b02ed8 100644 --- a/tests/api/test_google_news.py +++ b/tests/api/test_google_news.py @@ -1,5 +1,5 @@ import pytest -from app.news import GoogleNewsWrapper +from app.api.news import GoogleNewsWrapper @pytest.mark.news diff --git a/tests/api/test_news_api.py b/tests/api/test_news_api.py index 839941c..30508d6 100644 --- a/tests/api/test_news_api.py +++ b/tests/api/test_news_api.py @@ -1,6 +1,6 @@ import os import pytest -from app.news import NewsApiWrapper +from app.api.news import NewsApiWrapper @pytest.mark.news diff --git a/tests/api/test_reddit.py b/tests/api/test_reddit.py index 3e42eb6..d4533a5 100644 --- a/tests/api/test_reddit.py +++ b/tests/api/test_reddit.py @@ -1,6 +1,6 @@ import os import pytest -from app.social.reddit import MAX_COMMENTS, RedditWrapper +from app.api.social.reddit import MAX_COMMENTS, RedditWrapper @pytest.mark.social @pytest.mark.api diff --git a/tests/api/test_yfinance.py b/tests/api/test_yfinance.py index fa4174a..1f443d4 100644 --- a/tests/api/test_yfinance.py +++ b/tests/api/test_yfinance.py @@ -1,5 +1,5 @@ import pytest -from app.markets import YFinanceWrapper +from app.api.markets import YFinanceWrapper @pytest.mark.market @pytest.mark.api diff --git a/tests/tools/test_market_tool.py b/tests/tools/test_market_tool.py index 674707f..5e28edd 100644 --- a/tests/tools/test_market_tool.py +++ b/tests/tools/test_market_tool.py @@ -1,5 +1,5 @@ import pytest -from app.markets import MarketAPIsTool +from app.api.markets import MarketAPIsTool @pytest.mark.tools diff --git a/tests/tools/test_news_tool.py b/tests/tools/test_news_tool.py index 3b8254f..8193429 100644 --- a/tests/tools/test_news_tool.py +++ b/tests/tools/test_news_tool.py @@ -1,5 +1,5 @@ import pytest -from app.news import NewsAPIsTool +from app.api.news import NewsAPIsTool @pytest.mark.tools diff --git a/tests/tools/test_socials_tool.py b/tests/tools/test_socials_tool.py index d08ed0f..b1b8fd8 100644 --- a/tests/tools/test_socials_tool.py +++ b/tests/tools/test_socials_tool.py @@ -1,5 +1,5 @@ import pytest -from app.social import SocialAPIsTool +from app.api.social import SocialAPIsTool @pytest.mark.tools @@ -24,7 +24,7 @@ class TestSocialAPIsTool: result = tool.wrapper_handler.try_call_all(lambda w: w.get_top_crypto_posts(limit=2)) assert isinstance(result, dict) assert len(result.keys()) > 0 - for provider, posts in result.items(): + for _provider, posts in result.items(): for post in posts: assert post.title is not None assert post.time is not None diff --git a/tests/utils/test_market_aggregator.py b/tests/utils/test_market_aggregator.py index 35e3084..02e287f 100644 --- a/tests/utils/test_market_aggregator.py +++ b/tests/utils/test_market_aggregator.py @@ -1,6 +1,6 @@ import pytest from datetime import datetime -from app.base.markets import ProductInfo, Price +from app.api.base.markets import ProductInfo, Price from app.utils.market_aggregation import aggregate_history_prices, aggregate_product_info