intentkit 0.8.17.dev1__py3-none-any.whl → 0.8.17.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of intentkit might be problematic. Click here for more details.
- intentkit/__init__.py +1 -1
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +6 -5
- intentkit/abstracts/skill.py +5 -5
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/cdp.py +19 -77
- intentkit/clients/twitter.py +26 -34
- intentkit/clients/web3.py +1 -3
- intentkit/config/config.py +4 -0
- intentkit/core/agent.py +15 -15
- intentkit/core/asset.py +1 -2
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +19 -20
- intentkit/core/engine.py +2 -4
- intentkit/core/node.py +2 -1
- intentkit/core/prompt.py +3 -4
- intentkit/core/scheduler.py +1 -1
- intentkit/core/statistics.py +6 -7
- intentkit/models/agent.py +125 -92
- intentkit/models/agent_data.py +62 -36
- intentkit/models/app_setting.py +6 -6
- intentkit/models/chat.py +27 -24
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +62 -64
- intentkit/models/db.py +8 -7
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.py +12 -14
- intentkit/models/redis.py +2 -3
- intentkit/models/skill.py +25 -27
- intentkit/models/user.py +21 -22
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +1 -3
- intentkit/skills/aixbt/base.py +1 -3
- intentkit/skills/aixbt/projects.py +13 -13
- intentkit/skills/allora/base.py +1 -3
- intentkit/skills/allora/price.py +2 -3
- intentkit/skills/base.py +15 -22
- intentkit/skills/basename/__init__.py +3 -5
- intentkit/skills/carv/__init__.py +7 -8
- intentkit/skills/carv/base.py +6 -6
- intentkit/skills/carv/fetch_news.py +3 -3
- intentkit/skills/carv/onchain_query.py +4 -4
- intentkit/skills/carv/token_info_and_price.py +5 -5
- intentkit/skills/casino/base.py +1 -3
- intentkit/skills/casino/deck_draw.py +1 -2
- intentkit/skills/casino/deck_shuffle.py +1 -2
- intentkit/skills/casino/dice_roll.py +1 -2
- intentkit/skills/cdp/__init__.py +3 -5
- intentkit/skills/cdp/base.py +1 -3
- intentkit/skills/chainlist/base.py +1 -3
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/common/base.py +1 -3
- intentkit/skills/common/current_time.py +1 -2
- intentkit/skills/cookiefun/base.py +1 -2
- intentkit/skills/cookiefun/get_account_details.py +7 -7
- intentkit/skills/cookiefun/get_account_feed.py +19 -19
- intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
- intentkit/skills/cookiefun/get_sectors.py +3 -3
- intentkit/skills/cookiefun/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +6 -6
- intentkit/skills/cryptocompare/fetch_news.py +3 -4
- intentkit/skills/cryptocompare/fetch_price.py +5 -6
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +3 -4
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +3 -4
- intentkit/skills/cryptocompare/fetch_top_volume.py +3 -4
- intentkit/skills/cryptocompare/fetch_trading_signals.py +4 -5
- intentkit/skills/cryptopanic/__init__.py +4 -4
- intentkit/skills/cryptopanic/base.py +1 -3
- intentkit/skills/cryptopanic/fetch_crypto_news.py +3 -5
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +3 -3
- intentkit/skills/dapplooker/base.py +1 -3
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +5 -6
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +6 -8
- intentkit/skills/defillama/coins/fetch_block.py +4 -6
- intentkit/skills/defillama/coins/fetch_current_prices.py +6 -8
- intentkit/skills/defillama/coins/fetch_first_price.py +5 -7
- intentkit/skills/defillama/coins/fetch_historical_prices.py +7 -9
- intentkit/skills/defillama/coins/fetch_price_chart.py +7 -9
- intentkit/skills/defillama/coins/fetch_price_percentage.py +5 -7
- intentkit/skills/defillama/config/chains.py +1 -3
- intentkit/skills/defillama/fees/fetch_fees_overview.py +22 -24
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +14 -16
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +6 -8
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +3 -5
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +5 -7
- intentkit/skills/defillama/tests/api_integration.test.py +1 -1
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +2 -4
- intentkit/skills/defillama/tvl/fetch_chains.py +7 -9
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +2 -4
- intentkit/skills/defillama/tvl/fetch_protocol.py +30 -36
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +1 -3
- intentkit/skills/defillama/tvl/fetch_protocols.py +35 -43
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +40 -46
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +33 -35
- intentkit/skills/defillama/volumes/fetch_options_overview.py +22 -26
- intentkit/skills/defillama/yields/fetch_pool_chart.py +8 -10
- intentkit/skills/defillama/yields/fetch_pools.py +24 -28
- intentkit/skills/dexscreener/__init__.py +2 -2
- intentkit/skills/dexscreener/base.py +3 -3
- intentkit/skills/dexscreener/get_pair_info.py +2 -2
- intentkit/skills/dexscreener/get_token_pairs.py +2 -2
- intentkit/skills/dexscreener/get_tokens_info.py +5 -5
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/search_token.py +182 -182
- intentkit/skills/dexscreener/utils.py +15 -14
- intentkit/skills/dune_analytics/__init__.py +4 -4
- intentkit/skills/dune_analytics/base.py +1 -3
- intentkit/skills/dune_analytics/fetch_kol_buys.py +4 -4
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +5 -5
- intentkit/skills/elfa/base.py +1 -3
- intentkit/skills/elfa/mention.py +19 -21
- intentkit/skills/elfa/stats.py +4 -4
- intentkit/skills/elfa/tokens.py +12 -12
- intentkit/skills/elfa/utils.py +25 -27
- intentkit/skills/enso/__init__.py +2 -2
- intentkit/skills/enso/base.py +5 -8
- intentkit/skills/enso/best_yield.py +4 -6
- intentkit/skills/enso/networks.py +1 -2
- intentkit/skills/enso/prices.py +1 -3
- intentkit/skills/enso/route.py +1 -3
- intentkit/skills/enso/tokens.py +1 -3
- intentkit/skills/enso/wallet.py +5 -5
- intentkit/skills/erc20/__init__.py +4 -6
- intentkit/skills/erc721/__init__.py +4 -6
- intentkit/skills/firecrawl/base.py +1 -3
- intentkit/skills/firecrawl/clear.py +1 -2
- intentkit/skills/firecrawl/crawl.py +9 -10
- intentkit/skills/firecrawl/query.py +1 -2
- intentkit/skills/firecrawl/scrape.py +7 -8
- intentkit/skills/firecrawl/utils.py +13 -13
- intentkit/skills/github/base.py +1 -3
- intentkit/skills/github/github_search.py +1 -2
- intentkit/skills/heurist/base.py +1 -3
- intentkit/skills/heurist/image_generation_animagine_xl.py +7 -8
- intentkit/skills/heurist/image_generation_arthemy_comics.py +7 -8
- intentkit/skills/heurist/image_generation_arthemy_real.py +7 -8
- intentkit/skills/heurist/image_generation_braindance.py +7 -8
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +7 -8
- intentkit/skills/heurist/image_generation_flux_1_dev.py +7 -8
- intentkit/skills/heurist/image_generation_sdxl.py +7 -8
- intentkit/skills/http/base.py +1 -3
- intentkit/skills/http/get.py +7 -7
- intentkit/skills/http/post.py +9 -9
- intentkit/skills/http/put.py +9 -9
- intentkit/skills/lifi/__init__.py +4 -4
- intentkit/skills/lifi/base.py +1 -3
- intentkit/skills/lifi/token_execute.py +13 -13
- intentkit/skills/lifi/token_quote.py +6 -6
- intentkit/skills/lifi/utils.py +16 -16
- intentkit/skills/moralis/__init__.py +3 -3
- intentkit/skills/moralis/api.py +6 -7
- intentkit/skills/moralis/base.py +2 -4
- intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
- intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
- intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
- intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
- intentkit/skills/morpho/__init__.py +4 -6
- intentkit/skills/nation/__init__.py +2 -2
- intentkit/skills/nation/base.py +1 -3
- intentkit/skills/nation/nft_check.py +3 -4
- intentkit/skills/onchain.py +2 -6
- intentkit/skills/openai/base.py +1 -3
- intentkit/skills/openai/dalle_image_generation.py +1 -3
- intentkit/skills/openai/gpt_image_generation.py +2 -3
- intentkit/skills/openai/gpt_image_to_image.py +2 -3
- intentkit/skills/openai/image_to_text.py +1 -2
- intentkit/skills/portfolio/base.py +6 -6
- intentkit/skills/portfolio/token_balances.py +21 -21
- intentkit/skills/portfolio/wallet_approvals.py +7 -7
- intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
- intentkit/skills/portfolio/wallet_history.py +21 -21
- intentkit/skills/portfolio/wallet_net_worth.py +13 -13
- intentkit/skills/portfolio/wallet_nfts.py +19 -19
- intentkit/skills/portfolio/wallet_profitability.py +7 -7
- intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
- intentkit/skills/portfolio/wallet_stats.py +3 -3
- intentkit/skills/portfolio/wallet_swaps.py +19 -19
- intentkit/skills/pyth/__init__.py +3 -5
- intentkit/skills/slack/base.py +2 -4
- intentkit/skills/slack/get_channel.py +8 -8
- intentkit/skills/slack/get_message.py +9 -9
- intentkit/skills/slack/schedule_message.py +5 -5
- intentkit/skills/slack/send_message.py +3 -5
- intentkit/skills/supabase/base.py +1 -3
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- intentkit/skills/superfluid/__init__.py +4 -6
- intentkit/skills/system/add_autonomous_task.py +8 -10
- intentkit/skills/system/edit_autonomous_task.py +12 -14
- intentkit/skills/system/list_autonomous_tasks.py +1 -3
- intentkit/skills/tavily/base.py +1 -3
- intentkit/skills/tavily/tavily_extract.py +1 -2
- intentkit/skills/tavily/tavily_search.py +1 -3
- intentkit/skills/token/base.py +5 -5
- intentkit/skills/token/erc20_transfers.py +19 -19
- intentkit/skills/token/token_analytics.py +3 -3
- intentkit/skills/token/token_price.py +13 -13
- intentkit/skills/token/token_search.py +9 -9
- intentkit/skills/twitter/base.py +3 -4
- intentkit/skills/twitter/follow_user.py +1 -2
- intentkit/skills/twitter/get_mentions.py +3 -4
- intentkit/skills/twitter/get_timeline.py +1 -2
- intentkit/skills/twitter/get_user_by_username.py +1 -2
- intentkit/skills/twitter/get_user_tweets.py +2 -3
- intentkit/skills/twitter/like_tweet.py +1 -2
- intentkit/skills/twitter/post_tweet.py +3 -4
- intentkit/skills/twitter/reply_tweet.py +3 -4
- intentkit/skills/twitter/retweet.py +1 -2
- intentkit/skills/twitter/search_tweets.py +1 -2
- intentkit/skills/unrealspeech/base.py +1 -3
- intentkit/skills/unrealspeech/text_to_speech.py +8 -8
- intentkit/skills/venice_audio/__init__.py +8 -9
- intentkit/skills/venice_audio/base.py +3 -4
- intentkit/skills/venice_audio/input.py +41 -41
- intentkit/skills/venice_audio/venice_audio.py +6 -6
- intentkit/skills/venice_image/__init__.py +5 -5
- intentkit/skills/venice_image/api.py +138 -138
- intentkit/skills/venice_image/base.py +3 -3
- intentkit/skills/venice_image/config.py +33 -35
- intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
- intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
- intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
- intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
- intentkit/skills/venice_image/utils.py +77 -78
- intentkit/skills/web_scraper/base.py +1 -3
- intentkit/skills/web_scraper/document_indexer.py +1 -2
- intentkit/skills/web_scraper/scrape_and_index.py +4 -5
- intentkit/skills/web_scraper/utils.py +25 -26
- intentkit/skills/web_scraper/website_indexer.py +10 -11
- intentkit/skills/weth/__init__.py +4 -6
- intentkit/skills/wow/__init__.py +4 -6
- intentkit/skills/x402/__init__.py +2 -2
- intentkit/skills/x402/ask_agent.py +7 -7
- intentkit/skills/x402/base.py +2 -1
- intentkit/skills/x402/http_request.py +10 -10
- intentkit/skills/xmtp/base.py +3 -3
- intentkit/skills/xmtp/price.py +2 -2
- intentkit/skills/xmtp/swap.py +2 -4
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/error.py +2 -2
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +8 -9
- intentkit/utils/schema.py +5 -5
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/METADATA +3 -4
- intentkit-0.8.17.dev2.dist-info/RECORD +464 -0
- intentkit/models/generator.py +0 -347
- intentkit-0.8.17.dev1.dist-info/RECORD +0 -465
- {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/WHEEL +0 -0
- {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""CryptoCompare API implementation and shared schemas."""
|
|
2
2
|
|
|
3
3
|
import time
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
import httpx
|
|
7
6
|
from pydantic import BaseModel, Field
|
|
@@ -25,7 +24,7 @@ class FetchPriceInput(BaseModel):
|
|
|
25
24
|
...,
|
|
26
25
|
description="Base cryptocurrency symbol to get prices for (e.g., 'BTC', 'ETH')",
|
|
27
26
|
)
|
|
28
|
-
to_symbols:
|
|
27
|
+
to_symbols: list[str] = Field(
|
|
29
28
|
...,
|
|
30
29
|
description="List of target currencies (fiat or crypto) (e.g., ['USD', 'EUR', 'JPY'])",
|
|
31
30
|
)
|
|
@@ -70,7 +69,7 @@ class FetchTopVolumeInput(BaseModel):
|
|
|
70
69
|
|
|
71
70
|
|
|
72
71
|
# API Functions
|
|
73
|
-
async def fetch_price(api_key: str, from_symbol: str, to_symbols:
|
|
72
|
+
async def fetch_price(api_key: str, from_symbol: str, to_symbols: list[str]) -> dict:
|
|
74
73
|
"""
|
|
75
74
|
Fetch current price for a cryptocurrency in multiple currencies.
|
|
76
75
|
"""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Base class for all CryptoCompare tools."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from datetime import datetime, timedelta
|
|
5
|
-
from typing import Any
|
|
4
|
+
from datetime import UTC, datetime, timedelta
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
import httpx
|
|
8
8
|
from pydantic import BaseModel, Field
|
|
@@ -25,7 +25,7 @@ class CryptoCompareBaseTool(IntentKitSkill):
|
|
|
25
25
|
|
|
26
26
|
name: str = Field(description="The name of the tool")
|
|
27
27
|
description: str = Field(description="A description of what the tool does")
|
|
28
|
-
args_schema:
|
|
28
|
+
args_schema: type[BaseModel]
|
|
29
29
|
|
|
30
30
|
@property
|
|
31
31
|
def category(self) -> str:
|
|
@@ -43,7 +43,7 @@ class CryptoCompareBaseTool(IntentKitSkill):
|
|
|
43
43
|
"""
|
|
44
44
|
rate_limit = await self.get_agent_skill_data("rate_limit")
|
|
45
45
|
|
|
46
|
-
current_time = datetime.now(tz=
|
|
46
|
+
current_time = datetime.now(tz=UTC)
|
|
47
47
|
|
|
48
48
|
if (
|
|
49
49
|
rate_limit
|
|
@@ -68,7 +68,7 @@ class CryptoCompareBaseTool(IntentKitSkill):
|
|
|
68
68
|
return
|
|
69
69
|
|
|
70
70
|
async def fetch_price(
|
|
71
|
-
self, api_key: str, from_symbol: str, to_symbols:
|
|
71
|
+
self, api_key: str, from_symbol: str, to_symbols: list[str]
|
|
72
72
|
) -> dict:
|
|
73
73
|
"""Fetch current price for a cryptocurrency in multiple currencies.
|
|
74
74
|
|
|
@@ -263,7 +263,7 @@ class CryptoNews(BaseModel):
|
|
|
263
263
|
tags: str
|
|
264
264
|
categories: str
|
|
265
265
|
source: str
|
|
266
|
-
source_info:
|
|
266
|
+
source_info: dict[str, Any] = Field(default_factory=dict)
|
|
267
267
|
|
|
268
268
|
|
|
269
269
|
class CryptoExchange(BaseModel):
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching cryptocurrency news via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -32,13 +31,13 @@ class CryptoCompareFetchNews(CryptoCompareBaseTool):
|
|
|
32
31
|
|
|
33
32
|
name: str = "cryptocompare_fetch_news"
|
|
34
33
|
description: str = "Fetch the latest cryptocurrency news for a specific token"
|
|
35
|
-
args_schema:
|
|
34
|
+
args_schema: type[BaseModel] = CryptoCompareFetchNewsInput
|
|
36
35
|
|
|
37
36
|
async def _arun(
|
|
38
37
|
self,
|
|
39
38
|
token: str,
|
|
40
39
|
**kwargs,
|
|
41
|
-
) ->
|
|
40
|
+
) -> list[CryptoNews]:
|
|
42
41
|
"""Async implementation of the tool to fetch cryptocurrency news.
|
|
43
42
|
|
|
44
43
|
Args:
|
|
@@ -46,7 +45,7 @@ class CryptoCompareFetchNews(CryptoCompareBaseTool):
|
|
|
46
45
|
config: The configuration for the runnable, containing agent context.
|
|
47
46
|
|
|
48
47
|
Returns:
|
|
49
|
-
|
|
48
|
+
list[CryptoNews]: A list of cryptocurrency news articles.
|
|
50
49
|
|
|
51
50
|
Raises:
|
|
52
51
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching cryptocurrency prices via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -17,7 +16,7 @@ class CryptoCompareFetchPriceInput(BaseModel):
|
|
|
17
16
|
...,
|
|
18
17
|
description="Base cryptocurrency symbol to get prices for (e.g., 'BTC', 'ETH')",
|
|
19
18
|
)
|
|
20
|
-
to_symbols:
|
|
19
|
+
to_symbols: list[str] = Field(
|
|
21
20
|
...,
|
|
22
21
|
description="List of target currencies (fiat or crypto) (e.g., ['USD', 'EUR', 'JPY'])",
|
|
23
22
|
)
|
|
@@ -40,14 +39,14 @@ class CryptoCompareFetchPrice(CryptoCompareBaseTool):
|
|
|
40
39
|
description: str = (
|
|
41
40
|
"Fetch real-time cryptocurrency price data with multi-currency support"
|
|
42
41
|
)
|
|
43
|
-
args_schema:
|
|
42
|
+
args_schema: type[BaseModel] = CryptoCompareFetchPriceInput
|
|
44
43
|
|
|
45
44
|
async def _arun(
|
|
46
45
|
self,
|
|
47
46
|
from_symbol: str,
|
|
48
|
-
to_symbols:
|
|
47
|
+
to_symbols: list[str],
|
|
49
48
|
**kwargs,
|
|
50
|
-
) ->
|
|
49
|
+
) -> list[CryptoPrice]:
|
|
51
50
|
"""Async implementation of the tool to fetch cryptocurrency prices.
|
|
52
51
|
|
|
53
52
|
Args:
|
|
@@ -56,7 +55,7 @@ class CryptoCompareFetchPrice(CryptoCompareBaseTool):
|
|
|
56
55
|
config: The configuration for the runnable, containing agent context.
|
|
57
56
|
|
|
58
57
|
Returns:
|
|
59
|
-
|
|
58
|
+
list[CryptoPrice]: A list of cryptocurrency prices for each target currency.
|
|
60
59
|
|
|
61
60
|
Raises:
|
|
62
61
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching top exchanges for a cryptocurrency pair via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -44,7 +43,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
|
44
43
|
description: str = (
|
|
45
44
|
"Fetch top exchanges for a cryptocurrency trading pair, ranked by volume"
|
|
46
45
|
)
|
|
47
|
-
args_schema:
|
|
46
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTopExchangesInput
|
|
48
47
|
|
|
49
48
|
async def _arun(
|
|
50
49
|
self,
|
|
@@ -52,7 +51,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
|
52
51
|
to_symbol: str = "USD",
|
|
53
52
|
limit: int = 10,
|
|
54
53
|
**kwargs,
|
|
55
|
-
) ->
|
|
54
|
+
) -> list[CryptoExchange]:
|
|
56
55
|
"""Async implementation of the tool to fetch top exchanges for a cryptocurrency pair.
|
|
57
56
|
|
|
58
57
|
Args:
|
|
@@ -62,7 +61,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
|
|
|
62
61
|
config: The configuration for the runnable, containing agent context.
|
|
63
62
|
|
|
64
63
|
Returns:
|
|
65
|
-
|
|
64
|
+
list[CryptoExchange]: A list of top exchanges for the specified trading pair.
|
|
66
65
|
|
|
67
66
|
Raises:
|
|
68
67
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching top cryptocurrencies by market cap via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -39,14 +38,14 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
|
|
|
39
38
|
|
|
40
39
|
name: str = "cryptocompare_fetch_top_market_cap"
|
|
41
40
|
description: str = "Fetch top cryptocurrencies ranked by market capitalization"
|
|
42
|
-
args_schema:
|
|
41
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTopMarketCapInput
|
|
43
42
|
|
|
44
43
|
async def _arun(
|
|
45
44
|
self,
|
|
46
45
|
to_symbol: str = "USD",
|
|
47
46
|
limit: int = 10,
|
|
48
47
|
**kwargs,
|
|
49
|
-
) ->
|
|
48
|
+
) -> list[CryptoCurrency]:
|
|
50
49
|
"""Async implementation of the tool to fetch top cryptocurrencies by market cap.
|
|
51
50
|
|
|
52
51
|
Args:
|
|
@@ -55,7 +54,7 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
|
|
|
55
54
|
config: The configuration for the runnable, containing agent context.
|
|
56
55
|
|
|
57
56
|
Returns:
|
|
58
|
-
|
|
57
|
+
list[CryptoCurrency]: A list of top cryptocurrencies by market cap.
|
|
59
58
|
|
|
60
59
|
Raises:
|
|
61
60
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching top cryptocurrencies by trading volume via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -38,14 +37,14 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
|
|
|
38
37
|
|
|
39
38
|
name: str = "cryptocompare_fetch_top_volume"
|
|
40
39
|
description: str = "Fetch top cryptocurrencies ranked by 24-hour trading volume"
|
|
41
|
-
args_schema:
|
|
40
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTopVolumeInput
|
|
42
41
|
|
|
43
42
|
async def _arun(
|
|
44
43
|
self,
|
|
45
44
|
to_symbol: str = "USD",
|
|
46
45
|
limit: int = 10,
|
|
47
46
|
**kwargs,
|
|
48
|
-
) ->
|
|
47
|
+
) -> list[CryptoCurrency]:
|
|
49
48
|
"""Async implementation of the tool to fetch top cryptocurrencies by trading volume.
|
|
50
49
|
|
|
51
50
|
Args:
|
|
@@ -54,7 +53,7 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
|
|
|
54
53
|
config: The configuration for the runnable, containing agent context.
|
|
55
54
|
|
|
56
55
|
Returns:
|
|
57
|
-
|
|
56
|
+
list[CryptoCurrency]: A list of top cryptocurrencies by trading volume.
|
|
58
57
|
|
|
59
58
|
Raises:
|
|
60
59
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Tool for fetching cryptocurrency trading signals via CryptoCompare API."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Dict, List, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -43,13 +42,13 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
|
43
42
|
|
|
44
43
|
name: str = "cryptocompare_fetch_trading_signals"
|
|
45
44
|
description: str = "Fetch the latest trading signals for a specific cryptocurrency"
|
|
46
|
-
args_schema:
|
|
45
|
+
args_schema: type[BaseModel] = CryptoCompareFetchTradingSignalsInput
|
|
47
46
|
|
|
48
47
|
async def _arun(
|
|
49
48
|
self,
|
|
50
49
|
from_symbol: str,
|
|
51
50
|
**kwargs,
|
|
52
|
-
) ->
|
|
51
|
+
) -> list[TradingSignal]:
|
|
53
52
|
"""Async implementation of the tool to fetch cryptocurrency trading signals.
|
|
54
53
|
|
|
55
54
|
Args:
|
|
@@ -57,7 +56,7 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
|
57
56
|
config: The configuration for the runnable, containing agent context.
|
|
58
57
|
|
|
59
58
|
Returns:
|
|
60
|
-
|
|
59
|
+
list[TradingSignal]: A list of trading signals for the specified cryptocurrency.
|
|
61
60
|
|
|
62
61
|
Raises:
|
|
63
62
|
Exception: If there's an error accessing the CryptoCompare API.
|
|
@@ -86,7 +85,7 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
|
|
|
86
85
|
if "Data" in signals_data and signals_data["Data"]:
|
|
87
86
|
for indicator_name, indicator_data in signals_data["Data"].items():
|
|
88
87
|
if (
|
|
89
|
-
isinstance(indicator_data,
|
|
88
|
+
isinstance(indicator_data, dict)
|
|
90
89
|
and "sentiment" in indicator_data
|
|
91
90
|
):
|
|
92
91
|
result.append(
|
|
@@ -4,7 +4,7 @@ Loads and initializes skills for fetching crypto news and providing market insig
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import TypedDict
|
|
8
8
|
|
|
9
9
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
10
10
|
|
|
@@ -13,7 +13,7 @@ from .base import CryptopanicBaseTool
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
14
|
|
|
15
15
|
# Cache for skill instances
|
|
16
|
-
_skill_cache:
|
|
16
|
+
_skill_cache: dict[str, CryptopanicBaseTool] = {}
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class SkillStates(TypedDict):
|
|
@@ -34,7 +34,7 @@ async def get_skills(
|
|
|
34
34
|
config: Config,
|
|
35
35
|
is_private: bool,
|
|
36
36
|
**kwargs,
|
|
37
|
-
) ->
|
|
37
|
+
) -> list[CryptopanicBaseTool]:
|
|
38
38
|
"""Load CryptoPanic skills based on configuration.
|
|
39
39
|
|
|
40
40
|
Args:
|
|
@@ -70,7 +70,7 @@ async def get_skills(
|
|
|
70
70
|
|
|
71
71
|
def get_cryptopanic_skill(
|
|
72
72
|
name: str,
|
|
73
|
-
) ->
|
|
73
|
+
) -> CryptopanicBaseTool | None:
|
|
74
74
|
"""Retrieve a CryptoPanic skill instance by name.
|
|
75
75
|
|
|
76
76
|
Args:
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
Defines the base class and shared utilities for CryptoPanic skills.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from typing import Type
|
|
7
|
-
|
|
8
6
|
from langchain_core.tools.base import ToolException
|
|
9
7
|
from pydantic import BaseModel, Field
|
|
10
8
|
|
|
@@ -22,7 +20,7 @@ class CryptopanicBaseTool(IntentKitSkill):
|
|
|
22
20
|
|
|
23
21
|
name: str = Field(description="Tool name")
|
|
24
22
|
description: str = Field(description="Tool description")
|
|
25
|
-
args_schema:
|
|
23
|
+
args_schema: type[BaseModel]
|
|
26
24
|
|
|
27
25
|
def get_api_key(self) -> str:
|
|
28
26
|
"""Retrieve the CryptoPanic API key from context.
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
Fetches all news posts for BTC or ETH, sorted by publication date (newest first).
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from typing import List, Type
|
|
7
|
-
|
|
8
6
|
import httpx
|
|
9
7
|
from pydantic import BaseModel, Field
|
|
10
8
|
|
|
@@ -35,7 +33,7 @@ class CryptopanicNewsOutput(BaseModel):
|
|
|
35
33
|
"""Output schema for fetching crypto news."""
|
|
36
34
|
|
|
37
35
|
currency: str = Field(description="Currency news was fetched for")
|
|
38
|
-
news_items:
|
|
36
|
+
news_items: list[NewsItem] = Field(description="List of news items")
|
|
39
37
|
summary: str = Field(description="Summary of fetched news")
|
|
40
38
|
|
|
41
39
|
|
|
@@ -47,13 +45,13 @@ class FetchCryptoNews(CryptopanicBaseTool):
|
|
|
47
45
|
"Fetches all crypto market news posts from CryptoPanic for BTC or ETH, "
|
|
48
46
|
"sorted by publication date (newest first). Defaults to BTC."
|
|
49
47
|
)
|
|
50
|
-
args_schema:
|
|
48
|
+
args_schema: type[BaseModel] = CryptopanicNewsInput
|
|
51
49
|
|
|
52
50
|
async def fetch_news(
|
|
53
51
|
self,
|
|
54
52
|
currency: str,
|
|
55
53
|
api_key: str,
|
|
56
|
-
) ->
|
|
54
|
+
) -> list[NewsItem]:
|
|
57
55
|
"""Fetch the latest news for a specific currency from CryptoPanic API.
|
|
58
56
|
|
|
59
57
|
Args:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Skill to provide AI-driven insights on crypto market conditions using CryptoPanic news."""
|
|
2
2
|
|
|
3
|
-
from typing import ClassVar
|
|
3
|
+
from typing import ClassVar
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
@@ -29,7 +29,7 @@ class CryptopanicNewsOutput(BaseModel):
|
|
|
29
29
|
"""Output schema for fetching crypto news (used internally)."""
|
|
30
30
|
|
|
31
31
|
currency: str = Field(description="Currency news was fetched for")
|
|
32
|
-
news_items:
|
|
32
|
+
news_items: list[BaseModel] = Field(description="List of news items")
|
|
33
33
|
summary: str = Field(description="Summary of fetched news")
|
|
34
34
|
|
|
35
35
|
|
|
@@ -43,7 +43,7 @@ class FetchCryptoSentiment(CryptopanicBaseTool):
|
|
|
43
43
|
"with all posts sorted by recency. Triggered by 'sentiment' or 'market state' queries. "
|
|
44
44
|
"Defaults to BTC."
|
|
45
45
|
)
|
|
46
|
-
args_schema:
|
|
46
|
+
args_schema: type[BaseModel] = CryptopanicSentimentInput
|
|
47
47
|
|
|
48
48
|
INSIGHTS_PROMPT: ClassVar[str] = """
|
|
49
49
|
CryptoPanic Headlines for {currency}:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
from langchain_core.tools.base import ToolException
|
|
4
2
|
from pydantic import BaseModel, Field
|
|
5
3
|
|
|
@@ -12,7 +10,7 @@ class DappLookerBaseTool(IntentKitSkill):
|
|
|
12
10
|
|
|
13
11
|
name: str = Field(description="The name of the tool")
|
|
14
12
|
description: str = Field(description="A description of what the tool does")
|
|
15
|
-
args_schema:
|
|
13
|
+
args_schema: type[BaseModel]
|
|
16
14
|
|
|
17
15
|
def get_api_key(self) -> str:
|
|
18
16
|
context = self.get_context()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
6
|
from pydantic import BaseModel, Field
|
|
@@ -13,12 +13,12 @@ logger = logging.getLogger(__name__)
|
|
|
13
13
|
class DappLookerTokenDataInput(BaseModel):
|
|
14
14
|
"""Input for DappLooker token data tool."""
|
|
15
15
|
|
|
16
|
-
token_tickers:
|
|
16
|
+
token_tickers: str | None = Field(
|
|
17
17
|
description="Comma-separated list of AI agent token tickers (e.g., 'aixbt,vader'). "
|
|
18
18
|
"Either token_tickers or token_addresses must be provided.",
|
|
19
19
|
default=None,
|
|
20
20
|
)
|
|
21
|
-
token_addresses:
|
|
21
|
+
token_addresses: str | None = Field(
|
|
22
22
|
description="Comma-separated list of AI agent token contract addresses (e.g., '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825'). "
|
|
23
23
|
"Either token_tickers or token_addresses must be provided.",
|
|
24
24
|
default=None,
|
|
@@ -50,12 +50,12 @@ class DappLookerTokenData(DappLookerBaseTool):
|
|
|
50
50
|
"Note that this tool is specialized for AI agent tokens and may not return data for general cryptocurrencies like ETH, BTC, or SOL.\n"
|
|
51
51
|
"Either token_tickers or token_addresses must be provided."
|
|
52
52
|
)
|
|
53
|
-
args_schema:
|
|
53
|
+
args_schema: type[BaseModel] = DappLookerTokenDataInput
|
|
54
54
|
|
|
55
55
|
async def _arun(
|
|
56
56
|
self,
|
|
57
|
-
token_tickers:
|
|
58
|
-
token_addresses:
|
|
57
|
+
token_tickers: str | None = None,
|
|
58
|
+
token_addresses: str | None = None,
|
|
59
59
|
chain: str = "base",
|
|
60
60
|
**kwargs,
|
|
61
61
|
) -> str:
|
|
@@ -205,7 +205,7 @@ class DappLookerTokenData(DappLookerBaseTool):
|
|
|
205
205
|
"An error occurred while retrieving token data. Please try again later."
|
|
206
206
|
)
|
|
207
207
|
|
|
208
|
-
def _format_token_data(self, data:
|
|
208
|
+
def _format_token_data(self, data: list[dict[str, Any]]) -> str:
|
|
209
209
|
"""Format the token data for display.
|
|
210
210
|
|
|
211
211
|
Args:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""DeFi Llama API implementation and shared schemas."""
|
|
2
2
|
|
|
3
3
|
from datetime import datetime
|
|
4
|
-
from typing import List, Optional
|
|
5
4
|
|
|
6
5
|
import httpx
|
|
7
6
|
|
|
@@ -75,7 +74,7 @@ async def fetch_chains() -> dict:
|
|
|
75
74
|
|
|
76
75
|
|
|
77
76
|
# Coins API Functions
|
|
78
|
-
async def fetch_current_prices(coins:
|
|
77
|
+
async def fetch_current_prices(coins: list[str]) -> dict:
|
|
79
78
|
"""Get current prices of tokens by contract address using a 4-hour search window."""
|
|
80
79
|
coins_str = ",".join(coins)
|
|
81
80
|
url = f"{DEFILLAMA_COINS_BASE_URL}/prices/current/{coins_str}?searchWidth=4h"
|
|
@@ -87,7 +86,7 @@ async def fetch_current_prices(coins: List[str]) -> dict:
|
|
|
87
86
|
return response.json()
|
|
88
87
|
|
|
89
88
|
|
|
90
|
-
async def fetch_historical_prices(timestamp: int, coins:
|
|
89
|
+
async def fetch_historical_prices(timestamp: int, coins: list[str]) -> dict:
|
|
91
90
|
"""Get historical prices of tokens by contract address using a 4-hour search window."""
|
|
92
91
|
coins_str = ",".join(coins)
|
|
93
92
|
url = f"{DEFILLAMA_COINS_BASE_URL}/prices/historical/{timestamp}/{coins_str}?searchWidth=4h"
|
|
@@ -112,7 +111,7 @@ async def fetch_batch_historical_prices(coins_timestamps: dict) -> dict:
|
|
|
112
111
|
return response.json()
|
|
113
112
|
|
|
114
113
|
|
|
115
|
-
async def fetch_price_chart(coins:
|
|
114
|
+
async def fetch_price_chart(coins: list[str]) -> dict:
|
|
116
115
|
"""Get historical price chart data from the past day for multiple tokens."""
|
|
117
116
|
coins_str = ",".join(coins)
|
|
118
117
|
start_time = int(datetime.now().timestamp()) - 86400 # now - 1 day
|
|
@@ -127,7 +126,7 @@ async def fetch_price_chart(coins: List[str]) -> dict:
|
|
|
127
126
|
return response.json()
|
|
128
127
|
|
|
129
128
|
|
|
130
|
-
async def fetch_price_percentage(coins:
|
|
129
|
+
async def fetch_price_percentage(coins: list[str]) -> dict:
|
|
131
130
|
"""Get price percentage changes for multiple tokens over a 24h period."""
|
|
132
131
|
coins_str = ",".join(coins)
|
|
133
132
|
current_timestamp = int(datetime.now().timestamp())
|
|
@@ -142,7 +141,7 @@ async def fetch_price_percentage(coins: List[str]) -> dict:
|
|
|
142
141
|
return response.json()
|
|
143
142
|
|
|
144
143
|
|
|
145
|
-
async def fetch_first_price(coins:
|
|
144
|
+
async def fetch_first_price(coins: list[str]) -> dict:
|
|
146
145
|
"""Get first recorded price data for multiple tokens."""
|
|
147
146
|
coins_str = ",".join(coins)
|
|
148
147
|
url = f"{DEFILLAMA_COINS_BASE_URL}/prices/first/{coins_str}"
|
|
@@ -179,9 +178,7 @@ async def fetch_stablecoins() -> dict:
|
|
|
179
178
|
return response.json()
|
|
180
179
|
|
|
181
180
|
|
|
182
|
-
async def fetch_stablecoin_charts(
|
|
183
|
-
stablecoin_id: str, chain: Optional[str] = None
|
|
184
|
-
) -> dict:
|
|
181
|
+
async def fetch_stablecoin_charts(stablecoin_id: str, chain: str | None = None) -> dict:
|
|
185
182
|
"""Get historical circulating supply data for a stablecoin."""
|
|
186
183
|
base_url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoincharts"
|
|
187
184
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Base class for all DeFi Llama tools."""
|
|
2
2
|
|
|
3
|
-
from datetime import datetime, timedelta
|
|
4
|
-
from typing import Type
|
|
3
|
+
from datetime import UTC, datetime, timedelta
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -26,7 +25,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
|
|
|
26
25
|
|
|
27
26
|
name: str = Field(description="The name of the tool")
|
|
28
27
|
description: str = Field(description="A description of what the tool does")
|
|
29
|
-
args_schema:
|
|
28
|
+
args_schema: type[BaseModel]
|
|
30
29
|
base_url: str = Field(
|
|
31
30
|
default=DEFILLAMA_BASE_URL, description="Base URL for DeFi Llama API"
|
|
32
31
|
)
|
|
@@ -49,7 +48,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
|
|
|
49
48
|
Rate limit status and error message if limited
|
|
50
49
|
"""
|
|
51
50
|
rate_limit = await self.get_agent_skill_data("rate_limit")
|
|
52
|
-
current_time = datetime.now(tz=
|
|
51
|
+
current_time = datetime.now(tz=UTC)
|
|
53
52
|
|
|
54
53
|
if (
|
|
55
54
|
rate_limit
|
|
@@ -114,7 +113,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
|
|
|
114
113
|
"error": True,
|
|
115
114
|
"status_code": status_code,
|
|
116
115
|
"message": message,
|
|
117
|
-
"timestamp": datetime.now(tz=
|
|
116
|
+
"timestamp": datetime.now(tz=UTC).isoformat(),
|
|
118
117
|
}
|
|
119
118
|
|
|
120
119
|
def get_current_timestamp(self) -> int:
|
|
@@ -123,4 +122,4 @@ class DefiLlamaBaseTool(IntentKitSkill):
|
|
|
123
122
|
Returns:
|
|
124
123
|
Current Unix timestamp
|
|
125
124
|
"""
|
|
126
|
-
return int(datetime.now(tz=
|
|
125
|
+
return int(datetime.now(tz=UTC).timestamp())
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"""Tool for fetching batch historical token prices via DeFi Llama API."""
|
|
2
2
|
|
|
3
|
-
from typing import Dict, List, Optional, Type
|
|
4
|
-
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
5
|
from intentkit.skills.defillama.api import fetch_batch_historical_prices
|
|
@@ -33,7 +31,7 @@ class TokenPriceHistory(BaseModel):
|
|
|
33
31
|
"""Model representing historical price data for a single token."""
|
|
34
32
|
|
|
35
33
|
symbol: str = Field(..., description="Token symbol")
|
|
36
|
-
prices:
|
|
34
|
+
prices: list[HistoricalPricePoint] = Field(
|
|
37
35
|
..., description="List of historical price points"
|
|
38
36
|
)
|
|
39
37
|
|
|
@@ -41,7 +39,7 @@ class TokenPriceHistory(BaseModel):
|
|
|
41
39
|
class FetchBatchHistoricalPricesInput(BaseModel):
|
|
42
40
|
"""Input schema for fetching batch historical token prices."""
|
|
43
41
|
|
|
44
|
-
coins_timestamps:
|
|
42
|
+
coins_timestamps: dict[str, list[int]] = Field(
|
|
45
43
|
..., description="Dictionary mapping token identifiers to lists of timestamps"
|
|
46
44
|
)
|
|
47
45
|
|
|
@@ -49,11 +47,11 @@ class FetchBatchHistoricalPricesInput(BaseModel):
|
|
|
49
47
|
class FetchBatchHistoricalPricesResponse(BaseModel):
|
|
50
48
|
"""Response schema for batch historical token prices."""
|
|
51
49
|
|
|
52
|
-
coins:
|
|
50
|
+
coins: dict[str, TokenPriceHistory] = Field(
|
|
53
51
|
default_factory=dict,
|
|
54
52
|
description="Historical token prices keyed by token identifier",
|
|
55
53
|
)
|
|
56
|
-
error:
|
|
54
|
+
error: str | None = Field(None, description="Error message if any")
|
|
57
55
|
|
|
58
56
|
|
|
59
57
|
class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
|
|
@@ -78,10 +76,10 @@ class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
|
|
|
78
76
|
|
|
79
77
|
name: str = "defillama_fetch_batch_historical_prices"
|
|
80
78
|
description: str = FETCH_BATCH_HISTORICAL_PRICES_PROMPT
|
|
81
|
-
args_schema:
|
|
79
|
+
args_schema: type[BaseModel] = FetchBatchHistoricalPricesInput
|
|
82
80
|
|
|
83
81
|
async def _arun(
|
|
84
|
-
self, coins_timestamps:
|
|
82
|
+
self, coins_timestamps: dict[str, list[int]]
|
|
85
83
|
) -> FetchBatchHistoricalPricesResponse:
|
|
86
84
|
"""Fetch historical prices for the given tokens at specified timestamps.
|
|
87
85
|
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"""Tool for fetching current block data via DeFi Llama API."""
|
|
2
2
|
|
|
3
|
-
from typing import Optional, Type
|
|
4
|
-
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
5
|
from intentkit.skills.defillama.api import fetch_block
|
|
@@ -34,9 +32,9 @@ class FetchBlockResponse(BaseModel):
|
|
|
34
32
|
"""Response schema for block data."""
|
|
35
33
|
|
|
36
34
|
chain: str = Field(..., description="Normalized chain name")
|
|
37
|
-
height:
|
|
38
|
-
timestamp:
|
|
39
|
-
error:
|
|
35
|
+
height: int | None = Field(None, description="Block height number")
|
|
36
|
+
timestamp: int | None = Field(None, description="Unix timestamp of the block")
|
|
37
|
+
error: str | None = Field(None, description="Error message if any")
|
|
40
38
|
|
|
41
39
|
|
|
42
40
|
class DefiLlamaFetchBlock(DefiLlamaBaseTool):
|
|
@@ -55,7 +53,7 @@ class DefiLlamaFetchBlock(DefiLlamaBaseTool):
|
|
|
55
53
|
|
|
56
54
|
name: str = "defillama_fetch_block"
|
|
57
55
|
description: str = FETCH_BLOCK_PROMPT
|
|
58
|
-
args_schema:
|
|
56
|
+
args_schema: type[BaseModel] = FetchBlockInput
|
|
59
57
|
|
|
60
58
|
async def _arun(self, chain: str) -> FetchBlockResponse:
|
|
61
59
|
"""Fetch current block data for the given chain.
|