From 21ebe0700fe3236a13f6a6e1a034150c536afcdc Mon Sep 17 00:00:00 2001 From: Berack96 Date: Sun, 19 Oct 2025 21:18:45 +0200 Subject: [PATCH] Aggiungi modelli per l'analisi delle query e la generazione di report; aggiorna le configurazioni degli agenti --- configs.yaml | 2 + src/app/agents/core.py | 6 ++- src/app/agents/prompts/__init__.py | 6 ++- src/app/agents/prompts/query_analyzer.txt | 40 ++++++++++++++++++++ src/app/agents/prompts/report_generation.txt | 31 +++++++++++++++ src/app/configs.py | 3 +- 6 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/app/agents/prompts/query_analyzer.txt create mode 100644 src/app/agents/prompts/report_generation.txt diff --git a/configs.yaml b/configs.yaml index c0925b8..67e3080 100644 --- a/configs.yaml +++ b/configs.yaml @@ -42,4 +42,6 @@ agents: strategy: Conservative team_model: qwen3:1.7b team_leader_model: qwen3:4b + query_analyzer_model: qwen3:4b + report_generation_model: qwen3:4b predictor_model: qwen3:4b diff --git a/src/app/agents/core.py b/src/app/agents/core.py index 35c1c79..b3df55e 100644 --- a/src/app/agents/core.py +++ b/src/app/agents/core.py @@ -3,6 +3,9 @@ from app.configs import AppConfig +class QueryInputs(BaseModel): + user_query: str + strategy: str class QueryOutputs(BaseModel): response: str @@ -26,7 +29,8 @@ class PipelineInputs: agents = self.configs.agents self.team_model = self.configs.get_model_by_name(agents.team_model) self.team_leader_model = self.configs.get_model_by_name(agents.team_leader_model) - self.predictor_model = self.configs.get_model_by_name(agents.predictor_model) + self.query_analyzer_model = self.configs.get_model_by_name(agents.query_analyzer_model) + self.report_generation_model = self.configs.get_model_by_name(agents.report_generation_model) self.strategy = self.configs.get_strategy_by_name(agents.strategy) self.user_query = "" diff --git a/src/app/agents/prompts/__init__.py b/src/app/agents/prompts/__init__.py index 6aa7abe..656848a 100644 --- a/src/app/agents/prompts/__init__.py +++ b/src/app/agents/prompts/__init__.py @@ -10,12 +10,14 @@ COORDINATOR_INSTRUCTIONS = __load_prompt("team_leader.txt") MARKET_INSTRUCTIONS = __load_prompt("team_market.txt") NEWS_INSTRUCTIONS = __load_prompt("team_news.txt") SOCIAL_INSTRUCTIONS = __load_prompt("team_social.txt") -PREDICTOR_INSTRUCTIONS = __load_prompt("predictor.txt") +QUERY_ANALYZER_INSTRUCTIONS = __load_prompt("query_analyzer.txt") +REPORT_GENERATION_INSTRUCTIONS = __load_prompt("report_generation.txt") __all__ = [ "COORDINATOR_INSTRUCTIONS", "MARKET_INSTRUCTIONS", "NEWS_INSTRUCTIONS", "SOCIAL_INSTRUCTIONS", - "PREDICTOR_INSTRUCTIONS", + "QUERY_ANALYZER_INSTRUCTIONS", + "REPORT_GENERATION_INSTRUCTIONS", ] \ No newline at end of file diff --git a/src/app/agents/prompts/query_analyzer.txt b/src/app/agents/prompts/query_analyzer.txt new file mode 100644 index 0000000..d69ab61 --- /dev/null +++ b/src/app/agents/prompts/query_analyzer.txt @@ -0,0 +1,40 @@ +0) Determine the language of the query: + - This will help you understand better the intention of the user + - Focus on the query of the user + +1) Determine if the query is crypto or investment-related: + - Crypto-related if it mentions cryptocurrencies, tokens, NFTs, blockchain, exchanges, wallets, DeFi, oracles, smart contracts, on-chain, off-chain, staking, yield, liquidity, tokenomics, coins, ticker symbols, etc. + - Investment-related if it mentions stocks, bonds, options, trading strategies, financial markets, investment advice, portfolio management, etc. + - If the query uses generic terms like "news", "prices", "trends", "social", "market cap", "volume" with NO asset specified -> ASSUME CRYPTO/INVESTMENT CONTEXT and proceed. + - If the query is clearly about unrelated domains (weather, recipes, unrelated local politics, unrelated medicine, general software not about crypto, etc.) -> return NOT_CRYPTO error. + - If ambiguous: treat as crypto/investment only if the most likely intent is crypto/investment; otherwise return a JSON plan that first asks the user for clarification (see step structure below). + +2) REQUIRED OUTPUT (only JSON; no extra content): + - If crypto/investment is ok, write the query steps. + - If not crypto/investment: is not ok and write why is not. + +3) Constraints & clarifications for plan content: + - Each step must be concrete and actionable (examples: "fetch current price from CoinGecko API", "normalize tickers to uppercase and resolve aliases (e.g. XBT->BTC)", "compute 24h percent change"). + - List explicitly which inputs are required from the user (e.g. asset ticker(s), timeframe, exchange, fiat currency). + - If the plan can proceed without additional inputs, steps should include default assumptions and list them under "assumptions". + - Always tell to use Tools if are availables. + - Use clear formats for data: tickers uppercase, timeframe examples "1h, 24h, 7d", fiat "USD, EUR". + - "estimated_time" should be a short human-readable estimate (e.g. "30s", "2m") or ISO 8601 duration (e.g. "PT30S"). + - "confidence" must be a float between 0 and 1 (prefer two decimals), indicating how confidently the query is crypto/investment-related and the plan coverage. + +4) Error rules: + - the message must be short and clear. + - Provide a brief reason in the message clarifying why it's not crypto/investment. + +5) Ambiguity handling: + - If essential info is missing (e.g. which asset), include a first step that asks the user for it: + Step example: { "id":1, "description":"Request missing inputs from user", "inputs_needed":["asset_ticker"], "expected_output":"User provides ticker(s) or confirms defaults"} + - If user likely meant crypto/investment but unspecified assets (e.g. "prices and news"), explicitly state assumed default assets or that you will retrieve market-wide top assets. + +6) Examples: + - Input: "Dammi prezzi e notizie" -> ASSUME crypto/investment -> plan that uses defaults or asks which assets. + - Input: "How do i cook 'carbonara'?" -> error "The query is not about CRYPTO or INVESTMENTS, it is about cooking". + - Input: "BTC and ETH prices" -> plan to fetch prices for BTC and ETH with Tools. + - Input: "What are good stocks to invest in?" -> plan to fetch stock data and provide investment analysis. + +7) Output must be concise, only the JSON response described. No additional commentary. diff --git a/src/app/agents/prompts/report_generation.txt b/src/app/agents/prompts/report_generation.txt new file mode 100644 index 0000000..9187251 --- /dev/null +++ b/src/app/agents/prompts/report_generation.txt @@ -0,0 +1,31 @@ +You are an analytical assistant. You will receive, as input, a block of data and optional accompanying notes or pre-existing analyses. Your task is to produce a single, well-structured report in Markdown only. Do NOT output anything outside the Markdown report. + +Rules and structure: +1. Understand the input: + - Parse raw data, metadata (dates, units, sources), and any pre-existing analyses or notes. + - If pre-existing analyses are included, incorporate them as evidence and explain how they influence conclusions. If they conflict with raw data, explain the conflict and state assumptions used to resolve it. + - Do not invent facts. If key data is missing, state what is missing and any assumption(s) you make for the analysis. + +2. Report format (required headings and order): + - Title: concise and descriptive. + - Executive summary: 3–5 bullet points summarizing the main conclusions and recommended actions. + - Key findings: numbered list of the most important observations, each with supporting evidence (numbers, percent changes, references to input fields/rows). + - Data & Methods: brief description of the dataset (period, scope, sample size), preprocessing steps you inferred or performed, and analytical methods used. + - Use of pre-existing analyses: list which provided analyses you used and how they affected the report. + - Detailed analysis: subsections for major topics, with tables or code blocks for key calculations, and clear references to the source lines/fields in the input. + - Recommendations: prioritized, actionable recommendations tied to specific findings, with estimated impact where possible. + - Limitations & uncertainties: concise list of what reduces confidence (data quality, missing fields, assumptions). + - Appendix (if applicable): full summary tables, formulas, and any raw data snippets necessary to reproduce calculations. + +3. Presentation rules: + - Output must be valid Markdown. Use headings (##, ###), bullet lists, numbered lists, and Markdown tables as appropriate. + - Include inline numeric evidence (values and percent changes). When showing calculations, use fenced code blocks with brief comments. + - Keep language concise, formal, and non-speculative. Avoid jargon; explain technical terms when used. + - If any metrics require interpretation (e.g., growth rate), show the formula and the computed result. + - If you need clarification to improve the report, list the specific missing items at the end under a "Clarifying questions" heading. + +4. Output constraints: + - Return only the Markdown report (no extra commentary, no metadata). + - Prefer concise, stakeholder-oriented writing; keep the executive summary and recommendations prominent. + +Start the report now once you receive the input data. diff --git a/src/app/configs.py b/src/app/configs.py index 179ffdd..ee1dfee 100644 --- a/src/app/configs.py +++ b/src/app/configs.py @@ -76,7 +76,8 @@ class AgentsConfigs(BaseModel): strategy: str = "Conservative" team_model: str = "gemini-2.0-flash" team_leader_model: str = "gemini-2.0-flash" - predictor_model: str = "gemini-2.0-flash" + query_analyzer_model: str = "gemini-2.0-flash" + report_generation_model: str = "gemini-2.0-flash" class AppConfig(BaseModel): port: int = 8000