feat: add external instructions file for Market APIs Toolkit
- Created market_instructions.txt with detailed tool usage guidelines - Added _load_instructions() method to load instructions from external file - Updated MarketAPIsTool to use external instructions parameter - Improves maintainability by separating instructions from code
This commit is contained in:
94
src/app/api/tools/instructions/market_instructions.txt
Normal file
94
src/app/api/tools/instructions/market_instructions.txt
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
Market APIs Toolkit - Usage Instructions
|
||||||
|
|
||||||
|
OVERVIEW:
|
||||||
|
This toolkit provides access to real-time and historical cryptocurrency price data from multiple providers (Binance, YFinance, Coinbase, CryptoCompare). You can query a single provider for fast results or aggregate data from all providers for more reliable insights.
|
||||||
|
|
||||||
|
AVAILABLE TOOLS (6 total):
|
||||||
|
|
||||||
|
=== SINGLE-SOURCE TOOLS (FAST) ===
|
||||||
|
These tools query providers sequentially and return data from the first one that responds successfully.
|
||||||
|
|
||||||
|
1. get_product(asset_id: str) → ProductInfo
|
||||||
|
- Fetches current price for ONE asset
|
||||||
|
- Example: get_product("BTC")
|
||||||
|
- Use when: User wants a quick price check for a single asset
|
||||||
|
|
||||||
|
2. get_products(asset_ids: list[str]) → list[ProductInfo]
|
||||||
|
- Fetches current prices for MULTIPLE assets
|
||||||
|
- Example: get_products(["BTC", "ETH", "SOL"])
|
||||||
|
- Use when: User wants quick prices for multiple assets
|
||||||
|
|
||||||
|
3. get_historical_prices(asset_id: str, limit: int = 100) → list[Price]
|
||||||
|
- Fetches historical price data for ONE asset
|
||||||
|
- Example: get_historical_prices("BTC", limit=30)
|
||||||
|
- Use when: User wants price history (7 days → limit=7, 30 days → limit=30)
|
||||||
|
|
||||||
|
=== AGGREGATED TOOLS (COMPREHENSIVE) ===
|
||||||
|
These tools query ALL configured providers and merge results using volume-weighted averaging (VWAP) for maximum reliability.
|
||||||
|
|
||||||
|
4. get_product_aggregated(asset_id: str) → ProductInfo
|
||||||
|
- Queries ALL providers for ONE asset and aggregates results
|
||||||
|
- Returns most accurate price using VWAP calculation
|
||||||
|
- Example: get_product_aggregated("BTC")
|
||||||
|
- Use when: User requests "accurate", "reliable", or "comprehensive" single asset data
|
||||||
|
- Warning: Uses 4x API calls (one per provider)
|
||||||
|
|
||||||
|
5. get_products_aggregated(asset_ids: list[str]) → list[ProductInfo]
|
||||||
|
- Queries ALL providers for MULTIPLE assets and aggregates results
|
||||||
|
- Returns comprehensive dataset with confidence scores
|
||||||
|
- Example: get_products_aggregated(["BTC", "ETH"])
|
||||||
|
- Use when: User requests "detailed" or "comprehensive" multi-asset analysis
|
||||||
|
- Warning: Uses 4x API calls per asset
|
||||||
|
|
||||||
|
6. get_historical_prices_aggregated(asset_id: str = "BTC", limit: int = 100) → list[Price]
|
||||||
|
- Queries ALL providers for historical data and aggregates results
|
||||||
|
- Returns complete historical dataset from multiple sources
|
||||||
|
- Example: get_historical_prices_aggregated("BTC", limit=50)
|
||||||
|
- Use when: User requests comprehensive historical analysis
|
||||||
|
- Warning: Uses 4x API calls
|
||||||
|
|
||||||
|
TOOL SELECTION STRATEGY:
|
||||||
|
- "What's BTC price?" → get_product("BTC") [tool #1]
|
||||||
|
- "Get accurate BTC price" → get_product_aggregated("BTC") [tool #4]
|
||||||
|
- "Compare BTC, ETH, SOL" → get_products(["BTC", "ETH", "SOL"]) [tool #2]
|
||||||
|
- "Detailed analysis of BTC and ETH" → get_products_aggregated(["BTC", "ETH"]) [tool #5]
|
||||||
|
- "BTC price last week" → get_historical_prices("BTC", limit=7) [tool #3]
|
||||||
|
- "Comprehensive BTC history" → get_historical_prices_aggregated("BTC", limit=30) [tool #6]
|
||||||
|
|
||||||
|
ASSET ID CONVERSION:
|
||||||
|
Always convert common names to ticker symbols:
|
||||||
|
- Bitcoin → BTC
|
||||||
|
- Ethereum → ETH
|
||||||
|
- Solana → SOL
|
||||||
|
- Cardano → ADA
|
||||||
|
- Ripple → XRP
|
||||||
|
- Polkadot → DOT
|
||||||
|
- Dogecoin → DOGE
|
||||||
|
|
||||||
|
TIME RANGE INTERPRETATION:
|
||||||
|
- "last 7 days" / "past week" → limit=7
|
||||||
|
- "last 30 days" / "past month" → limit=30
|
||||||
|
- "last 24 hours" / "today" → limit=24 (if hourly) or limit=1 (if daily)
|
||||||
|
- "last 3 months" → limit=90
|
||||||
|
|
||||||
|
CRITICAL RULES:
|
||||||
|
1. NEVER fabricate prices or data - only report actual tool outputs
|
||||||
|
2. ALL data returned by tools is REAL-TIME and authoritative
|
||||||
|
3. ALWAYS include timestamps with price data
|
||||||
|
4. ALWAYS specify the data source (which provider(s) returned the data)
|
||||||
|
5. If tools fail, report the failure explicitly - DO NOT invent placeholder data
|
||||||
|
6. The 'provider' field in aggregated results shows which sources were used
|
||||||
|
|
||||||
|
ERROR HANDLING:
|
||||||
|
- All providers fail → Report "Price data unavailable from all sources"
|
||||||
|
- Partial data → Report what was retrieved and note missing portions
|
||||||
|
- Invalid asset → Report "Unable to find price data for [ASSET]. Check ticker symbol"
|
||||||
|
- API rate limits → Try single-source tools instead of aggregated tools
|
||||||
|
|
||||||
|
OUTPUT REQUIREMENTS:
|
||||||
|
- Include asset ticker symbol
|
||||||
|
- Include current price with currency (usually USD)
|
||||||
|
- Include timestamp (when the data was retrieved)
|
||||||
|
- Include source/provider information
|
||||||
|
- For historical data: include date range and data point count
|
||||||
|
- Be concise to save tokens - provide essential data only
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
from pathlib import Path
|
||||||
from agno.tools import Toolkit
|
from agno.tools import Toolkit
|
||||||
from app.api.wrapper_handler import WrapperHandler
|
from app.api.wrapper_handler import WrapperHandler
|
||||||
from app.api.core.markets import MarketWrapper, Price, ProductInfo
|
from app.api.core.markets import MarketWrapper, Price, ProductInfo
|
||||||
@@ -12,6 +13,17 @@ class MarketAPIsTool(MarketWrapper, Toolkit):
|
|||||||
Providers can be configured in configs.yaml under api.market_providers.
|
Providers can be configured in configs.yaml under api.market_providers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _load_instructions() -> str:
|
||||||
|
"""
|
||||||
|
Load the toolkit instructions from the external text file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: The content of the instructions file.
|
||||||
|
"""
|
||||||
|
instructions_path = Path(__file__).parent / "instructions" / "market_instructions.txt"
|
||||||
|
return instructions_path.read_text(encoding="utf-8")
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""
|
"""
|
||||||
Initialize the MarketAPIsTool with market API wrappers configured in configs.yaml.
|
Initialize the MarketAPIsTool with market API wrappers configured in configs.yaml.
|
||||||
@@ -36,6 +48,7 @@ class MarketAPIsTool(MarketWrapper, Toolkit):
|
|||||||
self.get_products_aggregated,
|
self.get_products_aggregated,
|
||||||
self.get_historical_prices_aggregated,
|
self.get_historical_prices_aggregated,
|
||||||
],
|
],
|
||||||
|
instructions=self._load_instructions(),
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_product(self, asset_id: str) -> ProductInfo:
|
def get_product(self, asset_id: str) -> ProductInfo:
|
||||||
|
|||||||
Reference in New Issue
Block a user