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
|
File without changes
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"""Tool for fetching DEX overview data via DeFi Llama API."""
|
|
2
|
+
|
|
3
|
+
from typing import Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from langchain.schema.runnable import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from intentkit.skills.defillama.api import fetch_dex_overview
|
|
9
|
+
from intentkit.skills.defillama.base import DefiLlamaBaseTool
|
|
10
|
+
|
|
11
|
+
FETCH_DEX_OVERVIEW_PROMPT = """
|
|
12
|
+
This tool fetches comprehensive overview data for DEX protocols from DeFi Llama.
|
|
13
|
+
Returns:
|
|
14
|
+
- Chain statistics and breakdowns
|
|
15
|
+
- Protocol-specific metrics
|
|
16
|
+
- Change percentages
|
|
17
|
+
- Total volume data
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class MethodologyInfo(BaseModel):
|
|
22
|
+
"""Model representing methodology information."""
|
|
23
|
+
|
|
24
|
+
UserFees: Optional[str] = Field(None, description="User fee information")
|
|
25
|
+
Fees: Optional[str] = Field(None, description="Fee structure")
|
|
26
|
+
Revenue: Optional[str] = Field(None, description="Revenue model")
|
|
27
|
+
ProtocolRevenue: Optional[str] = Field(None, description="Protocol revenue info")
|
|
28
|
+
HoldersRevenue: Optional[str] = Field(None, description="Holder revenue info")
|
|
29
|
+
SupplySideRevenue: Optional[str] = Field(
|
|
30
|
+
None, description="Supply side revenue info"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ProtocolInfo(BaseModel):
|
|
35
|
+
"""Model representing individual protocol data."""
|
|
36
|
+
|
|
37
|
+
total24h: Optional[float] = Field(None, description="24h total")
|
|
38
|
+
total48hto24h: Optional[float] = Field(None, description="48h to 24h total")
|
|
39
|
+
total7d: Optional[float] = Field(None, description="7d total")
|
|
40
|
+
total14dto7d: Optional[float] = Field(None, description="14d to 7d total")
|
|
41
|
+
total60dto30d: Optional[float] = Field(None, description="60d to 30d total")
|
|
42
|
+
total30d: Optional[float] = Field(None, description="30d total")
|
|
43
|
+
total1y: Optional[float] = Field(None, description="1y total")
|
|
44
|
+
totalAllTime: Optional[float] = Field(None, description="All time total")
|
|
45
|
+
average1y: Optional[float] = Field(None, description="1y average")
|
|
46
|
+
change_1d: Optional[float] = Field(None, description="1d change")
|
|
47
|
+
change_7d: Optional[float] = Field(None, description="7d change")
|
|
48
|
+
change_1m: Optional[float] = Field(None, description="1m change")
|
|
49
|
+
change_7dover7d: Optional[float] = Field(None, description="7d over 7d change")
|
|
50
|
+
change_30dover30d: Optional[float] = Field(None, description="30d over 30d change")
|
|
51
|
+
breakdown24h: Optional[Dict[str, Dict[str, float]]] = Field(
|
|
52
|
+
None, description="24h breakdown by chain"
|
|
53
|
+
)
|
|
54
|
+
breakdown30d: Optional[Dict[str, Dict[str, float]]] = Field(
|
|
55
|
+
None, description="30d breakdown by chain"
|
|
56
|
+
)
|
|
57
|
+
total7DaysAgo: Optional[float] = Field(None, description="Total 7 days ago")
|
|
58
|
+
total30DaysAgo: Optional[float] = Field(None, description="Total 30 days ago")
|
|
59
|
+
defillamaId: Optional[str] = Field(None, description="DeFi Llama ID")
|
|
60
|
+
name: str = Field(..., description="Protocol name")
|
|
61
|
+
displayName: str = Field(..., description="Display name")
|
|
62
|
+
module: str = Field(..., description="Module name")
|
|
63
|
+
category: str = Field(..., description="Protocol category")
|
|
64
|
+
logo: Optional[str] = Field(None, description="Logo URL")
|
|
65
|
+
chains: List[str] = Field(..., description="Supported chains")
|
|
66
|
+
protocolType: str = Field(..., description="Protocol type")
|
|
67
|
+
methodologyURL: Optional[str] = Field(None, description="Methodology URL")
|
|
68
|
+
methodology: Optional[MethodologyInfo] = Field(
|
|
69
|
+
None, description="Methodology details"
|
|
70
|
+
)
|
|
71
|
+
latestFetchIsOk: bool = Field(..., description="Latest fetch status")
|
|
72
|
+
disabled: Optional[bool] = Field(None, description="Whether protocol is disabled")
|
|
73
|
+
parentProtocol: Optional[str] = Field(None, description="Parent protocol")
|
|
74
|
+
slug: str = Field(..., description="Protocol slug")
|
|
75
|
+
linkedProtocols: Optional[List[str]] = Field(None, description="Linked protocols")
|
|
76
|
+
id: str = Field(..., description="Protocol ID")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class FetchDexOverviewResponse(BaseModel):
|
|
80
|
+
"""Response schema for DEX overview data."""
|
|
81
|
+
|
|
82
|
+
totalDataChart: List = Field(
|
|
83
|
+
default_factory=list, description="Total data chart points"
|
|
84
|
+
)
|
|
85
|
+
totalDataChartBreakdown: List = Field(
|
|
86
|
+
default_factory=list, description="Total data chart breakdown"
|
|
87
|
+
)
|
|
88
|
+
breakdown24h: Optional[Dict[str, Dict[str, float]]] = Field(
|
|
89
|
+
None, description="24h breakdown by chain"
|
|
90
|
+
)
|
|
91
|
+
breakdown30d: Optional[Dict[str, Dict[str, float]]] = Field(
|
|
92
|
+
None, description="30d breakdown by chain"
|
|
93
|
+
)
|
|
94
|
+
chain: Optional[str] = Field(None, description="Specific chain")
|
|
95
|
+
allChains: List[str] = Field(..., description="List of all chains")
|
|
96
|
+
total24h: float = Field(..., description="24h total")
|
|
97
|
+
total48hto24h: float = Field(..., description="48h to 24h total")
|
|
98
|
+
total7d: float = Field(..., description="7d total")
|
|
99
|
+
total14dto7d: float = Field(..., description="14d to 7d total")
|
|
100
|
+
total60dto30d: float = Field(..., description="60d to 30d total")
|
|
101
|
+
total30d: float = Field(..., description="30d total")
|
|
102
|
+
total1y: float = Field(..., description="1y total")
|
|
103
|
+
change_1d: float = Field(..., description="1d change")
|
|
104
|
+
change_7d: float = Field(..., description="7d change")
|
|
105
|
+
change_1m: float = Field(..., description="1m change")
|
|
106
|
+
change_7dover7d: float = Field(..., description="7d over 7d change")
|
|
107
|
+
change_30dover30d: float = Field(..., description="30d over 30d change")
|
|
108
|
+
total7DaysAgo: float = Field(..., description="Total 7 days ago")
|
|
109
|
+
total30DaysAgo: float = Field(..., description="Total 30 days ago")
|
|
110
|
+
protocols: List[ProtocolInfo] = Field(..., description="List of protocol data")
|
|
111
|
+
error: Optional[str] = Field(None, description="Error message if any")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class DefiLlamaFetchDexOverview(DefiLlamaBaseTool):
|
|
115
|
+
"""Tool for fetching DEX overview data from DeFi Llama.
|
|
116
|
+
|
|
117
|
+
This tool retrieves comprehensive data about DEX protocols, including
|
|
118
|
+
volumes, metrics, and chain breakdowns.
|
|
119
|
+
|
|
120
|
+
Example:
|
|
121
|
+
overview_tool = DefiLlamaFetchDexOverview(
|
|
122
|
+
skill_store=store,
|
|
123
|
+
agent_id="agent_123",
|
|
124
|
+
agent_store=agent_store
|
|
125
|
+
)
|
|
126
|
+
result = await overview_tool._arun()
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
name: str = "defillama_fetch_dex_overview"
|
|
130
|
+
description: str = FETCH_DEX_OVERVIEW_PROMPT
|
|
131
|
+
args_schema: None = None # No input parameters needed
|
|
132
|
+
|
|
133
|
+
async def _arun(self, config: RunnableConfig) -> FetchDexOverviewResponse:
|
|
134
|
+
"""Fetch DEX overview data.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
FetchDexOverviewResponse containing overview data or error
|
|
138
|
+
"""
|
|
139
|
+
try:
|
|
140
|
+
# Check rate limiting
|
|
141
|
+
context = self.context_from_config(config)
|
|
142
|
+
is_rate_limited, error_msg = await self.check_rate_limit(context)
|
|
143
|
+
if is_rate_limited:
|
|
144
|
+
return FetchDexOverviewResponse(error=error_msg)
|
|
145
|
+
|
|
146
|
+
# Fetch overview data from API
|
|
147
|
+
result = await fetch_dex_overview()
|
|
148
|
+
|
|
149
|
+
# Check for API errors
|
|
150
|
+
if isinstance(result, dict) and "error" in result:
|
|
151
|
+
return FetchDexOverviewResponse(error=result["error"])
|
|
152
|
+
|
|
153
|
+
# Return the response matching the API structure
|
|
154
|
+
return FetchDexOverviewResponse(**result)
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
return FetchDexOverviewResponse(error=str(e))
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Tool for fetching DEX protocol summary data via DeFi Llama API."""
|
|
2
|
+
|
|
3
|
+
from typing import Dict, List, Optional, Type
|
|
4
|
+
|
|
5
|
+
from langchain.schema.runnable import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from intentkit.skills.defillama.api import fetch_dex_summary
|
|
9
|
+
from intentkit.skills.defillama.base import DefiLlamaBaseTool
|
|
10
|
+
|
|
11
|
+
FETCH_DEX_SUMMARY_PROMPT = """
|
|
12
|
+
This tool fetches summary data for a specific DEX protocol from DeFi Llama.
|
|
13
|
+
Required:
|
|
14
|
+
- Protocol identifier
|
|
15
|
+
Returns:
|
|
16
|
+
- Protocol details and metadata
|
|
17
|
+
- Volume metrics
|
|
18
|
+
- Social links and identifiers
|
|
19
|
+
- Child protocols and versions
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FetchDexSummaryInput(BaseModel):
|
|
24
|
+
"""Input schema for fetching DEX protocol summary."""
|
|
25
|
+
|
|
26
|
+
protocol: str = Field(..., description="Protocol identifier (e.g. 'uniswap')")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class FetchDexSummaryResponse(BaseModel):
|
|
30
|
+
"""Response schema for DEX protocol summary data."""
|
|
31
|
+
|
|
32
|
+
id: str = Field(..., description="Protocol ID")
|
|
33
|
+
name: str = Field(..., description="Protocol name")
|
|
34
|
+
url: Optional[str] = Field(None, description="Protocol website URL")
|
|
35
|
+
description: Optional[str] = Field(None, description="Protocol description")
|
|
36
|
+
logo: Optional[str] = Field(None, description="Logo URL")
|
|
37
|
+
gecko_id: Optional[str] = Field(None, description="CoinGecko ID")
|
|
38
|
+
cmcId: Optional[str] = Field(None, description="CoinMarketCap ID")
|
|
39
|
+
chains: List[str] = Field(default_factory=list, description="Supported chains")
|
|
40
|
+
twitter: Optional[str] = Field(None, description="Twitter handle")
|
|
41
|
+
treasury: Optional[str] = Field(None, description="Treasury identifier")
|
|
42
|
+
governanceID: Optional[List[str]] = Field(None, description="Governance IDs")
|
|
43
|
+
github: Optional[List[str]] = Field(None, description="GitHub organizations")
|
|
44
|
+
childProtocols: Optional[List[str]] = Field(None, description="Child protocols")
|
|
45
|
+
linkedProtocols: Optional[List[str]] = Field(None, description="Linked protocols")
|
|
46
|
+
disabled: Optional[bool] = Field(None, description="Whether protocol is disabled")
|
|
47
|
+
displayName: str = Field(..., description="Display name")
|
|
48
|
+
module: Optional[str] = Field(None, description="Module name")
|
|
49
|
+
category: Optional[str] = Field(None, description="Protocol category")
|
|
50
|
+
methodologyURL: Optional[str] = Field(None, description="Methodology URL")
|
|
51
|
+
methodology: Optional[Dict] = Field(None, description="Methodology details")
|
|
52
|
+
forkedFrom: Optional[List[str]] = Field(None, description="Forked from protocols")
|
|
53
|
+
audits: Optional[str] = Field(None, description="Audit information")
|
|
54
|
+
address: Optional[str] = Field(None, description="Contract address")
|
|
55
|
+
audit_links: Optional[List[str]] = Field(None, description="Audit links")
|
|
56
|
+
versionKey: Optional[str] = Field(None, description="Version key")
|
|
57
|
+
parentProtocol: Optional[str] = Field(None, description="Parent protocol")
|
|
58
|
+
previousNames: Optional[List[str]] = Field(None, description="Previous names")
|
|
59
|
+
latestFetchIsOk: bool = Field(..., description="Latest fetch status")
|
|
60
|
+
slug: str = Field(..., description="Protocol slug")
|
|
61
|
+
protocolType: str = Field(..., description="Protocol type")
|
|
62
|
+
total24h: Optional[float] = Field(None, description="24h total volume")
|
|
63
|
+
total48hto24h: Optional[float] = Field(None, description="48h to 24h total volume")
|
|
64
|
+
total7d: Optional[float] = Field(None, description="7d total volume")
|
|
65
|
+
totalAllTime: Optional[float] = Field(None, description="All time total volume")
|
|
66
|
+
totalDataChart: List = Field(default_factory=list, description="Total data chart")
|
|
67
|
+
totalDataChartBreakdown: List = Field(
|
|
68
|
+
default_factory=list, description="Chart breakdown"
|
|
69
|
+
)
|
|
70
|
+
change_1d: Optional[float] = Field(None, description="1d change percentage")
|
|
71
|
+
error: Optional[str] = Field(None, description="Error message if any")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class DefiLlamaFetchDexSummary(DefiLlamaBaseTool):
|
|
75
|
+
"""Tool for fetching DEX protocol summary data from DeFi Llama.
|
|
76
|
+
|
|
77
|
+
This tool retrieves detailed information about a specific DEX protocol,
|
|
78
|
+
including metadata, metrics, and related protocols.
|
|
79
|
+
|
|
80
|
+
Example:
|
|
81
|
+
summary_tool = DefiLlamaFetchDexSummary(
|
|
82
|
+
skill_store=store,
|
|
83
|
+
agent_id="agent_123",
|
|
84
|
+
agent_store=agent_store
|
|
85
|
+
)
|
|
86
|
+
result = await summary_tool._arun(protocol="uniswap")
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
name: str = "defillama_fetch_dex_summary"
|
|
90
|
+
description: str = FETCH_DEX_SUMMARY_PROMPT
|
|
91
|
+
args_schema: Type[BaseModel] = FetchDexSummaryInput
|
|
92
|
+
|
|
93
|
+
async def _arun(
|
|
94
|
+
self, config: RunnableConfig, protocol: str
|
|
95
|
+
) -> FetchDexSummaryResponse:
|
|
96
|
+
"""Fetch summary data for the given DEX protocol.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
config: Runnable configuration
|
|
100
|
+
protocol: Protocol identifier
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
FetchDexSummaryResponse containing protocol data or error
|
|
104
|
+
"""
|
|
105
|
+
try:
|
|
106
|
+
# Check rate limiting
|
|
107
|
+
context = self.context_from_config(config)
|
|
108
|
+
is_rate_limited, error_msg = await self.check_rate_limit(context)
|
|
109
|
+
if is_rate_limited:
|
|
110
|
+
return FetchDexSummaryResponse(error=error_msg)
|
|
111
|
+
|
|
112
|
+
# Fetch protocol data from API
|
|
113
|
+
result = await fetch_dex_summary(protocol=protocol)
|
|
114
|
+
|
|
115
|
+
# Check for API errors
|
|
116
|
+
if isinstance(result, dict) and "error" in result:
|
|
117
|
+
return FetchDexSummaryResponse(error=result["error"])
|
|
118
|
+
|
|
119
|
+
# Return the response matching the API structure
|
|
120
|
+
return FetchDexSummaryResponse(**result)
|
|
121
|
+
|
|
122
|
+
except Exception as e:
|
|
123
|
+
return FetchDexSummaryResponse(error=str(e))
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""Tool for fetching options overview data via DeFi Llama API."""
|
|
2
|
+
|
|
3
|
+
from typing import Dict, List, Optional, Type
|
|
4
|
+
|
|
5
|
+
from langchain.schema.runnable import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from intentkit.skills.defillama.api import fetch_options_overview
|
|
9
|
+
from intentkit.skills.defillama.base import DefiLlamaBaseTool
|
|
10
|
+
|
|
11
|
+
FETCH_OPTIONS_OVERVIEW_PROMPT = """
|
|
12
|
+
This tool fetches comprehensive overview data for all options protocols from DeFi Llama.
|
|
13
|
+
Returns detailed metrics including:
|
|
14
|
+
- Total volumes across different timeframes
|
|
15
|
+
- Change percentages
|
|
16
|
+
- Protocol-specific data
|
|
17
|
+
- Chain breakdowns
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ProtocolMethodology(BaseModel):
|
|
22
|
+
"""Model representing protocol methodology data."""
|
|
23
|
+
|
|
24
|
+
UserFees: Optional[str] = Field(None, description="User fees description")
|
|
25
|
+
Fees: Optional[str] = Field(None, description="Fees description")
|
|
26
|
+
Revenue: Optional[str] = Field(None, description="Revenue description")
|
|
27
|
+
ProtocolRevenue: Optional[str] = Field(
|
|
28
|
+
None, description="Protocol revenue description"
|
|
29
|
+
)
|
|
30
|
+
HoldersRevenue: Optional[str] = Field(
|
|
31
|
+
None, description="Holders revenue description"
|
|
32
|
+
)
|
|
33
|
+
SupplySideRevenue: Optional[str] = Field(
|
|
34
|
+
None, description="Supply side revenue description"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Protocol(BaseModel):
|
|
39
|
+
"""Model representing protocol data."""
|
|
40
|
+
|
|
41
|
+
name: str = Field(..., description="Protocol name")
|
|
42
|
+
displayName: str = Field(..., description="Display name of protocol")
|
|
43
|
+
defillamaId: str = Field(..., description="DeFi Llama ID")
|
|
44
|
+
category: str = Field(..., description="Protocol category")
|
|
45
|
+
logo: str = Field(..., description="Logo URL")
|
|
46
|
+
chains: List[str] = Field(..., description="Supported chains")
|
|
47
|
+
module: str = Field(..., description="Protocol module")
|
|
48
|
+
total24h: Optional[float] = Field(None, description="24-hour total")
|
|
49
|
+
total7d: Optional[float] = Field(None, description="7-day total")
|
|
50
|
+
total30d: Optional[float] = Field(None, description="30-day total")
|
|
51
|
+
total1y: Optional[float] = Field(None, description="1-year total")
|
|
52
|
+
totalAllTime: Optional[float] = Field(None, description="All-time total")
|
|
53
|
+
change_1d: Optional[float] = Field(None, description="24-hour change percentage")
|
|
54
|
+
change_7d: Optional[float] = Field(None, description="7-day change percentage")
|
|
55
|
+
change_1m: Optional[float] = Field(None, description="30-day change percentage")
|
|
56
|
+
methodology: Optional[ProtocolMethodology] = Field(
|
|
57
|
+
None, description="Protocol methodology"
|
|
58
|
+
)
|
|
59
|
+
breakdown24h: Optional[Dict[str, Dict[str, float]]] = Field(
|
|
60
|
+
None, description="24-hour breakdown by chain"
|
|
61
|
+
)
|
|
62
|
+
breakdown30d: Optional[Dict[str, Dict[str, float]]] = Field(
|
|
63
|
+
None, description="30-day breakdown by chain"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class FetchOptionsOverviewResponse(BaseModel):
|
|
68
|
+
"""Response schema for options overview data."""
|
|
69
|
+
|
|
70
|
+
total24h: float = Field(..., description="Total volume in last 24 hours")
|
|
71
|
+
total7d: float = Field(..., description="Total volume in last 7 days")
|
|
72
|
+
total30d: float = Field(..., description="Total volume in last 30 days")
|
|
73
|
+
total1y: float = Field(..., description="Total volume in last year")
|
|
74
|
+
change_1d: float = Field(..., description="24-hour change percentage")
|
|
75
|
+
change_7d: float = Field(..., description="7-day change percentage")
|
|
76
|
+
change_1m: float = Field(..., description="30-day change percentage")
|
|
77
|
+
allChains: List[str] = Field(..., description="List of all chains")
|
|
78
|
+
protocols: List[Protocol] = Field(..., description="List of protocols")
|
|
79
|
+
error: Optional[str] = Field(None, description="Error message if any")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class DefiLlamaFetchOptionsOverview(DefiLlamaBaseTool):
|
|
83
|
+
"""Tool for fetching options overview data from DeFi Llama.
|
|
84
|
+
|
|
85
|
+
This tool retrieves comprehensive data about all options protocols,
|
|
86
|
+
including volume metrics, change percentages, and detailed protocol information.
|
|
87
|
+
|
|
88
|
+
Example:
|
|
89
|
+
overview_tool = DefiLlamaFetchOptionsOverview(
|
|
90
|
+
skill_store=store,
|
|
91
|
+
agent_id="agent_123",
|
|
92
|
+
agent_store=agent_store
|
|
93
|
+
)
|
|
94
|
+
result = await overview_tool._arun()
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
name: str = "defillama_fetch_options_overview"
|
|
98
|
+
description: str = FETCH_OPTIONS_OVERVIEW_PROMPT
|
|
99
|
+
|
|
100
|
+
class EmptyArgsSchema(BaseModel):
|
|
101
|
+
"""Empty schema for no input parameters."""
|
|
102
|
+
|
|
103
|
+
pass
|
|
104
|
+
|
|
105
|
+
args_schema: Type[BaseModel] = EmptyArgsSchema
|
|
106
|
+
|
|
107
|
+
async def _arun(self, config: RunnableConfig) -> FetchOptionsOverviewResponse:
|
|
108
|
+
"""Fetch overview data for all options protocols.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
FetchOptionsOverviewResponse containing comprehensive overview data or error
|
|
112
|
+
"""
|
|
113
|
+
try:
|
|
114
|
+
# Check rate limiting
|
|
115
|
+
context = self.context_from_config(config)
|
|
116
|
+
is_rate_limited, error_msg = await self.check_rate_limit(context)
|
|
117
|
+
if is_rate_limited:
|
|
118
|
+
return FetchOptionsOverviewResponse(error=error_msg)
|
|
119
|
+
|
|
120
|
+
# Fetch overview data from API
|
|
121
|
+
result = await fetch_options_overview()
|
|
122
|
+
|
|
123
|
+
# Check for API errors
|
|
124
|
+
if isinstance(result, dict) and "error" in result:
|
|
125
|
+
return FetchOptionsOverviewResponse(error=result["error"])
|
|
126
|
+
|
|
127
|
+
# Return the parsed response
|
|
128
|
+
return FetchOptionsOverviewResponse(**result)
|
|
129
|
+
|
|
130
|
+
except Exception as e:
|
|
131
|
+
return FetchOptionsOverviewResponse(error=str(e))
|
|
File without changes
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Tool for fetching pool chart data via DeFi Llama API."""
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional, Type
|
|
4
|
+
|
|
5
|
+
from langchain_core.runnables import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from intentkit.skills.defillama.api import fetch_pool_chart
|
|
9
|
+
from intentkit.skills.defillama.base import DefiLlamaBaseTool
|
|
10
|
+
|
|
11
|
+
FETCH_POOL_CHART_PROMPT = """
|
|
12
|
+
This tool fetches historical chart data from DeFi Llama for a specific pool.
|
|
13
|
+
Required:
|
|
14
|
+
- Pool ID
|
|
15
|
+
Returns historical data including:
|
|
16
|
+
- TVL in USD
|
|
17
|
+
- APY metrics (base, reward, total)
|
|
18
|
+
- Timestamps for each data point
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PoolDataPoint(BaseModel):
|
|
23
|
+
"""Model representing a single historical data point."""
|
|
24
|
+
|
|
25
|
+
timestamp: str = Field(..., description="ISO formatted timestamp of the data point")
|
|
26
|
+
tvlUsd: float = Field(..., description="Total Value Locked in USD")
|
|
27
|
+
apy: Optional[float] = Field(None, description="Total APY including rewards")
|
|
28
|
+
apyBase: Optional[float] = Field(None, description="Base APY without rewards")
|
|
29
|
+
apyReward: Optional[float] = Field(None, description="Additional APY from rewards")
|
|
30
|
+
il7d: Optional[float] = Field(None, description="7-day impermanent loss")
|
|
31
|
+
apyBase7d: Optional[float] = Field(None, description="7-day base APY")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class FetchPoolChartInput(BaseModel):
|
|
35
|
+
"""Input schema for fetching pool chart data."""
|
|
36
|
+
|
|
37
|
+
pool_id: str = Field(..., description="ID of the pool to fetch chart data for")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class FetchPoolChartResponse(BaseModel):
|
|
41
|
+
"""Response schema for pool chart data."""
|
|
42
|
+
|
|
43
|
+
status: str = Field("success", description="Response status")
|
|
44
|
+
data: List[PoolDataPoint] = Field(
|
|
45
|
+
default_factory=list, description="List of historical data points"
|
|
46
|
+
)
|
|
47
|
+
error: Optional[str] = Field(None, description="Error message if any")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class DefiLlamaFetchPoolChart(DefiLlamaBaseTool):
|
|
51
|
+
"""Tool for fetching pool chart data from DeFi Llama.
|
|
52
|
+
|
|
53
|
+
This tool retrieves historical data for a specific pool, including
|
|
54
|
+
TVL and APY metrics over time.
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
chart_tool = DefiLlamaFetchPoolChart(
|
|
58
|
+
skill_store=store,
|
|
59
|
+
agent_id="agent_123",
|
|
60
|
+
agent_store=agent_store
|
|
61
|
+
)
|
|
62
|
+
result = await chart_tool._arun(
|
|
63
|
+
pool_id="747c1d2a-c668-4682-b9f9-296708a3dd90"
|
|
64
|
+
)
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
name: str = "defillama_fetch_pool_chart"
|
|
68
|
+
description: str = FETCH_POOL_CHART_PROMPT
|
|
69
|
+
args_schema: Type[BaseModel] = FetchPoolChartInput
|
|
70
|
+
|
|
71
|
+
async def _arun(
|
|
72
|
+
self, config: RunnableConfig, pool_id: str
|
|
73
|
+
) -> FetchPoolChartResponse:
|
|
74
|
+
"""Fetch historical chart data for the given pool.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
pool_id: ID of the pool to fetch chart data for
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
FetchPoolChartResponse containing historical data or error
|
|
81
|
+
"""
|
|
82
|
+
try:
|
|
83
|
+
# Check rate limiting
|
|
84
|
+
context = self.context_from_config(config)
|
|
85
|
+
is_rate_limited, error_msg = await self.check_rate_limit(context)
|
|
86
|
+
if is_rate_limited:
|
|
87
|
+
return FetchPoolChartResponse(error=error_msg)
|
|
88
|
+
|
|
89
|
+
# Fetch chart data from API
|
|
90
|
+
result = await fetch_pool_chart(pool_id=pool_id)
|
|
91
|
+
|
|
92
|
+
# Check for API errors
|
|
93
|
+
if isinstance(result, dict) and "error" in result:
|
|
94
|
+
return FetchPoolChartResponse(error=result["error"])
|
|
95
|
+
|
|
96
|
+
# Return the response matching the API structure
|
|
97
|
+
return FetchPoolChartResponse(**result)
|
|
98
|
+
|
|
99
|
+
except Exception as e:
|
|
100
|
+
return FetchPoolChartResponse(error=str(e))
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""Tool for fetching pool data via DeFi Llama API."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from langchain.schema.runnable import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from intentkit.skills.defillama.api import fetch_pools
|
|
9
|
+
from intentkit.skills.defillama.base import DefiLlamaBaseTool
|
|
10
|
+
|
|
11
|
+
FETCH_POOLS_PROMPT = """
|
|
12
|
+
This tool fetches comprehensive data about yield-generating pools from DeFi Llama.
|
|
13
|
+
Returns data including:
|
|
14
|
+
- Pool details (chain, project, symbol)
|
|
15
|
+
- TVL and APY information
|
|
16
|
+
- Statistical metrics (mean, standard deviation)
|
|
17
|
+
- Risk assessments and predictions
|
|
18
|
+
- Historical performance data
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PredictionData(BaseModel):
|
|
23
|
+
"""Model representing prediction data for a pool."""
|
|
24
|
+
|
|
25
|
+
predictedClass: Optional[str] = Field(
|
|
26
|
+
None, description="Predicted direction of APY movement"
|
|
27
|
+
)
|
|
28
|
+
predictedProbability: Optional[float] = Field(
|
|
29
|
+
None, description="Probability of the prediction"
|
|
30
|
+
)
|
|
31
|
+
binnedConfidence: Optional[int] = Field(None, description="Confidence level bucket")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class PoolData(BaseModel):
|
|
35
|
+
"""Model representing a single pool's data."""
|
|
36
|
+
|
|
37
|
+
chain: str = Field(..., description="Blockchain network")
|
|
38
|
+
project: str = Field(..., description="Protocol or project name")
|
|
39
|
+
symbol: str = Field(..., description="Token or pool symbol")
|
|
40
|
+
tvlUsd: float = Field(..., description="Total Value Locked in USD")
|
|
41
|
+
apyBase: Optional[float] = Field(None, description="Base APY without rewards")
|
|
42
|
+
apyReward: Optional[float] = Field(None, description="Additional APY from rewards")
|
|
43
|
+
apy: Optional[float] = Field(None, description="Total APY including rewards")
|
|
44
|
+
rewardTokens: Optional[list[str]] = Field(
|
|
45
|
+
None, description="List of reward token addresses"
|
|
46
|
+
)
|
|
47
|
+
pool: Optional[str] = Field(None, description="Pool identifier")
|
|
48
|
+
apyPct1D: Optional[float] = Field(None, description="1-day APY percentage change")
|
|
49
|
+
apyPct7D: Optional[float] = Field(None, description="7-day APY percentage change")
|
|
50
|
+
apyPct30D: Optional[float] = Field(None, description="30-day APY percentage change")
|
|
51
|
+
stablecoin: bool = Field(False, description="Whether pool involves stablecoins")
|
|
52
|
+
ilRisk: str = Field("no", description="Impermanent loss risk assessment")
|
|
53
|
+
exposure: str = Field("single", description="Asset exposure type")
|
|
54
|
+
predictions: Optional[PredictionData] = Field(
|
|
55
|
+
None, description="APY movement predictions"
|
|
56
|
+
)
|
|
57
|
+
poolMeta: Optional[str] = Field(None, description="Additional pool metadata")
|
|
58
|
+
mu: Optional[float] = Field(None, description="Mean APY value")
|
|
59
|
+
sigma: Optional[float] = Field(None, description="APY standard deviation")
|
|
60
|
+
count: Optional[int] = Field(None, description="Number of data points")
|
|
61
|
+
outlier: bool = Field(False, description="Whether pool is an outlier")
|
|
62
|
+
underlyingTokens: Optional[list[str]] = Field(
|
|
63
|
+
None, description="List of underlying token addresses"
|
|
64
|
+
)
|
|
65
|
+
il7d: Optional[float] = Field(None, description="7-day impermanent loss")
|
|
66
|
+
apyBase7d: Optional[float] = Field(None, description="7-day base APY")
|
|
67
|
+
apyMean30d: Optional[float] = Field(None, description="30-day mean APY")
|
|
68
|
+
volumeUsd1d: Optional[float] = Field(None, description="24h volume in USD")
|
|
69
|
+
volumeUsd7d: Optional[float] = Field(None, description="7-day volume in USD")
|
|
70
|
+
apyBaseInception: Optional[float] = Field(
|
|
71
|
+
None, description="Base APY since inception"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class FetchPoolsResponse(BaseModel):
|
|
76
|
+
"""Response schema for pool data."""
|
|
77
|
+
|
|
78
|
+
status: str = Field("success", description="Response status")
|
|
79
|
+
data: list[PoolData] = Field(default_factory=list, description="List of pool data")
|
|
80
|
+
error: Optional[str] = Field(None, description="Error message if any")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class DefiLlamaFetchPools(DefiLlamaBaseTool):
|
|
84
|
+
"""Tool for fetching pool data from DeFi Llama.
|
|
85
|
+
|
|
86
|
+
This tool retrieves comprehensive data about yield-generating pools,
|
|
87
|
+
including TVL, APYs, risk metrics, and predictions.
|
|
88
|
+
|
|
89
|
+
Example:
|
|
90
|
+
pools_tool = DefiLlamaFetchPools(
|
|
91
|
+
skill_store=store,
|
|
92
|
+
agent_id="agent_123",
|
|
93
|
+
agent_store=agent_store
|
|
94
|
+
)
|
|
95
|
+
result = await pools_tool._arun()
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
name: str = "defillama_fetch_pools"
|
|
99
|
+
description: str = FETCH_POOLS_PROMPT
|
|
100
|
+
args_schema: None = None # No input parameters needed
|
|
101
|
+
|
|
102
|
+
async def _arun(self, config: RunnableConfig) -> FetchPoolsResponse:
|
|
103
|
+
"""Fetch pool data.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
FetchPoolsResponse containing pool data or error
|
|
107
|
+
"""
|
|
108
|
+
try:
|
|
109
|
+
# Check rate limiting
|
|
110
|
+
context = self.context_from_config(config)
|
|
111
|
+
is_rate_limited, error_msg = await self.check_rate_limit(context)
|
|
112
|
+
if is_rate_limited:
|
|
113
|
+
return FetchPoolsResponse(error=error_msg)
|
|
114
|
+
|
|
115
|
+
# Fetch pool data from API
|
|
116
|
+
result = await fetch_pools()
|
|
117
|
+
|
|
118
|
+
# Check for API errors
|
|
119
|
+
if isinstance(result, dict) and "error" in result:
|
|
120
|
+
return FetchPoolsResponse(error=result["error"])
|
|
121
|
+
|
|
122
|
+
# Return the response matching the API structure
|
|
123
|
+
return FetchPoolsResponse(**result)
|
|
124
|
+
|
|
125
|
+
except Exception as e:
|
|
126
|
+
return FetchPoolsResponse(error=str(e))
|