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,476 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, Dict, List, Optional, Type
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.dapplooker.base import DappLookerBaseTool
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class DappLookerTokenDataInput(BaseModel):
|
|
15
|
+
"""Input for DappLooker token data tool."""
|
|
16
|
+
|
|
17
|
+
token_tickers: Optional[str] = Field(
|
|
18
|
+
description="Comma-separated list of AI agent token tickers (e.g., 'aixbt,vader'). "
|
|
19
|
+
"Either token_tickers or token_addresses must be provided.",
|
|
20
|
+
default=None,
|
|
21
|
+
)
|
|
22
|
+
token_addresses: Optional[str] = Field(
|
|
23
|
+
description="Comma-separated list of AI agent token contract addresses (e.g., '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825'). "
|
|
24
|
+
"Either token_tickers or token_addresses must be provided.",
|
|
25
|
+
default=None,
|
|
26
|
+
)
|
|
27
|
+
chain: str = Field(
|
|
28
|
+
description="Blockchain network to query (e.g., 'base', 'ethereum').",
|
|
29
|
+
default="base",
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class DappLookerTokenData(DappLookerBaseTool):
|
|
34
|
+
"""Tool for retrieving AI agent token data from DappLooker.
|
|
35
|
+
|
|
36
|
+
This tool uses DappLooker's API to fetch comprehensive crypto market data and analytics
|
|
37
|
+
specifically for AI agent tokens.
|
|
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 = "dapplooker_token_data"
|
|
46
|
+
description: str = (
|
|
47
|
+
"Retrieve detailed token market data and analytics for AI agent tokens using DappLooker. "
|
|
48
|
+
"Use this tool when you need current information about AI-focused crypto tokens, "
|
|
49
|
+
"including price, market cap, volume, technical indicators, holder insights, and developer activity.\n"
|
|
50
|
+
"You can query by token ticker (e.g., 'aixbt', 'vader') or by token contract address. "
|
|
51
|
+
"Note that this tool is specialized for AI agent tokens and may not return data for general cryptocurrencies like ETH, BTC, or SOL.\n"
|
|
52
|
+
"Either token_tickers or token_addresses must be provided."
|
|
53
|
+
)
|
|
54
|
+
args_schema: Type[BaseModel] = DappLookerTokenDataInput
|
|
55
|
+
|
|
56
|
+
async def _arun(
|
|
57
|
+
self,
|
|
58
|
+
token_tickers: Optional[str] = None,
|
|
59
|
+
token_addresses: Optional[str] = None,
|
|
60
|
+
chain: str = "base",
|
|
61
|
+
config: RunnableConfig = None,
|
|
62
|
+
**kwargs,
|
|
63
|
+
) -> str:
|
|
64
|
+
"""Implementation of the DappLooker token data tool.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
token_tickers: Comma-separated list of token tickers.
|
|
68
|
+
token_addresses: Comma-separated list of token contract addresses.
|
|
69
|
+
chain: Blockchain network to query.
|
|
70
|
+
config: The configuration for the tool call.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
str: Formatted token data with market metrics and analytics.
|
|
74
|
+
"""
|
|
75
|
+
context = self.context_from_config(config)
|
|
76
|
+
logger.debug(
|
|
77
|
+
f"dapplooker_token_data.py: Fetching token data with context {context}"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# Get the API key from the agent's configuration or environment variable
|
|
81
|
+
api_key = self.get_api_key(context)
|
|
82
|
+
if not api_key:
|
|
83
|
+
return "Error: No DappLooker API key provided in the configuration or environment."
|
|
84
|
+
|
|
85
|
+
# Validate input
|
|
86
|
+
if not token_tickers and not token_addresses:
|
|
87
|
+
return "Error: Either token_tickers or token_addresses must be provided."
|
|
88
|
+
|
|
89
|
+
# Check for common non-AI agent tokens that won't be in the database
|
|
90
|
+
# Only check if using token_tickers, not relevant for token_addresses
|
|
91
|
+
if (
|
|
92
|
+
token_tickers
|
|
93
|
+
and not token_addresses
|
|
94
|
+
and token_tickers.lower()
|
|
95
|
+
in [
|
|
96
|
+
"btc",
|
|
97
|
+
"eth",
|
|
98
|
+
"sol",
|
|
99
|
+
"bitcoin",
|
|
100
|
+
"ethereum",
|
|
101
|
+
"solana",
|
|
102
|
+
"bnb",
|
|
103
|
+
"xrp",
|
|
104
|
+
"ada",
|
|
105
|
+
"doge",
|
|
106
|
+
]
|
|
107
|
+
):
|
|
108
|
+
return (
|
|
109
|
+
f"The token '{token_tickers}' is not an AI agent token and is not tracked by DappLooker. "
|
|
110
|
+
f"DappLooker specializes in AI agent tokens like 'aixbt', 'vader', and other AI-focused crypto projects. "
|
|
111
|
+
f"Please try querying for an AI agent token instead."
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Set up the request parameters
|
|
115
|
+
params = {
|
|
116
|
+
"api_key": api_key,
|
|
117
|
+
"chain": chain,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# Add either token_tickers or token_addresses to the parameters
|
|
121
|
+
if token_tickers:
|
|
122
|
+
params["token_tickers"] = token_tickers
|
|
123
|
+
if token_addresses:
|
|
124
|
+
params["token_addresses"] = token_addresses
|
|
125
|
+
|
|
126
|
+
logger.debug(f"dapplooker_token_data.py: Request params: {params}")
|
|
127
|
+
|
|
128
|
+
# Call DappLooker API
|
|
129
|
+
try:
|
|
130
|
+
async with httpx.AsyncClient(timeout=30.0) as client:
|
|
131
|
+
response = await client.get(
|
|
132
|
+
"https://api.dapplooker.com/v1/crypto-market/",
|
|
133
|
+
params=params,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
logger.debug(
|
|
137
|
+
f"dapplooker_token_data.py: API response status: {response.status_code}"
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
if response.status_code != 200:
|
|
141
|
+
logger.error(
|
|
142
|
+
f"dapplooker_token_data.py: Error from DappLooker API: {response.status_code} - {response.text}"
|
|
143
|
+
)
|
|
144
|
+
return f"Error retrieving token data: {response.status_code} - {response.text}"
|
|
145
|
+
|
|
146
|
+
# Parse the API response
|
|
147
|
+
response_json = response.json()
|
|
148
|
+
logger.debug(
|
|
149
|
+
f"dapplooker_token_data.py: Response type: {type(response_json)}"
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
# Check if response is a string and try to parse it
|
|
153
|
+
if isinstance(response_json, str):
|
|
154
|
+
try:
|
|
155
|
+
response_json = json.loads(response_json)
|
|
156
|
+
logger.debug(
|
|
157
|
+
"dapplooker_token_data.py: Parsed string response as JSON"
|
|
158
|
+
)
|
|
159
|
+
except json.JSONDecodeError as e:
|
|
160
|
+
logger.error(
|
|
161
|
+
f"dapplooker_token_data.py: Error parsing JSON: {e}"
|
|
162
|
+
)
|
|
163
|
+
return f"Error processing token data: {e}"
|
|
164
|
+
|
|
165
|
+
# Extract the data array from the response
|
|
166
|
+
# The API returns {"success": true, "data": [...]}
|
|
167
|
+
if isinstance(response_json, dict) and "data" in response_json:
|
|
168
|
+
data = response_json["data"]
|
|
169
|
+
logger.debug(
|
|
170
|
+
f"dapplooker_token_data.py: Found data array with {len(data)} items"
|
|
171
|
+
)
|
|
172
|
+
else:
|
|
173
|
+
data = response_json # Fallback for backward compatibility
|
|
174
|
+
logger.debug(
|
|
175
|
+
"dapplooker_token_data.py: Using response as data (fallback)"
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
logger.debug(
|
|
179
|
+
f"dapplooker_token_data.py: Received data type: {type(data)}"
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
if not data or data == []:
|
|
183
|
+
query_type = (
|
|
184
|
+
"tickers"
|
|
185
|
+
if token_tickers and not token_addresses
|
|
186
|
+
else "addresses"
|
|
187
|
+
)
|
|
188
|
+
query_value = token_tickers if token_tickers else token_addresses
|
|
189
|
+
return (
|
|
190
|
+
f"No results found for {query_type}: '{query_value}' on chain '{chain}'. "
|
|
191
|
+
f"This may be because:\n"
|
|
192
|
+
f"1. The token is not an AI agent token tracked by DappLooker\n"
|
|
193
|
+
f"2. The token ticker or address is incorrect\n"
|
|
194
|
+
f"3. The token exists on a different blockchain than '{chain}'\n\n"
|
|
195
|
+
f"DappLooker specializes in AI agent tokens like 'aixbt', 'vader', and other AI-focused crypto projects."
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# Format the results
|
|
199
|
+
return self._format_token_data(data)
|
|
200
|
+
|
|
201
|
+
except Exception as e:
|
|
202
|
+
logger.error(
|
|
203
|
+
f"dapplooker_token_data.py: Error retrieving token data: {e}",
|
|
204
|
+
exc_info=True,
|
|
205
|
+
)
|
|
206
|
+
return (
|
|
207
|
+
"An error occurred while retrieving token data. Please try again later."
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
def _format_token_data(self, data: List[Dict[str, Any]]) -> str:
|
|
211
|
+
"""Format the token data for display.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
data: List of token data dictionaries from DappLooker API.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
str: Formatted token data.
|
|
218
|
+
"""
|
|
219
|
+
if not data:
|
|
220
|
+
return "No token data available."
|
|
221
|
+
|
|
222
|
+
# Ensure data is a list
|
|
223
|
+
if not isinstance(data, list):
|
|
224
|
+
# If data is a dict, wrap it in a list
|
|
225
|
+
if isinstance(data, dict):
|
|
226
|
+
data = [data]
|
|
227
|
+
else:
|
|
228
|
+
return f"Error: Unexpected data format received from API: {type(data)}"
|
|
229
|
+
|
|
230
|
+
formatted_results = "# AI Agent Token Market Data\n\n"
|
|
231
|
+
|
|
232
|
+
for token in data:
|
|
233
|
+
# Ensure token is a dict
|
|
234
|
+
if not isinstance(token, dict):
|
|
235
|
+
logger.error(
|
|
236
|
+
f"dapplooker_token_data.py: Token is not a dictionary: {token}"
|
|
237
|
+
)
|
|
238
|
+
continue
|
|
239
|
+
|
|
240
|
+
token_info = token.get("token_info", {})
|
|
241
|
+
token_metrics = token.get("token_metrics", {})
|
|
242
|
+
technical_indicators = token.get("technical_indicators", {})
|
|
243
|
+
token_holder_insights = token.get("token_holder_insights", {})
|
|
244
|
+
smart_money_insights = token.get("smart_money_insights", {})
|
|
245
|
+
dev_wallet_insights = token.get("dev_wallet_insights", {})
|
|
246
|
+
|
|
247
|
+
# Token basic info
|
|
248
|
+
name = token_info.get("name", "Unknown")
|
|
249
|
+
symbol = token_info.get("symbol", "Unknown")
|
|
250
|
+
chain = token_info.get("chain", "Unknown")
|
|
251
|
+
address = token_info.get("ca", "Unknown")
|
|
252
|
+
ecosystem = token_info.get("ecosystem", "Unknown")
|
|
253
|
+
description = token_info.get("description", "")
|
|
254
|
+
handle = token_info.get("handle", "Unknown")
|
|
255
|
+
|
|
256
|
+
formatted_results += f"## {name} ({symbol})\n"
|
|
257
|
+
formatted_results += f"Chain: {chain}\n"
|
|
258
|
+
formatted_results += f"Ecosystem: {ecosystem}\n"
|
|
259
|
+
formatted_results += f"Contract: {address}\n"
|
|
260
|
+
if handle:
|
|
261
|
+
formatted_results += f"Handle: {handle}\n"
|
|
262
|
+
if description:
|
|
263
|
+
formatted_results += f"Description: {description}\n"
|
|
264
|
+
formatted_results += "\n"
|
|
265
|
+
|
|
266
|
+
# Price and market metrics
|
|
267
|
+
if token_metrics:
|
|
268
|
+
formatted_results += "### Market Metrics\n"
|
|
269
|
+
price = token_metrics.get("usd_price", "Unknown")
|
|
270
|
+
mcap = token_metrics.get("mcap", "Unknown")
|
|
271
|
+
fdv = token_metrics.get("fdv", "Unknown")
|
|
272
|
+
volume_24h = token_metrics.get("volume_24h", "Unknown")
|
|
273
|
+
total_liquidity = token_metrics.get("total_liquidity", "Unknown")
|
|
274
|
+
|
|
275
|
+
formatted_results += f"Price: ${price}\n"
|
|
276
|
+
formatted_results += f"Market Cap: ${mcap}\n"
|
|
277
|
+
formatted_results += f"Fully Diluted Value: ${fdv}\n"
|
|
278
|
+
formatted_results += f"24h Volume: ${volume_24h}\n"
|
|
279
|
+
formatted_results += f"Total Liquidity: ${total_liquidity}\n"
|
|
280
|
+
|
|
281
|
+
# Price changes
|
|
282
|
+
price_change_1h = token_metrics.get(
|
|
283
|
+
"price_change_percentage_1h", "Unknown"
|
|
284
|
+
)
|
|
285
|
+
price_change_24h = token_metrics.get(
|
|
286
|
+
"price_change_percentage_24h", "Unknown"
|
|
287
|
+
)
|
|
288
|
+
price_change_7d = token_metrics.get(
|
|
289
|
+
"price_change_percentage_7d", "Unknown"
|
|
290
|
+
)
|
|
291
|
+
price_change_30d = token_metrics.get(
|
|
292
|
+
"price_change_percentage_30d", "Unknown"
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
formatted_results += f"Price Change 1h: {price_change_1h}%\n"
|
|
296
|
+
formatted_results += f"Price Change 24h: {price_change_24h}%\n"
|
|
297
|
+
formatted_results += f"Price Change 7d: {price_change_7d}%\n"
|
|
298
|
+
formatted_results += f"Price Change 30d: {price_change_30d}%\n"
|
|
299
|
+
|
|
300
|
+
# Volume and Market Cap changes
|
|
301
|
+
volume_change_7d = token_metrics.get(
|
|
302
|
+
"volume_change_percentage_7d", "Unknown"
|
|
303
|
+
)
|
|
304
|
+
volume_change_30d = token_metrics.get(
|
|
305
|
+
"volume_change_percentage_30d", "Unknown"
|
|
306
|
+
)
|
|
307
|
+
mcap_change_7d = token_metrics.get(
|
|
308
|
+
"mcap_change_percentage_7d", "Unknown"
|
|
309
|
+
)
|
|
310
|
+
mcap_change_30d = token_metrics.get(
|
|
311
|
+
"mcap_change_percentage_30d", "Unknown"
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
formatted_results += f"Volume Change 7d: {volume_change_7d}%\n"
|
|
315
|
+
formatted_results += f"Volume Change 30d: {volume_change_30d}%\n"
|
|
316
|
+
formatted_results += f"Market Cap Change 7d: {mcap_change_7d}%\n"
|
|
317
|
+
formatted_results += f"Market Cap Change 30d: {mcap_change_30d}%\n"
|
|
318
|
+
|
|
319
|
+
# Price highs
|
|
320
|
+
price_high_24h = token_metrics.get("price_high_24h", "Unknown")
|
|
321
|
+
price_ath = token_metrics.get("price_ath", "Unknown")
|
|
322
|
+
|
|
323
|
+
formatted_results += f"24h High: ${price_high_24h}\n"
|
|
324
|
+
formatted_results += f"All-Time High: ${price_ath}\n\n"
|
|
325
|
+
|
|
326
|
+
# Technical indicators
|
|
327
|
+
if technical_indicators:
|
|
328
|
+
formatted_results += "### Technical Indicators\n"
|
|
329
|
+
support = technical_indicators.get("support", "Unknown")
|
|
330
|
+
resistance = technical_indicators.get("resistance", "Unknown")
|
|
331
|
+
rsi = technical_indicators.get("rsi", "Unknown")
|
|
332
|
+
sma = technical_indicators.get("sma", "Unknown")
|
|
333
|
+
|
|
334
|
+
formatted_results += f"Support: ${support}\n"
|
|
335
|
+
formatted_results += f"Resistance: ${resistance}\n"
|
|
336
|
+
formatted_results += f"RSI: {rsi}\n"
|
|
337
|
+
formatted_results += f"SMA: ${sma}\n\n"
|
|
338
|
+
|
|
339
|
+
# Token Holder Insights
|
|
340
|
+
if token_holder_insights:
|
|
341
|
+
formatted_results += "### Token Holder Insights\n"
|
|
342
|
+
total_holders = token_holder_insights.get(
|
|
343
|
+
"total_holder_count", "Unknown"
|
|
344
|
+
)
|
|
345
|
+
holder_change_24h = token_holder_insights.get(
|
|
346
|
+
"holder_count_change_percentage_24h", "Unknown"
|
|
347
|
+
)
|
|
348
|
+
fifty_percent_wallets = token_holder_insights.get(
|
|
349
|
+
"fifty_percentage_holding_wallet_count", "Unknown"
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
# First 100 buyers metrics
|
|
353
|
+
first_100_initial = token_holder_insights.get(
|
|
354
|
+
"first_100_buyers_initial_bought", "Unknown"
|
|
355
|
+
)
|
|
356
|
+
first_100_initial_pct = token_holder_insights.get(
|
|
357
|
+
"first_100_buyers_initial_bought_percentage", "Unknown"
|
|
358
|
+
)
|
|
359
|
+
first_100_current = token_holder_insights.get(
|
|
360
|
+
"first_100_buyers_current_holding", "Unknown"
|
|
361
|
+
)
|
|
362
|
+
first_100_current_pct = token_holder_insights.get(
|
|
363
|
+
"first_100_buyers_current_holding_percentage", "Unknown"
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
# Top holders concentration
|
|
367
|
+
top_10_balance = token_holder_insights.get(
|
|
368
|
+
"top_10_holder_balance", "Unknown"
|
|
369
|
+
)
|
|
370
|
+
top_10_pct = token_holder_insights.get(
|
|
371
|
+
"top_10_holder_percentage", "Unknown"
|
|
372
|
+
)
|
|
373
|
+
top_50_balance = token_holder_insights.get(
|
|
374
|
+
"top_50_holder_balance", "Unknown"
|
|
375
|
+
)
|
|
376
|
+
top_50_pct = token_holder_insights.get(
|
|
377
|
+
"top_50_holder_percentage", "Unknown"
|
|
378
|
+
)
|
|
379
|
+
top_100_balance = token_holder_insights.get(
|
|
380
|
+
"top_100_holder_balance", "Unknown"
|
|
381
|
+
)
|
|
382
|
+
top_100_pct = token_holder_insights.get(
|
|
383
|
+
"top_100_holder_percentage", "Unknown"
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
if total_holders != "Unknown":
|
|
387
|
+
formatted_results += f"Total Holders: {total_holders}\n"
|
|
388
|
+
formatted_results += f"Holder Change 24h: {holder_change_24h}%\n"
|
|
389
|
+
if fifty_percent_wallets != "Unknown":
|
|
390
|
+
formatted_results += (
|
|
391
|
+
f"Wallets Holding 50%: {fifty_percent_wallets}\n"
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
formatted_results += f"First 100 Buyers Initial: {first_100_initial} ({first_100_initial_pct}%)\n"
|
|
395
|
+
formatted_results += f"First 100 Buyers Current: {first_100_current} ({first_100_current_pct}%)\n"
|
|
396
|
+
|
|
397
|
+
formatted_results += (
|
|
398
|
+
f"Top 10 Holders: {top_10_balance} ({top_10_pct}%)\n"
|
|
399
|
+
)
|
|
400
|
+
formatted_results += (
|
|
401
|
+
f"Top 50 Holders: {top_50_balance} ({top_50_pct}%)\n"
|
|
402
|
+
)
|
|
403
|
+
formatted_results += (
|
|
404
|
+
f"Top 100 Holders: {top_100_balance} ({top_100_pct}%)\n\n"
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
# Smart money insights
|
|
408
|
+
if smart_money_insights:
|
|
409
|
+
formatted_results += "### Smart Money Insights\n"
|
|
410
|
+
top_buys = smart_money_insights.get("top_25_holder_buy_24h", "Unknown")
|
|
411
|
+
top_sells = smart_money_insights.get(
|
|
412
|
+
"top_25_holder_sold_24h", "Unknown"
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
formatted_results += f"Top 25 Holders Buy 24h: {top_buys}\n"
|
|
416
|
+
formatted_results += f"Top 25 Holders Sell 24h: {top_sells}\n\n"
|
|
417
|
+
|
|
418
|
+
# Developer Wallet Insights
|
|
419
|
+
if dev_wallet_insights:
|
|
420
|
+
formatted_results += "### Developer Wallet Insights\n"
|
|
421
|
+
wallet_address = dev_wallet_insights.get("wallet_address", "Unknown")
|
|
422
|
+
wallet_balance = dev_wallet_insights.get("wallet_balance", "Unknown")
|
|
423
|
+
wallet_percentage = dev_wallet_insights.get(
|
|
424
|
+
"dev_wallet_total_holding_percentage", "Unknown"
|
|
425
|
+
)
|
|
426
|
+
outflow_txs = dev_wallet_insights.get(
|
|
427
|
+
"dev_wallet_outflow_txs_count_24h", "Unknown"
|
|
428
|
+
)
|
|
429
|
+
outflow_amount = dev_wallet_insights.get(
|
|
430
|
+
"dev_wallet_outflow_amount_24h", "Unknown"
|
|
431
|
+
)
|
|
432
|
+
fresh_wallet = dev_wallet_insights.get("fresh_wallet", False)
|
|
433
|
+
dev_sold = dev_wallet_insights.get("dev_sold", False)
|
|
434
|
+
dev_sold_percentage = dev_wallet_insights.get(
|
|
435
|
+
"dev_sold_percentage", "Unknown"
|
|
436
|
+
)
|
|
437
|
+
bundle_wallet_count = dev_wallet_insights.get(
|
|
438
|
+
"bundle_wallet_count", "Unknown"
|
|
439
|
+
)
|
|
440
|
+
bundle_wallet_supply = dev_wallet_insights.get(
|
|
441
|
+
"bundle_wallet_supply_percentage", "Unknown"
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
formatted_results += f"Developer Wallet: {wallet_address}\n"
|
|
445
|
+
if wallet_balance != "Unknown":
|
|
446
|
+
formatted_results += f"Wallet Balance: {wallet_balance}\n"
|
|
447
|
+
if wallet_percentage != "Unknown":
|
|
448
|
+
formatted_results += f"Wallet Holding %: {wallet_percentage}%\n"
|
|
449
|
+
if outflow_txs != "Unknown":
|
|
450
|
+
formatted_results += f"Outflow Txs 24h: {outflow_txs}\n"
|
|
451
|
+
if outflow_amount != "Unknown":
|
|
452
|
+
formatted_results += f"Outflow Amount 24h: {outflow_amount}\n"
|
|
453
|
+
formatted_results += f"Fresh Wallet: {fresh_wallet}\n"
|
|
454
|
+
formatted_results += f"Dev Has Sold: {dev_sold}\n"
|
|
455
|
+
formatted_results += f"Dev Sold %: {dev_sold_percentage}%\n"
|
|
456
|
+
formatted_results += f"Bundle Wallet Count: {bundle_wallet_count}\n"
|
|
457
|
+
formatted_results += f"Bundle Supply %: {bundle_wallet_supply}%\n\n"
|
|
458
|
+
|
|
459
|
+
# Supply information
|
|
460
|
+
if token_metrics:
|
|
461
|
+
formatted_results += "### Supply Information\n"
|
|
462
|
+
circ_supply = token_metrics.get("circulating_supply", "Unknown")
|
|
463
|
+
total_supply = token_metrics.get("total_supply", "Unknown")
|
|
464
|
+
|
|
465
|
+
formatted_results += f"Circulating Supply: {circ_supply}\n"
|
|
466
|
+
formatted_results += f"Total Supply: {total_supply}\n\n"
|
|
467
|
+
|
|
468
|
+
# Last Updated
|
|
469
|
+
last_updated = token.get("last_updated_at", "Unknown")
|
|
470
|
+
if last_updated != "Unknown":
|
|
471
|
+
formatted_results += f"Last Updated: {last_updated}\n\n"
|
|
472
|
+
|
|
473
|
+
# Add separator between tokens
|
|
474
|
+
formatted_results += "---\n\n"
|
|
475
|
+
|
|
476
|
+
return formatted_results.strip()
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "DappLooker",
|
|
5
|
+
"description": "Retrieve comprehensive market data and analytics for AI agent tokens using DappLooker. This API specializes in AI-focused crypto projects and may not provide data for general cryptocurrencies like BTC or ETH.",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/dapplooker/dapplooker.jpg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Crypto",
|
|
9
|
+
"Market Data",
|
|
10
|
+
"Token Metrics",
|
|
11
|
+
"AI Agents"
|
|
12
|
+
],
|
|
13
|
+
"properties": {
|
|
14
|
+
"enabled": {
|
|
15
|
+
"type": "boolean",
|
|
16
|
+
"title": "Enabled",
|
|
17
|
+
"description": "Whether this skill is enabled",
|
|
18
|
+
"default": true
|
|
19
|
+
},
|
|
20
|
+
"states": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": {
|
|
23
|
+
"dapplooker_token_data": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"title": "AI Token Data",
|
|
26
|
+
"enum": [
|
|
27
|
+
"disabled",
|
|
28
|
+
"public",
|
|
29
|
+
"private"
|
|
30
|
+
],
|
|
31
|
+
"x-enum-title": [
|
|
32
|
+
"Disabled",
|
|
33
|
+
"Agent Owner + All Users",
|
|
34
|
+
"Agent Owner Only"
|
|
35
|
+
],
|
|
36
|
+
"description": "Retrieve detailed market data and analytics for AI-focused tokens by ticker or address",
|
|
37
|
+
"default": "private"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"description": "States for each DappLooker skill (disabled, public, or private)"
|
|
41
|
+
},
|
|
42
|
+
"api_key_provider": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"title": "API Key Provider",
|
|
45
|
+
"description": "Provider of the API key",
|
|
46
|
+
"enum": [
|
|
47
|
+
"platform",
|
|
48
|
+
"agent_owner"
|
|
49
|
+
],
|
|
50
|
+
"x-enum-title": [
|
|
51
|
+
"Nation Hosted",
|
|
52
|
+
"Owner Provided"
|
|
53
|
+
],
|
|
54
|
+
"default": "platform"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"required": [
|
|
58
|
+
"states",
|
|
59
|
+
"enabled"
|
|
60
|
+
],
|
|
61
|
+
"if": {
|
|
62
|
+
"properties": {
|
|
63
|
+
"api_key_provider": {
|
|
64
|
+
"const": "agent_owner"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"then": {
|
|
69
|
+
"properties": {
|
|
70
|
+
"api_key": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"title": "DappLooker API Key",
|
|
73
|
+
"description": "API key for DappLooker service",
|
|
74
|
+
"x-sensitive": true
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"if": {
|
|
78
|
+
"properties": {
|
|
79
|
+
"enabled": {
|
|
80
|
+
"const": true
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"then": {
|
|
85
|
+
"required": [
|
|
86
|
+
"api_key"
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"additionalProperties": true
|
|
91
|
+
}
|