intentkit 0.8.6.dev2__py3-none-any.whl → 0.8.17__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of intentkit might be problematic. Click here for more details.

Files changed (312) 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 +10 -5
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +3 -2
  8. intentkit/clients/cdp.py +53 -92
  9. intentkit/clients/twitter.py +56 -57
  10. intentkit/clients/web3.py +1 -3
  11. intentkit/config/config.py +5 -0
  12. intentkit/core/agent.py +16 -388
  13. intentkit/core/asset.py +64 -18
  14. intentkit/core/client.py +1 -1
  15. intentkit/core/credit.py +19 -20
  16. intentkit/core/engine.py +26 -11
  17. intentkit/core/node.py +2 -1
  18. intentkit/core/prompt.py +53 -15
  19. intentkit/core/scheduler.py +9 -9
  20. intentkit/core/statistics.py +6 -7
  21. intentkit/models/agent.py +256 -176
  22. intentkit/models/agent_data.py +62 -36
  23. intentkit/models/agent_schema.json +6 -9
  24. intentkit/models/app_setting.py +6 -6
  25. intentkit/models/chat.py +28 -24
  26. intentkit/models/conversation.py +8 -8
  27. intentkit/models/credit.py +62 -64
  28. intentkit/models/db.py +8 -7
  29. intentkit/models/db_mig.py +2 -2
  30. intentkit/models/llm.csv +15 -12
  31. intentkit/models/llm.py +18 -16
  32. intentkit/models/redis.py +2 -3
  33. intentkit/models/skill.py +62 -66
  34. intentkit/models/skills.csv +30 -26
  35. intentkit/models/user.py +46 -21
  36. intentkit/skills/acolyt/__init__.py +2 -9
  37. intentkit/skills/acolyt/ask.py +3 -4
  38. intentkit/skills/acolyt/base.py +4 -9
  39. intentkit/skills/aixbt/__init__.py +2 -13
  40. intentkit/skills/aixbt/base.py +1 -7
  41. intentkit/skills/aixbt/projects.py +14 -15
  42. intentkit/skills/allora/__init__.py +2 -9
  43. intentkit/skills/allora/base.py +4 -9
  44. intentkit/skills/allora/price.py +3 -4
  45. intentkit/skills/base.py +175 -52
  46. intentkit/skills/basename/__init__.py +4 -8
  47. intentkit/skills/carv/__init__.py +115 -121
  48. intentkit/skills/carv/base.py +184 -185
  49. intentkit/skills/carv/fetch_news.py +3 -3
  50. intentkit/skills/carv/onchain_query.py +4 -4
  51. intentkit/skills/carv/token_info_and_price.py +5 -5
  52. intentkit/skills/casino/__init__.py +4 -15
  53. intentkit/skills/casino/base.py +1 -7
  54. intentkit/skills/casino/deck_draw.py +5 -8
  55. intentkit/skills/casino/deck_shuffle.py +6 -6
  56. intentkit/skills/casino/dice_roll.py +2 -4
  57. intentkit/skills/cdp/__init__.py +3 -10
  58. intentkit/skills/cdp/base.py +1 -7
  59. intentkit/skills/cdp/schema.json +1 -17
  60. intentkit/skills/chainlist/__init__.py +2 -7
  61. intentkit/skills/chainlist/base.py +1 -7
  62. intentkit/skills/chainlist/chain_lookup.py +18 -18
  63. intentkit/skills/common/__init__.py +2 -9
  64. intentkit/skills/common/base.py +1 -7
  65. intentkit/skills/common/current_time.py +1 -2
  66. intentkit/skills/cookiefun/__init__.py +6 -9
  67. intentkit/skills/cookiefun/base.py +2 -7
  68. intentkit/skills/cookiefun/get_account_details.py +7 -7
  69. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  70. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  71. intentkit/skills/cookiefun/get_sectors.py +3 -3
  72. intentkit/skills/cookiefun/search_accounts.py +9 -9
  73. intentkit/skills/cryptocompare/__init__.py +7 -24
  74. intentkit/skills/cryptocompare/api.py +2 -3
  75. intentkit/skills/cryptocompare/base.py +10 -24
  76. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  77. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  78. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  79. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  80. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  81. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  82. intentkit/skills/cryptopanic/__init__.py +7 -10
  83. intentkit/skills/cryptopanic/base.py +51 -55
  84. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  85. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  86. intentkit/skills/dapplooker/__init__.py +2 -9
  87. intentkit/skills/dapplooker/base.py +4 -9
  88. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  89. intentkit/skills/defillama/__init__.py +24 -74
  90. intentkit/skills/defillama/api.py +6 -9
  91. intentkit/skills/defillama/base.py +8 -19
  92. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  93. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  94. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  95. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  96. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  97. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  98. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  99. intentkit/skills/defillama/config/chains.py +1 -3
  100. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  101. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  102. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  103. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  104. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  105. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  106. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  107. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  108. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  109. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  110. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  111. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  112. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  113. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  114. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  115. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  116. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  117. intentkit/skills/dexscreener/__init__.py +97 -102
  118. intentkit/skills/dexscreener/base.py +125 -130
  119. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  120. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  121. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  122. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  123. intentkit/skills/dexscreener/search_token.py +182 -184
  124. intentkit/skills/dexscreener/utils.py +15 -14
  125. intentkit/skills/dune_analytics/__init__.py +7 -9
  126. intentkit/skills/dune_analytics/base.py +48 -52
  127. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  128. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  129. intentkit/skills/elfa/__init__.py +5 -18
  130. intentkit/skills/elfa/base.py +10 -14
  131. intentkit/skills/elfa/mention.py +19 -21
  132. intentkit/skills/elfa/stats.py +4 -4
  133. intentkit/skills/elfa/tokens.py +12 -12
  134. intentkit/skills/elfa/utils.py +26 -28
  135. intentkit/skills/enso/__init__.py +11 -31
  136. intentkit/skills/enso/base.py +9 -15
  137. intentkit/skills/enso/best_yield.py +5 -7
  138. intentkit/skills/enso/networks.py +3 -9
  139. intentkit/skills/enso/prices.py +2 -4
  140. intentkit/skills/enso/route.py +6 -12
  141. intentkit/skills/enso/tokens.py +4 -16
  142. intentkit/skills/enso/wallet.py +6 -6
  143. intentkit/skills/erc20/__init__.py +5 -11
  144. intentkit/skills/erc721/__init__.py +5 -9
  145. intentkit/skills/firecrawl/__init__.py +5 -18
  146. intentkit/skills/firecrawl/base.py +4 -9
  147. intentkit/skills/firecrawl/clear.py +4 -8
  148. intentkit/skills/firecrawl/crawl.py +19 -19
  149. intentkit/skills/firecrawl/query.py +4 -3
  150. intentkit/skills/firecrawl/scrape.py +17 -22
  151. intentkit/skills/firecrawl/utils.py +50 -42
  152. intentkit/skills/github/__init__.py +2 -7
  153. intentkit/skills/github/base.py +1 -7
  154. intentkit/skills/github/github_search.py +1 -2
  155. intentkit/skills/heurist/__init__.py +8 -27
  156. intentkit/skills/heurist/base.py +4 -9
  157. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  158. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  159. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  160. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  161. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  162. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  163. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  164. intentkit/skills/http/__init__.py +4 -15
  165. intentkit/skills/http/base.py +1 -7
  166. intentkit/skills/http/get.py +21 -16
  167. intentkit/skills/http/post.py +23 -18
  168. intentkit/skills/http/put.py +23 -18
  169. intentkit/skills/lifi/__init__.py +5 -10
  170. intentkit/skills/lifi/base.py +1 -7
  171. intentkit/skills/lifi/token_execute.py +14 -17
  172. intentkit/skills/lifi/token_quote.py +7 -9
  173. intentkit/skills/lifi/utils.py +16 -16
  174. intentkit/skills/moralis/__init__.py +6 -10
  175. intentkit/skills/moralis/api.py +6 -7
  176. intentkit/skills/moralis/base.py +5 -10
  177. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  178. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  179. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  180. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  181. intentkit/skills/morpho/__init__.py +5 -9
  182. intentkit/skills/nation/__init__.py +4 -9
  183. intentkit/skills/nation/base.py +5 -10
  184. intentkit/skills/nation/nft_check.py +3 -4
  185. intentkit/skills/onchain.py +23 -0
  186. intentkit/skills/openai/__init__.py +17 -18
  187. intentkit/skills/openai/base.py +10 -14
  188. intentkit/skills/openai/dalle_image_generation.py +3 -8
  189. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  190. intentkit/skills/openai/gpt_image_generation.py +4 -8
  191. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  192. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  193. intentkit/skills/openai/image_to_text.py +3 -7
  194. intentkit/skills/openai/schema.json +32 -0
  195. intentkit/skills/portfolio/__init__.py +11 -35
  196. intentkit/skills/portfolio/base.py +33 -19
  197. intentkit/skills/portfolio/token_balances.py +21 -21
  198. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  199. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  200. intentkit/skills/portfolio/wallet_history.py +31 -31
  201. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  202. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  203. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  204. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  205. intentkit/skills/portfolio/wallet_stats.py +3 -3
  206. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  207. intentkit/skills/pyth/__init__.py +4 -10
  208. intentkit/skills/skills.toml +4 -0
  209. intentkit/skills/slack/__init__.py +5 -17
  210. intentkit/skills/slack/base.py +3 -9
  211. intentkit/skills/slack/get_channel.py +8 -8
  212. intentkit/skills/slack/get_message.py +9 -9
  213. intentkit/skills/slack/schedule_message.py +5 -5
  214. intentkit/skills/slack/send_message.py +3 -5
  215. intentkit/skills/supabase/__init__.py +7 -23
  216. intentkit/skills/supabase/base.py +1 -7
  217. intentkit/skills/supabase/delete_data.py +4 -4
  218. intentkit/skills/supabase/fetch_data.py +12 -12
  219. intentkit/skills/supabase/insert_data.py +4 -4
  220. intentkit/skills/supabase/invoke_function.py +6 -6
  221. intentkit/skills/supabase/update_data.py +6 -6
  222. intentkit/skills/supabase/upsert_data.py +4 -4
  223. intentkit/skills/superfluid/__init__.py +5 -9
  224. intentkit/skills/system/__init__.py +7 -24
  225. intentkit/skills/system/add_autonomous_task.py +10 -12
  226. intentkit/skills/system/delete_autonomous_task.py +2 -2
  227. intentkit/skills/system/edit_autonomous_task.py +14 -18
  228. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  229. intentkit/skills/system/read_agent_api_key.py +6 -4
  230. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  231. intentkit/skills/tavily/__init__.py +3 -12
  232. intentkit/skills/tavily/base.py +4 -9
  233. intentkit/skills/tavily/tavily_extract.py +2 -4
  234. intentkit/skills/tavily/tavily_search.py +4 -6
  235. intentkit/skills/token/__init__.py +5 -10
  236. intentkit/skills/token/base.py +7 -11
  237. intentkit/skills/token/erc20_transfers.py +19 -19
  238. intentkit/skills/token/token_analytics.py +3 -3
  239. intentkit/skills/token/token_price.py +13 -13
  240. intentkit/skills/token/token_search.py +9 -9
  241. intentkit/skills/twitter/__init__.py +11 -35
  242. intentkit/skills/twitter/base.py +22 -34
  243. intentkit/skills/twitter/follow_user.py +2 -6
  244. intentkit/skills/twitter/get_mentions.py +5 -12
  245. intentkit/skills/twitter/get_timeline.py +4 -12
  246. intentkit/skills/twitter/get_user_by_username.py +2 -6
  247. intentkit/skills/twitter/get_user_tweets.py +5 -13
  248. intentkit/skills/twitter/like_tweet.py +2 -6
  249. intentkit/skills/twitter/post_tweet.py +6 -9
  250. intentkit/skills/twitter/reply_tweet.py +6 -9
  251. intentkit/skills/twitter/retweet.py +2 -6
  252. intentkit/skills/twitter/search_tweets.py +4 -12
  253. intentkit/skills/unrealspeech/__init__.py +2 -7
  254. intentkit/skills/unrealspeech/base.py +2 -8
  255. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  256. intentkit/skills/venice_audio/__init__.py +98 -106
  257. intentkit/skills/venice_audio/base.py +117 -121
  258. intentkit/skills/venice_audio/input.py +41 -41
  259. intentkit/skills/venice_audio/venice_audio.py +7 -11
  260. intentkit/skills/venice_image/__init__.py +147 -154
  261. intentkit/skills/venice_image/api.py +138 -138
  262. intentkit/skills/venice_image/base.py +185 -192
  263. intentkit/skills/venice_image/config.py +33 -35
  264. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  265. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  266. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  267. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  268. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  269. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  270. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  271. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  272. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  273. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  274. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  275. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  276. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  277. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  278. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  279. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  280. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  281. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  282. intentkit/skills/venice_image/utils.py +77 -78
  283. intentkit/skills/web_scraper/__init__.py +5 -18
  284. intentkit/skills/web_scraper/base.py +21 -7
  285. intentkit/skills/web_scraper/document_indexer.py +7 -6
  286. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  287. intentkit/skills/web_scraper/utils.py +62 -63
  288. intentkit/skills/web_scraper/website_indexer.py +17 -19
  289. intentkit/skills/weth/__init__.py +5 -11
  290. intentkit/skills/wow/__init__.py +5 -11
  291. intentkit/skills/x402/__init__.py +61 -0
  292. intentkit/skills/x402/ask_agent.py +98 -0
  293. intentkit/skills/x402/base.py +99 -0
  294. intentkit/skills/x402/http_request.py +117 -0
  295. intentkit/skills/x402/schema.json +45 -0
  296. intentkit/skills/x402/x402.webp +0 -0
  297. intentkit/skills/xmtp/__init__.py +4 -15
  298. intentkit/skills/xmtp/base.py +5 -5
  299. intentkit/skills/xmtp/price.py +6 -6
  300. intentkit/skills/xmtp/swap.py +6 -8
  301. intentkit/skills/xmtp/transfer.py +4 -6
  302. intentkit/utils/error.py +2 -2
  303. intentkit/utils/logging.py +2 -4
  304. intentkit/utils/s3.py +8 -9
  305. intentkit/utils/schema.py +100 -0
  306. intentkit/utils/slack_alert.py +7 -8
  307. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +3 -4
  308. intentkit-0.8.17.dist-info/RECORD +466 -0
  309. intentkit/models/generator.py +0 -347
  310. intentkit-0.8.6.dev2.dist-info/RECORD +0 -457
  311. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  312. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
@@ -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.
@@ -65,7 +64,7 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
65
64
  skill_config = context.agent.skill_config(self.category)
66
65
 
67
66
  # Check rate limit
68
- await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
67
+ await self.check_rate_limit(max_requests=5, interval=60)
69
68
 
70
69
  # Get API key from context
71
70
  api_key = skill_config.get("api_key")
@@ -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.
@@ -64,7 +63,7 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
64
63
  skill_config = context.agent.skill_config(self.category)
65
64
 
66
65
  # Check rate limit
67
- await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
66
+ await self.check_rate_limit(max_requests=5, interval=60)
68
67
 
69
68
  # Get API key from context
70
69
  api_key = skill_config.get("api_key")
@@ -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.
@@ -67,7 +66,7 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
67
66
  skill_config = context.agent.skill_config(self.category)
68
67
 
69
68
  # Check rate limit
70
- await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
69
+ await self.check_rate_limit(max_requests=5, interval=60)
71
70
 
72
71
  # Get API key from context
73
72
  api_key = skill_config.get("api_key")
@@ -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,9 +4,8 @@ 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
- from intentkit.abstracts.skill import SkillStoreABC
10
9
  from intentkit.skills.base import SkillConfig, SkillState
11
10
 
12
11
  from .base import CryptopanicBaseTool
@@ -14,7 +13,7 @@ from .base import CryptopanicBaseTool
14
13
  logger = logging.getLogger(__name__)
15
14
 
16
15
  # Cache for skill instances
17
- _skill_cache: Dict[str, CryptopanicBaseTool] = {}
16
+ _skill_cache: dict[str, CryptopanicBaseTool] = {}
18
17
 
19
18
 
20
19
  class SkillStates(TypedDict):
@@ -34,9 +33,8 @@ class Config(SkillConfig):
34
33
  async def get_skills(
35
34
  config: Config,
36
35
  is_private: bool,
37
- store: SkillStoreABC,
38
36
  **kwargs,
39
- ) -> List[CryptopanicBaseTool]:
37
+ ) -> list[CryptopanicBaseTool]:
40
38
  """Load CryptoPanic skills based on configuration.
41
39
 
42
40
  Args:
@@ -60,7 +58,7 @@ async def get_skills(
60
58
 
61
59
  loaded_skills = []
62
60
  for name in available_skills:
63
- skill = get_cryptopanic_skill(name, store)
61
+ skill = get_cryptopanic_skill(name)
64
62
  if skill:
65
63
  logger.info("Successfully loaded skill: %s", name)
66
64
  loaded_skills.append(skill)
@@ -72,8 +70,7 @@ async def get_skills(
72
70
 
73
71
  def get_cryptopanic_skill(
74
72
  name: str,
75
- store: SkillStoreABC,
76
- ) -> Optional[CryptopanicBaseTool]:
73
+ ) -> CryptopanicBaseTool | None:
77
74
  """Retrieve a CryptoPanic skill instance by name.
78
75
 
79
76
  Args:
@@ -91,11 +88,11 @@ def get_cryptopanic_skill(
91
88
  if name == "fetch_crypto_news":
92
89
  from .fetch_crypto_news import FetchCryptoNews
93
90
 
94
- _skill_cache[name] = FetchCryptoNews(skill_store=store)
91
+ _skill_cache[name] = FetchCryptoNews()
95
92
  elif name == "fetch_crypto_sentiment":
96
93
  from .fetch_crypto_sentiment import FetchCryptoSentiment
97
94
 
98
- _skill_cache[name] = FetchCryptoSentiment(skill_store=store)
95
+ _skill_cache[name] = FetchCryptoSentiment()
99
96
  else:
100
97
  logger.warning("Unknown CryptoPanic skill: %s", name)
101
98
  return None
@@ -1,55 +1,51 @@
1
- """Base module for CryptoPanic skills.
2
-
3
- Defines the base class and shared utilities for CryptoPanic skills.
4
- """
5
-
6
- from typing import Type
7
-
8
- from langchain.tools.base import ToolException
9
- from pydantic import BaseModel, Field
10
-
11
- from intentkit.abstracts.skill import SkillStoreABC
12
- from intentkit.skills.base import IntentKitSkill
13
-
14
- base_url = "https://cryptopanic.com/api/v1/posts/"
15
-
16
-
17
- class CryptopanicBaseTool(IntentKitSkill):
18
- """Base class for CryptoPanic skills.
19
-
20
- Provides common functionality for interacting with the CryptoPanic API,
21
- including API key retrieval and skill store access.
22
- """
23
-
24
- name: str = Field(description="Tool name")
25
- description: str = Field(description="Tool description")
26
- args_schema: Type[BaseModel]
27
- skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
28
-
29
- def get_api_key(self) -> str:
30
- """Retrieve the CryptoPanic API key from context.
31
-
32
- Returns:
33
- API key string.
34
-
35
- Raises:
36
- ToolException: If the API key is not found.
37
- """
38
- context = self.get_context()
39
- skill_config = context.agent.skill_config(self.category)
40
- api_key_provider = skill_config.get("api_key_provider")
41
- if api_key_provider == "agent_owner":
42
- api_key = skill_config.get("api_key")
43
- if api_key:
44
- return api_key
45
- else:
46
- raise ToolException("No api_key found in agent_owner configuration")
47
- else:
48
- raise ToolException(
49
- f"Invalid API key provider: {api_key_provider}. Only 'agent_owner' is supported for CryptoPanic."
50
- )
51
-
52
- @property
53
- def category(self) -> str:
54
- """Category of the skill."""
55
- return "cryptopanic"
1
+ """Base module for CryptoPanic skills.
2
+
3
+ Defines the base class and shared utilities for CryptoPanic skills.
4
+ """
5
+
6
+ from langchain_core.tools.base import ToolException
7
+ from pydantic import BaseModel, Field
8
+
9
+ from intentkit.skills.base import IntentKitSkill
10
+
11
+ base_url = "https://cryptopanic.com/api/v1/posts/"
12
+
13
+
14
+ class CryptopanicBaseTool(IntentKitSkill):
15
+ """Base class for CryptoPanic skills.
16
+
17
+ Provides common functionality for interacting with the CryptoPanic API,
18
+ including API key retrieval and shared helpers.
19
+ """
20
+
21
+ name: str = Field(description="Tool name")
22
+ description: str = Field(description="Tool description")
23
+ args_schema: type[BaseModel]
24
+
25
+ def get_api_key(self) -> str:
26
+ """Retrieve the CryptoPanic API key from context.
27
+
28
+ Returns:
29
+ API key string.
30
+
31
+ Raises:
32
+ ToolException: If the API key is not found.
33
+ """
34
+ context = self.get_context()
35
+ skill_config = context.agent.skill_config(self.category)
36
+ api_key_provider = skill_config.get("api_key_provider")
37
+ if api_key_provider == "agent_owner":
38
+ api_key = skill_config.get("api_key")
39
+ if api_key:
40
+ return api_key
41
+ else:
42
+ raise ToolException("No api_key found in agent_owner configuration")
43
+ else:
44
+ raise ToolException(
45
+ f"Invalid API key provider: {api_key_provider}. Only 'agent_owner' is supported for CryptoPanic."
46
+ )
47
+
48
+ @property
49
+ def category(self) -> str:
50
+ """Category of the skill."""
51
+ return "cryptopanic"
@@ -3,12 +3,9 @@
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
 
11
- from intentkit.abstracts.skill import SkillStoreABC
12
9
  from intentkit.skills.cryptopanic.base import CryptopanicBaseTool
13
10
 
14
11
  SUPPORTED_CURRENCIES = ["BTC", "ETH"]
@@ -36,7 +33,7 @@ class CryptopanicNewsOutput(BaseModel):
36
33
  """Output schema for fetching crypto news."""
37
34
 
38
35
  currency: str = Field(description="Currency news was fetched for")
39
- news_items: List[NewsItem] = Field(description="List of news items")
36
+ news_items: list[NewsItem] = Field(description="List of news items")
40
37
  summary: str = Field(description="Summary of fetched news")
41
38
 
42
39
 
@@ -48,14 +45,13 @@ class FetchCryptoNews(CryptopanicBaseTool):
48
45
  "Fetches all crypto market news posts from CryptoPanic for BTC or ETH, "
49
46
  "sorted by publication date (newest first). Defaults to BTC."
50
47
  )
51
- args_schema: Type[BaseModel] = CryptopanicNewsInput
52
- skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
48
+ args_schema: type[BaseModel] = CryptopanicNewsInput
53
49
 
54
50
  async def fetch_news(
55
51
  self,
56
52
  currency: str,
57
53
  api_key: str,
58
- ) -> List[NewsItem]:
54
+ ) -> list[NewsItem]:
59
55
  """Fetch the latest news for a specific currency from CryptoPanic API.
60
56
 
61
57
  Args:
@@ -68,7 +64,7 @@ class FetchCryptoNews(CryptopanicBaseTool):
68
64
  Raises:
69
65
  ToolException: If the API request fails or data is invalid.
70
66
  """
71
- from langchain.tools.base import ToolException
67
+ from langchain_core.tools.base import ToolException
72
68
 
73
69
  if currency not in SUPPORTED_CURRENCIES:
74
70
  raise ToolException(f"Unsupported currency: {currency}")
@@ -1,10 +1,9 @@
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
 
7
- from intentkit.abstracts.skill import SkillStoreABC
8
7
  from intentkit.skills.cryptopanic.base import CryptopanicBaseTool
9
8
 
10
9
  SUPPORTED_CURRENCIES = ["BTC", "ETH"]
@@ -30,7 +29,7 @@ class CryptopanicNewsOutput(BaseModel):
30
29
  """Output schema for fetching crypto news (used internally)."""
31
30
 
32
31
  currency: str = Field(description="Currency news was fetched for")
33
- news_items: List[BaseModel] = Field(description="List of news items")
32
+ news_items: list[BaseModel] = Field(description="List of news items")
34
33
  summary: str = Field(description="Summary of fetched news")
35
34
 
36
35
 
@@ -44,8 +43,7 @@ class FetchCryptoSentiment(CryptopanicBaseTool):
44
43
  "with all posts sorted by recency. Triggered by 'sentiment' or 'market state' queries. "
45
44
  "Defaults to BTC."
46
45
  )
47
- args_schema: Type[BaseModel] = CryptopanicSentimentInput
48
- skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
46
+ args_schema: type[BaseModel] = CryptopanicSentimentInput
49
47
 
50
48
  INSIGHTS_PROMPT: ClassVar[str] = """
51
49
  CryptoPanic Headlines for {currency}:
@@ -79,7 +77,7 @@ Conclude with a short-term outlook for {currency}. Provide a concise, profession
79
77
  Raises:
80
78
  ToolException: If news fetching fails.
81
79
  """
82
- from langchain.tools.base import ToolException
80
+ from langchain_core.tools.base import ToolException
83
81
 
84
82
  from intentkit.skills.cryptopanic.fetch_crypto_news import (
85
83
  FetchCryptoNews,
@@ -90,7 +88,7 @@ Conclude with a short-term outlook for {currency}. Provide a concise, profession
90
88
  currency = "BTC"
91
89
 
92
90
  # Instantiate FetchCryptoNews
93
- news_skill = FetchCryptoNews(skill_store=self.skill_store)
91
+ news_skill = FetchCryptoNews()
94
92
 
95
93
  try:
96
94
  news_output: CryptopanicNewsOutput = await news_skill._arun(
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import NotRequired, TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.base import SkillConfig, SkillState
8
7
  from intentkit.skills.dapplooker.base import DappLookerBaseTool
9
8
  from intentkit.skills.dapplooker.dapplooker_token_data import DappLookerTokenData
@@ -28,7 +27,6 @@ class Config(SkillConfig):
28
27
  async def get_skills(
29
28
  config: "Config",
30
29
  is_private: bool,
31
- store: SkillStoreABC,
32
30
  **_,
33
31
  ) -> list[DappLookerBaseTool]:
34
32
  """Get all DappLooker skills.
@@ -36,7 +34,6 @@ async def get_skills(
36
34
  Args:
37
35
  config: The configuration for DappLooker skills.
38
36
  is_private: Whether to include private skills.
39
- store: The skill store for persisting data.
40
37
 
41
38
  Returns:
42
39
  A list of DappLooker skills.
@@ -53,7 +50,7 @@ async def get_skills(
53
50
  # Get each skill using the cached getter
54
51
  result = []
55
52
  for name in available_skills:
56
- skill = get_dapplooker_skill(name, store)
53
+ skill = get_dapplooker_skill(name)
57
54
  if skill:
58
55
  result.append(skill)
59
56
  return result
@@ -61,22 +58,18 @@ async def get_skills(
61
58
 
62
59
  def get_dapplooker_skill(
63
60
  name: str,
64
- store: SkillStoreABC,
65
61
  ) -> DappLookerBaseTool:
66
62
  """Get a DappLooker skill by name.
67
63
 
68
64
  Args:
69
65
  name: The name of the skill to get
70
- store: The skill store for persisting data
71
66
 
72
67
  Returns:
73
68
  The requested DappLooker skill
74
69
  """
75
70
  if name == "dapplooker_token_data":
76
71
  if name not in _cache:
77
- _cache[name] = DappLookerTokenData(
78
- skill_store=store,
79
- )
72
+ _cache[name] = DappLookerTokenData()
80
73
  return _cache[name]
81
74
  else:
82
75
  logger.warning(f"Unknown DappLooker skill: {name}")
@@ -1,9 +1,7 @@
1
- from typing import Type
2
-
3
- from langchain.tools.base import ToolException
1
+ from langchain_core.tools.base import ToolException
4
2
  from pydantic import BaseModel, Field
5
3
 
6
- from intentkit.abstracts.skill import SkillStoreABC
4
+ from intentkit.config.config import config
7
5
  from intentkit.skills.base import IntentKitSkill
8
6
 
9
7
 
@@ -12,17 +10,14 @@ 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]
16
- skill_store: SkillStoreABC = Field(
17
- description="The skill store for persisting data"
18
- )
13
+ args_schema: type[BaseModel]
19
14
 
20
15
  def get_api_key(self) -> str:
21
16
  context = self.get_context()
22
17
  skill_config = context.agent.skill_config(self.category)
23
18
  api_key_provider = skill_config.get("api_key_provider")
24
19
  if api_key_provider == "platform":
25
- return self.skill_store.get_system_config("dapplooker_api_key")
20
+ return config.dapplooker_api_key
26
21
  # for backward compatibility, may only have api_key in skill_config
27
22
  elif skill_config.get("api_key"):
28
23
  return skill_config.get("api_key")
@@ -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: