intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__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.
- intentkit/MANIFEST.in +14 -0
- intentkit/README.md +88 -0
- intentkit/__init__.py +6 -4
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +15 -8
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +9 -2
- intentkit/clients/cdp.py +129 -153
- intentkit/{utils → clients}/s3.py +109 -34
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +4 -7
- intentkit/config/config.py +123 -90
- intentkit/core/account_checking.py +802 -0
- intentkit/core/agent.py +313 -498
- intentkit/core/asset.py +267 -0
- intentkit/core/chat.py +5 -3
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +49 -41
- intentkit/core/draft.py +201 -0
- intentkit/core/draft_chat.py +118 -0
- intentkit/core/engine.py +378 -287
- intentkit/core/manager/__init__.py +25 -0
- intentkit/core/manager/engine.py +220 -0
- intentkit/core/manager/service.py +172 -0
- intentkit/core/manager/skills.py +178 -0
- intentkit/core/middleware.py +231 -0
- intentkit/core/prompt.py +74 -114
- intentkit/core/scheduler.py +143 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +931 -518
- intentkit/models/agent_data.py +165 -106
- intentkit/models/agent_schema.json +38 -251
- intentkit/models/app_setting.py +15 -13
- intentkit/models/chat.py +86 -140
- intentkit/models/credit.py +182 -162
- intentkit/models/db.py +42 -23
- intentkit/models/db_mig.py +120 -3
- intentkit/models/draft.py +222 -0
- intentkit/models/llm.csv +31 -0
- intentkit/models/llm.py +262 -370
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +222 -101
- intentkit/models/skills.csv +173 -0
- intentkit/models/team.py +189 -0
- intentkit/models/user.py +103 -31
- intentkit/skills/acolyt/__init__.py +2 -9
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +4 -9
- intentkit/skills/acolyt/schema.json +4 -3
- intentkit/skills/aixbt/__init__.py +2 -13
- intentkit/skills/aixbt/base.py +1 -7
- intentkit/skills/aixbt/projects.py +14 -15
- intentkit/skills/aixbt/schema.json +4 -4
- intentkit/skills/allora/__init__.py +2 -9
- intentkit/skills/allora/base.py +4 -9
- intentkit/skills/allora/price.py +3 -4
- intentkit/skills/allora/schema.json +3 -2
- intentkit/skills/base.py +241 -41
- intentkit/skills/basename/__init__.py +51 -0
- intentkit/skills/basename/base.py +11 -0
- intentkit/skills/basename/basename.svg +11 -0
- intentkit/skills/basename/schema.json +58 -0
- intentkit/skills/carv/__init__.py +115 -121
- intentkit/skills/carv/base.py +184 -185
- intentkit/skills/carv/fetch_news.py +3 -3
- intentkit/skills/carv/onchain_query.py +4 -4
- intentkit/skills/carv/schema.json +134 -137
- intentkit/skills/carv/token_info_and_price.py +6 -6
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/casino/schema.json +0 -1
- intentkit/skills/cdp/__init__.py +22 -84
- intentkit/skills/cdp/base.py +1 -7
- intentkit/skills/cdp/schema.json +11 -314
- intentkit/skills/chainlist/__init__.py +2 -7
- intentkit/skills/chainlist/base.py +1 -7
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/chainlist/schema.json +3 -5
- intentkit/skills/common/__init__.py +2 -9
- intentkit/skills/common/base.py +1 -7
- intentkit/skills/common/current_time.py +1 -2
- intentkit/skills/common/schema.json +2 -2
- intentkit/skills/cookiefun/__init__.py +6 -9
- intentkit/skills/cookiefun/base.py +2 -7
- intentkit/skills/cookiefun/get_account_details.py +7 -7
- intentkit/skills/cookiefun/get_account_feed.py +19 -19
- intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
- intentkit/skills/cookiefun/get_sectors.py +3 -3
- intentkit/skills/cookiefun/schema.json +1 -3
- intentkit/skills/cookiefun/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/__init__.py +7 -24
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +10 -24
- intentkit/skills/cryptocompare/fetch_news.py +4 -5
- intentkit/skills/cryptocompare/fetch_price.py +6 -7
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
- intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
- intentkit/skills/cryptocompare/schema.json +3 -3
- intentkit/skills/cryptopanic/__init__.py +7 -10
- intentkit/skills/cryptopanic/base.py +51 -55
- intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
- intentkit/skills/cryptopanic/schema.json +105 -103
- intentkit/skills/dapplooker/__init__.py +2 -9
- intentkit/skills/dapplooker/base.py +4 -9
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/dapplooker/schema.json +3 -5
- intentkit/skills/defillama/__init__.py +24 -74
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +8 -19
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_block.py +6 -8
- intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
- intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
- intentkit/skills/defillama/config/chains.py +1 -3
- intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
- intentkit/skills/defillama/schema.json +5 -1
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
- intentkit/skills/defillama/tests/api_integration.test.py +1 -1
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
- intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
- intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
- intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
- intentkit/skills/defillama/yields/fetch_pools.py +26 -30
- intentkit/skills/dexscreener/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -93
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- intentkit/skills/dune_analytics/__init__.py +7 -9
- intentkit/skills/dune_analytics/base.py +48 -52
- intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
- intentkit/skills/dune_analytics/schema.json +104 -99
- intentkit/skills/elfa/__init__.py +5 -18
- intentkit/skills/elfa/base.py +10 -14
- intentkit/skills/elfa/mention.py +19 -21
- intentkit/skills/elfa/schema.json +3 -2
- intentkit/skills/elfa/stats.py +4 -4
- intentkit/skills/elfa/tokens.py +12 -12
- intentkit/skills/elfa/utils.py +26 -28
- intentkit/skills/enso/__init__.py +11 -31
- intentkit/skills/enso/base.py +54 -35
- intentkit/skills/enso/best_yield.py +16 -24
- intentkit/skills/enso/networks.py +6 -11
- intentkit/skills/enso/prices.py +11 -13
- intentkit/skills/enso/route.py +34 -38
- intentkit/skills/enso/schema.json +3 -2
- intentkit/skills/enso/tokens.py +29 -38
- intentkit/skills/enso/wallet.py +76 -191
- intentkit/skills/erc20/__init__.py +50 -0
- intentkit/skills/erc20/base.py +11 -0
- intentkit/skills/erc20/erc20.svg +5 -0
- intentkit/skills/erc20/schema.json +74 -0
- intentkit/skills/erc721/__init__.py +53 -0
- intentkit/skills/erc721/base.py +11 -0
- intentkit/skills/erc721/erc721.svg +5 -0
- intentkit/skills/erc721/schema.json +90 -0
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- intentkit/skills/firecrawl/clear.py +4 -8
- intentkit/skills/firecrawl/crawl.py +19 -19
- intentkit/skills/firecrawl/query.py +4 -3
- intentkit/skills/firecrawl/schema.json +2 -6
- intentkit/skills/firecrawl/scrape.py +17 -22
- intentkit/skills/firecrawl/utils.py +50 -42
- intentkit/skills/github/__init__.py +2 -7
- intentkit/skills/github/base.py +1 -7
- intentkit/skills/github/github_search.py +1 -2
- intentkit/skills/github/schema.json +3 -4
- intentkit/skills/heurist/__init__.py +8 -27
- intentkit/skills/heurist/base.py +4 -9
- intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
- intentkit/skills/heurist/image_generation_braindance.py +13 -15
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
- intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
- intentkit/skills/heurist/image_generation_sdxl.py +13 -15
- intentkit/skills/heurist/schema.json +2 -2
- intentkit/skills/http/__init__.py +4 -15
- intentkit/skills/http/base.py +1 -7
- intentkit/skills/http/get.py +21 -16
- intentkit/skills/http/post.py +23 -18
- intentkit/skills/http/put.py +23 -18
- intentkit/skills/http/schema.json +4 -5
- intentkit/skills/lifi/__init__.py +8 -13
- intentkit/skills/lifi/base.py +3 -9
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +150 -60
- intentkit/skills/lifi/token_quote.py +8 -10
- intentkit/skills/lifi/utils.py +104 -51
- intentkit/skills/moralis/__init__.py +6 -10
- intentkit/skills/moralis/api.py +6 -7
- intentkit/skills/moralis/base.py +5 -10
- intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
- intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
- intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
- intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
- intentkit/skills/moralis/schema.json +7 -2
- intentkit/skills/morpho/__init__.py +52 -0
- intentkit/skills/morpho/base.py +11 -0
- intentkit/skills/morpho/morpho.svg +12 -0
- intentkit/skills/morpho/schema.json +73 -0
- intentkit/skills/nation/__init__.py +4 -9
- intentkit/skills/nation/base.py +5 -10
- intentkit/skills/nation/nft_check.py +3 -4
- intentkit/skills/nation/schema.json +4 -3
- intentkit/skills/onchain.py +30 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +4 -9
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +5 -9
- intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
- intentkit/skills/openai/gpt_image_to_image.py +5 -9
- intentkit/skills/openai/image_to_text.py +3 -7
- intentkit/skills/openai/schema.json +34 -3
- intentkit/skills/portfolio/__init__.py +11 -35
- intentkit/skills/portfolio/base.py +33 -19
- intentkit/skills/portfolio/schema.json +3 -5
- intentkit/skills/portfolio/token_balances.py +21 -21
- intentkit/skills/portfolio/wallet_approvals.py +17 -18
- intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
- intentkit/skills/portfolio/wallet_history.py +31 -31
- intentkit/skills/portfolio/wallet_net_worth.py +13 -13
- intentkit/skills/portfolio/wallet_nfts.py +19 -19
- intentkit/skills/portfolio/wallet_profitability.py +18 -18
- intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
- intentkit/skills/portfolio/wallet_stats.py +3 -3
- intentkit/skills/portfolio/wallet_swaps.py +19 -19
- intentkit/skills/pyth/__init__.py +50 -0
- intentkit/skills/pyth/base.py +11 -0
- intentkit/skills/pyth/pyth.svg +6 -0
- intentkit/skills/pyth/schema.json +75 -0
- intentkit/skills/skills.toml +36 -0
- intentkit/skills/slack/__init__.py +5 -17
- intentkit/skills/slack/base.py +3 -9
- intentkit/skills/slack/get_channel.py +8 -8
- intentkit/skills/slack/get_message.py +9 -9
- intentkit/skills/slack/schedule_message.py +5 -5
- intentkit/skills/slack/schema.json +2 -2
- intentkit/skills/slack/send_message.py +3 -5
- intentkit/skills/supabase/__init__.py +7 -23
- intentkit/skills/supabase/base.py +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- intentkit/skills/superfluid/__init__.py +53 -0
- intentkit/skills/superfluid/base.py +11 -0
- intentkit/skills/superfluid/schema.json +89 -0
- intentkit/skills/superfluid/superfluid.svg +6 -0
- intentkit/skills/system/__init__.py +7 -24
- intentkit/skills/system/add_autonomous_task.py +10 -12
- intentkit/skills/system/delete_autonomous_task.py +2 -2
- intentkit/skills/system/edit_autonomous_task.py +14 -18
- intentkit/skills/system/list_autonomous_tasks.py +3 -5
- intentkit/skills/system/read_agent_api_key.py +6 -4
- intentkit/skills/system/regenerate_agent_api_key.py +6 -4
- intentkit/skills/system/schema.json +6 -8
- intentkit/skills/tavily/__init__.py +3 -12
- intentkit/skills/tavily/base.py +4 -9
- intentkit/skills/tavily/schema.json +3 -5
- intentkit/skills/tavily/tavily_extract.py +2 -4
- intentkit/skills/tavily/tavily_search.py +4 -6
- intentkit/skills/token/__init__.py +5 -10
- intentkit/skills/token/base.py +7 -11
- intentkit/skills/token/erc20_transfers.py +19 -19
- intentkit/skills/token/schema.json +3 -6
- intentkit/skills/token/token_analytics.py +3 -3
- intentkit/skills/token/token_price.py +13 -13
- intentkit/skills/token/token_search.py +9 -9
- intentkit/skills/twitter/__init__.py +11 -35
- intentkit/skills/twitter/base.py +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +4 -12
- intentkit/skills/unrealspeech/__init__.py +2 -7
- intentkit/skills/unrealspeech/base.py +2 -8
- intentkit/skills/unrealspeech/schema.json +2 -5
- intentkit/skills/unrealspeech/text_to_speech.py +8 -8
- intentkit/skills/venice_audio/__init__.py +98 -106
- intentkit/skills/venice_audio/base.py +117 -121
- intentkit/skills/venice_audio/input.py +41 -41
- intentkit/skills/venice_audio/schema.json +151 -152
- intentkit/skills/venice_audio/venice_audio.py +38 -21
- intentkit/skills/venice_image/__init__.py +147 -154
- intentkit/skills/venice_image/api.py +138 -138
- intentkit/skills/venice_image/base.py +185 -192
- intentkit/skills/venice_image/config.py +33 -35
- intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
- intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
- intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
- intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
- intentkit/skills/venice_image/schema.json +267 -267
- intentkit/skills/venice_image/utils.py +77 -78
- intentkit/skills/web_scraper/__init__.py +5 -18
- intentkit/skills/web_scraper/base.py +21 -7
- intentkit/skills/web_scraper/document_indexer.py +7 -6
- intentkit/skills/web_scraper/schema.json +2 -6
- intentkit/skills/web_scraper/scrape_and_index.py +15 -15
- intentkit/skills/web_scraper/utils.py +62 -63
- intentkit/skills/web_scraper/website_indexer.py +17 -19
- intentkit/skills/weth/__init__.py +49 -0
- intentkit/skills/weth/base.py +11 -0
- intentkit/skills/weth/schema.json +58 -0
- intentkit/skills/weth/weth.svg +6 -0
- intentkit/skills/wow/__init__.py +51 -0
- intentkit/skills/wow/base.py +11 -0
- intentkit/skills/wow/schema.json +89 -0
- intentkit/skills/wow/wow.svg +7 -0
- intentkit/skills/x402/__init__.py +58 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +40 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +5 -5
- intentkit/skills/xmtp/price.py +7 -6
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/__init__.py +4 -0
- intentkit/utils/chain.py +198 -96
- intentkit/utils/ens.py +135 -0
- intentkit/utils/error.py +5 -2
- intentkit/utils/logging.py +9 -11
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +8 -8
- intentkit/utils/tx.py +16 -8
- intentkit/uv.lock +3377 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
- intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
- intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
- intentkit/core/node.py +0 -215
- intentkit/models/conversation.py +0 -286
- intentkit/models/generator.py +0 -347
- intentkit/skills/cdp/get_balance.py +0 -110
- intentkit/skills/cdp/swap.py +0 -121
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +0 -511
- intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
- {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching cryptocurrency news via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -32,13 +31,13 @@ class CryptoCompareFetchNews(CryptoCompareBaseTool):
|
|
|
32
31
|
|
|
33
32
|
name: str = "cryptocompare_fetch_news"
|
|
34
33
|
description: str = "Fetch the latest cryptocurrency news for a specific token"
|
|
35
|
-
args_schema:
|
|
34
|
+
args_schema: type[BaseModel] = CryptoCompareFetchNewsInput
|
|
36
35
|
|
|
37
36
|
async def _arun(
|
|
38
37
|
self,
|
|
39
38
|
token: str,
|
|
40
39
|
**kwargs,
|
|
41
|
-
) ->
|
|
40
|
+
) -> list[CryptoNews]:
|
|
42
41
|
"""Async implementation of the tool to fetch cryptocurrency news.
|
|
43
42
|
|
|
44
43
|
Args:
|
|
@@ -46,7 +45,7 @@ class CryptoCompareFetchNews(CryptoCompareBaseTool):
|
|
|
46
45
|
config: The configuration for the runnable, containing agent context.
|
|
47
46
|
|
|
48
47
|
Returns:
|
|
49
|
-
|
|
48
|
+
list[CryptoNews]: A list of cryptocurrency news articles.
|
|
50
49
|
|
|
51
50
|
Raises:
|
|
52
51
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -56,7 +55,7 @@ class CryptoCompareFetchNews(CryptoCompareBaseTool):
|
|
|
56
55
|
skill_config = context.agent.skill_config(self.category)
|
|
57
56
|
|
|
58
57
|
# Check rate limit
|
|
59
|
-
await self.check_rate_limit(
|
|
58
|
+
await self.check_rate_limit(max_requests=5, interval=60)
|
|
60
59
|
|
|
61
60
|
# Get API key from context
|
|
62
61
|
api_key = skill_config.get("api_key")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching cryptocurrency prices via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -17,7 +16,7 @@ class CryptoCompareFetchPriceInput(BaseModel):
|
|
|
17
16
|
...,
|
|
18
17
|
description="Base cryptocurrency symbol to get prices for (e.g., 'BTC', 'ETH')",
|
|
19
18
|
)
|
|
20
|
-
to_symbols:
|
|
19
|
+
to_symbols: list[str] = Field(
|
|
21
20
|
...,
|
|
22
21
|
description="List of target currencies (fiat or crypto) (e.g., ['USD', 'EUR', 'JPY'])",
|
|
23
22
|
)
|
|
@@ -40,14 +39,14 @@ class CryptoCompareFetchPrice(CryptoCompareBaseTool):
|
|
|
40
39
|
description: str = (
|
|
41
40
|
"Fetch real-time cryptocurrency price data with multi-currency support"
|
|
42
41
|
)
|
|
43
|
-
args_schema:
|
|
42
|
+
args_schema: type[BaseModel] = CryptoCompareFetchPriceInput
|
|
44
43
|
|
|
45
44
|
async def _arun(
|
|
46
45
|
self,
|
|
47
46
|
from_symbol: str,
|
|
48
|
-
to_symbols:
|
|
47
|
+
to_symbols: list[str],
|
|
49
48
|
**kwargs,
|
|
50
|
-
) ->
|
|
49
|
+
) -> list[CryptoPrice]:
|
|
51
50
|
"""Async implementation of the tool to fetch cryptocurrency prices.
|
|
52
51
|
|
|
53
52
|
Args:
|
|
@@ -56,7 +55,7 @@ class CryptoCompareFetchPrice(CryptoCompareBaseTool):
|
|
|
56
55
|
config: The configuration for the runnable, containing agent context.
|
|
57
56
|
|
|
58
57
|
Returns:
|
|
59
|
-
|
|
58
|
+
list[CryptoPrice]: A list of cryptocurrency prices for each target currency.
|
|
60
59
|
|
|
61
60
|
Raises:
|
|
62
61
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -66,7 +65,7 @@ class CryptoCompareFetchPrice(CryptoCompareBaseTool):
|
|
|
66
65
|
skill_config = context.agent.skill_config(self.category)
|
|
67
66
|
|
|
68
67
|
# Check rate limit
|
|
69
|
-
await self.check_rate_limit(
|
|
68
|
+
await self.check_rate_limit(max_requests=10, interval=60)
|
|
70
69
|
|
|
71
70
|
# Get API key from context
|
|
72
71
|
api_key = skill_config.get("api_key")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching top exchanges for a cryptocurrency pair via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -44,7 +43,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
|
44
43
|
description: str = (
|
|
45
44
|
"Fetch top exchanges for a cryptocurrency trading pair, ranked by volume"
|
|
46
45
|
)
|
|
47
|
-
args_schema:
|
|
46
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTopExchangesInput
|
|
48
47
|
|
|
49
48
|
async def _arun(
|
|
50
49
|
self,
|
|
@@ -52,7 +51,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
|
52
51
|
to_symbol: str = "USD",
|
|
53
52
|
limit: int = 10,
|
|
54
53
|
**kwargs,
|
|
55
|
-
) ->
|
|
54
|
+
) -> list[CryptoExchange]:
|
|
56
55
|
"""Async implementation of the tool to fetch top exchanges for a cryptocurrency pair.
|
|
57
56
|
|
|
58
57
|
Args:
|
|
@@ -62,7 +61,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
|
62
61
|
config: The configuration for the runnable, containing agent context.
|
|
63
62
|
|
|
64
63
|
Returns:
|
|
65
|
-
|
|
64
|
+
list[CryptoExchange]: A list of top exchanges for the specified trading pair.
|
|
66
65
|
|
|
67
66
|
Raises:
|
|
68
67
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -72,7 +71,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
|
72
71
|
skill_config = context.agent.skill_config(self.category)
|
|
73
72
|
|
|
74
73
|
# Check rate limit
|
|
75
|
-
await self.check_rate_limit(
|
|
74
|
+
await self.check_rate_limit(max_requests=5, interval=60)
|
|
76
75
|
|
|
77
76
|
# Get API key from context
|
|
78
77
|
api_key = skill_config.get("api_key")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching top cryptocurrencies by market cap via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -39,14 +38,14 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
|
|
|
39
38
|
|
|
40
39
|
name: str = "cryptocompare_fetch_top_market_cap"
|
|
41
40
|
description: str = "Fetch top cryptocurrencies ranked by market capitalization"
|
|
42
|
-
args_schema:
|
|
41
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTopMarketCapInput
|
|
43
42
|
|
|
44
43
|
async def _arun(
|
|
45
44
|
self,
|
|
46
45
|
to_symbol: str = "USD",
|
|
47
46
|
limit: int = 10,
|
|
48
47
|
**kwargs,
|
|
49
|
-
) ->
|
|
48
|
+
) -> list[CryptoCurrency]:
|
|
50
49
|
"""Async implementation of the tool to fetch top cryptocurrencies by market cap.
|
|
51
50
|
|
|
52
51
|
Args:
|
|
@@ -55,7 +54,7 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
|
|
|
55
54
|
config: The configuration for the runnable, containing agent context.
|
|
56
55
|
|
|
57
56
|
Returns:
|
|
58
|
-
|
|
57
|
+
list[CryptoCurrency]: A list of top cryptocurrencies by market cap.
|
|
59
58
|
|
|
60
59
|
Raises:
|
|
61
60
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -65,7 +64,7 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
|
|
|
65
64
|
skill_config = context.agent.skill_config(self.category)
|
|
66
65
|
|
|
67
66
|
# Check rate limit
|
|
68
|
-
await self.check_rate_limit(
|
|
67
|
+
await self.check_rate_limit(max_requests=5, interval=60)
|
|
69
68
|
|
|
70
69
|
# Get API key from context
|
|
71
70
|
api_key = skill_config.get("api_key")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching top cryptocurrencies by trading volume via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -38,14 +37,14 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
|
|
|
38
37
|
|
|
39
38
|
name: str = "cryptocompare_fetch_top_volume"
|
|
40
39
|
description: str = "Fetch top cryptocurrencies ranked by 24-hour trading volume"
|
|
41
|
-
args_schema:
|
|
40
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTopVolumeInput
|
|
42
41
|
|
|
43
42
|
async def _arun(
|
|
44
43
|
self,
|
|
45
44
|
to_symbol: str = "USD",
|
|
46
45
|
limit: int = 10,
|
|
47
46
|
**kwargs,
|
|
48
|
-
) ->
|
|
47
|
+
) -> list[CryptoCurrency]:
|
|
49
48
|
"""Async implementation of the tool to fetch top cryptocurrencies by trading volume.
|
|
50
49
|
|
|
51
50
|
Args:
|
|
@@ -54,7 +53,7 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
|
|
|
54
53
|
config: The configuration for the runnable, containing agent context.
|
|
55
54
|
|
|
56
55
|
Returns:
|
|
57
|
-
|
|
56
|
+
list[CryptoCurrency]: A list of top cryptocurrencies by trading volume.
|
|
58
57
|
|
|
59
58
|
Raises:
|
|
60
59
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -64,7 +63,7 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
|
|
|
64
63
|
skill_config = context.agent.skill_config(self.category)
|
|
65
64
|
|
|
66
65
|
# Check rate limit
|
|
67
|
-
await self.check_rate_limit(
|
|
66
|
+
await self.check_rate_limit(max_requests=5, interval=60)
|
|
68
67
|
|
|
69
68
|
# Get API key from context
|
|
70
69
|
api_key = skill_config.get("api_key")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching cryptocurrency trading signals via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Dict, List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -43,13 +42,13 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
|
43
42
|
|
|
44
43
|
name: str = "cryptocompare_fetch_trading_signals"
|
|
45
44
|
description: str = "Fetch the latest trading signals for a specific cryptocurrency"
|
|
46
|
-
args_schema:
|
|
45
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTradingSignalsInput
|
|
47
46
|
|
|
48
47
|
async def _arun(
|
|
49
48
|
self,
|
|
50
49
|
from_symbol: str,
|
|
51
50
|
**kwargs,
|
|
52
|
-
) ->
|
|
51
|
+
) -> list[TradingSignal]:
|
|
53
52
|
"""Async implementation of the tool to fetch cryptocurrency trading signals.
|
|
54
53
|
|
|
55
54
|
Args:
|
|
@@ -57,7 +56,7 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
|
57
56
|
config: The configuration for the runnable, containing agent context.
|
|
58
57
|
|
|
59
58
|
Returns:
|
|
60
|
-
|
|
59
|
+
list[TradingSignal]: A list of trading signals for the specified cryptocurrency.
|
|
61
60
|
|
|
62
61
|
Raises:
|
|
63
62
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -67,7 +66,7 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
|
67
66
|
skill_config = context.agent.skill_config(self.category)
|
|
68
67
|
|
|
69
68
|
# Check rate limit
|
|
70
|
-
await self.check_rate_limit(
|
|
69
|
+
await self.check_rate_limit(max_requests=5, interval=60)
|
|
71
70
|
|
|
72
71
|
# Get API key from context
|
|
73
72
|
api_key = skill_config.get("api_key")
|
|
@@ -86,7 +85,7 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
|
86
85
|
if "Data" in signals_data and signals_data["Data"]:
|
|
87
86
|
for indicator_name, indicator_data in signals_data["Data"].items():
|
|
88
87
|
if (
|
|
89
|
-
isinstance(indicator_data,
|
|
88
|
+
isinstance(indicator_data, dict)
|
|
90
89
|
and "sentiment" in indicator_data
|
|
91
90
|
):
|
|
92
91
|
result.append(
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"description": "Integration with CryptoCompare API providing cryptocurrency market data, price information, and crypto news with rate limiting capabilities",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/cryptocompare/cryptocompare.png",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
9
|
-
"
|
|
8
|
+
"Analytics",
|
|
9
|
+
"Crypto"
|
|
10
10
|
],
|
|
11
11
|
"properties": {
|
|
12
12
|
"enabled": {
|
|
@@ -165,4 +165,4 @@
|
|
|
165
165
|
}
|
|
166
166
|
},
|
|
167
167
|
"additionalProperties": true
|
|
168
|
-
}
|
|
168
|
+
}
|
|
@@ -4,9 +4,8 @@ Loads and initializes skills for fetching crypto news and providing market insig
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import TypedDict
|
|
8
8
|
|
|
9
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
10
9
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
11
10
|
|
|
12
11
|
from .base import CryptopanicBaseTool
|
|
@@ -14,7 +13,7 @@ from .base import CryptopanicBaseTool
|
|
|
14
13
|
logger = logging.getLogger(__name__)
|
|
15
14
|
|
|
16
15
|
# Cache for skill instances
|
|
17
|
-
_skill_cache:
|
|
16
|
+
_skill_cache: dict[str, CryptopanicBaseTool] = {}
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
class SkillStates(TypedDict):
|
|
@@ -34,9 +33,8 @@ class Config(SkillConfig):
|
|
|
34
33
|
async def get_skills(
|
|
35
34
|
config: Config,
|
|
36
35
|
is_private: bool,
|
|
37
|
-
store: SkillStoreABC,
|
|
38
36
|
**kwargs,
|
|
39
|
-
) ->
|
|
37
|
+
) -> list[CryptopanicBaseTool]:
|
|
40
38
|
"""Load CryptoPanic skills based on configuration.
|
|
41
39
|
|
|
42
40
|
Args:
|
|
@@ -60,7 +58,7 @@ async def get_skills(
|
|
|
60
58
|
|
|
61
59
|
loaded_skills = []
|
|
62
60
|
for name in available_skills:
|
|
63
|
-
skill = get_cryptopanic_skill(name
|
|
61
|
+
skill = get_cryptopanic_skill(name)
|
|
64
62
|
if skill:
|
|
65
63
|
logger.info("Successfully loaded skill: %s", name)
|
|
66
64
|
loaded_skills.append(skill)
|
|
@@ -72,8 +70,7 @@ async def get_skills(
|
|
|
72
70
|
|
|
73
71
|
def get_cryptopanic_skill(
|
|
74
72
|
name: str,
|
|
75
|
-
|
|
76
|
-
) -> Optional[CryptopanicBaseTool]:
|
|
73
|
+
) -> CryptopanicBaseTool | None:
|
|
77
74
|
"""Retrieve a CryptoPanic skill instance by name.
|
|
78
75
|
|
|
79
76
|
Args:
|
|
@@ -91,11 +88,11 @@ def get_cryptopanic_skill(
|
|
|
91
88
|
if name == "fetch_crypto_news":
|
|
92
89
|
from .fetch_crypto_news import FetchCryptoNews
|
|
93
90
|
|
|
94
|
-
_skill_cache[name] = FetchCryptoNews(
|
|
91
|
+
_skill_cache[name] = FetchCryptoNews()
|
|
95
92
|
elif name == "fetch_crypto_sentiment":
|
|
96
93
|
from .fetch_crypto_sentiment import FetchCryptoSentiment
|
|
97
94
|
|
|
98
|
-
_skill_cache[name] = FetchCryptoSentiment(
|
|
95
|
+
_skill_cache[name] = FetchCryptoSentiment()
|
|
99
96
|
else:
|
|
100
97
|
logger.warning("Unknown CryptoPanic skill: %s", name)
|
|
101
98
|
return None
|
|
@@ -1,55 +1,51 @@
|
|
|
1
|
-
"""Base module for CryptoPanic skills.
|
|
2
|
-
|
|
3
|
-
Defines the base class and shared utilities for CryptoPanic skills.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
from
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
""
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
def category(self) -> str:
|
|
54
|
-
"""Category of the skill."""
|
|
55
|
-
return "cryptopanic"
|
|
1
|
+
"""Base module for CryptoPanic skills.
|
|
2
|
+
|
|
3
|
+
Defines the base class and shared utilities for CryptoPanic skills.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from langchain_core.tools.base import ToolException
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.base import IntentKitSkill
|
|
10
|
+
|
|
11
|
+
base_url = "https://cryptopanic.com/api/v1/posts/"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CryptopanicBaseTool(IntentKitSkill):
|
|
15
|
+
"""Base class for CryptoPanic skills.
|
|
16
|
+
|
|
17
|
+
Provides common functionality for interacting with the CryptoPanic API,
|
|
18
|
+
including API key retrieval and shared helpers.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
name: str = Field(description="Tool name")
|
|
22
|
+
description: str = Field(description="Tool description")
|
|
23
|
+
args_schema: type[BaseModel]
|
|
24
|
+
|
|
25
|
+
def get_api_key(self) -> str:
|
|
26
|
+
"""Retrieve the CryptoPanic API key from context.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
API key string.
|
|
30
|
+
|
|
31
|
+
Raises:
|
|
32
|
+
ToolException: If the API key is not found.
|
|
33
|
+
"""
|
|
34
|
+
context = self.get_context()
|
|
35
|
+
skill_config = context.agent.skill_config(self.category)
|
|
36
|
+
api_key_provider = skill_config.get("api_key_provider")
|
|
37
|
+
if api_key_provider == "agent_owner":
|
|
38
|
+
api_key = skill_config.get("api_key")
|
|
39
|
+
if api_key:
|
|
40
|
+
return api_key
|
|
41
|
+
else:
|
|
42
|
+
raise ToolException("No api_key found in agent_owner configuration")
|
|
43
|
+
else:
|
|
44
|
+
raise ToolException(
|
|
45
|
+
f"Invalid API key provider: {api_key_provider}. Only 'agent_owner' is supported for CryptoPanic."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def category(self) -> str:
|
|
50
|
+
"""Category of the skill."""
|
|
51
|
+
return "cryptopanic"
|
|
@@ -3,12 +3,9 @@
|
|
|
3
3
|
Fetches all news posts for BTC or ETH, sorted by publication date (newest first).
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from typing import List, Type
|
|
7
|
-
|
|
8
6
|
import httpx
|
|
9
7
|
from pydantic import BaseModel, Field
|
|
10
8
|
|
|
11
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
12
9
|
from intentkit.skills.cryptopanic.base import CryptopanicBaseTool
|
|
13
10
|
|
|
14
11
|
SUPPORTED_CURRENCIES = ["BTC", "ETH"]
|
|
@@ -36,7 +33,7 @@ class CryptopanicNewsOutput(BaseModel):
|
|
|
36
33
|
"""Output schema for fetching crypto news."""
|
|
37
34
|
|
|
38
35
|
currency: str = Field(description="Currency news was fetched for")
|
|
39
|
-
news_items:
|
|
36
|
+
news_items: list[NewsItem] = Field(description="List of news items")
|
|
40
37
|
summary: str = Field(description="Summary of fetched news")
|
|
41
38
|
|
|
42
39
|
|
|
@@ -48,14 +45,13 @@ class FetchCryptoNews(CryptopanicBaseTool):
|
|
|
48
45
|
"Fetches all crypto market news posts from CryptoPanic for BTC or ETH, "
|
|
49
46
|
"sorted by publication date (newest first). Defaults to BTC."
|
|
50
47
|
)
|
|
51
|
-
args_schema:
|
|
52
|
-
skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
|
|
48
|
+
args_schema: type[BaseModel] = CryptopanicNewsInput
|
|
53
49
|
|
|
54
50
|
async def fetch_news(
|
|
55
51
|
self,
|
|
56
52
|
currency: str,
|
|
57
53
|
api_key: str,
|
|
58
|
-
) ->
|
|
54
|
+
) -> list[NewsItem]:
|
|
59
55
|
"""Fetch the latest news for a specific currency from CryptoPanic API.
|
|
60
56
|
|
|
61
57
|
Args:
|
|
@@ -68,7 +64,7 @@ class FetchCryptoNews(CryptopanicBaseTool):
|
|
|
68
64
|
Raises:
|
|
69
65
|
ToolException: If the API request fails or data is invalid.
|
|
70
66
|
"""
|
|
71
|
-
from
|
|
67
|
+
from langchain_core.tools.base import ToolException
|
|
72
68
|
|
|
73
69
|
if currency not in SUPPORTED_CURRENCIES:
|
|
74
70
|
raise ToolException(f"Unsupported currency: {currency}")
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"""Skill to provide AI-driven insights on crypto market conditions using CryptoPanic news."""
|
|
2
2
|
|
|
3
|
-
from typing import ClassVar
|
|
3
|
+
from typing import ClassVar
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
7
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
8
7
|
from intentkit.skills.cryptopanic.base import CryptopanicBaseTool
|
|
9
8
|
|
|
10
9
|
SUPPORTED_CURRENCIES = ["BTC", "ETH"]
|
|
@@ -30,7 +29,7 @@ class CryptopanicNewsOutput(BaseModel):
|
|
|
30
29
|
"""Output schema for fetching crypto news (used internally)."""
|
|
31
30
|
|
|
32
31
|
currency: str = Field(description="Currency news was fetched for")
|
|
33
|
-
news_items:
|
|
32
|
+
news_items: list[BaseModel] = Field(description="List of news items")
|
|
34
33
|
summary: str = Field(description="Summary of fetched news")
|
|
35
34
|
|
|
36
35
|
|
|
@@ -44,8 +43,7 @@ class FetchCryptoSentiment(CryptopanicBaseTool):
|
|
|
44
43
|
"with all posts sorted by recency. Triggered by 'sentiment' or 'market state' queries. "
|
|
45
44
|
"Defaults to BTC."
|
|
46
45
|
)
|
|
47
|
-
args_schema:
|
|
48
|
-
skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
|
|
46
|
+
args_schema: type[BaseModel] = CryptopanicSentimentInput
|
|
49
47
|
|
|
50
48
|
INSIGHTS_PROMPT: ClassVar[str] = """
|
|
51
49
|
CryptoPanic Headlines for {currency}:
|
|
@@ -79,7 +77,7 @@ Conclude with a short-term outlook for {currency}. Provide a concise, profession
|
|
|
79
77
|
Raises:
|
|
80
78
|
ToolException: If news fetching fails.
|
|
81
79
|
"""
|
|
82
|
-
from
|
|
80
|
+
from langchain_core.tools.base import ToolException
|
|
83
81
|
|
|
84
82
|
from intentkit.skills.cryptopanic.fetch_crypto_news import (
|
|
85
83
|
FetchCryptoNews,
|
|
@@ -90,7 +88,7 @@ Conclude with a short-term outlook for {currency}. Provide a concise, profession
|
|
|
90
88
|
currency = "BTC"
|
|
91
89
|
|
|
92
90
|
# Instantiate FetchCryptoNews
|
|
93
|
-
news_skill = FetchCryptoNews(
|
|
91
|
+
news_skill = FetchCryptoNews()
|
|
94
92
|
|
|
95
93
|
try:
|
|
96
94
|
news_output: CryptopanicNewsOutput = await news_skill._arun(
|