Refactor and update structure #20
12
README.md
12
README.md
@@ -99,6 +99,18 @@ Usando la libreria ``gradio`` è stata creata un'interfaccia web semplice per in
|
|||||||
- **Social Agent**: Analizza i sentimenti sui social media riguardo alle criptovalute.
|
- **Social Agent**: Analizza i sentimenti sui social media riguardo alle criptovalute.
|
||||||
- **Predictor Agent**: Utilizza i dati raccolti dagli altri agenti per fare previsioni.
|
- **Predictor Agent**: Utilizza i dati raccolti dagli altri agenti per fare previsioni.
|
||||||
|
|
||||||
|
## Struttura delle cartelle del Progetto
|
||||||
|
|
||||||
|
```
|
||||||
|
src <-- Cartella principale del codice sorgente
|
||||||
|
└── app <-- Cartella principale dell'applicazione
|
||||||
|
├── agents <-- Agenti, modelli, prompts e simili
|
||||||
|
├── markets <-- Market data provider (Es. Binance)
|
||||||
|
├── news <-- News data provider (Es. NewsAPI)
|
||||||
|
├── social <-- Social data provider (Es. Reddit)
|
||||||
|
└── utils <-- Codice di utilità generale
|
||||||
|
```
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
|
|
||||||
Per eseguire i test, assicurati di aver configurato correttamente le variabili d'ambiente nel file `.env` come descritto sopra. Poi esegui il comando:
|
Per eseguire i test, assicurati di aver configurato correttamente le variabili d'ambiente nel file `.env` come descritto sopra. Poi esegui il comando:
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ class PredictorOutput(BaseModel):
|
|||||||
strategy: str = Field(..., description="Concise operational strategy in Italian")
|
strategy: str = Field(..., description="Concise operational strategy in Italian")
|
||||||
portfolio: list[ItemPortfolio] = Field(..., description="List of portfolio items with allocations")
|
portfolio: list[ItemPortfolio] = Field(..., description="List of portfolio items with allocations")
|
||||||
|
|
||||||
|
|
||||||
PREDICTOR_INSTRUCTIONS = """
|
PREDICTOR_INSTRUCTIONS = """
|
||||||
You are an **Allocation Algorithm (Crypto-Algo)** specialized in analyzing market data and sentiment to generate an investment strategy and a target portfolio.
|
You are an **Allocation Algorithm (Crypto-Algo)** specialized in analyzing market data and sentiment to generate an investment strategy and a target portfolio.
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
from agno.team import Team
|
from agno.team import Team
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
from app.agents import AppModels
|
from app.agents import AppModels
|
||||||
from app.markets import MARKET_INSTRUCTIONS, MarketAPIsTool
|
from app.markets import MarketAPIsTool, ProductInfo
|
||||||
from app.news import NEWS_INSTRUCTIONS, NewsAPIsTool
|
from app.news import NewsAPIsTool
|
||||||
from app.social import SOCIAL_INSTRUCTIONS, SocialAPIsTool
|
from app.social import SocialAPIsTool
|
||||||
|
|
||||||
|
|
||||||
def create_team_with(models: AppModels, coordinator: AppModels | None = None) -> Team:
|
def create_team_with(models: AppModels, coordinator: AppModels | None = None) -> Team:
|
||||||
@@ -31,5 +32,74 @@ def create_team_with(models: AppModels, coordinator: AppModels | None = None) ->
|
|||||||
|
|
||||||
# TODO: migliorare le istruzioni del team
|
# TODO: migliorare le istruzioni del team
|
||||||
COORDINATOR_INSTRUCTIONS = """
|
COORDINATOR_INSTRUCTIONS = """
|
||||||
Agisci come coordinatore: smista le richieste tra MarketAgent, NewsAgent e SocialAgent.
|
You are the coordinator of a team of analysts specialized in cryptocurrency market analysis.
|
||||||
|
Your role is to gather insights from various sources, including market data, news articles, and social media trends.
|
||||||
|
Based on the information provided by your team members, you will synthesize a comprehensive sentiment analysis for each cryptocurrency discussed.
|
||||||
|
Your analysis should consider the following aspects:
|
||||||
|
1. Market Trends: Evaluate the current market trends and price movements.
|
||||||
|
2. News Impact: Assess the impact of recent news articles on market sentiment.
|
||||||
|
3. Social Media Buzz: Analyze social media discussions and trends related to the cryptocurrencies.
|
||||||
|
Your final output should be a well-rounded sentiment analysis that can guide investment decisions.
|
||||||
|
"""
|
||||||
|
|
||||||
|
MARKET_INSTRUCTIONS = """
|
||||||
|
**TASK:** You are a specialized **Crypto Price Data Retrieval Agent**. Your primary goal is to fetch the most recent and/or historical price data for requested cryptocurrency assets (e.g., 'BTC', 'ETH', 'SOL'). You must provide the data in a clear and structured format.
|
||||||
|
|
||||||
|
**AVAILABLE TOOLS:**
|
||||||
|
1. `get_products(asset_ids: list[str])`: Get **current** product/price info for a list of assets. **(PREFERITA: usa questa per i prezzi live)**
|
||||||
|
2. `get_historical_prices(asset_id: str, limit: int)`: Get historical price data for one asset. Default limit is 100. **(PREFERITA: usa questa per i dati storici)**
|
||||||
|
3. `get_products_aggregated(asset_ids: list[str])`: Get **aggregated current** product/price info for a list of assets. **(USA SOLO SE richiesto 'aggregato' o se `get_products` fallisce)**
|
||||||
|
4. `get_historical_prices_aggregated(asset_id: str, limit: int)`: Get **aggregated historical** price data for one asset. **(USA SOLO SE richiesto 'aggregato' o se `get_historical_prices` fallisce)**
|
||||||
|
|
||||||
|
**USAGE GUIDELINE:**
|
||||||
|
* **Asset ID:** Always convert common names (e.g., 'Bitcoin', 'Ethereum') into their official ticker/ID (e.g., 'BTC', 'ETH').
|
||||||
|
* **Cost Management (Cruciale per LLM locale):**
|
||||||
|
* **Priorità Bassa per Aggregazione:** **Non** usare i metodi `*aggregated` a meno che l'utente non lo richieda esplicitamente o se i metodi non-aggregati falliscono.
|
||||||
|
* **Limitazione Storica:** Il limite predefinito per i dati storici deve essere **20** punti dati, a meno che l'utente non specifichi un limite diverso.
|
||||||
|
* **Fallimento Tool:** Se lo strumento non restituisce dati per un asset specifico, rispondi per quell'asset con: "Dati di prezzo non trovati per [Asset ID]."
|
||||||
|
|
||||||
|
**REPORTING REQUIREMENT:**
|
||||||
|
1. **Format:** Output the results in a clear, easy-to-read list or table.
|
||||||
|
2. **Live Price Request:** If an asset's *current price* is requested, report the **Asset ID**, **Latest Price**, and **Time/Date of the price**.
|
||||||
|
3. **Historical Price Request:** If *historical data* is requested, report the **Asset ID**, the **Limit** of points returned, and the **First** and **Last** entries from the list of historical prices (Date, Price). Non stampare l'intera lista di dati storici.
|
||||||
|
4. **Output:** For all requests, fornire un **unico e conciso riepilogo** dei dati reperiti.
|
||||||
|
"""
|
||||||
|
|
||||||
|
NEWS_INSTRUCTIONS = """
|
||||||
|
**TASK:** You are a specialized **Crypto News Analyst**. Your goal is to fetch the latest news or top headlines related to cryptocurrencies, and then **analyze the sentiment** of the content to provide a concise report to the team leader. Prioritize 'crypto' or specific cryptocurrency names (e.g., 'Bitcoin', 'Ethereum') in your searches.
|
||||||
|
|
||||||
|
**AVAILABLE TOOLS:**
|
||||||
|
1. `get_latest_news(query: str, limit: int)`: Get the 'limit' most recent news articles for a specific 'query'.
|
||||||
|
2. `get_top_headlines(limit: int)`: Get the 'limit' top global news headlines.
|
||||||
|
3. `get_latest_news_aggregated(query: str, limit: int)`: Get aggregated latest news articles for a specific 'query'.
|
||||||
|
4. `get_top_headlines_aggregated(limit: int)`: Get aggregated top global news headlines.
|
||||||
|
|
||||||
|
**USAGE GUIDELINE:**
|
||||||
|
* Always use `get_latest_news` with a relevant crypto-related query first.
|
||||||
|
* The default limit for news items should be 5 unless specified otherwise.
|
||||||
|
* If the tool doesn't return any articles, respond with "No relevant news articles found."
|
||||||
|
|
||||||
|
**REPORTING REQUIREMENT:**
|
||||||
|
1. **Analyze** the tone and key themes of the retrieved articles.
|
||||||
|
2. **Summarize** the overall **market sentiment** (e.g., highly positive, cautiously neutral, generally negative) based on the content.
|
||||||
|
3. **Identify** the top 2-3 **main topics** discussed (e.g., new regulation, price surge, institutional adoption).
|
||||||
|
4. **Output** a single, brief report summarizing these findings. Do not output the raw articles.
|
||||||
|
"""
|
||||||
|
|
||||||
|
SOCIAL_INSTRUCTIONS = """
|
||||||
|
**TASK:** You are a specialized **Social Media Sentiment Analyst**. Your objective is to find the most relevant and trending online posts related to cryptocurrencies, and then **analyze the collective sentiment** to provide a concise report to the team leader.
|
||||||
|
|
||||||
|
**AVAILABLE TOOLS:**
|
||||||
|
1. `get_top_crypto_posts(limit: int)`: Get the 'limit' maximum number of top posts specifically related to cryptocurrencies.
|
||||||
|
|
||||||
|
**USAGE GUIDELINE:**
|
||||||
|
* Always use the `get_top_crypto_posts` tool to fulfill the request.
|
||||||
|
* The default limit for posts should be 5 unless specified otherwise.
|
||||||
|
* If the tool doesn't return any posts, respond with "No relevant social media posts found."
|
||||||
|
|
||||||
|
**REPORTING REQUIREMENT:**
|
||||||
|
1. **Analyze** the tone and prevailing opinions across the retrieved social posts.
|
||||||
|
2. **Summarize** the overall **community sentiment** (e.g., high enthusiasm/FOMO, uncertainty, FUD/fear) based on the content.
|
||||||
|
3. **Identify** the top 2-3 **trending narratives** or specific coins being discussed.
|
||||||
|
4. **Output** a single, brief report summarizing these findings. Do not output the raw posts.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from app.markets.yfinance import YFinanceWrapper
|
|||||||
from app.utils.market_aggregation import aggregate_history_prices, aggregate_product_info
|
from app.utils.market_aggregation import aggregate_history_prices, aggregate_product_info
|
||||||
from app.utils.wrapper_handler import WrapperHandler
|
from app.utils.wrapper_handler import WrapperHandler
|
||||||
|
|
||||||
__all__ = [ "MarketAPIsTool", "BinanceWrapper", "CoinBaseWrapper", "CryptoCompareWrapper", "YFinanceWrapper", "MARKET_INSTRUCTIONS" ]
|
__all__ = [ "MarketAPIsTool", "BinanceWrapper", "CoinBaseWrapper", "CryptoCompareWrapper", "YFinanceWrapper", "ProductInfo", "Price" ]
|
||||||
|
|
||||||
|
|
||||||
class MarketAPIsTool(BaseWrapper, Toolkit):
|
class MarketAPIsTool(BaseWrapper, Toolkit):
|
||||||
@@ -81,26 +81,3 @@ class MarketAPIsTool(BaseWrapper, Toolkit):
|
|||||||
"""
|
"""
|
||||||
all_prices = self.wrappers.try_call_all(lambda w: w.get_historical_prices(asset_id, limit))
|
all_prices = self.wrappers.try_call_all(lambda w: w.get_historical_prices(asset_id, limit))
|
||||||
return aggregate_history_prices(all_prices)
|
return aggregate_history_prices(all_prices)
|
||||||
|
|
||||||
MARKET_INSTRUCTIONS = """
|
|
||||||
**TASK:** You are a specialized **Crypto Price Data Retrieval Agent**. Your primary goal is to fetch the most recent and/or historical price data for requested cryptocurrency assets (e.g., 'BTC', 'ETH', 'SOL'). You must provide the data in a clear and structured format.
|
|
||||||
|
|
||||||
**AVAILABLE TOOLS:**
|
|
||||||
1. `get_products(asset_ids: list[str])`: Get **current** product/price info for a list of assets. **(PREFERITA: usa questa per i prezzi live)**
|
|
||||||
2. `get_historical_prices(asset_id: str, limit: int)`: Get historical price data for one asset. Default limit is 100. **(PREFERITA: usa questa per i dati storici)**
|
|
||||||
3. `get_products_aggregated(asset_ids: list[str])`: Get **aggregated current** product/price info for a list of assets. **(USA SOLO SE richiesto 'aggregato' o se `get_products` fallisce)**
|
|
||||||
4. `get_historical_prices_aggregated(asset_id: str, limit: int)`: Get **aggregated historical** price data for one asset. **(USA SOLO SE richiesto 'aggregato' o se `get_historical_prices` fallisce)**
|
|
||||||
|
|
||||||
**USAGE GUIDELINE:**
|
|
||||||
* **Asset ID:** Always convert common names (e.g., 'Bitcoin', 'Ethereum') into their official ticker/ID (e.g., 'BTC', 'ETH').
|
|
||||||
* **Cost Management (Cruciale per LLM locale):**
|
|
||||||
* **Priorità Bassa per Aggregazione:** **Non** usare i metodi `*aggregated` a meno che l'utente non lo richieda esplicitamente o se i metodi non-aggregati falliscono.
|
|
||||||
* **Limitazione Storica:** Il limite predefinito per i dati storici deve essere **20** punti dati, a meno che l'utente non specifichi un limite diverso.
|
|
||||||
* **Fallimento Tool:** Se lo strumento non restituisce dati per un asset specifico, rispondi per quell'asset con: "Dati di prezzo non trovati per [Asset ID]."
|
|
||||||
|
|
||||||
**REPORTING REQUIREMENT:**
|
|
||||||
1. **Format:** Output the results in a clear, easy-to-read list or table.
|
|
||||||
2. **Live Price Request:** If an asset's *current price* is requested, report the **Asset ID**, **Latest Price**, and **Time/Date of the price**.
|
|
||||||
3. **Historical Price Request:** If *historical data* is requested, report the **Asset ID**, the **Limit** of points returned, and the **First** and **Last** entries from the list of historical prices (Date, Price). Non stampare l'intera lista di dati storici.
|
|
||||||
4. **Output:** For all requests, fornire un **unico e conciso riepilogo** dei dati reperiti.
|
|
||||||
"""
|
|
||||||
@@ -6,7 +6,7 @@ from app.news.googlenews import GoogleNewsWrapper
|
|||||||
from app.news.cryptopanic_api import CryptoPanicWrapper
|
from app.news.cryptopanic_api import CryptoPanicWrapper
|
||||||
from app.news.duckduckgo import DuckDuckGoWrapper
|
from app.news.duckduckgo import DuckDuckGoWrapper
|
||||||
|
|
||||||
__all__ = ["NewsAPIsTool", "NEWS_INSTRUCTIONS", "NewsApiWrapper", "GoogleNewsWrapper", "CryptoPanicWrapper", "DuckDuckGoWrapper"]
|
__all__ = ["NewsAPIsTool", "NewsApiWrapper", "GoogleNewsWrapper", "CryptoPanicWrapper", "DuckDuckGoWrapper", "Article"]
|
||||||
|
|
||||||
|
|
||||||
class NewsAPIsTool(NewsWrapper, Toolkit):
|
class NewsAPIsTool(NewsWrapper, Toolkit):
|
||||||
@@ -72,25 +72,3 @@ class NewsAPIsTool(NewsWrapper, Toolkit):
|
|||||||
dict[str, list[Article]]: A dictionary mapping providers names to their list of Articles
|
dict[str, list[Article]]: A dictionary mapping providers names to their list of Articles
|
||||||
"""
|
"""
|
||||||
return self.wrapper_handler.try_call_all(lambda w: w.get_latest_news(query, limit))
|
return self.wrapper_handler.try_call_all(lambda w: w.get_latest_news(query, limit))
|
||||||
|
|
||||||
|
|
||||||
NEWS_INSTRUCTIONS = """
|
|
||||||
**TASK:** You are a specialized **Crypto News Analyst**. Your goal is to fetch the latest news or top headlines related to cryptocurrencies, and then **analyze the sentiment** of the content to provide a concise report to the team leader. Prioritize 'crypto' or specific cryptocurrency names (e.g., 'Bitcoin', 'Ethereum') in your searches.
|
|
||||||
|
|
||||||
**AVAILABLE TOOLS:**
|
|
||||||
1. `get_latest_news(query: str, limit: int)`: Get the 'limit' most recent news articles for a specific 'query'.
|
|
||||||
2. `get_top_headlines(limit: int)`: Get the 'limit' top global news headlines.
|
|
||||||
3. `get_latest_news_aggregated(query: str, limit: int)`: Get aggregated latest news articles for a specific 'query'.
|
|
||||||
4. `get_top_headlines_aggregated(limit: int)`: Get aggregated top global news headlines.
|
|
||||||
|
|
||||||
**USAGE GUIDELINE:**
|
|
||||||
* Always use `get_latest_news` with a relevant crypto-related query first.
|
|
||||||
* The default limit for news items should be 5 unless specified otherwise.
|
|
||||||
* If the tool doesn't return any articles, respond with "No relevant news articles found."
|
|
||||||
|
|
||||||
**REPORTING REQUIREMENT:**
|
|
||||||
1. **Analyze** the tone and key themes of the retrieved articles.
|
|
||||||
2. **Summarize** the overall **market sentiment** (e.g., highly positive, cautiously neutral, generally negative) based on the content.
|
|
||||||
3. **Identify** the top 2-3 **main topics** discussed (e.g., new regulation, price surge, institutional adoption).
|
|
||||||
4. **Output** a single, brief report summarizing these findings. Do not output the raw articles.
|
|
||||||
"""
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from app.utils.wrapper_handler import WrapperHandler
|
|||||||
from app.social.base import SocialPost, SocialWrapper
|
from app.social.base import SocialPost, SocialWrapper
|
||||||
from app.social.reddit import RedditWrapper
|
from app.social.reddit import RedditWrapper
|
||||||
|
|
||||||
__all__ = ["SocialAPIsTool", "SOCIAL_INSTRUCTIONS", "RedditWrapper"]
|
__all__ = ["SocialAPIsTool", "RedditWrapper", "SocialPost"]
|
||||||
|
|
||||||
|
|
||||||
class SocialAPIsTool(SocialWrapper, Toolkit):
|
class SocialAPIsTool(SocialWrapper, Toolkit):
|
||||||
@@ -40,22 +40,3 @@ class SocialAPIsTool(SocialWrapper, Toolkit):
|
|||||||
# la modifica è banale, basta usare try_call_all invece di try_call
|
# la modifica è banale, basta usare try_call_all invece di try_call
|
||||||
def get_top_crypto_posts(self, limit: int = 5) -> list[SocialPost]:
|
def get_top_crypto_posts(self, limit: int = 5) -> list[SocialPost]:
|
||||||
return self.wrapper_handler.try_call(lambda w: w.get_top_crypto_posts(limit))
|
return self.wrapper_handler.try_call(lambda w: w.get_top_crypto_posts(limit))
|
||||||
|
|
||||||
|
|
||||||
SOCIAL_INSTRUCTIONS = """
|
|
||||||
**TASK:** You are a specialized **Social Media Sentiment Analyst**. Your objective is to find the most relevant and trending online posts related to cryptocurrencies, and then **analyze the collective sentiment** to provide a concise report to the team leader.
|
|
||||||
|
|
||||||
**AVAILABLE TOOLS:**
|
|
||||||
1. `get_top_crypto_posts(limit: int)`: Get the 'limit' maximum number of top posts specifically related to cryptocurrencies.
|
|
||||||
|
|
||||||
**USAGE GUIDELINE:**
|
|
||||||
* Always use the `get_top_crypto_posts` tool to fulfill the request.
|
|
||||||
* The default limit for posts should be 5 unless specified otherwise.
|
|
||||||
* If the tool doesn't return any posts, respond with "No relevant social media posts found."
|
|
||||||
|
|
||||||
**REPORTING REQUIREMENT:**
|
|
||||||
1. **Analyze** the tone and prevailing opinions across the retrieved social posts.
|
|
||||||
2. **Summarize** the overall **community sentiment** (e.g., high enthusiasm/FOMO, uncertainty, FUD/fear) based on the content.
|
|
||||||
3. **Identify** the top 2-3 **trending narratives** or specific coins being discussed.
|
|
||||||
4. **Output** a single, brief report summarizing these findings. Do not output the raw posts.
|
|
||||||
"""
|
|
||||||
Reference in New Issue
Block a user