intentkit 0.6.13.dev2__py3-none-any.whl → 0.8.17__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 +1 -1
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +14 -7
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +5 -2
- intentkit/clients/cdp.py +101 -141
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +29 -0
- intentkit/config/config.py +8 -5
- intentkit/core/agent.py +472 -195
- intentkit/core/asset.py +253 -0
- intentkit/core/chat.py +51 -0
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +460 -130
- intentkit/core/engine.py +262 -233
- intentkit/core/node.py +15 -16
- intentkit/core/prompt.py +62 -28
- intentkit/core/scheduler.py +92 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +1096 -949
- intentkit/models/agent_data.py +68 -38
- intentkit/models/agent_public.json +98 -0
- intentkit/models/agent_schema.json +54 -439
- intentkit/models/app_setting.py +96 -33
- intentkit/models/chat.py +74 -27
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +362 -74
- intentkit/models/db.py +26 -8
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.csv +28 -0
- intentkit/models/llm.py +185 -350
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +186 -72
- intentkit/models/skills.csv +174 -0
- intentkit/models/user.py +82 -24
- 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 +248 -85
- 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 +5 -5
- intentkit/skills/casino/README.md +254 -0
- intentkit/skills/casino/__init__.py +86 -0
- intentkit/skills/casino/base.py +17 -0
- intentkit/skills/casino/casino.png +0 -0
- intentkit/skills/casino/deck_draw.py +127 -0
- intentkit/skills/casino/deck_shuffle.py +118 -0
- intentkit/skills/casino/dice_roll.py +100 -0
- intentkit/skills/casino/schema.json +77 -0
- intentkit/skills/casino/utils.py +107 -0
- 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 +11 -25
- 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 +11 -21
- 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/README.md +154 -0
- intentkit/skills/dexscreener/__init__.py +97 -93
- intentkit/skills/dexscreener/base.py +125 -133
- intentkit/skills/dexscreener/get_pair_info.py +158 -0
- intentkit/skills/dexscreener/get_token_pairs.py +165 -0
- intentkit/skills/dexscreener/get_tokens_info.py +212 -0
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -48
- intentkit/skills/dexscreener/search_token.py +182 -321
- intentkit/skills/dexscreener/utils.py +420 -0
- 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 +50 -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/README.md +11 -5
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -11
- 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 +6 -8
- intentkit/skills/firecrawl/scrape.py +150 -40
- 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 +12 -13
- intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
- intentkit/skills/heurist/image_generation_braindance.py +12 -13
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
- intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
- intentkit/skills/heurist/image_generation_sdxl.py +12 -13
- 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 +1 -7
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +36 -30
- 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 +23 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +3 -8
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +4 -8
- intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
- intentkit/skills/openai/gpt_image_to_image.py +4 -8
- 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 +40 -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 +9 -13
- intentkit/skills/supabase/delete_data.py +5 -6
- intentkit/skills/supabase/fetch_data.py +13 -14
- intentkit/skills/supabase/insert_data.py +5 -6
- intentkit/skills/supabase/invoke_function.py +7 -8
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +7 -8
- intentkit/skills/supabase/upsert_data.py +5 -6
- 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 +23 -35
- intentkit/skills/twitter/follow_user.py +3 -7
- intentkit/skills/twitter/get_mentions.py +6 -13
- intentkit/skills/twitter/get_timeline.py +5 -13
- intentkit/skills/twitter/get_user_by_username.py +3 -7
- intentkit/skills/twitter/get_user_tweets.py +6 -14
- intentkit/skills/twitter/like_tweet.py +3 -7
- intentkit/skills/twitter/post_tweet.py +23 -12
- intentkit/skills/twitter/reply_tweet.py +21 -12
- intentkit/skills/twitter/retweet.py +3 -7
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +5 -13
- 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 +9 -9
- 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 +61 -0
- intentkit/skills/x402/ask_agent.py +98 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +45 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +61 -2
- intentkit/skills/xmtp/price.py +18 -13
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +22 -25
- intentkit/skills/xmtp/transfer.py +71 -32
- intentkit/utils/chain.py +3 -3
- intentkit/utils/error.py +14 -1
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +59 -7
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
- intentkit-0.8.17.dist-info/RECORD +466 -0
- intentkit/abstracts/exception.py +0 -9
- intentkit/core/skill.py +0 -200
- 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.6.13.dev2.dist-info/RECORD +0 -409
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field, ValidationError, field_validator
|
|
5
|
+
|
|
6
|
+
from intentkit.skills.dexscreener.base import DexScreenerBaseTool
|
|
7
|
+
from intentkit.skills.dexscreener.model.search_token_response import (
|
|
8
|
+
SearchTokenResponseModel,
|
|
9
|
+
)
|
|
10
|
+
from intentkit.skills.dexscreener.utils import (
|
|
11
|
+
API_ENDPOINTS,
|
|
12
|
+
MAX_TOKENS_BATCH,
|
|
13
|
+
RATE_LIMITS,
|
|
14
|
+
create_error_response,
|
|
15
|
+
create_no_results_response,
|
|
16
|
+
format_success_response,
|
|
17
|
+
get_liquidity_value,
|
|
18
|
+
group_pairs_by_token,
|
|
19
|
+
handle_validation_error,
|
|
20
|
+
truncate_large_fields,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class GetTokensInfoInput(BaseModel):
|
|
27
|
+
"""Input schema for the DexScreener get_tokens_info tool."""
|
|
28
|
+
|
|
29
|
+
chain_id: str = Field(
|
|
30
|
+
description="The blockchain chain ID (e.g., 'ethereum', 'solana', 'bsc', 'polygon', 'arbitrum', 'base', 'avalanche')"
|
|
31
|
+
)
|
|
32
|
+
token_addresses: list[str] = Field(
|
|
33
|
+
description=f"List of token contract addresses to retrieve info for (maximum {MAX_TOKENS_BATCH} addresses). "
|
|
34
|
+
"Each address should be in the format '0x1234...abcd' for Ethereum-based chains."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
@field_validator("token_addresses")
|
|
38
|
+
@classmethod
|
|
39
|
+
def validate_token_addresses(cls, v: list[str]) -> list[str]:
|
|
40
|
+
if not v:
|
|
41
|
+
raise ValueError("At least one token address is required")
|
|
42
|
+
if len(v) > MAX_TOKENS_BATCH:
|
|
43
|
+
raise ValueError(f"Maximum {MAX_TOKENS_BATCH} token addresses allowed")
|
|
44
|
+
# Remove duplicates while preserving order
|
|
45
|
+
seen = set()
|
|
46
|
+
unique_addresses = []
|
|
47
|
+
for addr in v:
|
|
48
|
+
if addr not in seen:
|
|
49
|
+
seen.add(addr)
|
|
50
|
+
unique_addresses.append(addr)
|
|
51
|
+
return unique_addresses
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class GetTokensInfo(DexScreenerBaseTool):
|
|
55
|
+
"""
|
|
56
|
+
Tool to get detailed information for multiple tokens at once on DexScreener.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
name: str = "dexscreener_get_tokens_info"
|
|
60
|
+
description: str = (
|
|
61
|
+
f"Retrieves detailed trading pair information for multiple tokens (up to {MAX_TOKENS_BATCH}) "
|
|
62
|
+
"using chain ID and a list of token addresses. For each token, returns all available "
|
|
63
|
+
"trading pairs with price, volume, liquidity, market data, and DEX information. "
|
|
64
|
+
"This is more efficient than making individual calls when you need info for multiple tokens. "
|
|
65
|
+
"Use this tool for portfolio analysis or comparing multiple tokens at once."
|
|
66
|
+
)
|
|
67
|
+
args_schema: type[BaseModel] = GetTokensInfoInput
|
|
68
|
+
|
|
69
|
+
async def _arun(
|
|
70
|
+
self,
|
|
71
|
+
chain_id: str,
|
|
72
|
+
token_addresses: list[str],
|
|
73
|
+
**kwargs: Any,
|
|
74
|
+
) -> str:
|
|
75
|
+
"""Implementation to get information for multiple tokens."""
|
|
76
|
+
|
|
77
|
+
# Apply rate limiting
|
|
78
|
+
await self.global_rate_limit_by_skill(
|
|
79
|
+
limit=RATE_LIMITS["tokens"],
|
|
80
|
+
seconds=60,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
logger.info(
|
|
84
|
+
f"Executing DexScreener get_tokens_info tool with chain_id: '{chain_id}', "
|
|
85
|
+
f"token_addresses: {len(token_addresses)} tokens"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
# Construct API path - addresses are comma-separated
|
|
90
|
+
addresses_param = ",".join(token_addresses)
|
|
91
|
+
api_path = f"{API_ENDPOINTS['tokens']}/{chain_id}/{addresses_param}"
|
|
92
|
+
|
|
93
|
+
data, error_details = await self._get(path=api_path)
|
|
94
|
+
|
|
95
|
+
if error_details:
|
|
96
|
+
return await self._handle_error_response(error_details)
|
|
97
|
+
|
|
98
|
+
if not data:
|
|
99
|
+
logger.error(f"No data returned for tokens on {chain_id}")
|
|
100
|
+
return create_error_response(
|
|
101
|
+
error_type="empty_success",
|
|
102
|
+
message="API call returned empty success response.",
|
|
103
|
+
additional_data={
|
|
104
|
+
"chain_id": chain_id,
|
|
105
|
+
"token_addresses": token_addresses,
|
|
106
|
+
},
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
# Validate response using SearchTokenResponseModel since API returns similar structure
|
|
111
|
+
result = SearchTokenResponseModel.model_validate(data)
|
|
112
|
+
except ValidationError as e:
|
|
113
|
+
return handle_validation_error(
|
|
114
|
+
e, f"{chain_id}/{len(token_addresses)} tokens", len(str(data))
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
if not result.pairs:
|
|
118
|
+
return create_no_results_response(
|
|
119
|
+
f"{chain_id} - {len(token_addresses)} tokens",
|
|
120
|
+
reason="no trading pairs found for any of the specified tokens",
|
|
121
|
+
additional_data={
|
|
122
|
+
"chain_id": chain_id,
|
|
123
|
+
"requested_addresses": token_addresses,
|
|
124
|
+
"tokens_data": {},
|
|
125
|
+
"all_pairs": [],
|
|
126
|
+
"found_tokens": 0,
|
|
127
|
+
"total_pairs": 0,
|
|
128
|
+
},
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
pairs_list = [p for p in result.pairs if p is not None]
|
|
132
|
+
|
|
133
|
+
if not pairs_list:
|
|
134
|
+
return create_no_results_response(
|
|
135
|
+
f"{chain_id} - {len(token_addresses)} tokens",
|
|
136
|
+
reason="all pairs were null or invalid",
|
|
137
|
+
additional_data={
|
|
138
|
+
"chain_id": chain_id,
|
|
139
|
+
"requested_addresses": token_addresses,
|
|
140
|
+
"tokens_data": {},
|
|
141
|
+
"all_pairs": [],
|
|
142
|
+
"found_tokens": 0,
|
|
143
|
+
"total_pairs": 0,
|
|
144
|
+
},
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Group pairs by token address for better organization
|
|
148
|
+
tokens_data = group_pairs_by_token(pairs_list)
|
|
149
|
+
|
|
150
|
+
# Sort pairs within each token by liquidity (highest first)
|
|
151
|
+
for token_addr, pairs in tokens_data.items():
|
|
152
|
+
try:
|
|
153
|
+
pairs.sort(key=get_liquidity_value, reverse=True)
|
|
154
|
+
except Exception as sort_err:
|
|
155
|
+
logger.warning(
|
|
156
|
+
f"Failed to sort pairs for token {token_addr}: {sort_err}"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
logger.info(
|
|
160
|
+
f"Found {len(pairs_list)} total pairs across {len(tokens_data)} tokens "
|
|
161
|
+
f"for {len(token_addresses)} requested addresses on {chain_id}"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
return format_success_response(
|
|
165
|
+
{
|
|
166
|
+
"tokens_data": {
|
|
167
|
+
addr: [p.model_dump() for p in pairs]
|
|
168
|
+
for addr, pairs in tokens_data.items()
|
|
169
|
+
},
|
|
170
|
+
"all_pairs": [p.model_dump() for p in pairs_list],
|
|
171
|
+
"chain_id": chain_id,
|
|
172
|
+
"requested_addresses": token_addresses,
|
|
173
|
+
"found_tokens": len(tokens_data),
|
|
174
|
+
"total_pairs": len(pairs_list),
|
|
175
|
+
}
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
except Exception as e:
|
|
179
|
+
return await self._handle_unexpected_runtime_error(
|
|
180
|
+
e, f"{chain_id}/{len(token_addresses)} tokens"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
async def _handle_error_response(self, error_details: dict) -> str:
|
|
184
|
+
"""Formats error details (from _get) into a JSON string."""
|
|
185
|
+
if error_details.get("error_type") in [
|
|
186
|
+
"connection_error",
|
|
187
|
+
"parsing_error",
|
|
188
|
+
"unexpected_error",
|
|
189
|
+
]:
|
|
190
|
+
logger.error(
|
|
191
|
+
f"DexScreener get_tokens_info tool encountered an error: {error_details}"
|
|
192
|
+
)
|
|
193
|
+
else: # api_error
|
|
194
|
+
logger.warning(f"DexScreener API returned an error: {error_details}")
|
|
195
|
+
|
|
196
|
+
# Truncate potentially large fields before returning to user/LLM
|
|
197
|
+
truncated_details = truncate_large_fields(error_details)
|
|
198
|
+
return format_success_response(truncated_details)
|
|
199
|
+
|
|
200
|
+
async def _handle_unexpected_runtime_error(
|
|
201
|
+
self, e: Exception, query_info: str
|
|
202
|
+
) -> str:
|
|
203
|
+
"""Formats unexpected runtime exception details into a JSON string."""
|
|
204
|
+
logger.exception(
|
|
205
|
+
f"An unexpected runtime error occurred in get_tokens_info tool _arun method for {query_info}: {e}"
|
|
206
|
+
)
|
|
207
|
+
return create_error_response(
|
|
208
|
+
error_type="runtime_error",
|
|
209
|
+
message="An unexpected internal error occurred processing the tokens info request",
|
|
210
|
+
details=str(e),
|
|
211
|
+
additional_data={"query_info": query_info},
|
|
212
|
+
)
|
|
@@ -1,82 +1,80 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
schemaVersion: Optional[str] = None
|
|
82
|
-
pairs: Optional[List[Optional[PairModel]]] = None
|
|
1
|
+
from pydantic import BaseModel
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TokenModel(BaseModel):
|
|
5
|
+
address: str | None = None
|
|
6
|
+
name: str | None = None
|
|
7
|
+
symbol: str | None = None
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TxnsDetailsModel(BaseModel):
|
|
11
|
+
buys: int | None = None
|
|
12
|
+
sells: int | None = None
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TxnsModel(BaseModel):
|
|
16
|
+
m5: TxnsDetailsModel | None = None
|
|
17
|
+
h1: TxnsDetailsModel | None = None
|
|
18
|
+
h6: TxnsDetailsModel | None = None
|
|
19
|
+
h24: TxnsDetailsModel | None = None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class VolumeModel(BaseModel):
|
|
23
|
+
h24: float | None = None
|
|
24
|
+
h6: float | None = None
|
|
25
|
+
h1: float | None = None
|
|
26
|
+
m5: float | None = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class PriceChangeModel(BaseModel):
|
|
30
|
+
m5: float | None = None
|
|
31
|
+
h1: float | None = None
|
|
32
|
+
h6: float | None = None
|
|
33
|
+
h24: float | None = None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class LiquidityModel(BaseModel):
|
|
37
|
+
usd: float | None = None
|
|
38
|
+
base: float | None = None
|
|
39
|
+
quote: float | None = None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class WebsiteModel(BaseModel):
|
|
43
|
+
label: str | None = None
|
|
44
|
+
url: str | None = None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class SocialModel(BaseModel):
|
|
48
|
+
type: str | None = None
|
|
49
|
+
url: str | None = None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class InfoModel(BaseModel):
|
|
53
|
+
imageUrl: str | None = None
|
|
54
|
+
websites: list[WebsiteModel | None] | None = None
|
|
55
|
+
socials: list[SocialModel | None] | None = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class PairModel(BaseModel):
|
|
59
|
+
chainId: str | None = None
|
|
60
|
+
dexId: str | None = None
|
|
61
|
+
url: str | None = None
|
|
62
|
+
pairAddress: str | None = None
|
|
63
|
+
labels: list[str | None] | None = None
|
|
64
|
+
baseToken: TokenModel | None = None
|
|
65
|
+
quoteToken: TokenModel | None = None
|
|
66
|
+
priceNative: str | None = None
|
|
67
|
+
priceUsd: str | None = None
|
|
68
|
+
txns: TxnsModel | None = None
|
|
69
|
+
volume: VolumeModel | None = None
|
|
70
|
+
priceChange: PriceChangeModel | None = None
|
|
71
|
+
liquidity: LiquidityModel | None = None
|
|
72
|
+
fdv: float | None = None
|
|
73
|
+
marketCap: float | None = None
|
|
74
|
+
pairCreatedAt: int | None = None
|
|
75
|
+
info: InfoModel | None = None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class SearchTokenResponseModel(BaseModel):
|
|
79
|
+
schemaVersion: str | None = None
|
|
80
|
+
pairs: list[PairModel | None] | None = None
|
|
@@ -1,48 +1,91 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Dexscreener",
|
|
4
|
+
"description": "Integration with DexScreener API, enabling crypto token pair information",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/dexscreener/dexscreener.png",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Analytics",
|
|
9
|
+
"DeFi"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"enabled": {
|
|
13
|
+
"type": "boolean",
|
|
14
|
+
"title": "Enabled",
|
|
15
|
+
"description": "Enable or disable the Dexscreener skill.",
|
|
16
|
+
"default": false
|
|
17
|
+
},
|
|
18
|
+
"states": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"title": "Skill States",
|
|
21
|
+
"description": "Enable/disable specific tools. Only enable one if you want a consistent characteristic for your agent",
|
|
22
|
+
"properties": {
|
|
23
|
+
"search_token": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"enum": [
|
|
26
|
+
"disabled",
|
|
27
|
+
"public",
|
|
28
|
+
"private"
|
|
29
|
+
],
|
|
30
|
+
"x-enum-title": [
|
|
31
|
+
"Disabled",
|
|
32
|
+
"Agent Owner + All Users",
|
|
33
|
+
"Agent Owner Only"
|
|
34
|
+
],
|
|
35
|
+
"description": "Searches on DexScreener for token pairs matching a query (symbol, name, address). Returns up to 25 pairs sorted by 'liquidity' or 'volume' with timeframe options, including price, volume, etc. Use this tool to find token information based on user queries.",
|
|
36
|
+
"default": "disabled"
|
|
37
|
+
},
|
|
38
|
+
"get_pair_info": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"enum": [
|
|
41
|
+
"disabled",
|
|
42
|
+
"public",
|
|
43
|
+
"private"
|
|
44
|
+
],
|
|
45
|
+
"x-enum-title": [
|
|
46
|
+
"Disabled",
|
|
47
|
+
"Agent Owner + All Users",
|
|
48
|
+
"Agent Owner Only"
|
|
49
|
+
],
|
|
50
|
+
"description": "Retrieves detailed information about a specific trading pair using chain ID and pair address. Returns comprehensive data including current price, volume, liquidity, price changes, market cap, FDV, transaction counts, and social links.",
|
|
51
|
+
"default": "disabled"
|
|
52
|
+
},
|
|
53
|
+
"get_token_pairs": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"enum": [
|
|
56
|
+
"disabled",
|
|
57
|
+
"public",
|
|
58
|
+
"private"
|
|
59
|
+
],
|
|
60
|
+
"x-enum-title": [
|
|
61
|
+
"Disabled",
|
|
62
|
+
"Agent Owner + All Users",
|
|
63
|
+
"Agent Owner Only"
|
|
64
|
+
],
|
|
65
|
+
"description": "Finds all trading pairs for a specific token using chain ID and token address. Returns a list of all pools/pairs where this token is traded, including pair addresses, DEX information, liquidity, volume, and pricing data for each pair.",
|
|
66
|
+
"default": "disabled"
|
|
67
|
+
},
|
|
68
|
+
"get_tokens_info": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"enum": [
|
|
71
|
+
"disabled",
|
|
72
|
+
"public",
|
|
73
|
+
"private"
|
|
74
|
+
],
|
|
75
|
+
"x-enum-title": [
|
|
76
|
+
"Disabled",
|
|
77
|
+
"Agent Owner + All Users",
|
|
78
|
+
"Agent Owner Only"
|
|
79
|
+
],
|
|
80
|
+
"description": "Retrieves detailed trading pair information for multiple tokens (up to 30) using chain ID and a list of token addresses. More efficient than making individual calls when you need info for multiple tokens. Use for portfolio analysis or comparing multiple tokens at once.",
|
|
81
|
+
"default": "disabled"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"required": [
|
|
87
|
+
"enabled",
|
|
88
|
+
"states"
|
|
89
|
+
],
|
|
90
|
+
"additionalProperties": true
|
|
91
|
+
}
|