intentkit 0.5.0__py3-none-any.whl → 0.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of intentkit might be problematic. Click here for more details.
- intentkit/__init__.py +17 -0
- intentkit/abstracts/__init__.py +0 -0
- intentkit/abstracts/agent.py +60 -0
- intentkit/abstracts/api.py +4 -0
- intentkit/abstracts/engine.py +38 -0
- intentkit/abstracts/exception.py +9 -0
- intentkit/abstracts/graph.py +25 -0
- intentkit/abstracts/skill.py +129 -0
- intentkit/abstracts/twitter.py +54 -0
- intentkit/clients/__init__.py +14 -0
- intentkit/clients/cdp.py +53 -0
- intentkit/clients/twitter.py +445 -0
- intentkit/config/__init__.py +0 -0
- intentkit/config/config.py +164 -0
- intentkit/core/__init__.py +0 -0
- intentkit/core/agent.py +191 -0
- intentkit/core/api.py +40 -0
- intentkit/core/client.py +45 -0
- intentkit/core/credit.py +1767 -0
- intentkit/core/engine.py +1018 -0
- intentkit/core/node.py +223 -0
- intentkit/core/prompt.py +58 -0
- intentkit/core/skill.py +124 -0
- intentkit/models/agent.py +1689 -0
- intentkit/models/agent_data.py +810 -0
- intentkit/models/agent_schema.json +733 -0
- intentkit/models/app_setting.py +156 -0
- intentkit/models/base.py +9 -0
- intentkit/models/chat.py +581 -0
- intentkit/models/conversation.py +286 -0
- intentkit/models/credit.py +1406 -0
- intentkit/models/db.py +120 -0
- intentkit/models/db_mig.py +102 -0
- intentkit/models/generator.py +347 -0
- intentkit/models/llm.py +746 -0
- intentkit/models/redis.py +132 -0
- intentkit/models/skill.py +466 -0
- intentkit/models/user.py +243 -0
- intentkit/skills/__init__.py +12 -0
- intentkit/skills/acolyt/__init__.py +83 -0
- intentkit/skills/acolyt/acolyt.jpg +0 -0
- intentkit/skills/acolyt/ask.py +128 -0
- intentkit/skills/acolyt/base.py +28 -0
- intentkit/skills/acolyt/schema.json +89 -0
- intentkit/skills/aixbt/README.md +71 -0
- intentkit/skills/aixbt/__init__.py +73 -0
- intentkit/skills/aixbt/aixbt.jpg +0 -0
- intentkit/skills/aixbt/base.py +21 -0
- intentkit/skills/aixbt/projects.py +153 -0
- intentkit/skills/aixbt/schema.json +99 -0
- intentkit/skills/allora/__init__.py +83 -0
- intentkit/skills/allora/allora.jpeg +0 -0
- intentkit/skills/allora/base.py +28 -0
- intentkit/skills/allora/price.py +130 -0
- intentkit/skills/allora/schema.json +89 -0
- intentkit/skills/base.py +174 -0
- intentkit/skills/carv/README.md +95 -0
- intentkit/skills/carv/__init__.py +121 -0
- intentkit/skills/carv/base.py +183 -0
- intentkit/skills/carv/carv.webp +0 -0
- intentkit/skills/carv/fetch_news.py +92 -0
- intentkit/skills/carv/onchain_query.py +164 -0
- intentkit/skills/carv/schema.json +137 -0
- intentkit/skills/carv/token_info_and_price.py +110 -0
- intentkit/skills/cdp/__init__.py +137 -0
- intentkit/skills/cdp/base.py +21 -0
- intentkit/skills/cdp/cdp.png +0 -0
- intentkit/skills/cdp/get_balance.py +81 -0
- intentkit/skills/cdp/schema.json +473 -0
- intentkit/skills/chainlist/README.md +38 -0
- intentkit/skills/chainlist/__init__.py +54 -0
- intentkit/skills/chainlist/base.py +21 -0
- intentkit/skills/chainlist/chain_lookup.py +208 -0
- intentkit/skills/chainlist/chainlist.png +0 -0
- intentkit/skills/chainlist/schema.json +47 -0
- intentkit/skills/common/__init__.py +82 -0
- intentkit/skills/common/base.py +21 -0
- intentkit/skills/common/common.jpg +0 -0
- intentkit/skills/common/current_time.py +84 -0
- intentkit/skills/common/schema.json +57 -0
- intentkit/skills/cookiefun/README.md +121 -0
- intentkit/skills/cookiefun/__init__.py +78 -0
- intentkit/skills/cookiefun/base.py +41 -0
- intentkit/skills/cookiefun/constants.py +18 -0
- intentkit/skills/cookiefun/cookiefun.png +0 -0
- intentkit/skills/cookiefun/get_account_details.py +171 -0
- intentkit/skills/cookiefun/get_account_feed.py +282 -0
- intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
- intentkit/skills/cookiefun/get_sectors.py +128 -0
- intentkit/skills/cookiefun/schema.json +155 -0
- intentkit/skills/cookiefun/search_accounts.py +225 -0
- intentkit/skills/cryptocompare/__init__.py +130 -0
- intentkit/skills/cryptocompare/api.py +159 -0
- intentkit/skills/cryptocompare/base.py +303 -0
- intentkit/skills/cryptocompare/cryptocompare.png +0 -0
- intentkit/skills/cryptocompare/fetch_news.py +96 -0
- intentkit/skills/cryptocompare/fetch_price.py +99 -0
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
- intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
- intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
- intentkit/skills/cryptocompare/schema.json +168 -0
- intentkit/skills/cryptopanic/__init__.py +108 -0
- intentkit/skills/cryptopanic/base.py +51 -0
- intentkit/skills/cryptopanic/cryptopanic.png +0 -0
- intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
- intentkit/skills/cryptopanic/schema.json +103 -0
- intentkit/skills/dapplooker/README.md +92 -0
- intentkit/skills/dapplooker/__init__.py +83 -0
- intentkit/skills/dapplooker/base.py +26 -0
- intentkit/skills/dapplooker/dapplooker.jpg +0 -0
- intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
- intentkit/skills/dapplooker/schema.json +91 -0
- intentkit/skills/defillama/__init__.py +323 -0
- intentkit/skills/defillama/api.py +315 -0
- intentkit/skills/defillama/base.py +135 -0
- intentkit/skills/defillama/coins/__init__.py +0 -0
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
- intentkit/skills/defillama/coins/fetch_block.py +98 -0
- intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
- intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
- intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
- intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
- intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
- intentkit/skills/defillama/config/__init__.py +0 -0
- intentkit/skills/defillama/config/chains.py +433 -0
- intentkit/skills/defillama/defillama.jpeg +0 -0
- intentkit/skills/defillama/fees/__init__.py +0 -0
- intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
- intentkit/skills/defillama/schema.json +383 -0
- intentkit/skills/defillama/stablecoins/__init__.py +0 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
- intentkit/skills/defillama/tests/__init__.py +0 -0
- intentkit/skills/defillama/tests/api_integration.test.py +192 -0
- intentkit/skills/defillama/tests/api_unit.test.py +583 -0
- intentkit/skills/defillama/tvl/__init__.py +0 -0
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
- intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
- intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
- intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
- intentkit/skills/defillama/volumes/__init__.py +0 -0
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
- intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
- intentkit/skills/defillama/yields/__init__.py +0 -0
- intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
- intentkit/skills/defillama/yields/fetch_pools.py +126 -0
- intentkit/skills/dexscreener/__init__.py +93 -0
- intentkit/skills/dexscreener/base.py +133 -0
- intentkit/skills/dexscreener/dexscreener.png +0 -0
- intentkit/skills/dexscreener/model/__init__.py +0 -0
- intentkit/skills/dexscreener/model/search_token_response.py +82 -0
- intentkit/skills/dexscreener/schema.json +48 -0
- intentkit/skills/dexscreener/search_token.py +321 -0
- intentkit/skills/dune_analytics/__init__.py +103 -0
- intentkit/skills/dune_analytics/base.py +46 -0
- intentkit/skills/dune_analytics/dune.png +0 -0
- intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
- intentkit/skills/dune_analytics/schema.json +99 -0
- intentkit/skills/elfa/README.md +100 -0
- intentkit/skills/elfa/__init__.py +123 -0
- intentkit/skills/elfa/base.py +28 -0
- intentkit/skills/elfa/elfa.jpg +0 -0
- intentkit/skills/elfa/mention.py +504 -0
- intentkit/skills/elfa/schema.json +153 -0
- intentkit/skills/elfa/stats.py +118 -0
- intentkit/skills/elfa/tokens.py +126 -0
- intentkit/skills/enso/README.md +75 -0
- intentkit/skills/enso/__init__.py +114 -0
- intentkit/skills/enso/abi/__init__.py +0 -0
- intentkit/skills/enso/abi/approval.py +279 -0
- intentkit/skills/enso/abi/erc20.py +14 -0
- intentkit/skills/enso/abi/route.py +129 -0
- intentkit/skills/enso/base.py +44 -0
- intentkit/skills/enso/best_yield.py +286 -0
- intentkit/skills/enso/enso.jpg +0 -0
- intentkit/skills/enso/networks.py +105 -0
- intentkit/skills/enso/prices.py +93 -0
- intentkit/skills/enso/route.py +300 -0
- intentkit/skills/enso/schema.json +212 -0
- intentkit/skills/enso/tokens.py +223 -0
- intentkit/skills/enso/wallet.py +381 -0
- intentkit/skills/github/README.md +63 -0
- intentkit/skills/github/__init__.py +54 -0
- intentkit/skills/github/base.py +21 -0
- intentkit/skills/github/github.jpg +0 -0
- intentkit/skills/github/github_search.py +183 -0
- intentkit/skills/github/schema.json +59 -0
- intentkit/skills/heurist/__init__.py +143 -0
- intentkit/skills/heurist/base.py +26 -0
- intentkit/skills/heurist/heurist.png +0 -0
- intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
- intentkit/skills/heurist/image_generation_braindance.py +162 -0
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
- intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
- intentkit/skills/heurist/image_generation_sdxl.py +161 -0
- intentkit/skills/heurist/schema.json +196 -0
- intentkit/skills/lifi/README.md +294 -0
- intentkit/skills/lifi/__init__.py +141 -0
- intentkit/skills/lifi/base.py +21 -0
- intentkit/skills/lifi/lifi.png +0 -0
- intentkit/skills/lifi/schema.json +89 -0
- intentkit/skills/lifi/token_execute.py +472 -0
- intentkit/skills/lifi/token_quote.py +190 -0
- intentkit/skills/lifi/utils.py +656 -0
- intentkit/skills/moralis/README.md +490 -0
- intentkit/skills/moralis/__init__.py +110 -0
- intentkit/skills/moralis/api.py +281 -0
- intentkit/skills/moralis/base.py +55 -0
- intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
- intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
- intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
- intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
- intentkit/skills/moralis/moralis.png +0 -0
- intentkit/skills/moralis/schema.json +156 -0
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +511 -0
- intentkit/skills/nation/__init__.py +62 -0
- intentkit/skills/nation/base.py +31 -0
- intentkit/skills/nation/nation.png +0 -0
- intentkit/skills/nation/nft_check.py +106 -0
- intentkit/skills/nation/schema.json +58 -0
- intentkit/skills/openai/__init__.py +107 -0
- intentkit/skills/openai/base.py +32 -0
- intentkit/skills/openai/dalle_image_generation.py +128 -0
- intentkit/skills/openai/gpt_image_generation.py +152 -0
- intentkit/skills/openai/gpt_image_to_image.py +186 -0
- intentkit/skills/openai/image_to_text.py +126 -0
- intentkit/skills/openai/openai.png +0 -0
- intentkit/skills/openai/schema.json +139 -0
- intentkit/skills/portfolio/README.md +55 -0
- intentkit/skills/portfolio/__init__.py +151 -0
- intentkit/skills/portfolio/base.py +107 -0
- intentkit/skills/portfolio/constants.py +9 -0
- intentkit/skills/portfolio/moralis.png +0 -0
- intentkit/skills/portfolio/schema.json +237 -0
- intentkit/skills/portfolio/token_balances.py +155 -0
- intentkit/skills/portfolio/wallet_approvals.py +102 -0
- intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
- intentkit/skills/portfolio/wallet_history.py +155 -0
- intentkit/skills/portfolio/wallet_net_worth.py +112 -0
- intentkit/skills/portfolio/wallet_nfts.py +139 -0
- intentkit/skills/portfolio/wallet_profitability.py +101 -0
- intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
- intentkit/skills/portfolio/wallet_stats.py +79 -0
- intentkit/skills/portfolio/wallet_swaps.py +147 -0
- intentkit/skills/skills.toml +103 -0
- intentkit/skills/slack/__init__.py +98 -0
- intentkit/skills/slack/base.py +55 -0
- intentkit/skills/slack/get_channel.py +109 -0
- intentkit/skills/slack/get_message.py +136 -0
- intentkit/skills/slack/schedule_message.py +92 -0
- intentkit/skills/slack/schema.json +135 -0
- intentkit/skills/slack/send_message.py +81 -0
- intentkit/skills/slack/slack.jpg +0 -0
- intentkit/skills/system/__init__.py +90 -0
- intentkit/skills/system/base.py +22 -0
- intentkit/skills/system/read_agent_api_key.py +87 -0
- intentkit/skills/system/regenerate_agent_api_key.py +77 -0
- intentkit/skills/system/schema.json +53 -0
- intentkit/skills/system/system.svg +76 -0
- intentkit/skills/tavily/README.md +86 -0
- intentkit/skills/tavily/__init__.py +91 -0
- intentkit/skills/tavily/base.py +27 -0
- intentkit/skills/tavily/schema.json +119 -0
- intentkit/skills/tavily/tavily.jpg +0 -0
- intentkit/skills/tavily/tavily_extract.py +147 -0
- intentkit/skills/tavily/tavily_search.py +139 -0
- intentkit/skills/token/README.md +89 -0
- intentkit/skills/token/__init__.py +107 -0
- intentkit/skills/token/base.py +154 -0
- intentkit/skills/token/constants.py +9 -0
- intentkit/skills/token/erc20_transfers.py +145 -0
- intentkit/skills/token/moralis.png +0 -0
- intentkit/skills/token/schema.json +141 -0
- intentkit/skills/token/token_analytics.py +81 -0
- intentkit/skills/token/token_price.py +132 -0
- intentkit/skills/token/token_search.py +121 -0
- intentkit/skills/twitter/__init__.py +146 -0
- intentkit/skills/twitter/base.py +68 -0
- intentkit/skills/twitter/follow_user.py +69 -0
- intentkit/skills/twitter/get_mentions.py +124 -0
- intentkit/skills/twitter/get_timeline.py +111 -0
- intentkit/skills/twitter/get_user_by_username.py +84 -0
- intentkit/skills/twitter/get_user_tweets.py +123 -0
- intentkit/skills/twitter/like_tweet.py +65 -0
- intentkit/skills/twitter/post_tweet.py +90 -0
- intentkit/skills/twitter/reply_tweet.py +98 -0
- intentkit/skills/twitter/retweet.py +76 -0
- intentkit/skills/twitter/schema.json +258 -0
- intentkit/skills/twitter/search_tweets.py +115 -0
- intentkit/skills/twitter/twitter.png +0 -0
- intentkit/skills/unrealspeech/__init__.py +55 -0
- intentkit/skills/unrealspeech/base.py +21 -0
- intentkit/skills/unrealspeech/schema.json +100 -0
- intentkit/skills/unrealspeech/text_to_speech.py +177 -0
- intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
- intentkit/skills/venice_audio/__init__.py +106 -0
- intentkit/skills/venice_audio/base.py +119 -0
- intentkit/skills/venice_audio/input.py +41 -0
- intentkit/skills/venice_audio/schema.json +152 -0
- intentkit/skills/venice_audio/venice_audio.py +240 -0
- intentkit/skills/venice_audio/venice_logo.jpg +0 -0
- intentkit/skills/venice_image/README.md +119 -0
- intentkit/skills/venice_image/__init__.py +154 -0
- intentkit/skills/venice_image/api.py +138 -0
- intentkit/skills/venice_image/base.py +188 -0
- intentkit/skills/venice_image/config.py +35 -0
- intentkit/skills/venice_image/image_enhance/README.md +119 -0
- intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
- intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
- intentkit/skills/venice_image/image_generation/README.md +144 -0
- intentkit/skills/venice_image/image_generation/__init__.py +0 -0
- intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
- intentkit/skills/venice_image/image_upscale/README.md +111 -0
- intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
- intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
- intentkit/skills/venice_image/image_vision/README.md +112 -0
- intentkit/skills/venice_image/image_vision/__init__.py +0 -0
- intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
- intentkit/skills/venice_image/schema.json +267 -0
- intentkit/skills/venice_image/utils.py +78 -0
- intentkit/skills/venice_image/venice_image.jpg +0 -0
- intentkit/skills/web_scraper/README.md +82 -0
- intentkit/skills/web_scraper/__init__.py +92 -0
- intentkit/skills/web_scraper/base.py +21 -0
- intentkit/skills/web_scraper/langchain.png +0 -0
- intentkit/skills/web_scraper/schema.json +115 -0
- intentkit/skills/web_scraper/scrape_and_index.py +327 -0
- intentkit/utils/__init__.py +1 -0
- intentkit/utils/chain.py +436 -0
- intentkit/utils/error.py +134 -0
- intentkit/utils/logging.py +70 -0
- intentkit/utils/middleware.py +61 -0
- intentkit/utils/random.py +16 -0
- intentkit/utils/s3.py +267 -0
- intentkit/utils/slack_alert.py +79 -0
- intentkit/utils/tx.py +37 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
- intentkit-0.5.2.dist-info/RECORD +365 -0
- intentkit-0.5.0.dist-info/RECORD +0 -4
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Tool for fetching cryptocurrency prices via CryptoCompare API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import List, Type
|
|
5
|
+
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.cryptocompare.base import CryptoCompareBaseTool, CryptoPrice
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CryptoCompareFetchPriceInput(BaseModel):
|
|
15
|
+
"""Input for CryptoCompareFetchPrice tool."""
|
|
16
|
+
|
|
17
|
+
from_symbol: str = Field(
|
|
18
|
+
...,
|
|
19
|
+
description="Base cryptocurrency symbol to get prices for (e.g., 'BTC', 'ETH')",
|
|
20
|
+
)
|
|
21
|
+
to_symbols: List[str] = Field(
|
|
22
|
+
...,
|
|
23
|
+
description="List of target currencies (fiat or crypto) (e.g., ['USD', 'EUR', 'JPY'])",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class CryptoCompareFetchPrice(CryptoCompareBaseTool):
|
|
28
|
+
"""Tool for fetching cryptocurrency prices from CryptoCompare.
|
|
29
|
+
|
|
30
|
+
This tool uses the CryptoCompare API to retrieve real-time cryptocurrency price data
|
|
31
|
+
with multi-currency support. Provide a base currency (e.g., 'BTC', 'ETH') and a list
|
|
32
|
+
of target currencies (e.g., ['USD', 'EUR', 'JPY']) to get current exchange rates.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
name: The name of the tool.
|
|
36
|
+
description: A description of what the tool does.
|
|
37
|
+
args_schema: The schema for the tool's input arguments.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
name: str = "cryptocompare_fetch_price"
|
|
41
|
+
description: str = (
|
|
42
|
+
"Fetch real-time cryptocurrency price data with multi-currency support"
|
|
43
|
+
)
|
|
44
|
+
args_schema: Type[BaseModel] = CryptoCompareFetchPriceInput
|
|
45
|
+
|
|
46
|
+
async def _arun(
|
|
47
|
+
self,
|
|
48
|
+
from_symbol: str,
|
|
49
|
+
to_symbols: List[str],
|
|
50
|
+
config: RunnableConfig,
|
|
51
|
+
**kwargs,
|
|
52
|
+
) -> List[CryptoPrice]:
|
|
53
|
+
"""Async implementation of the tool to fetch cryptocurrency prices.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
from_symbol: Base cryptocurrency symbol to get prices for (e.g., 'BTC', 'ETH')
|
|
57
|
+
to_symbols: List of target currencies (fiat or crypto) (e.g., ['USD', 'EUR', 'JPY'])
|
|
58
|
+
config: The configuration for the runnable, containing agent context.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
List[CryptoPrice]: A list of cryptocurrency prices for each target currency.
|
|
62
|
+
|
|
63
|
+
Raises:
|
|
64
|
+
Exception: If there's an error accessing the CryptoCompare API.
|
|
65
|
+
"""
|
|
66
|
+
try:
|
|
67
|
+
context = self.context_from_config(config)
|
|
68
|
+
|
|
69
|
+
# Check rate limit
|
|
70
|
+
await self.check_rate_limit(context.agent.id, max_requests=10, interval=60)
|
|
71
|
+
|
|
72
|
+
# Get API key from context
|
|
73
|
+
api_key = context.config.get("api_key")
|
|
74
|
+
if not api_key:
|
|
75
|
+
raise ValueError("CryptoCompare API key not found in configuration")
|
|
76
|
+
|
|
77
|
+
# Fetch price data directly
|
|
78
|
+
price_data = await self.fetch_price(api_key, from_symbol, to_symbols)
|
|
79
|
+
|
|
80
|
+
# Check for errors
|
|
81
|
+
if "error" in price_data:
|
|
82
|
+
raise ValueError(price_data["error"])
|
|
83
|
+
|
|
84
|
+
# Convert to list of CryptoPrice objects
|
|
85
|
+
result = []
|
|
86
|
+
for to_symbol, price in price_data.items():
|
|
87
|
+
result.append(
|
|
88
|
+
CryptoPrice(
|
|
89
|
+
from_symbol=from_symbol,
|
|
90
|
+
to_symbol=to_symbol,
|
|
91
|
+
price=price,
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
return result
|
|
96
|
+
|
|
97
|
+
except Exception as e:
|
|
98
|
+
logger.error("Error fetching price: %s", str(e))
|
|
99
|
+
raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""Tool for fetching top exchanges for a cryptocurrency pair via CryptoCompare API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import List, Type
|
|
5
|
+
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.cryptocompare.base import CryptoCompareBaseTool, CryptoExchange
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CryptoCompareFetchTopExchangesInput(BaseModel):
|
|
15
|
+
"""Input for CryptoCompareFetchTopExchanges tool."""
|
|
16
|
+
|
|
17
|
+
from_symbol: str = Field(
|
|
18
|
+
..., description="Base cryptocurrency symbol for the trading pair (e.g., 'BTC')"
|
|
19
|
+
)
|
|
20
|
+
to_symbol: str = Field(
|
|
21
|
+
"USD",
|
|
22
|
+
description="Quote currency symbol for the trading pair. Defaults to 'USD'",
|
|
23
|
+
)
|
|
24
|
+
limit: int = Field(
|
|
25
|
+
10,
|
|
26
|
+
description="Number of exchanges to fetch (max 100)",
|
|
27
|
+
ge=1,
|
|
28
|
+
le=100,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
33
|
+
"""Tool for fetching top exchanges for a cryptocurrency pair from CryptoCompare.
|
|
34
|
+
|
|
35
|
+
This tool uses the CryptoCompare API to retrieve the top exchanges
|
|
36
|
+
for a specific cryptocurrency trading pair, ranked by volume.
|
|
37
|
+
|
|
38
|
+
Attributes:
|
|
39
|
+
name: The name of the tool.
|
|
40
|
+
description: A description of what the tool does.
|
|
41
|
+
args_schema: The schema for the tool's input arguments.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
name: str = "cryptocompare_fetch_top_exchanges"
|
|
45
|
+
description: str = (
|
|
46
|
+
"Fetch top exchanges for a cryptocurrency trading pair, ranked by volume"
|
|
47
|
+
)
|
|
48
|
+
args_schema: Type[BaseModel] = CryptoCompareFetchTopExchangesInput
|
|
49
|
+
|
|
50
|
+
async def _arun(
|
|
51
|
+
self,
|
|
52
|
+
from_symbol: str,
|
|
53
|
+
to_symbol: str = "USD",
|
|
54
|
+
limit: int = 10,
|
|
55
|
+
config: RunnableConfig = None,
|
|
56
|
+
**kwargs,
|
|
57
|
+
) -> List[CryptoExchange]:
|
|
58
|
+
"""Async implementation of the tool to fetch top exchanges for a cryptocurrency pair.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
from_symbol: Base cryptocurrency symbol for the trading pair (e.g., 'BTC')
|
|
62
|
+
to_symbol: Quote currency symbol for the trading pair. Defaults to 'USD'
|
|
63
|
+
limit: Number of exchanges to fetch (max 100)
|
|
64
|
+
config: The configuration for the runnable, containing agent context.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
List[CryptoExchange]: A list of top exchanges for the specified trading pair.
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
Exception: If there's an error accessing the CryptoCompare API.
|
|
71
|
+
"""
|
|
72
|
+
try:
|
|
73
|
+
context = self.context_from_config(config)
|
|
74
|
+
|
|
75
|
+
# Check rate limit
|
|
76
|
+
await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
|
|
77
|
+
|
|
78
|
+
# Get API key from context
|
|
79
|
+
api_key = context.config.get("api_key")
|
|
80
|
+
if not api_key:
|
|
81
|
+
raise ValueError("CryptoCompare API key not found in configuration")
|
|
82
|
+
|
|
83
|
+
# Fetch top exchanges data directly
|
|
84
|
+
exchanges_data = await self.fetch_top_exchanges(
|
|
85
|
+
api_key, from_symbol, to_symbol
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Check for errors
|
|
89
|
+
if "error" in exchanges_data:
|
|
90
|
+
raise ValueError(exchanges_data["error"])
|
|
91
|
+
|
|
92
|
+
# Convert to list of CryptoExchange objects
|
|
93
|
+
result = []
|
|
94
|
+
if "Data" in exchanges_data and exchanges_data["Data"]:
|
|
95
|
+
for item in exchanges_data["Data"]:
|
|
96
|
+
if len(result) >= limit:
|
|
97
|
+
break
|
|
98
|
+
|
|
99
|
+
result.append(
|
|
100
|
+
CryptoExchange(
|
|
101
|
+
exchange=item.get("exchange", ""),
|
|
102
|
+
from_symbol=from_symbol,
|
|
103
|
+
to_symbol=to_symbol,
|
|
104
|
+
volume24h=item.get("volume24h", 0),
|
|
105
|
+
volume24h_to=item.get("volume24hTo", 0),
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
return result
|
|
110
|
+
|
|
111
|
+
except Exception as e:
|
|
112
|
+
logger.error("Error fetching top exchanges: %s", str(e))
|
|
113
|
+
raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""Tool for fetching top cryptocurrencies by market cap via CryptoCompare API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import List, Type
|
|
5
|
+
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.cryptocompare.base import CryptoCompareBaseTool, CryptoCurrency
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CryptoCompareFetchTopMarketCapInput(BaseModel):
|
|
15
|
+
"""Input for CryptoCompareFetchTopMarketCap tool."""
|
|
16
|
+
|
|
17
|
+
to_symbol: str = Field(
|
|
18
|
+
"USD",
|
|
19
|
+
description="Quote currency for market cap calculation (e.g., 'USD', 'EUR')",
|
|
20
|
+
)
|
|
21
|
+
limit: int = Field(
|
|
22
|
+
10,
|
|
23
|
+
description="Number of cryptocurrencies to fetch (max 100)",
|
|
24
|
+
ge=1,
|
|
25
|
+
le=100,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
|
|
30
|
+
"""Tool for fetching top cryptocurrencies by market cap from CryptoCompare.
|
|
31
|
+
|
|
32
|
+
This tool uses the CryptoCompare API to retrieve the top cryptocurrencies
|
|
33
|
+
ranked by market capitalization in a specified quote currency.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
name: The name of the tool.
|
|
37
|
+
description: A description of what the tool does.
|
|
38
|
+
args_schema: The schema for the tool's input arguments.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
name: str = "cryptocompare_fetch_top_market_cap"
|
|
42
|
+
description: str = "Fetch top cryptocurrencies ranked by market capitalization"
|
|
43
|
+
args_schema: Type[BaseModel] = CryptoCompareFetchTopMarketCapInput
|
|
44
|
+
|
|
45
|
+
async def _arun(
|
|
46
|
+
self,
|
|
47
|
+
to_symbol: str = "USD",
|
|
48
|
+
limit: int = 10,
|
|
49
|
+
config: RunnableConfig = None,
|
|
50
|
+
**kwargs,
|
|
51
|
+
) -> List[CryptoCurrency]:
|
|
52
|
+
"""Async implementation of the tool to fetch top cryptocurrencies by market cap.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
to_symbol: Quote currency for market cap calculation (e.g., 'USD', 'EUR')
|
|
56
|
+
limit: Number of cryptocurrencies to fetch (max 100)
|
|
57
|
+
config: The configuration for the runnable, containing agent context.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
List[CryptoCurrency]: A list of top cryptocurrencies by market cap.
|
|
61
|
+
|
|
62
|
+
Raises:
|
|
63
|
+
Exception: If there's an error accessing the CryptoCompare API.
|
|
64
|
+
"""
|
|
65
|
+
try:
|
|
66
|
+
context = self.context_from_config(config)
|
|
67
|
+
|
|
68
|
+
# Check rate limit
|
|
69
|
+
await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
|
|
70
|
+
|
|
71
|
+
# Get API key from context
|
|
72
|
+
api_key = context.config.get("api_key")
|
|
73
|
+
if not api_key:
|
|
74
|
+
raise ValueError("CryptoCompare API key not found in configuration")
|
|
75
|
+
|
|
76
|
+
# Fetch top market cap data directly
|
|
77
|
+
market_cap_data = await self.fetch_top_market_cap(api_key, limit, to_symbol)
|
|
78
|
+
|
|
79
|
+
# Check for errors
|
|
80
|
+
if "error" in market_cap_data:
|
|
81
|
+
raise ValueError(market_cap_data["error"])
|
|
82
|
+
|
|
83
|
+
# Convert to list of CryptoCurrency objects
|
|
84
|
+
result = []
|
|
85
|
+
if "Data" in market_cap_data and market_cap_data["Data"]:
|
|
86
|
+
for item in market_cap_data["Data"]:
|
|
87
|
+
coin_info = item.get("CoinInfo", {})
|
|
88
|
+
raw_data = item.get("RAW", {}).get(to_symbol, {})
|
|
89
|
+
|
|
90
|
+
result.append(
|
|
91
|
+
CryptoCurrency(
|
|
92
|
+
id=str(coin_info.get("Id", "")),
|
|
93
|
+
name=coin_info.get("Name", ""),
|
|
94
|
+
symbol=coin_info.get(
|
|
95
|
+
"Name", ""
|
|
96
|
+
), # API uses same field for symbol
|
|
97
|
+
full_name=coin_info.get("FullName", ""),
|
|
98
|
+
market_cap=raw_data.get("MKTCAP", 0),
|
|
99
|
+
volume24h=raw_data.get("VOLUME24HOUR", 0),
|
|
100
|
+
price=raw_data.get("PRICE", 0),
|
|
101
|
+
change24h=raw_data.get("CHANGEPCT24HOUR", 0),
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
return result
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
logger.error("Error fetching top market cap: %s", str(e))
|
|
109
|
+
raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""Tool for fetching top cryptocurrencies by trading volume via CryptoCompare API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import List, Type
|
|
5
|
+
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.cryptocompare.base import CryptoCompareBaseTool, CryptoCurrency
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CryptoCompareFetchTopVolumeInput(BaseModel):
|
|
15
|
+
"""Input for CryptoCompareFetchTopVolume tool."""
|
|
16
|
+
|
|
17
|
+
to_symbol: str = Field(
|
|
18
|
+
"USD", description="Quote currency for volume calculation. Defaults to 'USD'"
|
|
19
|
+
)
|
|
20
|
+
limit: int = Field(
|
|
21
|
+
10,
|
|
22
|
+
description="Number of cryptocurrencies to fetch (max 100)",
|
|
23
|
+
ge=1,
|
|
24
|
+
le=100,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
|
|
29
|
+
"""Tool for fetching top cryptocurrencies by trading volume from CryptoCompare.
|
|
30
|
+
|
|
31
|
+
This tool uses the CryptoCompare API to retrieve the top cryptocurrencies
|
|
32
|
+
ranked by 24-hour trading volume in a specified quote currency.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
name: The name of the tool.
|
|
36
|
+
description: A description of what the tool does.
|
|
37
|
+
args_schema: The schema for the tool's input arguments.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
name: str = "cryptocompare_fetch_top_volume"
|
|
41
|
+
description: str = "Fetch top cryptocurrencies ranked by 24-hour trading volume"
|
|
42
|
+
args_schema: Type[BaseModel] = CryptoCompareFetchTopVolumeInput
|
|
43
|
+
|
|
44
|
+
async def _arun(
|
|
45
|
+
self,
|
|
46
|
+
to_symbol: str = "USD",
|
|
47
|
+
limit: int = 10,
|
|
48
|
+
config: RunnableConfig = None,
|
|
49
|
+
**kwargs,
|
|
50
|
+
) -> List[CryptoCurrency]:
|
|
51
|
+
"""Async implementation of the tool to fetch top cryptocurrencies by trading volume.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
to_symbol: Quote currency for volume calculation. Defaults to 'USD'
|
|
55
|
+
limit: Number of cryptocurrencies to fetch (max 100)
|
|
56
|
+
config: The configuration for the runnable, containing agent context.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
List[CryptoCurrency]: A list of top cryptocurrencies by trading volume.
|
|
60
|
+
|
|
61
|
+
Raises:
|
|
62
|
+
Exception: If there's an error accessing the CryptoCompare API.
|
|
63
|
+
"""
|
|
64
|
+
try:
|
|
65
|
+
context = self.context_from_config(config)
|
|
66
|
+
|
|
67
|
+
# Check rate limit
|
|
68
|
+
await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
|
|
69
|
+
|
|
70
|
+
# Get API key from context
|
|
71
|
+
api_key = context.config.get("api_key")
|
|
72
|
+
if not api_key:
|
|
73
|
+
raise ValueError("CryptoCompare API key not found in configuration")
|
|
74
|
+
|
|
75
|
+
# Fetch top volume data directly
|
|
76
|
+
volume_data = await self.fetch_top_volume(api_key, limit, to_symbol)
|
|
77
|
+
|
|
78
|
+
# Check for errors
|
|
79
|
+
if "error" in volume_data:
|
|
80
|
+
raise ValueError(volume_data["error"])
|
|
81
|
+
|
|
82
|
+
# Convert to list of CryptoCurrency objects
|
|
83
|
+
result = []
|
|
84
|
+
if "Data" in volume_data and volume_data["Data"]:
|
|
85
|
+
for item in volume_data["Data"]:
|
|
86
|
+
coin_info = item.get("CoinInfo", {})
|
|
87
|
+
raw_data = item.get("RAW", {}).get(to_symbol, {})
|
|
88
|
+
|
|
89
|
+
result.append(
|
|
90
|
+
CryptoCurrency(
|
|
91
|
+
id=str(coin_info.get("Id", "")),
|
|
92
|
+
name=coin_info.get("Name", ""),
|
|
93
|
+
symbol=coin_info.get(
|
|
94
|
+
"Name", ""
|
|
95
|
+
), # API uses same field for symbol
|
|
96
|
+
full_name=coin_info.get("FullName", ""),
|
|
97
|
+
market_cap=raw_data.get("MKTCAP", 0),
|
|
98
|
+
volume24h=raw_data.get("VOLUME24HOUR", 0),
|
|
99
|
+
price=raw_data.get("PRICE", 0),
|
|
100
|
+
change24h=raw_data.get("CHANGEPCT24HOUR", 0),
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return result
|
|
105
|
+
|
|
106
|
+
except Exception as e:
|
|
107
|
+
logger.error("Error fetching top volume: %s", str(e))
|
|
108
|
+
raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Tool for fetching cryptocurrency trading signals via CryptoCompare API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Dict, List, Type
|
|
5
|
+
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.cryptocompare.base import CryptoCompareBaseTool
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CryptoCompareFetchTradingSignalsInput(BaseModel):
|
|
15
|
+
"""Input for CryptoCompareFetchTradingSignals tool."""
|
|
16
|
+
|
|
17
|
+
from_symbol: str = Field(
|
|
18
|
+
...,
|
|
19
|
+
description="Cryptocurrency symbol to fetch trading signals for (e.g., 'BTC')",
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TradingSignal(BaseModel):
|
|
24
|
+
"""Model representing a cryptocurrency trading signal."""
|
|
25
|
+
|
|
26
|
+
symbol: str
|
|
27
|
+
indicator: str
|
|
28
|
+
value: float
|
|
29
|
+
signal: str
|
|
30
|
+
description: str
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
34
|
+
"""Tool for fetching cryptocurrency trading signals from CryptoCompare.
|
|
35
|
+
|
|
36
|
+
This tool uses the CryptoCompare API to retrieve the latest trading signals
|
|
37
|
+
for a specific cryptocurrency. These signals can help inform trading decisions.
|
|
38
|
+
|
|
39
|
+
Attributes:
|
|
40
|
+
name: The name of the tool.
|
|
41
|
+
description: A description of what the tool does.
|
|
42
|
+
args_schema: The schema for the tool's input arguments.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
name: str = "cryptocompare_fetch_trading_signals"
|
|
46
|
+
description: str = "Fetch the latest trading signals for a specific cryptocurrency"
|
|
47
|
+
args_schema: Type[BaseModel] = CryptoCompareFetchTradingSignalsInput
|
|
48
|
+
|
|
49
|
+
async def _arun(
|
|
50
|
+
self,
|
|
51
|
+
from_symbol: str,
|
|
52
|
+
config: RunnableConfig,
|
|
53
|
+
**kwargs,
|
|
54
|
+
) -> List[TradingSignal]:
|
|
55
|
+
"""Async implementation of the tool to fetch cryptocurrency trading signals.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
from_symbol: Cryptocurrency symbol to fetch trading signals for (e.g., 'BTC')
|
|
59
|
+
config: The configuration for the runnable, containing agent context.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
List[TradingSignal]: A list of trading signals for the specified cryptocurrency.
|
|
63
|
+
|
|
64
|
+
Raises:
|
|
65
|
+
Exception: If there's an error accessing the CryptoCompare API.
|
|
66
|
+
"""
|
|
67
|
+
try:
|
|
68
|
+
context = self.context_from_config(config)
|
|
69
|
+
|
|
70
|
+
# Check rate limit
|
|
71
|
+
await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
|
|
72
|
+
|
|
73
|
+
# Get API key from context
|
|
74
|
+
api_key = context.config.get("api_key")
|
|
75
|
+
if not api_key:
|
|
76
|
+
raise ValueError("CryptoCompare API key not found in configuration")
|
|
77
|
+
|
|
78
|
+
# Fetch trading signals data directly
|
|
79
|
+
signals_data = await self.fetch_trading_signals(api_key, from_symbol)
|
|
80
|
+
|
|
81
|
+
# Check for errors
|
|
82
|
+
if "error" in signals_data:
|
|
83
|
+
raise ValueError(signals_data["error"])
|
|
84
|
+
|
|
85
|
+
# Convert to list of TradingSignal objects
|
|
86
|
+
result = []
|
|
87
|
+
if "Data" in signals_data and signals_data["Data"]:
|
|
88
|
+
for indicator_name, indicator_data in signals_data["Data"].items():
|
|
89
|
+
if (
|
|
90
|
+
isinstance(indicator_data, Dict)
|
|
91
|
+
and "sentiment" in indicator_data
|
|
92
|
+
):
|
|
93
|
+
result.append(
|
|
94
|
+
TradingSignal(
|
|
95
|
+
symbol=from_symbol,
|
|
96
|
+
indicator=indicator_name,
|
|
97
|
+
value=indicator_data.get("score", 0.0),
|
|
98
|
+
signal=indicator_data.get("sentiment", ""),
|
|
99
|
+
description=indicator_data.get("description", ""),
|
|
100
|
+
)
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
return result
|
|
104
|
+
|
|
105
|
+
except Exception as e:
|
|
106
|
+
logger.error("Error fetching trading signals: %s", str(e))
|
|
107
|
+
raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
|