intentkit 0.8.16.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.

Files changed (274) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/abstracts/agent.py +4 -5
  3. intentkit/abstracts/engine.py +5 -5
  4. intentkit/abstracts/graph.py +6 -5
  5. intentkit/abstracts/skill.py +5 -5
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/cdp.py +19 -77
  8. intentkit/clients/twitter.py +26 -34
  9. intentkit/clients/web3.py +1 -3
  10. intentkit/config/config.py +4 -0
  11. intentkit/core/agent.py +15 -15
  12. intentkit/core/asset.py +1 -2
  13. intentkit/core/client.py +1 -1
  14. intentkit/core/credit.py +19 -20
  15. intentkit/core/engine.py +2 -4
  16. intentkit/core/node.py +2 -1
  17. intentkit/core/prompt.py +3 -4
  18. intentkit/core/scheduler.py +1 -1
  19. intentkit/core/statistics.py +6 -7
  20. intentkit/models/agent.py +125 -92
  21. intentkit/models/agent_data.py +62 -36
  22. intentkit/models/app_setting.py +6 -6
  23. intentkit/models/chat.py +27 -24
  24. intentkit/models/conversation.py +8 -8
  25. intentkit/models/credit.py +62 -64
  26. intentkit/models/db.py +8 -7
  27. intentkit/models/db_mig.py +2 -2
  28. intentkit/models/llm.py +12 -14
  29. intentkit/models/redis.py +2 -3
  30. intentkit/models/skill.py +25 -27
  31. intentkit/models/skills.csv +29 -28
  32. intentkit/models/user.py +21 -22
  33. intentkit/skills/acolyt/ask.py +3 -4
  34. intentkit/skills/acolyt/base.py +1 -3
  35. intentkit/skills/aixbt/base.py +1 -3
  36. intentkit/skills/aixbt/projects.py +13 -13
  37. intentkit/skills/allora/base.py +1 -3
  38. intentkit/skills/allora/price.py +2 -3
  39. intentkit/skills/base.py +15 -22
  40. intentkit/skills/basename/__init__.py +3 -5
  41. intentkit/skills/carv/__init__.py +7 -8
  42. intentkit/skills/carv/base.py +6 -6
  43. intentkit/skills/carv/fetch_news.py +3 -3
  44. intentkit/skills/carv/onchain_query.py +4 -4
  45. intentkit/skills/carv/token_info_and_price.py +5 -5
  46. intentkit/skills/casino/base.py +1 -3
  47. intentkit/skills/casino/deck_draw.py +1 -2
  48. intentkit/skills/casino/deck_shuffle.py +1 -2
  49. intentkit/skills/casino/dice_roll.py +1 -2
  50. intentkit/skills/cdp/__init__.py +3 -5
  51. intentkit/skills/cdp/base.py +1 -3
  52. intentkit/skills/chainlist/base.py +1 -3
  53. intentkit/skills/chainlist/chain_lookup.py +18 -18
  54. intentkit/skills/common/base.py +1 -3
  55. intentkit/skills/common/current_time.py +1 -2
  56. intentkit/skills/cookiefun/base.py +1 -2
  57. intentkit/skills/cookiefun/get_account_details.py +7 -7
  58. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  59. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  60. intentkit/skills/cookiefun/get_sectors.py +3 -3
  61. intentkit/skills/cookiefun/search_accounts.py +9 -9
  62. intentkit/skills/cryptocompare/api.py +2 -3
  63. intentkit/skills/cryptocompare/base.py +6 -6
  64. intentkit/skills/cryptocompare/fetch_news.py +3 -4
  65. intentkit/skills/cryptocompare/fetch_price.py +5 -6
  66. intentkit/skills/cryptocompare/fetch_top_exchanges.py +3 -4
  67. intentkit/skills/cryptocompare/fetch_top_market_cap.py +3 -4
  68. intentkit/skills/cryptocompare/fetch_top_volume.py +3 -4
  69. intentkit/skills/cryptocompare/fetch_trading_signals.py +4 -5
  70. intentkit/skills/cryptopanic/__init__.py +4 -4
  71. intentkit/skills/cryptopanic/base.py +1 -3
  72. intentkit/skills/cryptopanic/fetch_crypto_news.py +3 -5
  73. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +3 -3
  74. intentkit/skills/dapplooker/base.py +1 -3
  75. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  76. intentkit/skills/defillama/api.py +6 -9
  77. intentkit/skills/defillama/base.py +5 -6
  78. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +6 -8
  79. intentkit/skills/defillama/coins/fetch_block.py +4 -6
  80. intentkit/skills/defillama/coins/fetch_current_prices.py +6 -8
  81. intentkit/skills/defillama/coins/fetch_first_price.py +5 -7
  82. intentkit/skills/defillama/coins/fetch_historical_prices.py +7 -9
  83. intentkit/skills/defillama/coins/fetch_price_chart.py +7 -9
  84. intentkit/skills/defillama/coins/fetch_price_percentage.py +5 -7
  85. intentkit/skills/defillama/config/chains.py +1 -3
  86. intentkit/skills/defillama/fees/fetch_fees_overview.py +22 -24
  87. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +14 -16
  88. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +6 -8
  89. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +3 -5
  90. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +5 -7
  91. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  92. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +2 -4
  93. intentkit/skills/defillama/tvl/fetch_chains.py +7 -9
  94. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +2 -4
  95. intentkit/skills/defillama/tvl/fetch_protocol.py +30 -36
  96. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +1 -3
  97. intentkit/skills/defillama/tvl/fetch_protocols.py +35 -43
  98. intentkit/skills/defillama/volumes/fetch_dex_overview.py +40 -46
  99. intentkit/skills/defillama/volumes/fetch_dex_summary.py +33 -35
  100. intentkit/skills/defillama/volumes/fetch_options_overview.py +22 -26
  101. intentkit/skills/defillama/yields/fetch_pool_chart.py +8 -10
  102. intentkit/skills/defillama/yields/fetch_pools.py +24 -28
  103. intentkit/skills/dexscreener/__init__.py +2 -2
  104. intentkit/skills/dexscreener/base.py +3 -3
  105. intentkit/skills/dexscreener/get_pair_info.py +2 -2
  106. intentkit/skills/dexscreener/get_token_pairs.py +2 -2
  107. intentkit/skills/dexscreener/get_tokens_info.py +5 -5
  108. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  109. intentkit/skills/dexscreener/search_token.py +182 -182
  110. intentkit/skills/dexscreener/utils.py +15 -14
  111. intentkit/skills/dune_analytics/__init__.py +4 -4
  112. intentkit/skills/dune_analytics/base.py +1 -3
  113. intentkit/skills/dune_analytics/fetch_kol_buys.py +4 -4
  114. intentkit/skills/dune_analytics/fetch_nation_metrics.py +5 -5
  115. intentkit/skills/elfa/base.py +1 -3
  116. intentkit/skills/elfa/mention.py +19 -21
  117. intentkit/skills/elfa/stats.py +4 -4
  118. intentkit/skills/elfa/tokens.py +12 -12
  119. intentkit/skills/elfa/utils.py +25 -27
  120. intentkit/skills/enso/__init__.py +2 -2
  121. intentkit/skills/enso/base.py +5 -8
  122. intentkit/skills/enso/best_yield.py +4 -6
  123. intentkit/skills/enso/networks.py +1 -2
  124. intentkit/skills/enso/prices.py +1 -3
  125. intentkit/skills/enso/route.py +1 -3
  126. intentkit/skills/enso/tokens.py +1 -3
  127. intentkit/skills/enso/wallet.py +5 -5
  128. intentkit/skills/erc20/__init__.py +4 -6
  129. intentkit/skills/erc721/__init__.py +4 -6
  130. intentkit/skills/firecrawl/base.py +1 -3
  131. intentkit/skills/firecrawl/clear.py +1 -2
  132. intentkit/skills/firecrawl/crawl.py +9 -10
  133. intentkit/skills/firecrawl/query.py +1 -2
  134. intentkit/skills/firecrawl/scrape.py +7 -8
  135. intentkit/skills/firecrawl/utils.py +13 -13
  136. intentkit/skills/github/base.py +1 -3
  137. intentkit/skills/github/github_search.py +1 -2
  138. intentkit/skills/heurist/base.py +1 -3
  139. intentkit/skills/heurist/image_generation_animagine_xl.py +7 -8
  140. intentkit/skills/heurist/image_generation_arthemy_comics.py +7 -8
  141. intentkit/skills/heurist/image_generation_arthemy_real.py +7 -8
  142. intentkit/skills/heurist/image_generation_braindance.py +7 -8
  143. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +7 -8
  144. intentkit/skills/heurist/image_generation_flux_1_dev.py +7 -8
  145. intentkit/skills/heurist/image_generation_sdxl.py +7 -8
  146. intentkit/skills/http/base.py +1 -3
  147. intentkit/skills/http/get.py +7 -7
  148. intentkit/skills/http/post.py +9 -9
  149. intentkit/skills/http/put.py +9 -9
  150. intentkit/skills/lifi/__init__.py +4 -4
  151. intentkit/skills/lifi/base.py +1 -3
  152. intentkit/skills/lifi/token_execute.py +13 -13
  153. intentkit/skills/lifi/token_quote.py +6 -6
  154. intentkit/skills/lifi/utils.py +16 -16
  155. intentkit/skills/moralis/__init__.py +3 -3
  156. intentkit/skills/moralis/api.py +6 -7
  157. intentkit/skills/moralis/base.py +2 -4
  158. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  159. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  160. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  161. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  162. intentkit/skills/morpho/__init__.py +4 -6
  163. intentkit/skills/nation/__init__.py +2 -2
  164. intentkit/skills/nation/base.py +1 -3
  165. intentkit/skills/nation/nft_check.py +3 -4
  166. intentkit/skills/onchain.py +2 -6
  167. intentkit/skills/openai/base.py +1 -3
  168. intentkit/skills/openai/dalle_image_generation.py +1 -3
  169. intentkit/skills/openai/gpt_image_generation.py +2 -3
  170. intentkit/skills/openai/gpt_image_to_image.py +2 -3
  171. intentkit/skills/openai/image_to_text.py +1 -2
  172. intentkit/skills/portfolio/base.py +6 -6
  173. intentkit/skills/portfolio/token_balances.py +21 -21
  174. intentkit/skills/portfolio/wallet_approvals.py +7 -7
  175. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  176. intentkit/skills/portfolio/wallet_history.py +21 -21
  177. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  178. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  179. intentkit/skills/portfolio/wallet_profitability.py +7 -7
  180. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  181. intentkit/skills/portfolio/wallet_stats.py +3 -3
  182. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  183. intentkit/skills/pyth/__init__.py +3 -5
  184. intentkit/skills/slack/base.py +2 -4
  185. intentkit/skills/slack/get_channel.py +8 -8
  186. intentkit/skills/slack/get_message.py +9 -9
  187. intentkit/skills/slack/schedule_message.py +5 -5
  188. intentkit/skills/slack/send_message.py +3 -5
  189. intentkit/skills/supabase/base.py +1 -3
  190. intentkit/skills/supabase/delete_data.py +4 -4
  191. intentkit/skills/supabase/fetch_data.py +12 -12
  192. intentkit/skills/supabase/insert_data.py +4 -4
  193. intentkit/skills/supabase/invoke_function.py +6 -6
  194. intentkit/skills/supabase/update_data.py +6 -6
  195. intentkit/skills/supabase/upsert_data.py +4 -4
  196. intentkit/skills/superfluid/__init__.py +4 -6
  197. intentkit/skills/system/add_autonomous_task.py +8 -10
  198. intentkit/skills/system/edit_autonomous_task.py +12 -14
  199. intentkit/skills/system/list_autonomous_tasks.py +1 -3
  200. intentkit/skills/tavily/base.py +1 -3
  201. intentkit/skills/tavily/tavily_extract.py +1 -2
  202. intentkit/skills/tavily/tavily_search.py +1 -3
  203. intentkit/skills/token/base.py +5 -5
  204. intentkit/skills/token/erc20_transfers.py +19 -19
  205. intentkit/skills/token/token_analytics.py +3 -3
  206. intentkit/skills/token/token_price.py +13 -13
  207. intentkit/skills/token/token_search.py +9 -9
  208. intentkit/skills/twitter/base.py +3 -4
  209. intentkit/skills/twitter/follow_user.py +1 -2
  210. intentkit/skills/twitter/get_mentions.py +3 -4
  211. intentkit/skills/twitter/get_timeline.py +1 -2
  212. intentkit/skills/twitter/get_user_by_username.py +1 -2
  213. intentkit/skills/twitter/get_user_tweets.py +2 -3
  214. intentkit/skills/twitter/like_tweet.py +1 -2
  215. intentkit/skills/twitter/post_tweet.py +3 -4
  216. intentkit/skills/twitter/reply_tweet.py +3 -4
  217. intentkit/skills/twitter/retweet.py +1 -2
  218. intentkit/skills/twitter/search_tweets.py +1 -2
  219. intentkit/skills/unrealspeech/base.py +1 -3
  220. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  221. intentkit/skills/venice_audio/__init__.py +8 -9
  222. intentkit/skills/venice_audio/base.py +3 -4
  223. intentkit/skills/venice_audio/input.py +41 -41
  224. intentkit/skills/venice_audio/venice_audio.py +6 -6
  225. intentkit/skills/venice_image/__init__.py +5 -5
  226. intentkit/skills/venice_image/api.py +138 -138
  227. intentkit/skills/venice_image/base.py +3 -3
  228. intentkit/skills/venice_image/config.py +33 -35
  229. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  230. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  231. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  232. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  233. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  234. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  235. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  236. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  237. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  238. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  239. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  240. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  241. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  242. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  243. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  244. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  245. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  246. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  247. intentkit/skills/venice_image/utils.py +77 -78
  248. intentkit/skills/web_scraper/base.py +1 -3
  249. intentkit/skills/web_scraper/document_indexer.py +1 -2
  250. intentkit/skills/web_scraper/scrape_and_index.py +4 -5
  251. intentkit/skills/web_scraper/utils.py +25 -26
  252. intentkit/skills/web_scraper/website_indexer.py +10 -11
  253. intentkit/skills/weth/__init__.py +4 -6
  254. intentkit/skills/wow/__init__.py +4 -6
  255. intentkit/skills/x402/__init__.py +11 -3
  256. intentkit/skills/x402/ask_agent.py +12 -78
  257. intentkit/skills/x402/base.py +90 -0
  258. intentkit/skills/x402/http_request.py +117 -0
  259. intentkit/skills/x402/schema.json +15 -10
  260. intentkit/skills/xmtp/base.py +3 -3
  261. intentkit/skills/xmtp/price.py +2 -2
  262. intentkit/skills/xmtp/swap.py +2 -4
  263. intentkit/skills/xmtp/transfer.py +4 -6
  264. intentkit/utils/error.py +2 -2
  265. intentkit/utils/logging.py +2 -4
  266. intentkit/utils/s3.py +8 -9
  267. intentkit/utils/schema.py +5 -5
  268. intentkit/utils/slack_alert.py +7 -8
  269. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/METADATA +3 -4
  270. intentkit-0.8.17.dev2.dist-info/RECORD +464 -0
  271. intentkit/models/generator.py +0 -347
  272. intentkit-0.8.16.dev1.dist-info/RECORD +0 -464
  273. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/WHEEL +0 -0
  274. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/licenses/LICENSE +0 -0
@@ -1,4 +1,4 @@
1
- from typing import Any, Dict, List, Type
1
+ from typing import Any
2
2
 
3
3
  import httpx
4
4
  from pydantic import BaseModel
@@ -20,9 +20,9 @@ class GetSectors(CookieFunBaseTool):
20
20
  description: str = (
21
21
  "Returns a list of all available sectors in the CookieFun system."
22
22
  )
23
- args_schema: Type[BaseModel] = GetSectorsInput
23
+ args_schema: type[BaseModel] = GetSectorsInput
24
24
 
25
- async def _arun(self, **kwargs) -> List[Dict[str, Any]]:
25
+ async def _arun(self, **kwargs) -> list[dict[str, Any]]:
26
26
  """
27
27
  Get all available sectors from the CookieFun API.
28
28
 
@@ -1,5 +1,5 @@
1
1
  from enum import IntEnum
2
- from typing import Any, Dict, List, Optional, Type, Union
2
+ from typing import Any
3
3
 
4
4
  import httpx
5
5
  from pydantic import BaseModel, Field
@@ -38,17 +38,17 @@ class SearchAccountsInput(BaseModel):
38
38
  description="Search query to find Twitter accounts that authored tweets matching the criteria"
39
39
  )
40
40
 
41
- type: Optional[int] = Field(
41
+ type: int | None = Field(
42
42
  default=None,
43
43
  description="Type of tweets to search for: 0 for Original, 1 for Reply, 2 for Quote (leave empty for all types)",
44
44
  )
45
45
 
46
- sortBy: Optional[int] = Field(
46
+ sortBy: int | None = Field(
47
47
  default=None,
48
48
  description="Sort by: 0 for SmartEngagementPoints, 1 for Impressions, 2 for MatchingTweetsCount",
49
49
  )
50
50
 
51
- sortOrder: Optional[int] = Field(
51
+ sortOrder: int | None = Field(
52
52
  default=None,
53
53
  description="Sort order: 0 for Ascending, 1 for Descending",
54
54
  )
@@ -59,16 +59,16 @@ class SearchAccounts(CookieFunBaseTool):
59
59
 
60
60
  name: str = "cookiefun_search_accounts"
61
61
  description: str = "Searches for Twitter accounts that authored tweets matching specified search criteria."
62
- args_schema: Type[BaseModel] = SearchAccountsInput
62
+ args_schema: type[BaseModel] = SearchAccountsInput
63
63
 
64
64
  async def _arun(
65
65
  self,
66
66
  searchQuery: str,
67
- type: Optional[int] = None,
68
- sortBy: Optional[int] = None,
69
- sortOrder: Optional[int] = None,
67
+ type: int | None = None,
68
+ sortBy: int | None = None,
69
+ sortOrder: int | None = None,
70
70
  **kwargs,
71
- ) -> Union[List[Dict[str, Any]], str]:
71
+ ) -> list[dict[str, Any]] | str:
72
72
  """
73
73
  Search for Twitter accounts based on tweet content.
74
74
 
@@ -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: List[str] = Field(
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: List[str]) -> dict:
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, timezone
5
- from typing import Any, Dict, List, Type
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: Type[BaseModel]
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=timezone.utc)
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: List[str]
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: Dict[str, Any] = Field(default_factory=dict)
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: Type[BaseModel] = CryptoCompareFetchNewsInput
34
+ args_schema: type[BaseModel] = CryptoCompareFetchNewsInput
36
35
 
37
36
  async def _arun(
38
37
  self,
39
38
  token: str,
40
39
  **kwargs,
41
- ) -> List[CryptoNews]:
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
- List[CryptoNews]: A list of cryptocurrency news articles.
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: List[str] = Field(
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: Type[BaseModel] = CryptoCompareFetchPriceInput
42
+ args_schema: type[BaseModel] = CryptoCompareFetchPriceInput
44
43
 
45
44
  async def _arun(
46
45
  self,
47
46
  from_symbol: str,
48
- to_symbols: List[str],
47
+ to_symbols: list[str],
49
48
  **kwargs,
50
- ) -> List[CryptoPrice]:
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
- List[CryptoPrice]: A list of cryptocurrency prices for each target currency.
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: Type[BaseModel] = CryptoCompareFetchTopExchangesInput
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
- ) -> List[CryptoExchange]:
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
- List[CryptoExchange]: A list of top exchanges for the specified trading pair.
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: Type[BaseModel] = CryptoCompareFetchTopMarketCapInput
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
- ) -> List[CryptoCurrency]:
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
- List[CryptoCurrency]: A list of top cryptocurrencies by market cap.
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: Type[BaseModel] = CryptoCompareFetchTopVolumeInput
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
- ) -> List[CryptoCurrency]:
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
- List[CryptoCurrency]: A list of top cryptocurrencies by trading volume.
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: Type[BaseModel] = CryptoCompareFetchTradingSignalsInput
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
- ) -> List[TradingSignal]:
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
- List[TradingSignal]: A list of trading signals for the specified cryptocurrency.
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, Dict)
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 Dict, List, Optional, TypedDict
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: Dict[str, CryptopanicBaseTool] = {}
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
- ) -> List[CryptopanicBaseTool]:
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
- ) -> Optional[CryptopanicBaseTool]:
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: Type[BaseModel]
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: List[NewsItem] = Field(description="List of 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: Type[BaseModel] = CryptopanicNewsInput
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
- ) -> List[NewsItem]:
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, List, Type
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: List[BaseModel] = Field(description="List of 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: Type[BaseModel] = CryptopanicSentimentInput
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: Type[BaseModel]
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, Dict, List, Optional, Type
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: Optional[str] = Field(
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: Optional[str] = Field(
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: Type[BaseModel] = DappLookerTokenDataInput
53
+ args_schema: type[BaseModel] = DappLookerTokenDataInput
54
54
 
55
55
  async def _arun(
56
56
  self,
57
- token_tickers: Optional[str] = None,
58
- token_addresses: Optional[str] = None,
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: List[Dict[str, Any]]) -> str:
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: List[str]) -> dict:
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: List[str]) -> dict:
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: List[str]) -> dict:
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: List[str]) -> dict:
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: List[str]) -> dict:
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, timezone
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: Type[BaseModel]
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=timezone.utc)
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=timezone.utc).isoformat(),
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=timezone.utc).timestamp())
125
+ return int(datetime.now(tz=UTC).timestamp())